ThresholdSensor传感器的值无法更新

问题描述

配置了6个电压的ThresholdSensor,reading值来自与自己配置的对象,想法是参考ThresholdSensor_CPU1TBDVFS对象,当前需要的对象MyCSRModel_Chip_Adc0_1存在,里面的值也是刷新的,但是传感器这边的值有时候是0,有时候有值,有值的时候好像也保持一个数字不更新。
一开始是高低告警门限配置错了,后来门限改对了,现象还是一样

这种是可以读到值的时候,这个Reading值是223

%lsprop ThresholdSensor_Adc0_1Sensor_0101
bmc.kepler.Object.Properties
  ClassName="ThresholdSensor"
  ObjectIdentifier=[1,"1","1","0101"]
  ObjectName="ThresholdSensor_Adc0_1Sensor_0101"
  TraceSamplingRate=0
bmc.kepler.Systems.ThresholdSensor
  Capabilities=232
  EntityId=98
  EntityInstance=102
  LowerCritical=150
  LowerNoncritical=0
  LowerNonrecoverable=0
  NegativeHysteresis=4
  OriginalReading=0
  OwnerLun=0
  PositiveHysteresis=4
  Reading=223
  ReadingMask=4626
  ReadingStatus=0
  SensorIdentifier=""
  SensorName="Adc0_1 voltage Sensor"
  SensorNumber=8
  SensorType=2
  UpperCritical=240
  UpperNoncritical=0
  UpperNonrecoverable=0
bmc.kepler.Systems.ThresholdSensorDisplay
  AssertStatus=0
  Health="OK"
  LowerCriticalDisplay="0.750"
  LowerNoncriticalDisplay="0.000"
  LowerNonrecoverableDisplay="0.000"
  NegativeHysteresisDisplay="0.020"
  PositiveHysteresisDisplay="0.020"
  ReadingDisplay="1.115"
  Status="Enabled"
  UnitDisplay="Volts"
  UpperCriticalDisplay="1.200"
  UpperNoncriticalDisplay="0.000"
  UpperNonrecoverableDisplay="0.000"
Private
  Accuracy=0
  Analog=1
  AssertMask=516
  B=0
  BA=0
  BaseUnit=4
  BelongsToSystem=false
  DeassertMask=516
  Initialization=127
  IsValid=true
  Linearization=0
  M=5
  MT=0
  MaximumReading=127
  MinimumReading=0
  ModifierUnit=0
  NominalReading=90
  NormalMaximum=0
  NormalMinimum=0
  OwnerId=32
  RBExp=208
  ReadingType=1
  Unit=0

下面这个是读不到值的时候,Reading值是0

% lsprop ThresholdSensor_Adc0_1Sensor_0101
bmc.kepler.Object.Properties
  ClassName="ThresholdSensor"
  ObjectIdentifier=[1,"1","1","0101"]
  ObjectName="ThresholdSensor_Adc0_1Sensor_0101"
  TraceSamplingRate=0
bmc.kepler.Systems.ThresholdSensor
  Capabilities=232
  EntityId=98
  EntityInstance=102
  LowerCritical=150
  LowerNoncritical=0
  LowerNonrecoverable=0
  NegativeHysteresis=4
  OriginalReading=0
  OwnerLun=0
  PositiveHysteresis=4
  Reading=0
  ReadingMask=4626
  ReadingStatus=0
  SensorIdentifier=""
  SensorName="Adc0_1 voltage Sensor"
  SensorNumber=8
  SensorType=2
  UpperCritical=240
  UpperNoncritical=0
  UpperNonrecoverable=0
bmc.kepler.Systems.ThresholdSensorDisplay
  AssertStatus=4
  Health="Major"
  LowerCriticalDisplay="0.750"
  LowerNoncriticalDisplay="0.000"
  LowerNonrecoverableDisplay="0.000"
  NegativeHysteresisDisplay="0.020"
  PositiveHysteresisDisplay="0.020"
  ReadingDisplay="0.000"
  Status="Enabled"
  UnitDisplay="Volts"
  UpperCriticalDisplay="1.200"
  UpperNoncriticalDisplay="0.000"
  UpperNonrecoverableDisplay="0.000"
Private
  Accuracy=0
  Analog=1
  AssertMask=516
  B=0
  BA=0
  BaseUnit=4
  BelongsToSystem=false
  DeassertMask=516
  Initialization=127
  IsValid=true
  Linearization=0
  M=5
  MT=0
  MaximumReading=127
  MinimumReading=0
  ModifierUnit=0
  NominalReading=90
  NormalMaximum=0
  NormalMinimum=0
  OwnerId=32
  RBExp=208
  ReadingType=1
  Unit=0

