传感器的值不更新问题求助

配置的 ThresholdSensor传感器的值不更新,想要参考VrdMgmt_1.Cpu0v9TACore这种自定义的对象,如何能触发Reading值的sig_properties_changed

在sensor的AppDump\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 [1115] ["1970-01-01 04:27:49"] ["fetch"]

目前这个属性实际上是变化了,但是这里只有fetch,一直无法触发sig_properties_changed,下面是传感器属性;

% 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=7
  EntityInstance=96
  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=10
  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

下面是对应值的对象属性,已经把Value修改了, Reading=223还是不变;1150应该对应的是230

% 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

确认在 mdb_interface 中,针对 bmc.demo.OpenUBMC.ReadingValue 属性是否配置了变更发送信号?

有配置emitsChangedSignal

            "Value": {
                "baseType": "U64",
                "description": "从芯片读到的值",
                "options": {
                    "emitsChangedSignal": "true"
                }
            }

而且我上午也抓到了信号,而且我看Cpu0v9TACore这里面没配置emitsChangedSignal,也能正常用。

‣ 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" {
          };
  };

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

:white_check_mark: 结论

根本原因MyCSRModel_Chip_Adc0_1_0101.Value 属性未配置 emit-changed=true,导致其值变化时未产生 PropertiesChanged 信号,从而无法驱动 ThresholdSensor.Reading 的同步更新。

解决方案
MyCSRModel 类定义中,Value 属性启用 emitChangedSignal: true,确保其值更新时能主动发出信号,方可实现 ThresholdSensor 的自动 Reading 更新。

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

ThresholdSensor传感器值不更新问题分析与解决方案

根据您提供的信息,ThresholdSensor_Adc0_1Sensor_0101Reading 值无法及时更新,尽管其数据源 MyCSRModel_Chip_Adc0_1_0101.Value 已发生变化(例如从 1115 变为 1150),但在 sync_property_trace.log 中仅记录了 fetch 操作,却无法触发 sig_properties_changed 事件,导致 ThresholdSensorReading 值未能同步变化。

以下是基于知识库内容的系统性分析与解决建议。


:magnifying_glass_tilted_left: 问题定位分析

:white_check_mark: 当前已确认正常的部分

  1. 数据源存在且值会变MyCSRModel_Chip_Adc0_1_0101.Value 可以修改和读取。
  2. 表达式语法正确Reading 配置为 "expr($1 / 5)",其中 $1 指向 MyCSRModel_Chip_Adc0_1_0101.Value,计算逻辑合理(如 1150 / 5 = 230)。
  3. 初始读取有效:日志显示 fetch 成功获取到 1115,并计算出 Reading=223,说明首次同步正常。
  4. ReadingMask 和 Capabilities 配置无误
    • Capabilities=232:表示传感器受实体在位和上下电状态影响(bit7=1),若实体可用,则不会导致禁用。
    • ReadingMask=4626AssertMask=516DeassertMask=516 属于电压类常见配置,通常有效。
  5. ThresholdSensor 基本属性合规:包括 SensorType=2(电压)、BaseUnit=4(Volts)等均符合规范。

:cross_mark: 失败的根本原因分析

:prohibited: 核心问题:未触发 PropertiesChanged 信号

虽然数据源 MyCSRModel_Chip_Adc0_1_0101.Value 的值已更新,但该属性未主动发射 PropertiesChanged D-Bus 信号,导致 ThresholdSensor 所依赖的数据同步机制无法感知变化。

在 openUBMC 架构中,ThresholdSensorReading 属性依赖于 表达式中的数据源触发 sig_properties_changed 才能重新计算并更新自身值。

:magnifying_glass_tilted_right: 关键证据:
  • 日志中只看到一条 fetch 记录,后续无 changedupdate 行为。
  • sync_property_trace.log 显示的是“获取”,而没有“变更通知”。
  • MyCSRModel_Chip_Adc0_1_0101 是用户自定义对象(bmc.demo.OpenUBMC.Reading),很可能缺少对 emit-changed 标志位的启用。

