点击此处查看详细分析解答
关于同一传感器在“门限传感器”与“温度海洋”界面显示门限值不一致的问题分析
根据您提供的详细信息,同一传感器(如 Inlet Temp)在“门限传感器”界面和“温度海洋”界面显示的门限值不一致 是一个已知的配置机制差异问题,而非系统故障。以下是基于上下文信息的全面分析和解决方案建议。
问题核心结论
根本原因: “门限传感器”界面直接读取 IPMI 标准化的 ThresholdSensor 配置,而“温度海洋”界面使用独立的 TemperatureInfo 对象配置其门限值,二者数据源独立,没有自动同步机制,导致显示不一致。
两个界面的数据来源对比
| 特性 |
门限传感器(ThresholdSensor) |
温度海洋(Temperature Ocean) |
| 数据对象类型 |
ThresholdSensor 类传感器对象 |
TemperatureInfo 配置类 |
| 配置文件 |
CSR/SR 配置文件中定义 ThresholdSensor_XXX |
需额外配置 TemperatureInfo_XXX |
| 门限值来源 |
UpperNoncritical, UpperCritical 等属性 |
UpperThreshold[] 数组(独立配置) |
| 单位来源 |
Unit, BaseUnit 决定(如 128 表示 ℃) |
从 TemperatureInfo 中独立解析 |
| 是否自动关联 |
否,需手动保持一致 |
不自动引用 ThresholdSensor 的门限 |
| 是否支持动态引用 |
支持通过 <=/XXX 表达式引用其他对象 |
支持,但需显式配置引用 |
为何修改 SR 后“温度海洋”未更新?
您提到:
“尝试过修改 sr 中的值,升级后门限传感器界面跟着变了,温度海洋还是不变”
这是因为:
- 修改的是
ThresholdSensor_InletTemp 中的 UpperNoncritical、UpperCritical 等字段 → 仅影响 “门限传感器”界面。
- 而“温度海洋”使用的
TemperatureInfo_InletTemp 对象中的 UpperThreshold 是一个独立配置项,即使传感器变了,它也不会自动更新。
结论:两个界面使用的不是同一个配置项,必须分别配置或显式建立引用关系。
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]),或通过表达式引用
解决方案建议
方案一:【推荐】在 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
}
注意:当前系统可能不完全支持数组字段的直接引用,需验证 UpperThreshold[0] 是否可写。如不支持,需由后端 Lua 插件进行转换。
方案二:【定制开发】修改 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
})
此方法需要访问底层传感器模型,属于 cooling 组件的定制开发,需由平台团队支持。
方案三:【临时修复】手动保持 TemperatureInfo 与 ThresholdSensor 一致
如果无法进行代码修改,则应确保:
| 门限类型 |
ThresholdSensor 字段 |
TemperatureInfo 数组位置 |
应配置值 |
| 轻微上门限 |
UpperNoncritical |
UpperThreshold[0] |
41 |
| 严重上门限 |
UpperCritical |
UpperThreshold[1] |
43 |
| 紧急上门限 |
UpperNonrecoverable |
UpperThreshold[2] |
255(禁用) |
在 SR 文件中硬编码匹配:
"TemperatureInfo_InletTemp": {
"UpperThreshold": [41, 43, 255],
...
}
缺点:后续修改门限需同时改两处,易出错。
建议操作流程
-
确认当前 TemperatureInfo_InletTemp.UpperThreshold 配置值
查看 SR 配置文件,确认其是否为 [36, 38, 255],这正是您在界面上看到的值。
-
统一配置策略
- 若支持表达式引用 → 使用 方案一
- 若支持 Lua 层处理 → 推动平台团队实施 方案二
- 否则 → 手动采用 方案三
-
提交定制诉求
向 openUBMC 社区或技术支持提交需求:
“建议增加 TemperatureInfo 对 ThresholdSensor 门限值的默认引用能力,避免配置冗余。”
相关注意事项
- 坐标系说明:“温度海洋”使用固定坐标系(左下角为原点),适用于 2U 机型俯视图。
- 数据格式:
UpperThreshold 是 U8 数组,数值超过 255 会被视为无效或截断。
- 显示逻辑:温度海洋界面仅在
UpperThreshold[x] != 255 时才显示对应级别门限。
- 缓存问题:修改 SR 后需确保 BMC 重启或配置重载生效。
总结
| 项目 |
说明 |
| 问题性质 |
配置机制设计差异,非代码缺陷 |
| 主因 |
“温度海洋”未自动同步“门限传感器”的门限值 |
| 根因定位 |
TemperatureInfo.UpperThreshold 与 ThresholdSensor.UpperNoncritical 独立配置 |
| 解决方向 |
显式引用、定制插件、手动同步 |
| 推荐做法 |
在 TemperatureInfo 中通过 <=/ 表达式引用 ThresholdSensor 的门限字段 |
一句话总结:要让两个界面一致,就不能只改 ThresholdSensor,还必须同步更新 TemperatureInfo 的 UpperThreshold 配置,或建立自动引用关系。