阈值传感器对象ReadingDisplay没有值,导致web页面传感器读值为0

问题描述

阈值传感器对象Reading属性有值,但是ReadingDisplay没有值,导致web页面传感器读值为0

环境信息

  • 软件版本:openUBMC 2512

重现步骤

  1. 传感器SR配置如下

    1. "ThresholdSensor_HddBpPower": {
        "OwnerId": 32,
        "OwnerLun": 0,
        "EntityId": "<=/Entity_InnerHddCard.Id",
        "EntityInstance": "<=/Entity_InnerHddCard.Instance",
        "Initialization": 127,
        "Capabilities": 232,
        "SensorType": 11,
        "ReadingType": 1,
        "SensorName": "FBP${Slot}_Power",
        "SensorIdentifier": "FBP${Slot}_Power",
        "BaseUnit": 6,
        "Analog": 1,
        "NominalReading": 25,
        "MinimumReading": 0,
        "MaximumReading": 255,
        "Reading": "<=/Scanner_HddBPPower.Value |> expr((($1 & 255) << 8) | (($1 >> 8) & 255) * 0.25)",
        "ReadingStatus": "<=/Scanner_HddBPPower.Status",
        "SensorNumber": 255,
        "M": 1,
        "PositiveHysteresis": 1,
        "NegativeHysteresis": 1
      }
      
  2. 查询相应scanner读值,有值。

  3. 查询传感器对象。Reading属性有值,但是ReadingDisplay没有值,导致web页面传感器读值为0。

    ~ ~ $ mdbctl lsprop ThresholdSensor_HddBpPower_01011801 bmc.kepler.Systems.ThresholdSensor
    bmc.kepler.Systems.ThresholdSensor
    Capabilities=232
    EntityId=11
    EntityInstance=113
    LowerCritical=0
    LowerNoncritical=0
    LowerNonrecoverable=0
    NegativeHysteresis=1
    OriginalReading=0
    OwnerLun=0
    PositiveHysteresis=1
    Reading=2
    ReadingMask=0
    ReadingStatus=0
    SensorIdentifier=“FBP1_Power”
    SensorName=“FBP1_Power”
    SensorNumber=51
    SensorType=11
    UpperCritical=0
    UpperNoncritical=0
    UpperNonrecoverable=0
    Private
    Accuracy=0
    Analog=1
    AssertMask=0
    B=0
    BA=0
    BaseUnit=6
    BelongsToSystem=false
    DeassertMask=0
    Initialization=127
    IsValid=true
    Linearization=0
    M=1
    MT=0
    MaximumReading=255
    MinimumReading=0
    ModifierUnit=0
    NominalReading=25
    NormalMaximum=0
    NormalMinimum=0
    OwnerId=32
    RBExp=0
    ReadingType=1
    Unit=0

期望结果

Reading属性跟ReadingDisplay属性同步,web页面传感器读值正常

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

问题分析:阈值传感器 ReadingDisplay 为空导致 Web 读值显示 0

根据提供的传感器配置和查询结果,ThresholdSensor_HddBpPower 对象的 Reading 属性值为 2,但 ReadingDisplay 属性未出现在输出中(即缺失或为 0.000),导致 Web 界面显示传感器读值为 0。
结合知识图谱与相关文档,以下是对该问题的可能原因分析及排查建议。


一、ReadingDisplay 的基本机制

  • ReadingDisplay 是阈值传感器的一个属性,用于存储和显示格式化后的读值,通常由系统根据 ReadingMBRBExp 等系数计算得出(IPMI 标准公式:ReadingDisplay = (M × Reading + B × 10^{RBExp}))。
    来源:知识图谱实体 ReadingDisplay 描述。
  • 该属性直接影响 Web 界面显示的传感器数值,若其缺失或为 0.000,则 Web 会显示 0
    来源:知识图谱关系 ReadingDisplayThreshold Sensor:“The ReadingDisplay attribute stores the current value of the sensor for display.”

在用户配置中:

  • M = 1B = 0RBExp = 0 → 预期 ReadingDisplay 应等于 Reading2(格式化后为 "2.000")。
  • 但实际输出中没有任何 ReadingDisplay 字段,说明系统未生成该属性或其值为空。

二、可能原因(基于上下文)

