同一传感器在“门限传感器”界面和“温度海洋”界面,显示的门限值不一致

问题描述

同一传感器(举例Inlet Temp)在“门限传感器”界面和“温度海洋”界面,显示的门限值不一致

环境信息

  • 操作系统:OS:openEuler 20.03 (LTS-SP3) 内核版本:4.19.90-2112.8.0.0131.oe1.aarch64

  • 软件版本:OpenUBMC2509

  • 硬件配置:[如 CPU、内存等]

重现步骤

  1. “门限传感器”界面查看Inlet temp(举例,不仅仅是这个传感器有问题)

  2. 点击”系统管理“–”风扇&散热“–”传感器温度“;查看右侧的Inlet Temp状态**,**显示轻微: 36℃, 严重: 38℃,实际为第一步查询到的:轻微:41℃,严重:43℃

期望结果

同一传感器在“门限传感器”界面和“温度海洋”界面,显示的门限值应当一致

实际结果

同一传感器在“门限传感器”界面和“温度海洋”界面,显示的门限值不一致

尝试过的解决方案

1、主要是温度海洋的门限值不对,尝试过修改sr中的值,升级后门限传感器界面跟着变了,温度海洋还是不变

2、查看温度海洋界面获取门限值数据来源,get_temperatures_info函数调用源头和入参没有找到。

3、社区搜到类似问题贴,有提到温度海洋的方法调用和传参是cooling未开源组件,专家回复“温度海洋中的门限值,由于是数组无法直接引用传感器的值,需要单独配置。若需修改,则需进行定制操作”,但是没有具体的定制方法

答案内容由AI生成,仅供参考:

:compass: 总结

项目 说明
问题性质 配置机制设计差异,非代码缺陷
主因 “温度海洋”未自动同步“门限传感器”的门限值
根因定位 TemperatureInfo.UpperThresholdThresholdSensor.UpperNoncritical 独立配置
解决方向 显式引用、定制插件、手动同步
推荐做法 TemperatureInfo 中通过 <=/ 表达式引用 ThresholdSensor 的门限字段

:light_bulb: 一句话总结:要让两个界面一致,就不能只改 ThresholdSensor还必须同步更新 TemperatureInfoUpperThreshold 配置,或建立自动引用关系

点击此处查看详细分析解答

关于同一传感器在“门限传感器”与“温度海洋”界面显示门限值不一致的问题分析

根据您提供的详细信息,同一传感器(如 Inlet Temp)在“门限传感器”界面和“温度海洋”界面显示的门限值不一致 是一个已知的配置机制差异问题,而非系统故障。以下是基于上下文信息的全面分析和解决方案建议。


:magnifying_glass_tilted_left: 问题核心结论

根本原因: “门限传感器”界面直接读取 IPMI 标准化的 ThresholdSensor 配置,而“温度海洋”界面使用独立的 TemperatureInfo 对象配置其门限值,二者数据源独立,没有自动同步机制,导致显示不一致。


:bar_chart: 两个界面的数据来源对比

特性 门限传感器(ThresholdSensor) 温度海洋(Temperature Ocean)
数据对象类型 ThresholdSensor 类传感器对象 TemperatureInfo 配置类
配置文件 CSR/SR 配置文件中定义 ThresholdSensor_XXX 需额外配置 TemperatureInfo_XXX
门限值来源 UpperNoncritical, UpperCritical 等属性 UpperThreshold[] 数组(独立配置)
单位来源 Unit, BaseUnit 决定(如 128 表示 ℃) TemperatureInfo 中独立解析
是否自动关联 :cross_mark: 否,需手动保持一致 :cross_mark: 不自动引用 ThresholdSensor 的门限
是否支持动态引用 :white_check_mark: 支持通过 <=/XXX 表达式引用其他对象 :white_check_mark: 支持,但需显式配置引用

:puzzle_piece: 为何修改 SR 后“温度海洋”未更新?

您提到:

“尝试过修改 sr 中的值,升级后门限传感器界面跟着变了,温度海洋还是不变”

这是因为:

  • 修改的是 ThresholdSensor_InletTemp 中的 UpperNoncriticalUpperCritical 等字段 → 仅影响 “门限传感器”界面
  • 而“温度海洋”使用的 TemperatureInfo_InletTemp 对象中的 UpperThreshold 是一个独立配置项,即使传感器变了,它也不会自动更新

:white_check_mark: 结论:两个界面使用的不是同一个配置项,必须分别配置或显式建立引用关系。


:file_folder: TemperatureInfo 类配置详情(来自文档)

"TemperatureInfo_InletTemp": {
  "CoordinateX": 0,
  "CoordinateY": 0,
  "Health": "<=/ThresholdSensor_InletTemp.Health>",
  "LowerThreshold": [255, 255, 255],
  "Name": "Inlet Temp",
  "ReadingValue": "<=/Scanner_InletTemp.Value>",
  "Status": "<=/Scanner_InletTemp.Status>",
  "UpperThreshold": [255, 255, 255]
}

其中:

  • UpperThreshold 是一个 U8 数组,格式为 [轻微, 严重, 致命]
  • 255 表示 不启用该级别告警
  • 必须手动将其配置为与 ThresholdSensor 一致的值(例如 [41, 43, 255]),或通过表达式引用

:white_check_mark: 解决方案建议

