定制化内存传感器,导致内存离散传感器丢失

问题描述

在定制化仓中定制化内存CSR,添加ThresholdSensor_Mem1Temp内存温度传感器后,CSR中原来的内存离散传感器在环境上以及web上都丢失了

"FormatVersion": "3.00",
"DataVersion": "3.00",
"Objects": {
    "ThresholdSensor_Mem1Temp": {
        "EntityId": "<=/Entity_DIMM000.Id",
        "EntityInstance": "<=/Entity_DIMM000.Instance",
        "Initialization": 127,
        "Capabilities": 232,
        "SensorType": 1,
        "ReadingType": 1,
        "SensorName": "DIMM000_Temp",
        "Unit": 128,
        "BaseUnit": 1,
        "NominalReading": 30,
        "MaximumReading": 127,
        "MinimumReading": 128,
        "Reading": "<=/Memory_1.TemperatureCelsius |> expr($1 > 255 ? 128 : $1)",
        "ReadingStatus": "<=/::FruCtrl_1_0.PowerState ; <=/Memory_1.TemperatureCelsius |> string.cmp($1, 'ON') |> expr($1 ? 1 : 0)  |> expr(($1 == 0) ? 2 : ($2 > 255 ? 2 : 0))",
        "SensorNumber": 255,
        "AssertMask": 128,
		"DeassertMask": 28800,
		"ReadingMask": 2056,
        "UpperNoncritical": 95,
		"PositiveHysteresis": 2,
		"NegativeHysteresis": 2,
        "M": 1,
        "IsValid": "<=/Memory_1.Presence |> expr($1 == 1 ? true : false)"
    },

环境信息

  • BMC基线版本:2512

重现步骤

  1. [第一步]
    在定制化仓中新增memory_2p24ch24_0_cust.sr文件,文件中新增ThreshouldSensor对象

{
“FormatVersion”: “3.00”,
“DataVersion”: “3.00”,
“Objects”: {
“ThresholdSensor_Mem1Temp”: {
“EntityId”: “<=/Entity_DIMM000.Id”,
“EntityInstance”: “<=/Entity_DIMM000.Instance”,
“Initialization”: 127,
“Capabilities”: 232,
“SensorType”: 1,
“ReadingType”: 1,
“SensorName”: “DIMM000_Temp”,
“Unit”: 128,
“BaseUnit”: 1,
“NominalReading”: 30,
“MaximumReading”: 127,
“MinimumReading”: 128,
“Reading”: “<=/Memory_1.TemperatureCelsius |> expr($1 > 255 ? 128 : $1)”,
“ReadingStatus”: “<=/::FruCtrl_1_0.PowerState ; <=/Memory_1.TemperatureCelsius |> string.cmp($1, ‘ON’) |> expr($1 ? 1 : 0) |> expr(($1 == 0) ? 2 : ($2 > 255 ? 2 : 0))”,
“SensorNumber”: 255,
“AssertMask”: 128,
“DeassertMask”: 28800,
“ReadingMask”: 2056,
“UpperNoncritical”: 95,
“PositiveHysteresis”: 2,
“NegativeHysteresis”: 2,
“M”: 1,
“IsValid”: “<=/Memory_1.Presence |> expr($1 == 1 ? true : false)”
},
“ThresholdSensor_Mem2Temp”: {
“EntityId”: “<=/Entity_DIMM010.Id”,
“EntityInstance”: “<=/Entity_DIMM010.Instance”,
“Initialization”: 127,
“Capabilities”: 232,
“SensorType”: 1,
“ReadingType”: 1,
“SensorName”: “DIMM010_Temp”,
“Unit”: 128,
“BaseUnit”: 1,
“NominalReading”: 30,
“MaximumReading”: 127,
“MinimumReading”: 128,
“Reading”: “<=/Memory_2.TemperatureCelsius |> expr($1 > 255 ? 128 : $1)”,
“ReadingStatus”: “<=/::FruCtrl_1_0.PowerState ; <=/Memory_2.TemperatureCelsius |> string.cmp($1, ‘ON’) |> expr($1 ? 1 : 0) |> expr(($1 == 0) ? 2 : ($2 > 255 ? 2 : 0))”,
“SensorNumber”: 255,
“AssertMask”: 128,
“DeassertMask”: 28800,
“ReadingMask”: 2056,
“UpperNoncritical”: 95,
“PositiveHysteresis”: 2,
“NegativeHysteresis”: 2,
“M”: 1,
“IsValid”: “<=/Memory_2.Presence |> expr($1 == 1 ? true : false)”
},
“ThresholdSensor_Mem3Temp”: {
“EntityId”: “<=/Entity_DIMM020.Id”,
“EntityInstance”: “<=/Entity_DIMM020.Instance”,
“Initialization”: 127,
“Capabilities”: 232,
“SensorType”: 1,
“ReadingType”: 1,
“SensorName”: “DIMM020_Temp”,
“Unit”: 128,
“BaseUnit”: 1,
“NominalReading”: 30,
“MaximumReading”: 127,
“MinimumReading”: 128,
“Reading”: “<=/Memory_3.TemperatureCelsius |> expr($1 > 255 ? 128 : $1)”,
“ReadingStatus”: “<=/::FruCtrl_1_0.PowerState ; <=/Memory_3.TemperatureCelsius |> string.cmp($1, ‘ON’) |> expr($1 ? 1 : 0) |> expr(($1 == 0) ? 2 : ($2 > 255 ? 2 : 0))”,
“SensorNumber”: 255,
“AssertMask”: 128,
“DeassertMask”: 28800,
“ReadingMask”: 2056,
“UpperNoncritical”: 95,
“PositiveHysteresis”: 2,
“NegativeHysteresis”: 2,
“M”: 1,
“IsValid”: “<=/Memory_3.Presence |> expr($1 == 1 ? true : false)”
},
“ThresholdSensor_Mem4Temp”: {
“EntityId”: “<=/Entity_DIMM030.Id”,
“EntityInstance”: “<=/Entity_DIMM030.Instance”,
“Initialization”: 127,
“Capabilities”: 232,
“SensorType”: 1,
“ReadingType”: 1,
“SensorName”: “DIMM030_Temp”,
“Unit”: 128,
“BaseUnit”: 1,
“NominalReading”: 30,
“MaximumReading”: 127,
“MinimumReading”: 128,
“Reading”: “<=/Memory_4.TemperatureCelsius |> expr($1 > 255 ? 128 : $1)”,
“ReadingStatus”: “<=/::FruCtrl_1_0.PowerState ; <=/Memory_4.TemperatureCelsius |> string.cmp($1, ‘ON’) |> expr($1 ? 1 : 0) |> expr(($1 == 0) ? 2 : ($2 > 255 ? 2 : 0))”,
“SensorNumber”: 255,
“AssertMask”: 128,
“DeassertMask”: 28800,
“ReadingMask”: 2056,
“UpperNoncritical”: 95,
“PositiveHysteresis”: 2,
“NegativeHysteresis”: 2,
“M”: 1,
“IsValid”: “<=/Memory_4.Presence |> expr($1 == 1 ? true : false)”
},
“ThresholdSensor_Mem5Temp”: {
“EntityId”: “<=/Entity_DIMM040.Id”,
“EntityInstance”: “<=/Entity_DIMM040.Instance”,
“Initialization”: 127,
“Capabilities”: 232,
“SensorType”: 1,
“ReadingType”: 1,
“SensorName”: “DIMM040_Temp”,
“Unit”: 128,
“BaseUnit”: 1,
“NominalReading”: 30,
“MaximumReading”: 127,
“MinimumReading”: 128,
“Reading”: “<=/Memory_5.TemperatureCelsius |> expr($1 > 255 ? 128 : $1)”,
“ReadingStatus”: “<=/::FruCtrl_1_0.PowerState ; <=/Memory_5.TemperatureCelsius |> string.cmp($1, ‘ON’) |> expr($1 ? 1 : 0) |> expr(($1 == 0) ? 2 : ($2 > 255 ? 2 : 0))”,
“SensorNumber”: 255,
“AssertMask”: 128,
“DeassertMask”: 28800,
“ReadingMask”: 2056,
“UpperNoncritical”: 95,
“PositiveHysteresis”: 2,
“NegativeHysteresis”: 2,
“M”: 1,
“IsValid”: “<=/Memory_5.Presence |> expr($1 == 1 ? true : false)”
},
“ThresholdSensor_Mem6Temp”: {
“EntityId”: “<=/Entity_DIMM050.Id”,
“EntityInstance”: “<=/Entity_DIMM050.Instance”,
“Initialization”: 127,
“Capabilities”: 232,
“SensorType”: 1,
“ReadingType”: 1,
“SensorName”: “DIMM050_Temp”,
“Unit”: 128,
“BaseUnit”: 1,
“NominalReading”: 30,
“MaximumReading”: 127,
“MinimumReading”: 128,
“Reading”: “<=/Memory_6.TemperatureCelsius |> expr($1 > 255 ? 128 : $1)”,
“ReadingStatus”: “<=/::FruCtrl_1_0.PowerState ; <=/Memory_6.TemperatureCelsius |> string.cmp($1, ‘ON’) |> expr($1 ? 1 : 0) |> expr(($1 == 0) ? 2 : ($2 > 255 ? 2 : 0))”,
“SensorNumber”: 255,
“AssertMask”: 128,
“DeassertMask”: 28800,
“ReadingMask”: 2056,
“UpperNoncritical”: 95,
“PositiveHysteresis”: 2,
“NegativeHysteresis”: 2,
“M”: 1,
“IsValid”: “<=/Memory_6.Presence |> expr($1 == 1 ? true : false)”
},
“ThresholdSensor_Mem7Temp”: {
“EntityId”: “<=/Entity_DIMM060.Id”,
“EntityInstance”: “<=/Entity_DIMM060.Instance”,
“Initialization”: 127,
“Capabilities”: 232,
“SensorType”: 1,
“ReadingType”: 1,
“SensorName”: “DIMM060_Temp”,
“Unit”: 128,
“BaseUnit”: 1,
“NominalReading”: 30,
“MaximumReading”: 127,
“MinimumReading”: 128,
“Reading”: “<=/Memory_7.TemperatureCelsius |> expr($1 > 255 ? 128 : $1)”,
“ReadingStatus”: “<=/::FruCtrl_1_0.PowerState ; <=/Memory_7.TemperatureCelsius |> string.cmp($1, ‘ON’) |> expr($1 ? 1 : 0) |> expr(($1 == 0) ? 2 : ($2 > 255 ? 2 : 0))”,
“SensorNumber”: 255,
“AssertMask”: 128,
“DeassertMask”: 28800,
“ReadingMask”: 2056,
“UpperNoncritical”: 95,
“PositiveHysteresis”: 2,
“NegativeHysteresis”: 2,
“M”: 1,
“IsValid”: “<=/Memory_7.Presence |> expr($1 == 1 ? true : false)”
},
“ThresholdSensor_Mem8Temp”: {
“EntityId”: “<=/Entity_DIMM070.Id”,
“EntityInstance”: “<=/Entity_DIMM070.Instance”,
“Initialization”: 127,
“Capabilities”: 232,
“SensorType”: 1,
“ReadingType”: 1,
“SensorName”: “DIMM070_Temp”,
“Unit”: 128,
“BaseUnit”: 1,
“NominalReading”: 30,
“MaximumReading”: 127,
“MinimumReading”: 128,
“Reading”: “<=/Memory_8.TemperatureCelsius |> expr($1 > 255 ? 128 : $1)”,
“ReadingStatus”: “<=/::FruCtrl_1_0.PowerState ; <=/Memory_8.TemperatureCelsius |> string.cmp($1, ‘ON’) |> expr($1 ? 1 : 0) |> expr(($1 == 0) ? 2 : ($2 > 255 ? 2 : 0))”,
“SensorNumber”: 255,
“AssertMask”: 128,
“DeassertMask”: 28800,
“ReadingMask”: 2056,
“UpperNoncritical”: 95,
“PositiveHysteresis”: 2,
“NegativeHysteresis”: 2,
“M”: 1,
“IsValid”: “<=/Memory_8.Presence |> expr($1 == 1 ? true : false)”
},
“ThresholdSensor_Mem9Temp”: {
“EntityId”: “<=/Entity_DIMM080.Id”,
“EntityInstance”: “<=/Entity_DIMM080.Instance”,
“Initialization”: 127,
“Capabilities”: 232,
“SensorType”: 1,
“ReadingType”: 1,
“SensorName”: “DIMM080_Temp”,
“Unit”: 128,
“BaseUnit”: 1,
“NominalReading”: 30,
“MaximumReading”: 127,
“MinimumReading”: 128,
“Reading”: “<=/Memory_9.TemperatureCelsius |> expr($1 > 255 ? 128 : $1)”,
“ReadingStatus”: “<=/::FruCtrl_1_0.PowerState ; <=/Memory_9.TemperatureCelsius |> string.cmp($1, ‘ON’) |> expr($1 ? 1 : 0) |> expr(($1 == 0) ? 2 : ($2 > 255 ? 2 : 0))”,
“SensorNumber”: 255,
“AssertMask”: 128,
“DeassertMask”: 28800,
“ReadingMask”: 2056,
“UpperNoncritical”: 95,
“PositiveHysteresis”: 2,
“NegativeHysteresis”: 2,
“M”: 1,
“IsValid”: “<=/Memory_9.Presence |> expr($1 == 1 ? true : false)”
},
“ThresholdSensor_Mem10Temp”: {
“EntityId”: “<=/Entity_DIMM090.Id”,
“EntityInstance”: “<=/Entity_DIMM090.Instance”,
“Initialization”: 127,
“Capabilities”: 232,
“SensorType”: 1,
“ReadingType”: 1,
“SensorName”: “DIMM090_Temp”,
“Unit”: 128,
“BaseUnit”: 1,
“NominalReading”: 30,
“MaximumReading”: 127,
“MinimumReading”: 128,
“Reading”: “<=/Memory_10.TemperatureCelsius |> expr($1 > 255 ? 128 : $1)”,
“ReadingStatus”: “<=/::FruCtrl_1_0.PowerState ; <=/Memory_10.TemperatureCelsius |> string.cmp($1, ‘ON’) |> expr($1 ? 1 : 0) |> expr(($1 == 0) ? 2 : ($2 > 255 ? 2 : 0))”,
“SensorNumber”: 255,
“AssertMask”: 128,
“DeassertMask”: 28800,
“ReadingMask”: 2056,
“UpperNoncritical”: 95,
“PositiveHysteresis”: 2,
“NegativeHysteresis”: 2,
“M”: 1,
“IsValid”: “<=/Memory_10.Presence |> expr($1 == 1 ? true : false)”
},
“ThresholdSensor_Mem11Temp”: {
“EntityId”: “<=/Entity_DIMM0A0.Id”,
“EntityInstance”: “<=/Entity_DIMM0A0.Instance”,
“Initialization”: 127,
“Capabilities”: 232,
“SensorType”: 1,
“ReadingType”: 1,
“SensorName”: “DIMM0A0_Temp”,
“Unit”: 128,
“BaseUnit”: 1,
“NominalReading”: 30,
“MaximumReading”: 127,
“MinimumReading”: 128,
“Reading”: “<=/Memory_11.TemperatureCelsius |> expr($1 > 255 ? 128 : $1)”,
“ReadingStatus”: “<=/::FruCtrl_1_0.PowerState ; <=/Memory_11.TemperatureCelsius |> string.cmp($1, ‘ON’) |> expr($1 ? 1 : 0) |> expr(($1 == 0) ? 2 : ($2 > 255 ? 2 : 0))”,
“SensorNumber”: 255,
“AssertMask”: 128,
“DeassertMask”: 28800,
“ReadingMask”: 2056,
“UpperNoncritical”: 95,
“PositiveHysteresis”: 2,
“NegativeHysteresis”: 2,
“M”: 1,
“IsValid”: “<=/Memory_11.Presence |> expr($1 == 1 ? true : false)”
},
“ThresholdSensor_Mem12Temp”: {
“EntityId”: “<=/Entity_DIMM0B0.Id”,
“EntityInstance”: “<=/Entity_DIMM0B0.Instance”,
“Initialization”: 127,
“Capabilities”: 232,
“SensorType”: 1,
“ReadingType”: 1,
“SensorName”: “DIMM0B0_Temp”,
“Unit”: 128,
“BaseUnit”: 1,
“NominalReading”: 30,
“MaximumReading”: 127,
“MinimumReading”: 128,
“Reading”: “<=/Memory_12.TemperatureCelsius |> expr($1 > 255 ? 128 : $1)”,
“ReadingStatus”: “<=/::FruCtrl_1_0.PowerState ; <=/Memory_12.TemperatureCelsius |> string.cmp($1, ‘ON’) |> expr($1 ? 1 : 0) |> expr(($1 == 0) ? 2 : ($2 > 255 ? 2 : 0))”,
“SensorNumber”: 255,
“AssertMask”: 128,
“DeassertMask”: 28800,
“ReadingMask”: 2056,
“UpperNoncritical”: 95,
“PositiveHysteresis”: 2,
“NegativeHysteresis”: 2,
“M”: 1,
“IsValid”: “<=/Memory_12.Presence |> expr($1 == 1 ? true : false)”
},
“ThresholdSensor_Mem13Temp”: {
“EntityId”: “<=/Entity_DIMM100.Id”,
“EntityInstance”: “<=/Entity_DIMM100.Instance”,
“Initialization”: 127,
“Capabilities”: 232,
“SensorType”: 1,
“ReadingType”: 1,
“SensorName”: “DIMM100_Temp”,
“Unit”: 128,
“BaseUnit”: 1,
“NominalReading”: 30,
“MaximumReading”: 127,
“MinimumReading”: 128,
“Reading”: “<=/Memory_13.TemperatureCelsius |> expr($1 > 255 ? 128 : $1)”,
“ReadingStatus”: “<=/::FruCtrl_1_0.PowerState ; <=/Memory_13.TemperatureCelsius |> string.cmp($1, ‘ON’) |> expr($1 ? 1 : 0) |> expr(($1 == 0) ? 2 : ($2 > 255 ? 2 : 0))”,
“SensorNumber”: 255,
“AssertMask”: 128,
“DeassertMask”: 28800,
“ReadingMask”: 2056,
“UpperNoncritical”: 95,
“PositiveHysteresis”: 2,
“NegativeHysteresis”: 2,
“M”: 1,
“IsValid”: “<=/Memory_13.Presence |> expr($1 == 1 ? true : false)”
},
“ThresholdSensor_Mem14Temp”: {
“EntityId”: “<=/Entity_DIMM110.Id”,
“EntityInstance”: “<=/Entity_DIMM110.Instance”,
“Initialization”: 127,
“Capabilities”: 232,
“SensorType”: 1,
“ReadingType”: 1,
“SensorName”: “DIMM110_Temp”,
“Unit”: 128,
“BaseUnit”: 1,
“NominalReading”: 30,
“MaximumReading”: 127,
“MinimumReading”: 128,
“Reading”: “<=/Memory_14.TemperatureCelsius |> expr($1 > 255 ? 128 : $1)”,
“ReadingStatus”: “<=/::FruCtrl_1_0.PowerState ; <=/Memory_14.TemperatureCelsius |> string.cmp($1, ‘ON’) |> expr($1 ? 1 : 0) |> expr(($1 == 0) ? 2 : ($2 > 255 ? 2 : 0))”,
“SensorNumber”: 255,
“AssertMask”: 128,
“DeassertMask”: 28800,
“ReadingMask”: 2056,
“UpperNoncritical”: 95,
“PositiveHysteresis”: 2,
“NegativeHysteresis”: 2,
“M”: 1,
“IsValid”: “<=/Memory_14.Presence |> expr($1 == 1 ? true : false)”
},
“ThresholdSensor_Mem15Temp”: {
“EntityId”: “<=/Entity_DIMM120.Id”,
“EntityInstance”: “<=/Entity_DIMM120.Instance”,
“Initialization”: 127,
“Capabilities”: 232,
“SensorType”: 1,
“ReadingType”: 1,
“SensorName”: “DIMM120_Temp”,
“Unit”: 128,
“BaseUnit”: 1,
“NominalReading”: 30,
“MaximumReading”: 127,
“MinimumReading”: 128,
“Reading”: “<=/Memory_15.TemperatureCelsius |> expr($1 > 255 ? 128 : $1)”,
“ReadingStatus”: “<=/::FruCtrl_1_0.PowerState ; <=/Memory_15.TemperatureCelsius |> string.cmp($1, ‘ON’) |> expr($1 ? 1 : 0) |> expr(($1 == 0) ? 2 : ($2 > 255 ? 2 : 0))”,
“SensorNumber”: 255,
“AssertMask”: 128,
“DeassertMask”: 28800,
“ReadingMask”: 2056,
“UpperNoncritical”: 95,
“PositiveHysteresis”: 2,
“NegativeHysteresis”: 2,
“M”: 1,
“IsValid”: “<=/Memory_15.Presence |> expr($1 == 1 ? true : false)”
},
“ThresholdSensor_Mem16Temp”: {
“EntityId”: “<=/Entity_DIMM130.Id”,
“EntityInstance”: “<=/Entity_DIMM130.Instance”,
“Initialization”: 127,
“Capabilities”: 232,
“SensorType”: 1,
“ReadingType”: 1,
“SensorName”: “DIMM130_Temp”,
“Unit”: 128,
“BaseUnit”: 1,
“NominalReading”: 30,
“MaximumReading”: 127,
“MinimumReading”: 128,
“Reading”: “<=/Memory_16.TemperatureCelsius |> expr($1 > 255 ? 128 : $1)”,
“ReadingStatus”: “<=/::FruCtrl_1_0.PowerState ; <=/Memory_16.TemperatureCelsius |> string.cmp($1, ‘ON’) |> expr($1 ? 1 : 0) |> expr(($1 == 0) ? 2 : ($2 > 255 ? 2 : 0))”,
“SensorNumber”: 255,
“AssertMask”: 128,
“DeassertMask”: 28800,
“ReadingMask”: 2056,
“UpperNoncritical”: 95,
“PositiveHysteresis”: 2,
“NegativeHysteresis”: 2,
“M”: 1,
“IsValid”: “<=/Memory_16.Presence |> expr($1 == 1 ? true : false)”
},
“ThresholdSensor_Mem17Temp”: {
“EntityId”: “<=/Entity_DIMM140.Id”,
“EntityInstance”: “<=/Entity_DIMM140.Instance”,
“Initialization”: 127,
“Capabilities”: 232,
“SensorType”: 1,
“ReadingType”: 1,
“SensorName”: “DIMM140_Temp”,
“Unit”: 128,
“BaseUnit”: 1,
“NominalReading”: 30,
“MaximumReading”: 127,
“MinimumReading”: 128,
“Reading”: “<=/Memory_17.TemperatureCelsius |> expr($1 > 255 ? 128 : $1)”,
“ReadingStatus”: “<=/::FruCtrl_1_0.PowerState ; <=/Memory_17.TemperatureCelsius |> string.cmp($1, ‘ON’) |> expr($1 ? 1 : 0) |> expr(($1 == 0) ? 2 : ($2 > 255 ? 2 : 0))”,
“SensorNumber”: 255,
“AssertMask”: 128,
“DeassertMask”: 28800,
“ReadingMask”: 2056,
“UpperNoncritical”: 95,
“PositiveHysteresis”: 2,
“NegativeHysteresis”: 2,
“M”: 1,
“IsValid”: “<=/Memory_17.Presence |> expr($1 == 1 ? true : false)”
},
“ThresholdSensor_Mem18Temp”: {
“EntityId”: “<=/Entity_DIMM150.Id”,
“EntityInstance”: “<=/Entity_DIMM150.Instance”,
“Initialization”: 127,
“Capabilities”: 232,
“SensorType”: 1,
“ReadingType”: 1,
“SensorName”: “DIMM150_Temp”,
“Unit”: 128,
“BaseUnit”: 1,
“NominalReading”: 30,
“MaximumReading”: 127,
“MinimumReading”: 128,
“Reading”: “<=/Memory_18.TemperatureCelsius |> expr($1 > 255 ? 128 : $1)”,
“ReadingStatus”: “<=/::FruCtrl_1_0.PowerState ; <=/Memory_18.TemperatureCelsius |> string.cmp($1, ‘ON’) |> expr($1 ? 1 : 0) |> expr(($1 == 0) ? 2 : ($2 > 255 ? 2 : 0))”,
“SensorNumber”: 255,
“AssertMask”: 128,
“DeassertMask”: 28800,
“ReadingMask”: 2056,
“UpperNoncritical”: 95,
“PositiveHysteresis”: 2,
“NegativeHysteresis”: 2,
“M”: 1,
“IsValid”: “<=/Memory_18.Presence |> expr($1 == 1 ? true : false)”
},
“ThresholdSensor_Mem19Temp”: {
“EntityId”: “<=/Entity_DIMM160.Id”,
“EntityInstance”: “<=/Entity_DIMM160.Instance”,
“Initialization”: 127,
“Capabilities”: 232,
“SensorType”: 1,
“ReadingType”: 1,
“SensorName”: “DIMM160_Temp”,
“Unit”: 128,
“BaseUnit”: 1,
“NominalReading”: 30,
“MaximumReading”: 127,
“MinimumReading”: 128,
“Reading”: “<=/Memory_19.TemperatureCelsius |> expr($1 > 255 ? 128 : $1)”,
“ReadingStatus”: “<=/::FruCtrl_1_0.PowerState ; <=/Memory_19.TemperatureCelsius |> string.cmp($1, ‘ON’) |> expr($1 ? 1 : 0) |> expr(($1 == 0) ? 2 : ($2 > 255 ? 2 : 0))”,
“SensorNumber”: 255,
“AssertMask”: 128,
“DeassertMask”: 28800,
“ReadingMask”: 2056,
“UpperNoncritical”: 95,
“PositiveHysteresis”: 2,
“NegativeHysteresis”: 2,
“M”: 1,
“IsValid”: “<=/Memory_19.Presence |> expr($1 == 1 ? true : false)”
},
“ThresholdSensor_Mem20Temp”: {
“EntityId”: “<=/Entity_DIMM170.Id”,
“EntityInstance”: “<=/Entity_DIMM170.Instance”,
“Initialization”: 127,
“Capabilities”: 232,
“SensorType”: 1,
“ReadingType”: 1,
“SensorName”: “DIMM170_Temp”,
“Unit”: 128,
“BaseUnit”: 1,
“NominalReading”: 30,
“MaximumReading”: 127,
“MinimumReading”: 128,
“Reading”: “<=/Memory_20.TemperatureCelsius |> expr($1 > 255 ? 128 : $1)”,
“ReadingStatus”: “<=/::FruCtrl_1_0.PowerState ; <=/Memory_20.TemperatureCelsius |> string.cmp($1, ‘ON’) |> expr($1 ? 1 : 0) |> expr(($1 == 0) ? 2 : ($2 > 255 ? 2 : 0))”,
“SensorNumber”: 255,
“AssertMask”: 128,
“DeassertMask”: 28800,
“ReadingMask”: 2056,
“UpperNoncritical”: 95,
“PositiveHysteresis”: 2,
“NegativeHysteresis”: 2,
“M”: 1,
“IsValid”: “<=/Memory_20.Presence |> expr($1 == 1 ? true : false)”
},
“ThresholdSensor_Mem21Temp”: {
“EntityId”: “<=/Entity_DIMM180.Id”,
“EntityInstance”: “<=/Entity_DIMM180.Instance”,
“Initialization”: 127,
“Capabilities”: 232,
“SensorType”: 1,
“ReadingType”: 1,
“SensorName”: “DIMM180_Temp”,
“Unit”: 128,
“BaseUnit”: 1,
“NominalReading”: 30,
“MaximumReading”: 127,
“MinimumReading”: 128,
“Reading”: “<=/Memory_21.TemperatureCelsius |> expr($1 > 255 ? 128 : $1)”,
“ReadingStatus”: “<=/::FruCtrl_1_0.PowerState ; <=/Memory_21.TemperatureCelsius |> string.cmp($1, ‘ON’) |> expr($1 ? 1 : 0) |> expr(($1 == 0) ? 2 : ($2 > 255 ? 2 : 0))”,
“SensorNumber”: 255,
“AssertMask”: 128,
“DeassertMask”: 28800,
“ReadingMask”: 2056,
“UpperNoncritical”: 95,
“PositiveHysteresis”: 2,
“NegativeHysteresis”: 2,
“M”: 1,
“IsValid”: “<=/Memory_21.Presence |> expr($1 == 1 ? true : false)”
},
“ThresholdSensor_Mem22Temp”: {
“EntityId”: “<=/Entity_DIMM190.Id”,
“EntityInstance”: “<=/Entity_DIMM190.Instance”,
“Initialization”: 127,
“Capabilities”: 232,
“SensorType”: 1,
“ReadingType”: 1,
“SensorName”: “DIMM190_Temp”,
“Unit”: 128,
“BaseUnit”: 1,
“NominalReading”: 30,
“MaximumReading”: 127,
“MinimumReading”: 128,
“Reading”: “<=/Memory_22.TemperatureCelsius |> expr($1 > 255 ? 128 : $1)”,
“ReadingStatus”: “<=/::FruCtrl_1_0.PowerState ; <=/Memory_22.TemperatureCelsius |> string.cmp($1, ‘ON’) |> expr($1 ? 1 : 0) |> expr(($1 == 0) ? 2 : ($2 > 255 ? 2 : 0))”,
“SensorNumber”: 255,
“AssertMask”: 128,
“DeassertMask”: 28800,
“ReadingMask”: 2056,
“UpperNoncritical”: 95,
“PositiveHysteresis”: 2,
“NegativeHysteresis”: 2,
“M”: 1,
“IsValid”: “<=/Memory_22.Presence |> expr($1 == 1 ? true : false)”
},
“ThresholdSensor_Mem23Temp”: {
“EntityId”: “<=/Entity_DIMM1A0.Id”,
“EntityInstance”: “<=/Entity_DIMM1A0.Instance”,
“Initialization”: 127,
“Capabilities”: 232,
“SensorType”: 1,
“ReadingType”: 1,
“SensorName”: “DIMM1A0_Temp”,
“Unit”: 128,
“BaseUnit”: 1,
“NominalReading”: 30,
“MaximumReading”: 127,
“MinimumReading”: 128,
“Reading”: “<=/Memory_23.TemperatureCelsius |> expr($1 > 255 ? 128 : $1)”,
“ReadingStatus”: “<=/::FruCtrl_1_0.PowerState ; <=/Memory_23.TemperatureCelsius |> string.cmp($1, ‘ON’) |> expr($1 ? 1 : 0) |> expr(($1 == 0) ? 2 : ($2 > 255 ? 2 : 0))”,
“SensorNumber”: 255,
“AssertMask”: 128,
“DeassertMask”: 28800,
“ReadingMask”: 2056,
“UpperNoncritical”: 95,
“PositiveHysteresis”: 2,
“NegativeHysteresis”: 2,
“M”: 1,
“IsValid”: “<=/Memory_23.Presence |> expr($1 == 1 ? true : false)”
},
“ThresholdSensor_Mem24Temp”: {
“EntityId”: “<=/Entity_DIMM1B0.Id”,
“EntityInstance”: “<=/Entity_DIMM1B0.Instance”,
“Initialization”: 127,
“Capabilities”: 232,
“SensorType”: 1,
“ReadingType”: 1,
“SensorName”: “DIMM1B0_Temp”,
“Unit”: 128,
“BaseUnit”: 1,
“NominalReading”: 30,
“MaximumReading”: 127,
“MinimumReading”: 128,
“Reading”: “<=/Memory_24.TemperatureCelsius |> expr($1 > 255 ? 128 : $1)”,
“ReadingStatus”: “<=/::FruCtrl_1_0.PowerState ; <=/Memory_24.TemperatureCelsius |> string.cmp($1, ‘ON’) |> expr($1 ? 1 : 0) |> expr(($1 == 0) ? 2 : ($2 > 255 ? 2 : 0))”,
“SensorNumber”: 255,
“AssertMask”: 128,
“DeassertMask”: 28800,
“ReadingMask”: 2056,
“UpperNoncritical”: 95,
“PositiveHysteresis”: 2,
“NegativeHysteresis”: 2,
“M”: 1,
“IsValid”: “<=/Memory_24.Presence |> expr($1 == 1 ? true : false)”
}
}
}

期望结果

内存的离散传感器和门限传感器都正常显示

实际结果

定制化时只有内存的门限传感器没有内存离散传感器,不定制化时只有内存离散传感器

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

总结

项目 内容
问题现象 添加内存温度门限传感器后,离散传感器丢失
根本原因 定制 CSR 文件未包含原有 DiscreteSensor 定义,导致对象未注册
解决方案 修改定制文件以保留原有对象,或采用 Patch 模式增量更新
修复目标 实现 ThresholdSensorDiscreteSensor 共存,保障全面监控
建议操作 核查并补全所有内存相关传感器定义,测试验证 Web 与 CLI 显示一致性

结论定制化不应导致功能退化。正确的做法是在保留原有对象的基础上进行扩展,确保系统监控完整性不受影响。

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

定制化内存传感器导致内存离散传感器丢失问题分析

问题概述

在服务器管理系统中,用户在定制化过程中通过添加 ThresholdSensor_MemXTemp 类型的内存温度传感器后,发现原有的内存离散传感器无法在系统环境及Web界面正常显示。此问题表现为:

  • 未定制时:系统正常加载内存离散传感器;
  • 定制后:仅显示新增的门限(Threshold)传感器,原有离散传感器丢失。

该问题影响系统的完整监控能力,可能导致内存健康状态、在位状态等关键信息缺失。


问题原因分析

根据相关知识图谱和文档内容,该问题的本质是由于 CSR(Configuration and Status Record)文件定制方式不当 导致的对象覆盖或加载冲突。

1. CSR 文件加载机制导致对象丢失

  • 在 openUBMC 架构中,BMC 启动阶段会加载 CSR 文件来初始化硬件管理对象。
  • 当用户创建名为 memory_2p24ch24_0_cust.sr 的定制化 CSR 文件时,系统默认将其作为“全量替换”而非“增量叠加”处理。
  • 如果该定制文件仅包含新的 ThresholdSensor 对象而未包含原始 CSR 中已有的 DiscreteSensor 定义,则原有的内存离散传感器将不会被注册。

:white_check_mark: 根本原因:定制化 SR 文件中缺少对原有离散传感器对象的保留配置,导致 BMC 的传感器管理服务 (sensor) 在对象分发阶段仅注册了新定义的门限传感器,忽略了已被排除的离散传感器。


2. 传感器注册流程的关键依赖

根据 {id: 7} 文档中的说明:

“当有传感器csr对象分发时(on_add_object),先进行缓存(temp_store_sensor);当该 position 所有对象分发完成后(on_add_object_complete),统一处理传感器和sdr的注册(register_sensors)。”

这意味着:

  • 所有传感器对象必须在对象分发阶段被完整提交;
  • 若某一类对象(如 DiscreteSensor)未出现在待加载对象中,则注册流程不会自动恢复其默认行为;
  • 即使原厂 SR 文件中有定义,只要定制版本未包含,即视为“删除”。

3. 离散传感器的作用不可替代

内存相关的 DiscreteSensor 通常用于监测以下状态:

  • 内存模块在位状态(Presence)
  • 内存故障状态(Fault State)
  • ECC 错误事件(Correctable/ Uncorrectable ECC)
  • 内存接触不良告警(MemPoorContactAlarmEnabled)

这些状态无法由门限传感器替代,必须显式配置并正确加载。

:warning: 若未正确加载 DiscreteSensor,即使物理内存正常,BMC 也可能无法识别其存在或健康状态,导致误报或漏报。


解决方案建议

:white_check_mark: 方案一:修改定制化 CSR 文件以保留原有传感器

确保在 memory_2p24ch24_0_cust.sr 文件中:

  1. 保留原始 SR 文件中关于内存离散传感器的所有定义
  2. 增量添加 新的 ThresholdSensor_MemXTemp
  3. 使用正确的实体引用关系(如 <=/Entity_DIMMXXX.Id)关联传感器与硬件实体。
"Objects": {
    // 新增的门限传感器
    "ThresholdSensor_Mem1Temp": {
        ...
    },
    // 必须包含原有的离散传感器定义
    "DiscreteSensor_DIMM000_Presence": {
        "EntityId": "<=/Entity_DIMM000.Id",
        "EntityInstance": "<=/Entity_DIMM000.Instance",
        "SensorType": 35,
        "ReadingType": 111,
        "SensorName": "DIMM000_Presence",
        "AssertMask": 1,
        "DeassertMask": 2,
        "DiscreteMask": 3,
        "Unit": 192,
        "BaseUnit": 0,
        "DiscreteType": 0
    },
    ...
}

:pushpin: 推荐工具辅助对比原始 .sr 与定制 .sr 文件,确保无对象遗漏。


:white_check_mark: 方案二:采用 Patch 模式进行定制(推荐)

避免使用“全量 CSR 替换”,而是使用补丁机制仅修改所需字段:

  • 将定制内容拆分为独立的 patch 文件(如 memory_temp_patch.sr);
  • 仅声明需要增加或覆盖的部分;
  • 利用 openUBMC 支持的多源合并机制实现增量配置。

这可以避免误删其他非目标对象。


:white_check_mark: 方案三:验证 CSR 是否被正确加载

使用如下命令检查 CSR 加载结果:

# 查看所有传感器列表
ipmcget -t sensor -d list

# 通过 Redfish API 查询离散传感器
GET /redfish/v1/Chassis/{id}/DiscreteSensors

同时查看日志中是否有类似错误:

Error: Unknown object path /DiscreteSensor_DIMM000_Presence

配置建议与最佳实践

实践 说明
增量而非全量替换 定制 CSR 应作为增量补丁,不覆盖原厂配置
保留原有对象结构 若需重命名或扩展,应完整迁移原对象后再调整
统一命名规范 DIMM000_Temp, DIMM000_Presence,保证可读性
测试验证顺序 先确认离散传感器存在,再测试阈值告警功能

参考依据

  1. 传感器适配指南》指出:

    “若离散传感器未配置对应的离散事件,则该离散传感器将无法纳入 BMC 的管理范畴。”

  2. 传感器定制与开发》说明:

    “传感器定制需包括对象配置、事件配置、过滤和描述配置等多个环节。”

  3. 网卡适配指南》示例中明确给出了 DiscreteSensorThresholdSensor 并存的配置模式。

  4. KG 数据中 ThresholdSensor_MemoryTempSensor 组件的关系表明:

    门限传感器仅负责读值监控,不承担状态监控职责,二者功能互补,不可互相替代。


总结

项目 内容
问题现象 添加内存温度门限传感器后,离散传感器丢失
根本原因 定制 CSR 文件未包含原有 DiscreteSensor 定义,导致对象未注册
解决方案 修改定制文件以保留原有对象,或采用 Patch 模式增量更新
修复目标 实现 ThresholdSensorDiscreteSensor 共存,保障全面监控
建议操作 核查并补全所有内存相关传感器定义,测试验证 Web 与 CLI 显示一致性

结论定制化不应导致功能退化。正确的做法是在保留原有对象的基础上进行扩展,确保系统监控完整性不受影响。

麻烦发一下定制完所有的csr内容,是不是环境上没 DiscreteSensor对象

环境上如果没有配 DiscreteSensor对象的话,那bmc肯定不会对外显示离散传感器,配置好就可以显示了

我的疑问是内存的CSR已经配了这个离散传感器对象,但是环境上没有加载

内存的CSR环境没加载的话,内存相关信息全部不会显示的

您好,我把新增的ThresholdSensor直接放到内存的CSR里,现在还是一样的现象,门限传感器是正常的,但是离散传感器也是不显示的,环境上也是看不到内存的离散传感器,这可能是什么原因呢

离散传感器对象是DiscreteSensor,需配置该对象才能加载
门限传感器对象为ThresholdSensor,配置该对象只能加载对应的门限传感器



这个内存的CSR里两种传感器都配了的,现在只有门限传感器生效

完整的sr文件能方便发下吗

memory_2p24ch24_0.txt (300.2 KB)
您好,这是完整的sr文件

文件内3096行和3097行都配置了Evnet_MemoryRAS6CE对象,配置有问题,重复了。导致3097行下面都属于这个3096行的Evnet_MemoryRAS6CE对象了,下面配的对象都不加载

1 个赞