看了一下区别,AssertStatus不一样,但是没有地方解释这里的AssertStatus=4是什么意思,只找到如下的解释:

AssertStatus U16 只读 变更广播 传感器SEL事件状态,bit0 - bit14依次对应15种offset的离散事件状态,1:Assert;0:Deassert

环境信息

2509版本
属性来源时这个dbus

~ ~ $ busctl --user introspect  bmc.kepler.complex_sensor /bmc/demo/MyCSRModel/MyCSRModel_Chip_Adc0_1_0101  | cat
NAME                                TYPE      SIGNATURE   RESULT/VALUE                  FLAGS
bmc.demo.OpenUBMC.Reading           interface -           -                             -
.Channel                            property  y           1                             emits-change
.Chip                               property  y           0                             emits-change
.TemperatureCelsius                 property  n           1116                          emits-change writable
.Value                              property  t           1116                          emits-change writable
bmc.kepler.Object.Properties        interface -           -                             -
.GetAllWithContext                  method    a{ss}s      a{sv}                         -
.GetOptions                         method    a{ss}ss     a{ss}                         -
.GetPrivateProperties               method    a{ss}       s                             -
.GetPropertiesByNames               method    a{ss}sas    a{sv}a{sv}                    -
.GetPropertiesByOptions             method    a{ss}sa{ss} as                            -
.GetPropertyDetail                  method    a{ss}ss     s                             -
.GetWithContext                     method    a{ss}ss     v                             -
.SetWithContext                     method    a{ss}ssv    -                             -
.ClassName                          property  s           "MyCSRModel"                  emits-change
.ObjectIdentifier                   property  (ysss)      1 "1" "1" "0101"              emits-change
.ObjectName                         property  s           "MyCSRModel_Chip_Adc0_1_0101" emits-change
.TraceSamplingRate                  property  d           0                             emits-change
org.freedesktop.DBus.Introspectable interface -           -                             -
.Introspect                         method    -           s                             -
org.freedesktop.DBus.ObjectManager  interface -           -                             -
.GetManagedObjects                  method    -           a{oa{sa{sv}}}                 -
org.freedesktop.DBus.Peer           interface -           -                             -
.GetMachineId                       method    -           s                             -
.Ping                               method    -           -                             -
org.freedesktop.DBus.Properties     interface -           -                             -
.Get                                method    ss          v                             -
.GetAll                             method    s           a{sv}                         -
.Set                                method    ssv         -                             -
.PropertiesChanged                  signal    sa{sv}as    -                             -

mds里面的配置是

{
    "bmc.demo.OpenUBMC.Reading": {
        "properties": {
            "TemperatureCelsius": {
                "baseType": "S16",
                "descriptions": "OpenUBMC示例中的温度读值"
            },
            "Chip": {
                "baseType": "U8",
                "readOnly": true,
                "description": "Chip"
            },
            "Channel": {
                "baseType": "U8",
                "readOnly": true,
                "description": "Channel"
            },
            "Value": {
                "baseType": "U64",
                "description": "从芯片读到的值",
                "options": {
                    "emitsChangedSignal": "true"
                }
            }
        }
    }
}

sr里面的配置是:

"ThresholdSensor_Adc0_1Sensor": {
      "OwnerId": 32,
      "OwnerLun": 0,
      "EntityId": "<=/Entity_Adc0_1Sensor.Id",
      "EntityInstance": "<=/Entity_Adc0_1Sensor.Instance",
      "Initialization": 127,
      "Capabilities": 232,
      "SensorType": 2,
      "ReadingType": 1,
      "SensorName": "Adc0_1 voltage Sensor",
      "Unit": 0,
      "BaseUnit": 4,
      "ModifierUnit": 0,
      "Analog": 1,
      "NominalReading": 90,
      "NormalMaximum": 0,
      "NormalMinimum": 0,
      "MaximumReading": 255,
      "MinimumReading": 0,
      "Reading": "<=/MyCSRModel_Chip_Adc0_1.Value |> expr($1 / 5)",
      "AssertMask": 516,
      "DeassertMask": 516,
      "ReadingMask": 4626,
      "Linearization": 0,
      "M": 5,
      "RBExp": 208,
      "UpperCritical": 240,
      "LowerCritical": 150,
      "PositiveHysteresis": 4,
      "NegativeHysteresis": 4
    },

从sensor的日志看,有时候能成功,打印的是