1. 传感器 Status 或 ReadingStatus 影响显示

  • 北向接口(如 Web)的传感器值直接受本传感器的 ReadingStatusStatus 属性影响:

    step1 北向接口传感器的值直接受本传感器的ReadingStatus属性及Status属性影响,查看ReadingStatus值是否非0或Status是否为Disabled,在这两种情况下传感器不会显示出读值。
    (来源:文档块 ID=1,帖子 #4

  • 用户查询中 ReadingStatus = 0(正常),但 Status 属性未显示。若 StatusDisabled,则 Web 无法显示读数,且 ReadingDisplay 可能不会被生成或强制置 0
    Status 受关联 Entity 的状态影响,特别是当 Capabilities 的 bit7 置位时(Capabilities=232,二进制 11101000,bit7 为 1),传感器将被 Entity 的失效状态禁用。

    step3 若传感器的Capabilities属性的bit7配置为1,则传感器会受到Entity失效影响会被禁止。当Entity的PowerStatePresence属性为0,则Entity失效,会进一步导致传感器Status为Disabled。
    (来源:文档块 ID=1,帖子 #4

  • 建议:使用 busctl get-property bmc.kepler.Systems.ThresholdSensor ThresholdSensor_HddBpPower_01011801 bmc.kepler.Systems.ThresholdSensor Status 查看是否 Disabled;同时检查关联 Entity(Entity_InnerHddCard)的 PowerStatePresence 是否为 0

2. ReadingMask 配置为 0 可能影响显示

  • 用户配置中 ReadingMask = 0。根据 IPMI 规范和 CSR 配置:

    ReadingMask 决定是否能对外显示门限,配置门限场景使用。
    (来源:文档块 ID=10,《CSR配置字典之Sensor类》)

  • 虽然 ReadingMask 主要用于门限显示,但某些实现中也可能影响读值本身的对外呈现。0 可能意味着不显示任何读值信息,导致 ReadingDisplay 不被计算或输出。

  • 建议:根据实际需要配置 ReadingMask,例如为 0xFFFF 或至少使能读值显示位。

3. 数据源同步表达式问题

  • 用户配置中使用表达式:
    "Reading": "<=/Scanner_HddBPPower.Value |> expr((($1 & 255) << 8) | (($1 >> 8) & 255) * 0.25)"
    
  • Reading = 2 表明表达式已成功取到值,但转换后的结果可能不合预期(例如 *0.25 操作符优先级导致结果异常?实际值 2 看起来较小)。
  • 虽然 Reading 有值,但 ReadingDisplay 计算可能因数据格式错误或超出 MB 范围而失败。
  • 建议:检查 Scanner 原始值,确认表达式语法正确(特别是括号与运算符优先级);可先使用简单同步语法(如 <=/Scanner_HddBPPower.Value)测试 ReadingDisplay 是否自动生成。

4. Unit 等辅助参数配置异常

  • 用户配置中 Unit = 0BaseUnit = 6ModifierUnit = 0。对于功率传感器,单位应为适当值(如 Unit = 0xC0 用于离散,但此处为阈值传感器,应使用标准单位)。
  • 知识图谱指出:Unit 用于指定传感器单位,错误的 Unit 可能导致显示模块无法解析读值,进而跳过 ReadingDisplay 的生成。
    来源:知识图谱实体 DiscreteSensor_PwrCapStatus 关系中提到 Unit 设为 192 (0xC0) 用于离散传感器,阈值传感器应有不同的配置。
  • 建议:参考同类传感器正确配置 Unit,例如功率传感器通常 Unit = 0(无单位或无符号)需结合 BaseUnit 解释,但建议检查社区标准配置。

三、排查步骤总结(基于上下文文档)

  1. 检查 Status 属性
    使用 busctl get-property 查看传感器 Status 是否为 Disabled。若为 Disabled,则检查关联 Entity 的 PowerStatePresence

  2. 验证 ReadingStatus 与 CSR 配置一致性
    当前 ReadingStatus = 0 正常,但若 Status 被禁用,仍需从 Entity 角度排查(step3)。

  3. 审查 ReadingMask 配置
    确认是否需要设置合理的 ReadingMask 以允许读值对外显示。

  4. 简化 Reading 表达式
    暂时去掉表达式,使用直接同步(<=/Scanner_HddBPPower.Value)观察 ReadingDisplay 是否出现,以确定是否为表达式转换问题。

  5. 核对 Unit 及单位相关配置
    参考已有正常功率传感器的配置(例如 ThresholdSensor_GPUPower 实例),调整 UnitBaseUnitModifierUnit

  6. 收集更多日志
    若上述步骤无法定位,根据社区建议提供 vpd 配置信息、传感器名称及一键日志,联系 PAE 进一步分析(来源:文档块 ID=1,帖子 #2)。


四、期望结果

通过上述排查和配置修正,系统应能正常计算出 ReadingDisplay 值(预计为 "2.000"),并使 Web 页面正确显示传感器读值,而不为 0