:white_check_mark: 解决方案

:white_check_mark: 方案一:确保数据源属性配置 emit-changed = TRUE

知识库关系明确指出:

"CoreTemp", "emit-changed", "The CoreTemp property must have emit-changed set to TRUE for the system to propagate changes to dependent components like the ThresholdSensor."

:white_check_mark: 应用于当前场景:

应检查或修改 MyCSRModel 类定义中 Value 属性的配置,确保其包含:

"properties": {
  "Value": {
    "baseType": "int32",
    "dynamic": true,
    "emitChangedSignal": true  // 关键:必须显式设置为 true
  }
}

或者在 .csr 文件或 VPD 配置中添加:

"bmc.demo.OpenUBMC.Reading": {
  "properties": {
    "Value": {
      "@Signal": "Changed"
    }
  }
}

:light_bulb: 若未显式开启 emit-changed,即使值变化了,也不会向 D-Bus 发送 PropertiesChanged 信号,导致下游对象(如 ThresholdSensor)无法感知更新。


:white_check_mark: 方案二:手动验证信号是否发出(诊断用)

可以使用 dbus-monitor 工具监听 D-Bus 上的信号,确认 MyCSRModel_Chip_Adc0_1_0101 是否发出 PropertiesChanged 信号:

dbus-monitor --system "interface='org.freedesktop.DBus.Properties',member='PropertiesChanged'"

然后使用 setprop 修改 Value 值:

mdbctl setprop MyCSRModel_Chip_Adc0_1_0101 bmc.demo.OpenUBMC.Reading Value 1200

观察是否有类似输出:

signal name=PropertiesChanged ...
  arg0: org.freedesktop.DBus.Properties
  arg1: { "Value": <1200> }

如果没有,则证明信号未发射 → 需修复 emit-changed 配置


:white_check_mark: 方案三:使用 setprop 强制触发属性变更(测试手段)

如果暂时无法修改模型定义,可通过 setprop 显式设置属性值以强制触发变更事件:

mdbctl setprop MyCSRModel_Chip_Adc0_1_0101 bmc.demo.OpenUBMC.Reading Value 1150 --force

并确认 sig_properties_changed 被捕获。

注意:某些系统需结合 --override 或通过 traceprop 工具辅助调试。


:white_check_mark: 方案四:验证 ThresholdSensor 的 Reading 是否基于表达式同步

根据知识库:

"The ThresholdSensor object must have the Reading property configured as data synchronization or an expression containing data synchronization."

您当前已使用表达式:"expr($1 / 5)",这是正确的形式。

:white_check_mark: 建议补充日志监控 sensor 组件是否注册了对该路径的监听。


:puzzle_piece: 排查清单总结

检查项 是否满足 说明
:white_check_mark: 数据源对象值能否修改 :check_mark: 已验证 Value=1150
:white_check_mark: 数据源是否发射 PropertiesChanged 信号 :red_question_mark: 未知 必须验证
:white_check_mark: 数据源属性是否配置 emit-changed=true :cross_mark: 否(推测) 关键修复点
:white_check_mark: ThresholdSensor.Reading 是否为表达式形式 :check_mark: "expr($1 / 5)" 正确
:white_check_mark: MyCSRModel 是否属于自定义类 :check_mark: 需手动配置信号触发
:white_check_mark: 是否存在 sig_properties_changed 日志 :cross_mark: 表示未触发