1970-01-01 02:09:48.818462 sensor NOTICE: sensor_instance.lua(542): Adc1_0 voltage Sensor|{"value":[1129],"type":"synchronization","source":{"properties":[{"Service":"bmc.kepler.complex_sensor","Interface":"bmc.demo.OpenUBMC.Reading","Property":"Value","Path":"/bmc/demo/MyCSRModel/MyCSRModel_Chip_Adc1_0_0101"}],"expressions":["expr($1 / 5)"]}}
1970-01-01 02:09:48.918463 sensor NOTICE: sensor_instance.lua(542): Adc1_0 voltage Sensor|{"value":[1129],"type":"synchronization","source":{"properties":[{"Service":"bmc.kepler.complex_sensor","Interface":"bmc.demo.OpenUBMC.Reading","Property":"Value","Path":"/bmc/demo/MyCSRModel/MyCSRModel_Chip_Adc1_0_0101"}],"expressions":["expr($1 / 5)"]}}
1970-01-01 02:09:49.025074 sensor NOTICE: sel_management.lua(688): add sel[{"SensorName":"Adc1_0 voltage Sensor","RecordSeq":476,"SubjectName":"Adc1_0 voltage Sensor","SensorType":2,"SensorId":"ThresholdSensor_Adc1_0Sensor_0101","SelEventType":129,"SensorNumber":13,"SelMsgVersion":4,"GenerateId":32,"Timestamp":7788,"SelType":2,"RecordId":476,"SelData3":150,"SelData2":225,"SelData1":82}] successfully, record id is 476
1970-01-01 02:09:49.025392 sensor NOTICE: sensor_instance.lua(582): [ThresholdSensor_Adc1_0Sensor_0101] deassert an event [reading: 225, LowerCritical threshold: 150]
1970-01-01 02:09:49.411985 sensor NOTICE: sensor_instance.lua(542): Adc1_2 voltage Sensor|{"value":[843],"type":"synchronization","source":{"properties":[{"Service":"bmc.kepler.complex_sensor","Interface":"bmc.demo.OpenUBMC.Reading","Property":"Value","Path":"/bmc/demo/MyCSRModel/MyCSRModel_Chip_Adc1_2_0101"}],"expressions":["expr($1 / 5)"]}}
1970-01-01 02:09:49.536823 sensor NOTICE: sensor_instance.lua(542): Adc1_2 voltage Sensor|{"value":[843],"type":"synchronization","source":{"properties":[{"Service":"bmc.kepler.complex_sensor","Interface":"bmc.demo.OpenUBMC.Reading","Property":"Value","Path":"/bmc/demo/MyCSRModel/MyCSRModel_Chip_Adc1_2_0101"}],"expressions":["expr($1 / 5)"]}}
1970-01-01 02:09:49.731862 sensor NOTICE: sel_management.lua(688): add sel[{"SensorName":"Adc1_0 voltage Sensor","RecordSeq":477,"SubjectName":"Adc1_0 voltage Sensor","SensorType":2,"SensorId":"ThresholdSensor_Adc1_0Sensor_0101","SelEventType":129,"SensorNumber":13,"SelMsgVersion":4,"GenerateId":32,"Timestamp":7789,"SelType":2,"RecordId":477,"SelData3":150,"SelData2":225,"SelData1":82}] successfully, record id is 477
1970-01-01 02:09:49.732214 sensor NOTICE: sensor_instance.lua(582): [ThresholdSensor_Adc1_0Sensor_0101] deassert an event [reading: 225, LowerCritical threshold: 150]
1970-01-01 02:09:50.305392 sensor NOTICE: sel_management.lua(688): add sel[{"SensorName":"Adc1_2 voltage Sensor","RecordSeq":478,"SubjectName":"Adc1_2 voltage Sensor","SensorType":2,"SensorId":"ThresholdSensor_Adc1_2Sensor_0101","SelEventType":129,"SensorNumber":14,"SelMsgVersion":4,"GenerateId":32,"Timestamp":7789,"SelType":2,"RecordId":478,"SelData3":150,"SelData2":168,"SelData1":82}] successfully, record id is 478
1970-01-01 02:09:50.305760 sensor NOTICE: sensor_instance.lua(582): [ThresholdSensor_Adc1_2Sensor_0101] deassert an event [reading: 168, LowerCritical threshold: 150]
1970-01-01 02:09:50.562563 sensor NOTICE: sel_management.lua(688): add sel[{"SensorName":"Adc1_2 voltage Sensor","RecordSeq":479,"SubjectName":"Adc1_2 voltage Sensor","SensorType":2,"SensorId":"ThresholdSensor_Adc1_2Sensor_0101","SelEventType":129,"SensorNumber":14,"SelMsgVersion":4,"GenerateId":32,"Timestamp":7790,"SelType":2,"RecordId":479,"SelData3":150,"SelData2":168,"SelData1":82}] successfully, record id is 479
1970-01-01 02:09:50.569275 sensor NOTICE: sensor_instance.lua(582): [ThresholdSensor_Adc1_2Sensor_0101] deassert an event [reading: 168, LowerCritical threshold: 150]
1970-01-01 02:09:51.705956 sensor NOTICE: sensor_instance.lua(542): Adc1_1 voltage Sensor|{"value":[1117],"type":"synchronization","source":{"properties":[{"Service":"bmc.kepler.complex_sensor","Interface":"bmc.demo.OpenUBMC.Reading","Property":"Value","Path":"/bmc/demo/MyCSRModel/MyCSRModel_Chip_Adc1_1_0101"}],"expressions":["expr($1 / 5)"]}}
1970-01-01 02:09:51.875636 sensor NOTICE: sensor_instance.lua(542): Adc1_1 voltage Sensor|{"value":[1117],"type":"synchronization","source":{"properties":[{"Service":"bmc.kepler.complex_sensor","Interface":"bmc.demo.OpenUBMC.Reading","Property":"Value","Path":"/bmc/demo/MyCSRModel/MyCSRModel_Chip_Adc1_1_0101"}],"expressions":["expr($1 / 5)"]}}
1970-01-01 02:09:52.027261 sensor NOTICE: sel_management.lua(688): add sel[{"SensorName":"Adc1_1 voltage Sensor","RecordSeq":480,"SubjectName":"Adc1_1 voltage Sensor","SensorType":2,"SensorId":"ThresholdSensor_Adc1_1Sensor_0101","SelEventType":129,"SensorNumber":16,"SelMsgVersion":4,"GenerateId":32,"Timestamp":7791,"SelType":2,"RecordId":480,"SelData3":150,"SelData2":223,"SelData1":82}] successfully, record id is 480
1970-01-01 02:09:52.028174 sensor NOTICE: sensor_instance.lua(582): [ThresholdSensor_Adc1_1Sensor_0101] deassert an event [reading: 223, LowerCritical threshold: 150]
1970-01-01 02:09:52.180477 sensor NOTICE: sel_management.lua(688): add sel[{"SensorName":"Adc1_1 voltage Sensor","RecordSeq":481,"SubjectName":"Adc1_1 voltage Sensor","SensorType":2,"SensorId":"ThresholdSensor_Adc1_1Sensor_0101","SelEventType":129,"SensorNumber":16,"SelMsgVersion":4,"GenerateId":32,"Timestamp":7792,"SelType":2,"RecordId":481,"SelData3":150,"SelData2":223,"SelData1":82}] successfully, record id is 481
1970-01-01 02:09:52.181087 sensor NOTICE: sensor_instance.lua(582): [ThresholdSensor_Adc1_1Sensor_0101] deassert an event [reading: 223, LowerCritical threshold: 150]

