属性无法自动更新

在适配某一款npu卡的时候,已经通过带外协议获取到了温度值,并且在资源树上可以正确显示了,但是使用同步语法到门限传感器对象的reading,reading值一直不会改变。
vpd配置情况:

        "ThresholdSensor_GPUAICoreTemp": {
            "OwnerId": 32,
            "OwnerLun": 0,
            "EntityId": "<=/Entity_GPUCard.Id",
            "EntityInstance": "<=/Entity_GPUCard.Instance",
            "Initialization": 127,
            "Capabilities": 104,
            "SensorType": 1,
            "ReadingType": 1,
            "SensorName": "NPU${Slot} AICORE Temp",
            "AssertMask": 0,
            "DeassertMask": 0,
            "ReadingMask": 2056,
            "UpperNoncritical": 105,
            "PositiveHysteresis": 2,
            "Unit": 128,
            "BaseUnit": 1,
            "ModifierUnit": 0,
            "Linearization": 0,
            "M": 100,
            "RBExp": 224,
            "Analog": 1,
            "NominalReading": 25,
            "NormalMaximum": 0,
            "NormalMinimum": 0,
            "MaximumReading": 127,
            "MinimumReading": 128,
            "Reading": "<=/wzAtlasModel.CoreTemp",
            "ReadingStatus": "<=/wzAtlasModel.CoreTemp |> expr($1 >= 255 ? 1 : 0)"
        },

查看资源树,发现wzAtlasModel_010101010302的CoreTemp已经可以读到了是44:

~ ~ $ mdbctl lsprop wzAtlasModel_010101010302
bmc.kepler.Object.Properties
  ClassName="wzAtlasModel"
  ObjectIdentifier=[1,"1","1","010101010302"]
  ObjectName="wzAtlasModel_010101010302"
bmc.kepler.wzapp.AtlasCard
  BoardID=175
  CoreTemp=44
Private
  RefMCUChip="$ref"

~ ~ $ 

查看门限传感器对象的Reading一直为0

~ ~ $ mdbctl lsprop ThresholdSensor_GPUAICoreTemp_010101010302
bmc.kepler.Object.Properties
  ClassName="ThresholdSensor"
  ObjectIdentifier=[1,"1","1","010101010302"]
  ObjectName="ThresholdSensor_GPUAICoreTemp_010101010302"
bmc.kepler.Systems.ThresholdSensor
  Capabilities=104
  EntityId=11
  EntityInstance=101
  LowerCritical=0
  LowerNoncritical=0
  LowerNonrecoverable=0
  NegativeHysteresis=0
  OriginalReading=0
  OwnerLun=0
  PositiveHysteresis=2
  Reading=0
  ReadingMask=2056
  ReadingStatus=1
  SensorIdentifier=""
  SensorName="NPU3 AICORE Temp"
  SensorNumber=79
  SensorType=1
  UpperCritical=0
  UpperNoncritical=105
  UpperNonrecoverable=0

在章节门限传感器原始值到读值的转换有提到RBExp等参数具体是如何转换运算的哦

Reading属性值为0,那么一定是没有感知到配置的数据源是否有变化,请确认模型配置中的wzAtlasModel类的CoreTemp属性配置了属性变更信号发送标记emit-changed为TRUE

这里的配置是没有问题的,Reading值若为44,会经过 (100 * 44) * 0.01 的运算,会得到ReadingDisplay属性值为"44.000"的结果

1 个赞