:hammer_and_wrench: 建议操作步骤

  1. 检查并修改 MyCSRModel 的 CSR 定义

    "bmc.demo.OpenUBMC.Reading": {
      "properties": {
        "Value": {
          "emitChangedSignal": true
        }
      }
    }
    
  2. 重新加载或重建 BMC 配置包(VPD/CSR)

    • 使用 bingo build 重新构建整包;
    • 升级后重启 bmc.kepler.sensor 服务或整机。
  3. 验证信号是否发出

    dbus-monitor --system "interface='org.freedesktop.DBus.Properties'"
    

    然后执行 setprop 修改 Value

  4. 观察 sync_property_trace.log 是否出现新的 updatechanged 记录

  5. 确认 ThresholdSensor.Reading 自动更新为 230(即 1150 / 5)。


:books: 相关参考文档与实体

  • 实体setprop, getprop, Reading, ThresholdSensor, emit-changed
  • 关系
    • "CoreTemp" -- "emit-changed":强调属性变更必须发送事件。
    • "Reading" -- "ThresholdSensor":Reading 是 ThresholdSensor 的核心属性。
    • "Reading" -- "setprop":用于模拟属性更新。
  • 文档
    • 《[CSR配置字典之Sensor类]》中关于 Capabilities 和数据同步说明;
    • 《[传感器适配指南]》中强调表达式与数据源变更传播的重要性。

:white_check_mark: 结论

根本原因MyCSRModel_Chip_Adc0_1_0101.Value 属性未配置 emit-changed=true,导致其值变化时未产生 PropertiesChanged 信号,从而无法驱动 ThresholdSensor.Reading 的同步更新。

解决方案
MyCSRModel 类定义中,Value 属性启用 emitChangedSignal: true,确保其值更新时能主动发出信号,方可实现 ThresholdSensor 的自动 Reading 更新。


如已完成配置但仍无效,请提供 dbus-monitor 输出日志,可进一步排查 sensor 模块是否监听了该路径。

用busctl 查一下MyCSRModel_Chip_Adc0_1_0101 的资源树

确认实际生效的 是否发送信号

表达式一般不会有bug

也可以看MyCSRModel_Chip_Adc0_1_0101 所在的sync_property_trace.log 确认一下

最常见的可能性:

实际就是不发送信号的,比如生效代码是错的,或者没有自动生成

没配的时候默认就是true

我用的这个命令busctl --user monitor ,查到的确实有

Type=signal  Endian=l  Flags=1  Version=1 Cookie=34  Timestamp="Thu 1970-01-01 00:41:05.384276 UTC"
  Sender=:1.170  Path=/bmc/demo/MyCSRModel/MyCSRModel_Chip_Adc_0101  Interface=org.freedesktop.DBus.Properties  Member=PropertiesChanged
  UniqueName=:1.170
  MESSAGE "sa{sv}as" {
          STRING "bmc.demo.OpenUBMC.Reading";
          ARRAY "{sv}" {
                  DICT_ENTRY "sv" {
                          STRING "TemperatureCelsius";
                          VARIANT "q" {
                                  UINT16 220;
                          };
                  };
          };
          ARRAY "s" {
          };
  };
 busctl --user introspect  bmc.kepler.complex_sensor  /bmc/demo/MyCSRModel/MyCSRModel_Chip_Adc_0101   | cat
NAME                                TYPE      SIGNATURE   RESULT/VALUE               FLAGS
bmc.demo.OpenUBMC.Reading           interface -           -                          -
.TemperatureCelsius                 property  q           220                        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_Adc_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    -                          -

但是我这个是不是抓错了,应该用其他的命令抓emit的信号?

前面你提的 MyCSRModel_Chip_Adc0_1_0101

你抓的 MyCSRModel_Chip_Adc_0101

你改的不是一个对象吧

这个是我不停的调试,改名字了,实际没错,但是结果就是出不来,能不能我把一键收集日志发给您,或者你开个会议,在我的环境上看看?

会议吧

我要怎么接入?

找下项目支持 约会议

刚刚在自己组件的config.cfg增加了
MODULE_NAME = “complex_sensor”
其他的都没改,目前sensor模块可以自己更新值了。感谢 sunpeijun协助。。。

麻烦 标记下解决方案哈

1 个赞