有时候添加失败

77 sensor ERROR: sdr_management.lua(547): fru sdr by obj no need to process.
1970-01-01 01:10:23.231039 sensor ERROR: sel_management.lua(690): add sel[{"SelData1":89,"SensorType":2,"SelType":2,"SelData3":240,"SubjectName":"Adc0_3 voltage Sensor","SensorName":"Adc0_3 voltage Sensor","SensorId":"ThresholdSensor_Adc0_3Sensor_0101","SelEventType":129,"SensorNumber":6,"SelMsgVersion":4,"GenerateId":32,"SelData2":222}] failed
1970-01-01 01:10:23.499729 sensor ERROR: sel_management.lua(690): add sel[{"SelData1":89,"SensorType":2,"SelType":2,"SelData3":240,"SubjectName":"Adc0_3 voltage Sensor","SensorName":"Adc0_3 voltage Sensor","SensorId":"ThresholdSensor_Adc0_3Sensor_0101","SelEventType":129,"SensorNumber":6,"SelMsgVersion":4,"GenerateId":32,"SelData2":222}] failed
1970-01-01 01:10:23.774344 sensor ERROR: sel_management.lua(690): add sel[{"SelData1":82,"SensorType":2,"SelType":2,"SelData3":150,"SubjectName":"Adc0_1 voltage Sensor","SensorName":"Adc0_1 voltage Sensor","SensorId":"ThresholdSensor_Adc0_1Sensor_0101","SelEventType":129,"SensorNumber":8,"SelMsgVersion":4,"GenerateId":32,"SelData2":223}] failed
1970-01-01 01:10:23.994434 sensor ERROR: sel_management.lua(690): add sel[{"SelData1":82,"SensorType":2,"SelType":2,"SelData3":150,"SubjectName":"Adc0_1 voltage Sensor","SensorName":"Adc0_1 voltage Sensor","SensorId":"ThresholdSensor_Adc0_1Sensor_0101","SelEventType":129,"SensorNumber":8,"SelMsgVersion":4,"GenerateId":32,"SelData2":223}] failed
1970-01-01 01:10:24.184751 sensor ERROR: sel_management.lua(690): add sel[{"SelData1":89,"SensorType":2,"SelType":2,"SelData3":240,"SubjectName":"Adc1_0 voltage Sensor","SensorName":"Adc1_0 voltage Sensor","SensorId":"ThresholdSensor_Adc1_0Sensor_0101","SelEventType":129,"SensorNumber":9,"SelMsgVersion":4,"GenerateId":32,"SelData2":225}] failed
1970-01-01 01:10:24.500778 sensor ERROR: sel_management.lua(690): add sel[{"SelData1":89,"SensorType":2,"SelType":2,"SelData3":240,"SubjectName":"Adc1_0 voltage Sensor","SensorName":"Adc1_0 voltage Sensor","SensorId":"ThresholdSensor_Adc1_0Sensor_0101","SelEventType":129,"SensorNumber":9,"SelMsgVersion":4,"GenerateId":32,"SelData2":225}] failed
1970-01-01 01:10:24.693101 sensor ERROR: sel_management.lua(690): add sel[{"SelData1":89,"SensorType":2,"SelType":2,"SelData3":240,"SubjectName":"Adc1_1 voltage Sensor","SensorName":"Adc1_1 voltage Sensor","SensorId":"ThresholdSensor_Adc1_1Sensor_0101","SelEventType":129,"SensorNumber":11,"SelMsgVersion":4,"GenerateId":32,"SelData2":223}] failed
1970-01-01 01:10:24.867595 sensor ERROR: sel_management.lua(690): add sel[{"SelData1":89,"SensorType":2,"SelType":2,"SelData3":240,"SubjectName":"Adc1_1 voltage Sensor","SensorName":"Adc1_1 voltage Sensor","SensorId":"ThresholdSensor_Adc1_1Sensor_0101","SelEventType":129,"SensorNumber":11,"SelMsgVersion":4,"GenerateId":32,"SelData2":223}] failed
1970-01-01 01:10:25.242283 sensor ERROR: sel_management.lua(690): add sel[{"SelData1":82,"SensorType":2,"SelType":2,"SelData3":150,"SubjectName":"Adc0_2 voltage Sensor","SensorName":"Adc0_2 voltage Sensor","SensorId":"ThresholdSensor_Adc0_2Sensor_0101","SelEventType":129,"SensorNumber":12,"SelMsgVersion":4,"GenerateId":32,"SelData2":176}] failed
1970-01-01 01:10:25.372431 sensor ERROR: sel_management.lua(690): add sel[{"SelData1":82,"SensorType":2,"SelType":2,"SelData3":150,"SubjectName":"Adc0_2 voltage Sensor","SensorName":"Adc0_2 voltage Sensor","SensorId":"ThresholdSensor_Adc0_2Sensor_0101","SelEventType":129,"SensorNumber":12,"SelMsgVersion":4,"GenerateId":32,"SelData2":176}] failed

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