emitsChangedSignal默认应该就是true。我改一下mdb_interface组件试试,改为如下:

    "bmc.kepler.wzapp.AtlasCard": {
        "properties": {
            "BoardID": {
                "baseType": "U16",
                "readOnly": false,
                "description": "单板ID"
            },
            "CoreTemp": {
                "baseType": "U16",
                "options": {
                    "volatile": true,
                    "emitsChangedSignal": "true"
                },
                "readOnly": true,
                "description": "芯片1温度"
            },

以下是将温度值赋值到wzAtlasModel实例的代码

        local ok_t, temp = pcall(function()
            return smbus:GetChipTemperature()
        end)

        if ok_t and temp then
            logging:notice("Temperature[" .. position .. "] = " .. tostring(temp.t))
            object["CoreTemp"] = temp.t
        else

在mdb_interface中改为

"bmc.kepler.wzapp.AtlasCard": {
        "properties": {
            "BoardID": {
                "baseType": "U16",
                "readOnly": false,
                "description": "单板ID"
            },
            "CoreTemp": {
                "baseType": "U16",
                "options": {
                    "volatile": true,
                    "emitsChangedSignal": "true"
                },
                "readOnly": true,
                "description": "芯片1温度"
            },

在资源树上:

busctl --user introspect bmc.kepler.wzapp /bmc/kepler/wzAtlasModel/wzAtlasModel_010101010302
NAME                                TYPE      SIGNATURE   RESULT/VALUE                       
bmc.kepler.Object.Properties        interface -           -                                  
.GetAllWithContext                  method    a{ss}s      a{sv}                              
NAME                                TYPE      SIGNATURE   RESULT/VALUE                             FLAGS
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           "wzAtlasModel"                           emits-change
.ObjectIdentifier                   property  (ysss)      1 "1" "1" "010101010302"                 emits-change
.ObjectName                         property  s           "wzAtlasModel_010101010302"              emits-change
bmc.kepler.wzapp.AtlasCard          interface -           -                                        -
.BoardID                            property  q           175                                      emits-change writable
.CoreTemp                           property  q           40                                       emits-change

~ ~ $ mdbctl lsprop ThresholdSensor_GPUAICoreTemp_010101010302
bmc.kepler.Object.Properties
  ClassName="ThresholdSensor"
  ObjectIdentifier=[1,"1","1","010101010302"]
  ObjectName="ThresholdSensor_GPUAICoreTemp_010101010302"
bmc.kepler.Systems.ThresholdSensor
  Capabilities=104
  EntityId=11
  EntityInstance=101
  LowerCritical=0
  LowerNoncritical=0
  LowerNonrecoverable=0
  NegativeHysteresis=0
  OriginalReading=0
  OwnerLun=0
  PositiveHysteresis=2
  Reading=0
  ReadingMask=2056
  ReadingStatus=1
  SensorIdentifier=""
  SensorName="NPU3 AICORE Temp"
  SensorNumber=77
  SensorType=1
  UpperCritical=0
  UpperNoncritical=105
  UpperNonrecoverable=0

app.log日志:

2025-12-05 08:13:47.361041 sensor ERROR: sdr_group.lua(148): sensor ThresholdSensor_GPUAICoreTemp_010101010302 of host 0 has no sdr record and cannot be updated.

@linwanmin @zybwh 大佬可以帮忙分析一下吗?

你atlas的对象名叫这个?不是模型名_xxx 这种格式么

还有你看一下sensor启动时候的日志,看是否正确解析了这个表达式,我感觉可能是这个问题

[2025-12-05 08:13:48] sensor ThresholdSensor_GPUAICoreTemp_010101010302 of host 0 is registered, number is 72.
[2025-12-05 08:13:48] threshold sdr ThresholdSensor_GPUAICoreTemp_010101010302 of host 0 is registered.

传感器对象看起来是正常注册

看一下framework.log呢,有没有相关的日志

等等,你这个mds对象是手动创建的吗?MDS定义能提供一下吗?如果没有配置CSR对象,是没办法在CSR里面配同步的

是自己创建的,也配置了csr对象了:

        "wzAtlasModel":{
            "RefMCUChip":"#/Chip_Dmini"
        },

mds:

{
    "wzAtlasModel": {
        "path": "/bmc/kepler/wzAtlasModel/${id}",
        "interfaces": {
            "bmc.kepler.wzapp.AtlasCard": {
                "properties": {
                    "BoardID": {
                        "usage": [
                            "CSR"
                        ]
                    },
                    "CoreTemp": {
                        "usage": [
                            "CSR"
                        ],
                        "default": 32768
                    }
                }
            }
        },
        "properties": {
            "RefMCUChip": {
                "usage": [
                    "CSR"
                ],
                "baseType": "U8[]",
                "refInterface": "bmc.kepler.Chip.BlockIO"
            }
        }
    }
}

格式上还是有比较大的问题

首先这里定义的是类,并非具体的对象,同时类的定义是大驼峰,WzAtlasModel

因此实际上在csr中配置的时候,应该表明具体的对象

"WzAtlasModel_1": {
    "RefMCUChip": "#/Chip_Dmini"
}

引用的时候:

"Reading": "<=/WzAtlasModel_1.CoreTemp"

改了,好像还是不行,资源树情况:

~ ~ $ mdbctl lsobj WzAtlasModel
WzAtlasModel_1_0101010103
WzAtlasModel_1_010101010302

~ ~ $ mdbctl lsprop WzAtlasModel_1_010101010302
bmc.kepler.Object.Properties
  ClassName="WzAtlasModel"
  ObjectIdentifier=[1,"1","1","010101010302"]
  ObjectName="WzAtlasModel_1_010101010302"
bmc.kepler.wzapp.AtlasCard
  BoardID=175
  CoreTemp=43
Private
  RefMCUChip="$ref"


~ ~ $ mdbctl lsprop ThresholdSensor_GPUAICoreTemp_010101010302
bmc.kepler.Object.Properties
  ClassName="ThresholdSensor"
  ObjectIdentifier=[1,"1","1","010101010302"]
  ObjectName="ThresholdSensor_GPUAICoreTemp_010101010302"
bmc.kepler.Systems.ThresholdSensor
  Capabilities=104
  EntityId=11
  EntityInstance=101
  LowerCritical=0
  LowerNoncritical=0
  LowerNonrecoverable=0
  NegativeHysteresis=0
  OriginalReading=0
  PositiveHysteresis=2
  Reading=0
  ReadingMask=2056
  ReadingStatus=1
  SensorIdentifier=""
  SensorName="NPU3 AICORE Temp"
  SensorNumber=76
  SensorType=1
  UpperCritical=0
  UpperNoncritical=105
  UpperNonrecoverable=0

vpd:

        "WzAtlasModel_1":{
            "RefMCUChip":"#/Chip_Dmini"
        },
        "ThresholdSensor_GPUAICoreTemp": {
            "OwnerId": 32,
            "OwnerLun": 0,
            "EntityId": "<=/Entity_GPUCard.Id",
            "EntityInstance": "<=/Entity_GPUCard.Instance",
            "Initialization": 127,
            "Capabilities": 104,
            "SensorType": 1,
            "ReadingType": 1,
            "SensorName": "NPU${Slot} AICORE Temp",
            "AssertMask": 0,
            "DeassertMask": 0,
            "ReadingMask": 2056,
            "UpperNoncritical": 105,
            "PositiveHysteresis": 2,
            "Unit": 128,
            "BaseUnit": 1,
            "ModifierUnit": 0,
            "Linearization": 0,
            "M": 100,
            "RBExp": 224,
            "Analog": 1,
            "NominalReading": 25,
            "NormalMaximum": 0,
            "NormalMinimum": 0,
            "MaximumReading": 127,
            "MinimumReading": 128,
            "Reading": "<=/WzAtlasModel_1.CoreTemp",
            "ReadingStatus": "<=/WzAtlasModel_1.CoreTemp |> expr($1 >= 255 ? 1 : 0)"
        },

我怀疑是组件启动顺序的问题,但是改了以下内容,也没能正常:

1.将同步引用语法改为动态引用语法;
2.在bmc web-门限传感器页面看到温度还是 – ;
3.通过远程机器执行mdbctl lsprop ThresholdSensor_GPUAICoreTemp_010101010302命令后,再次查看web界面有的数据显示(和WzAtlasModel_1_010101010302.CoreTemp一致),但数据不会自动更新。

        "ThresholdSensor_GPUAICoreTemp": {
            "OwnerId": 32,
            "OwnerLun": 0,
            "EntityId": "<=/Entity_GPUCard.Id",
            "EntityInstance": "<=/Entity_GPUCard.Instance",
            "Initialization": 127,
            "Capabilities": 104,
            "SensorType": 1,
            "ReadingType": 1,
            "SensorName": "NPU${Slot} AICORE Temp",
            "AssertMask": 0,
            "DeassertMask": 0,
            "ReadingMask": 2056,
            "UpperNoncritical": 105,
            "PositiveHysteresis": 2,
            "Unit": 128,
            "BaseUnit": 1,
            "ModifierUnit": 0,
            "Linearization": 0,
            "M": 100,
            "RBExp": 224,
            "Analog": 1,
            "NominalReading": 25,
            "NormalMaximum": 0,
            "NormalMinimum": 0,
            "MaximumReading": 127,
            "MinimumReading": 128,
            "Reading": "#/WzAtlasModel_1.CoreTemp",
            "ReadingStatus": "#/WzAtlasModel_1.CoreTemp |> expr($1 >= 255 ? 1 : 0)"
        },

引用是被动式出发,读一次刷一次

我发现你的ReadingStatus有点问题,如果你reading是0,从你的表达式来看应该也是0,但实际是1。可能是这个问题:

  • 如果 Entity_GPUCard 对象不存在、未初始化、或其 PowerState=0(未上电)、Presence=0(未检测到),则根据 openUBMC 的实体依赖机制,所有关联的传感器会被自动置为 Status=DisabledReadingStatus=1,即使 Reading 表达式正确也无法生效。

看一下你的Entity配置?

如果Entity配置没问题的话,还有种方法是调用hwdiscovery 的010101010302 objectgroup的getobjects,里面会显示表达式解析后的路径和接口,你看一下是否正确。

最后的话,可以通过busctl monitor命令监听所有的dbus信号,看看有没有这个接口的信号发出。

2 个赞

由于大量社区举报,此话题被临时关闭至少 4 小时。