:check_mark: 方案一:【推荐】在 TemperatureInfo 中显式引用 ThresholdSensor 的门限值

修改 TemperatureInfo_InletTemp 的配置,使用表达式动态获取传感器的实际门限值:

"TemperatureInfo_InletTemp": {
  "Name": "Inlet Temp",
  "ReadingValue": "<=/Scanner_InletTemp.Value>",
  "Status": "<=/Scanner_InletTemp.Status>",
  "Health": "<=/ThresholdSensor_InletTemp.Health>",
  "UpperThreshold": "expr({ \
    $1 == 255 ? 255 : $1, \
    $2 == 255 ? 255 : $2, \
    255 \
  }) |> map(function(x) return tonumber(x) end)",
  "UpperThreshold[0]": "<=/ThresholdSensor_InletTemp.UpperNoncritical>",
  "UpperThreshold[1]": "<=/ThresholdSensor_InletTemp.UpperCritical>",
  "UpperThreshold[2]": 255,
  "CoordinateX": 0,
  "CoordinateY": 6
}

:warning: 注意:当前系统可能不完全支持数组字段的直接引用,需验证 UpperThreshold[0] 是否可写。如不支持,需由后端 Lua 插件进行转换。


:check_mark: 方案二:【定制开发】修改 thermal.lua 插件实现自动映射

rackmount/interface_config/web_backend/plugins/orchestrator/thermal.lua 中,您已找到关键函数:

function m.get_temperatures_info(temperatures_info)
    local res = cjson.json_object_new_array()
    for _, temp_info in pairs(temperatures_info) do
        local data = cjson.json_object_new_object()
        data['Name'] = temp_info.Name
        data['ReadingValue'] = temp_info.ReadingValue
        data['Status'] = temp_info.Status
        data['CoordinateX'] = temp_info.CoordinateX
        data['CoordinateY'] = temp_info.CoordinateY
        data['UpperThreshold'] = cjson.json_object_from_table(
            invalid_value_transform({string.byte(temp_info.UpperThreshold, 1, #temp_info.UpperThreshold)}))
    end
    return res
end

可在此函数中加入逻辑,根据 Name 去查找对应的 ThresholdSensor 对象并自动提取门限值,替代原始的静态配置。

例如:

-- 伪代码示意
local sensor = find_sensor_by_name("Inlet Temp")
data['UpperThreshold'] = cjson.json_encode({
    sensor.UpperNoncritical or 255,
    sensor.UpperCritical or 255,
    255
})

:hammer_and_wrench: 此方法需要访问底层传感器模型,属于 cooling 组件的定制开发,需由平台团队支持。


:check_mark: 方案三:【临时修复】手动保持 TemperatureInfoThresholdSensor 一致

如果无法进行代码修改,则应确保:

门限类型 ThresholdSensor 字段 TemperatureInfo 数组位置 应配置值
轻微上门限 UpperNoncritical UpperThreshold[0] 41
严重上门限 UpperCritical UpperThreshold[1] 43
紧急上门限 UpperNonrecoverable UpperThreshold[2] 255(禁用)

在 SR 文件中硬编码匹配:

"TemperatureInfo_InletTemp": {
  "UpperThreshold": [41, 43, 255],
  ...
}

:red_exclamation_mark: 缺点:后续修改门限需同时改两处,易出错。


:pushpin: 建议操作流程

  1. 确认当前 TemperatureInfo_InletTemp.UpperThreshold 配置值
    查看 SR 配置文件,确认其是否为 [36, 38, 255],这正是您在界面上看到的值。

  2. 统一配置策略

    • 若支持表达式引用 → 使用 方案一
    • 若支持 Lua 层处理 → 推动平台团队实施 方案二
    • 否则 → 手动采用 方案三
  3. 提交定制诉求
    向 openUBMC 社区或技术支持提交需求:

    “建议增加 TemperatureInfoThresholdSensor 门限值的默认引用能力,避免配置冗余。”


:warning: 相关注意事项

  • 坐标系说明:“温度海洋”使用固定坐标系(左下角为原点),适用于 2U 机型俯视图。
  • 数据格式UpperThresholdU8 数组,数值超过 255 会被视为无效或截断。
  • 显示逻辑:温度海洋界面仅在 UpperThreshold[x] != 255 时才显示对应级别门限。
  • 缓存问题:修改 SR 后需确保 BMC 重启或配置重载生效。

:compass: 总结

项目 说明
问题性质 配置机制设计差异,非代码缺陷
主因 “温度海洋”未自动同步“门限传感器”的门限值
根因定位 TemperatureInfo.UpperThresholdThresholdSensor.UpperNoncritical 独立配置
解决方向 显式引用、定制插件、手动同步
推荐做法 TemperatureInfo 中通过 <=/ 表达式引用 ThresholdSensor 的门限字段

:light_bulb: 一句话总结:要让两个界面一致,就不能只改 ThresholdSensor还必须同步更新 TemperatureInfoUpperThreshold 配置,或建立自动引用关系

看下传感器的配置嘛

应该是数据源不一样

看下差异

门限传感器界面可以看到;温度海洋的没法看到数据源,这个 在“已尝试定位”里已经说明了

温度海洋和传感器是各自的对象写死的值。猜测是修改人员只改了传感器和事件的门限,不知道还有温度海洋这个东西