:receipt: 总结与建议

问题点 分析结论 建议
Reading 时为 0,时为 223 数据同步链路不稳定或越界导致无效 引入 Scanner 中间层
AssertStatus = 4 bit[2] 被置位 → 触发 Lower Non-critical 警告 检查是否 Reading 过低或误判
MaximumReading = 127 vs 读数=223 超出合法范围,导致逻辑异常 改为 255
无 ReadingStatus 同步 无法判断数据有效性 配置 ReadingStatus 来源
直接绑定 CSR Model 属性 openUBMC 不保证事件监听可靠性 使用 Scanner 保证同步机制

:white_check_mark: 最终推荐操作步骤:

  1. 新增 Scanner 对象,用于代理 MyCSRModel_Chip_Adc0_1.Value
  2. 修改 ThresholdSensor.Reading 来源,指向 Scanner 并保留表达式;
  3. 同步配置 ReadingStatus
  4. MaximumReading 改为 255
  5. 重启 bmc.kepler.sensor 服务,验证效果

:white_check_mark: 遵循 openUBMC 的标准传感器接入模式,才能保证数据稳定性与可维护性。

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

ThresholdSensor 传感器读值不稳定问题分析与解决方案

根据您提供的问题描述和系统信息,ThresholdSensor_Adc0_1Sensor_0101 的读值在 0223 之间不稳定波动,且实际来源对象(MyCSRModel_Chip_Adc0_1)的数据是正常更新的。以下是对该问题的系统性分析和解决方案。


:magnifying_glass_tilted_left: 问题现象总结

  • 现象
    ThresholdSensorReading 值频繁在 0223 之间切换,未能持续反映真实传感器数据。
  • 数据源正常
    D-Bus 接口 MyCSRModel_Chip_Adc0_1_0101.Value 属性会正常变化(如 1116),说明底层硬件读数正常。
  • 关键差异点
    • Reading = 223 时,AssertStatus = 0Healthy = "OK"
    • Reading = 0 时,AssertStatus = 4Health = "Major"
  • 配置逻辑
    Reading 由表达式 <=/MyCSRModel_Chip_Adc0_1.Value |> expr($1 / 5) 配置为从上游对象同步并做除法处理。

:puzzle_piece: 核心原因分析

1. AssertStatus = 4 的含义

尽管文档中未直接说明 AssertStatus=4 含义,但从 IPMI 协议及 openUBMC 实现来看:

AssertStatus 是一个 16 位无符号整数(uint16),其每个 bit 代表某种传感器事件的状态(1 表示 Assert,0 表示 Deassert)。

  • AssertStatus = 4 → 二进制为 0000 0000 0000 0100 → 即 bit[2] 被置位 → 下限非临界事件(Lower Non-critical)被触发
  • 这说明:当 Reading 被计算或传递为 0 时,值低于 LowerNoncritical 阈值(当前为 0),导致触发告警事件,进而使 AssertStatus 的 bit[2] 被置位。

:white_check_mark: 推论:Reading 值变为 0 是由于数据同步失败或表达式计算异常引起,并非故意设置。


2. 数据源同步机制分析

您在 .sr 文件中使用了如下表达式配置:

"Reading": "<=/MyCSRModel_Chip_Adc0_1.Value |> expr($1 / 5)"

此表达式的执行流程如下:

  1. 从 D-Bus 对象 /bmc/demo/MyCSRModel/MyCSRModel_Chip_Adc0_1_0101 获取 Value 属性;
  2. 将其值作为 $1 输入到表达式 expr($1 / 5)
  3. 将结果赋值给 ThresholdSensor.Reading

但关键在于:

:white_check_mark: ThresholdSensor.Reading 并不能直接监听 /MyCSRModel_Chip_Adc0_1.Value 的信号变化,除非它通过 Scanner 对象中间同步。

而当前架构中,ThresholdSensorReading 属性要求与 Scanner 对象 同步。但您直接绑定到了 CSR Model 属性,存在 信号链断裂风险

:cross_mark: 问题根源可能在于:表达式依赖的 D-Bus 属性变更事件未被 sensor 组件正确捕获。


3. ReadingMask 与 MaximumReading 的配置矛盾

观察配置项:

"MaximumReading": 127,
"MinimumReading": 0,
"ReadingMask": 4626

MyCSRModel_Chip_Adc0_1.Value 提供的是 U64 类型(如 1116),经 /5 后为 223.2 → 取整为 223

然而:

  • MaximumReading = 127 表示该传感器认为最大合法读数为 127。
  • 实际读取值 223 > 127违反了传感器的有效范围限制

:yellow_circle: 当 Reading > MaximumReading 或 < MinimumReading 时,sensor 组件会认为读值无效,可能将 Reading 重置为 0 或触发异常状态!


4. ReadingStatus 的缺失

在 openUBMC 中:

  • ThresholdSensor.Reading:存储传感器当前原始读值;
  • ThresholdSensor.ReadingStatus:指示读值的 有效性状态(例如:SCAN_NORMAL=0,SCAN_FAILURE=1 等);
  • 二者都必须通过 Scanner 实现同步

但您的配置中:

  • 没有定义 Scanner 对象;
  • ReadingStatus 虽为 0,但无法动态更新,可能导致系统误判为“固定有效”,而实际来源不稳定。

这种模式下一旦出现一次读取失败,后续状态无法反映,导致逻辑混乱。


:white_check_mark: 解决方案建议

:white_check_mark: 方案一:引入 Scanner 对象作为中间层(推荐)

在 openUBMC 框架中,正确的做法是通过 Scanner 对象定期采集原始数据,并被 ThresholdSensor 同步。

:white_check_mark: 正确架构流程:

[MyCSRModel_Chip_Adc0_1.Value (D-Bus)]
          ↓ (Signal emit)
    [Scanner_Adc0_1_Voltage]
          ↓ (Synchronization)
  [ThresholdSensor.Reading] ← expr(Scanner.Value / 5)

:page_facing_up: SR 配置修改示例:

// 1. 定义 Scanner
"Scanner_Adc0_1_Voltage": {
  "Service": "bmc.kepler.hwproxy",
  "Path": "/bmc/demo/MyCSRModel/MyCSRModel_Chip_Adc0_1_0101",
  "Interface": "bmc.demo.OpenUBMC.Reading",
  "Property": "Value"
},

// 2. 修改 ThresholdSensor 的 Reading 源
"ThresholdSensor_Adc0_1Sensor": {
  "OwnerId": 32,
  "OwnerLun": 0,
  "EntityId": "<=/Entity_Adc0_1Sensor.Id",
  "EntityInstance": "<=/Entity_Adc0_1Sensor.Instance",
  "Initialization": 127,
  "Capabilities": 232,
  "SensorType": 2,
  "ReadingType": 1,
  "SensorName": "Adc0_1 voltage Sensor",
  "Unit": 0,
  "BaseUnit": 4,
  "ModifierUnit": 0,
  "Analog": 1,
  "NominalReading": 90,
  "NormalMaximum": 0,
  "NormalMinimum": 0,
  "MaximumReading": 255,       // ✅ 改为255以兼容223
  "MinimumReading": 0,
  "Reading": "<=/Scanner_Adc0_1_Voltage.Value |> expr($1 / 5)",
  "ReadingStatus": "<=/Scanner_Adc0_1_Voltage.Status |> expr($1 == 0 ? 0 : 2)",  // 可选映射
  "AssertMask": 516,
  "DeassertMask": 516,
  "ReadingMask": 4626,
  "Linearization": 0,
  "M": 1,
  "RBExp": 208,
  "UpperCritical": 240,
  "LowerCritical": 150,
  "PositiveHysteresis": 4,
  "NegativeHysteresis": 4
}

:warning: 注意:必须确保 bmc.kepler.sensor 服务能够访问 Scanner 对象的 ValueStatus 属性。


:white_check_mark: 方案二:强制验证表达式健壮性(临时规避)

如果暂时无法引入 Scanner,应对表达式增加健壮判断:

"Reading": "<=/MyCSRModel_Chip_Adc0_1.Value |> expr($1 > 0 && $1 <= 65535 ? ($1 / 5) : 0)"

并适当增加默认值保护。


:white_check_mark: 方案三:调整 MaximumReading

当前 MaximumReading = 127 但预期读数为 223,明显不合理。

"MaximumReading": 255

:warning: 否则超出范围的读数将被视为无效,可能导致 Reading 被强制清零。


:hammer_and_wrench: 排查建议命令

1. 查看 Scanner 是否存在及状态

mdbctl lsobj Scanner_Adc0_1_Voltage
mdbctl lsprop Scanner_Adc0_1.Value 的更新频率、信号发射机制;
- `sensor` 服务的日志(如 `sensor.log`)中是否有同步失败记录;
- `mdbctl lsprop ThresholdSensor_Adc0_1Sensor_0101` 查看历史变化;
- 使用 `busctl monitor` 监听 D-Bus 属性变更是否被触发;
- 检查 `ThresholdSensor` 是否被扫描服务正确加载。

---

## 🧾 总结与建议

| 问题点 | 分析结论 | 建议 |
|--------|--------|------|
| `Reading` 时为 0,时为 223 | 数据同步链路不稳定或越界导致无效 | 引入 Scanner 中间层 |
| `AssertStatus = 4` | bit[2] 被置位 → 触发 Lower Non-critical 警告 | 检查是否 Reading 过低或误判 |
| `MaximumReading = 127` vs 读数=223 | 超出合法范围,导致逻辑异常 | 改为 255 |
| 无 ReadingStatus 同步 | 无法判断数据有效性 | 配置 ReadingStatus 来源 |
| 直接绑定 CSR Model 属性 | openUBMC 不保证事件监听可靠性 | 使用 Scanner 保证同步机制 |

---

### ✅ 最终推荐操作步骤:

1. **新增 Scanner 对象**,用于代理 `MyCSRModel_Chip_Adc0_1.Value`;
2. **修改 `ThresholdSensor.Reading` 来源**,指向 Scanner 并保留表达式;
3. **同步配置 `ReadingStatus`**;
4. **将 `MaximumReading` 改为 255**;
5. **重启 `bmc.kepler.sensor` 服务,验证效果**。

> ✅ 遵循 openUBMC 的标准传感器接入模式,才能保证数据稳定性与可维护性。

--- 

如仍有问题,建议提供 `sensor.log` 或 `journalctl -u bmc.kepler.sensor` 的日志片段以进一步排查。
**`MaximumReading`**这个值修改成255了,还是不更新值,

% lsprop MyCSRModel_Chip_Adc0_1_0101
bmc.demo.OpenUBMC.Reading
  Channel=1
  Chip=0
  TemperatureCelsius=0
  Value=1115
bmc.kepler.Object.Properties
  ClassName="MyCSRModel"
  ObjectIdentifier=[1,"1","1","0101"]
  ObjectName="MyCSRModel_Chip_Adc0_1_0101"
  TraceSamplingRate=0

% setprop set MyCSRModel_Chip_Adc0_1_0101 bmc.demo.OpenUBMC.Reading Value 1150
Success

% lsprop MyCSRModel_Chip_Adc0_1_0101
bmc.demo.OpenUBMC.Reading
  Channel=1
  Chip=0
  TemperatureCelsius=0
  Value=1150
bmc.kepler.Object.Properties
  ClassName="MyCSRModel"
  ObjectIdentifier=[1,"1","1","0101"]
  ObjectName="MyCSRModel_Chip_Adc0_1_0101"
  TraceSamplingRate=0

% lsprop ThresholdSensor_Adc0_1Sensor_0101
bmc.kepler.Object.Properties
  ClassName="ThresholdSensor"
  ObjectIdentifier=[1,"1","1","0101"]
  ObjectName="ThresholdSensor_Adc0_1Sensor_0101"
  TraceSamplingRate=0
bmc.kepler.Systems.ThresholdSensor
  Capabilities=232
  EntityId=98
  EntityInstance=102
  LowerCritical=150
  LowerNoncritical=0
  LowerNonrecoverable=0
  NegativeHysteresis=4
  OriginalReading=0
  OwnerLun=0
  PositiveHysteresis=4
  Reading=223
  ReadingMask=4626
  ReadingStatus=0
  SensorIdentifier=""
  SensorName="Adc0_1 voltage Sensor"
  SensorNumber=9
  SensorType=2
  UpperCritical=240
  UpperNoncritical=0
  UpperNonrecoverable=0
bmc.kepler.Systems.ThresholdSensorDisplay
  AssertStatus=0
  Health="OK"
  LowerCriticalDisplay="0.750"
  LowerNoncriticalDisplay="0.000"
  LowerNonrecoverableDisplay="0.000"
  NegativeHysteresisDisplay="0.020"
  PositiveHysteresisDisplay="0.020"
  ReadingDisplay="1.115"
  Status="Enabled"
  UnitDisplay="Volts"
  UpperCriticalDisplay="1.200"
  UpperNoncriticalDisplay="0.000"
  UpperNonrecoverableDisplay="0.000"
Private
  Accuracy=0
  Analog=1
  AssertMask=516
  B=0
  BA=0
  BaseUnit=4
  BelongsToSystem=false
  DeassertMask=516
  Initialization=127
  IsValid=true
  Linearization=0
  M=5
  MT=0
  MaximumReading=255
  MinimumReading=0
  ModifierUnit=0
  NominalReading=90
  NormalMaximum=0
  NormalMinimum=0
  OwnerId=32
  RBExp=208
  ReadingType=1
  Unit=0

%

设置了 MyCSRModel_Chip_Adc0_1_0101的值,从1115换到1150,但是ThresholdSensor_Adc0_1Sensor_0101的Reading值还是223,对应的是1115,223*5=1115,1150/5=230,这个值变成1150了,下面的读值应该变成230的,结果没变

从sensor的sync_property_trace.log看到,我的传感器里面的变更只有

ThresholdSensor ThresholdSensor_Adc0_1Sensor_0101 Reading: 223 ["expr($1 / 5)"]
    $1: bmc.kepler.complex_sensor /bmc/demo/MyCSRModel/MyCSRModel_Chip_Adc0_1_0101 bmc.demo.OpenUBMC.Reading Value [1116] ["1970-01-01 00:07:06"] ["fetch"]

正常情况应该是sig_properties_changed
我用monitor监控,可以看到这个信号变化了

‣ Type=signal  Endian=l  Flags=1  Version=1 Cookie=2016  Timestamp="Thu 1970-01-01 01:31:28.507945 UTC"
  Sender=:1.7  Path=/bmc/demo/MyCSRModel/MyCSRModel_Chip_Adc0_1_0101  Interface=org.freedesktop.DBus.Properties  Member=PropertiesChanged
  UniqueName=:1.7
  MESSAGE "sa{sv}as" {
          STRING "bmc.demo.OpenUBMC.Reading";
          ARRAY "{sv}" {
                  DICT_ENTRY "sv" {
                          STRING "Value";
                          VARIANT "t" {
                                  UINT64 1115;
                          };
                  };
          };
          ARRAY "s" {
          };
  };

不更新的原因你在另一个帖子问了

就不在这个贴讨论了哈