Skip to main content

传感器实体

传感器是一个只读实体,它提供了一些信息。信息具有一个值以及可选的测量单位。从 homeassistant.components.sensor.SensorEntity 派生实体平台。

属性

tip

属性应该始终只从内存返回信息,而不做输入/输出(如网络请求)。实现 update()async_update() 来获取数据。

名称类型默认描述
device_classSensorDeviceClass | NoneNone传感器的类型。
last_resetdatetime.datetime | NoneNone像电力使用表、燃气表、水表等累积传感器初始化的时间。如果初始化时间未知,设置为 None。请注意,last_reset 属性返回的 datetime.datetime 将在实体状态属性更新时转换为 ISO 8601 格式的字符串。当更改 last_reset 时,state 必须是有效数字。
native_unit_of_measurementstr | NoneNone传感器值表示的测量单位。如果 native_unit_of_measurement 为 °C 或 °F,且其 device_class 为温度,则传感器的 unit_of_measurement 为用户配置的首选温度单位,传感器的 state 在可选单位转换后将是 native_value。如果提供了 单位转换,则不应定义 native_unit_of_measurement
native_valuestr | int | float | date | datetime | Decimal | None必需传感器在其 native_unit_of_measurement 中的值。使用 device_class 可能会限制此属性返回的类型。
optionslist[str] | NoneNone在传感器提供文本状态的情况下,此属性可用于提供可能的状态列表。需要设置 enum 设备类。不可与 state_classnative_unit_of_measurement 结合使用。
state_classSensorStateClass | str | NoneNone状态类型。如果不是 None,则假定传感器为数值类型,并将作为前端的折线图显示,而不是离散值。
suggested_display_precisionint | NoneNone显示时应使用的传感器状态中的小数位数。
suggested_unit_of_measurementstr | NoneNone用于传感器状态的测量单位。对于具有 unique_id 的传感器,这将用作初始测量单位,用户可以覆盖。对于没有 unique_id 的传感器,这将是传感器状态的测量单位。此属性旨在被集成用来覆盖自动单位转换规则,例如,使温度传感器始终显示为 °C,无论配置的单位系统是否偏好 °C°F,或者使距离传感器即使在配置的单位系统为公制时也始终显示为英里。
tip

对于传感器实体,不要添加 extra_state_attributes,而是创建一个额外的传感器实体。不变的属性只在数据库中保存一次。如果 extra_state_attributes 和传感器值都频繁变化,这可能会迅速增加数据库的大小。

可用的设备类

如果指定设备类,则传感器实体也需要返回正确的测量单位。

常量支持的单位描述
SensorDeviceClass.APPARENT_POWERVA表观功率
SensorDeviceClass.AQINone空气质量指数
SensorDeviceClass.AREAm², cm², km², mm², in², ft², yd², mi², ac, ha面积
SensorDeviceClass.ATMOSPHERIC_PRESSUREcbar, bar, hPa, mmHG, inHg, kPa, mbar, Pa, psi大气压力
SensorDeviceClass.BATTERY%剩余电池百分比
SensorDeviceClass.BLOOD_GLUCOSE_CONCENTRATIONmg/dL, mmol/L血糖浓度
SensorDeviceClass.CO2ppm二氧化碳浓度
SensorDeviceClass.COppm一氧化碳浓度
SensorDeviceClass.CONDUCTIVITYS/cm, mS/cm, µS/cm导电率
SensorDeviceClass.CURRENTA, mA电流
SensorDeviceClass.DATA_RATEbit/s, kbit/s, Mbit/s, Gbit/s, B/s, kB/s, MB/s, GB/s, KiB/s, MiB/s, GiB/s数据速率
SensorDeviceClass.DATA_SIZEbit, kbit, Mbit, Gbit, B, kB, MB, GB, TB, PB, EB, ZB, YB, KiB, MiB, GiB, TiB, PiB, EiB, ZiB, YiB数据大小
SensorDeviceClass.DATE日期。要求 native_value 是一个 Python datetime.date 对象,或 None
SensorDeviceClass.DISTANCEkm, m, cm, mm, mi, nmi, yd, in通用距离
SensorDeviceClass.DURATIONd, h, min, s, ms, µs时间段。仅因时间流逝不应更新。设备或服务需要提供一个新的数据点以进行更新。
SensorDeviceClass.ENERGYJ, kJ, MJ, GJ, mWh, Wh, kWh, MWh, GWh, TWh, cal, kcal, Mcal, Gcal能量,此设备类应当用于表示能耗的传感器,例如电表。表示单位时间内的_功率_。不要与 power 混淆。
SensorDeviceClass.ENERGY_DISTANCEkWh/100km, Wh/km, mi/kWh, km/kWh每单位距离的能量,此设备类应当用于表示按距离的能耗,例如电动车消耗的电能量。
SensorDeviceClass.ENERGY_STORAGEJ, kJ, MJ, GJ, mWh, Wh, kWh, MWh, GWh, TWh, cal, kcal, Mcal, Gcal储存的能量,此设备类应当用于表示储存的能量的传感器,例如当前电池中储存的电能量或电池的容量。表示单位时间内的_功率_。不要与 power 混淆。
SensorDeviceClass.ENUM传感器具有有限的一组(非数值)状态。使用此设备类时,options 属性必须设置为可能状态的列表。
SensorDeviceClass.FREQUENCYHz, kHz, MHz, GHz频率
SensorDeviceClass.GASL, m³, ft³, CCF气体体积。气体消耗量按能量以千瓦时计而不是按体积计算,应归类为能量。
SensorDeviceClass.HUMIDITY%相对湿度
SensorDeviceClass.ILLUMINANCElx光照水平
SensorDeviceClass.IRRADIANCEW/m², BTU/(h⋅ft²)辐照度
SensorDeviceClass.MOISTURE%湿度
SensorDeviceClass.MONETARYISO 4217带货币的货币价值。
SensorDeviceClass.NITROGEN_DIOXIDEµg/m³二氧化氮浓度
SensorDeviceClass.NITROGEN_MONOXIDEµg/m³一氧化氮浓度
SensorDeviceClass.NITROUS_OXIDEµg/m³硝酸氧化物浓度
SensorDeviceClass.OZONEµg/m³臭氧浓度
SensorDeviceClass.PHNone溶液的潜在氢(pH)
SensorDeviceClass.PM1µg/m³小于1微米的颗粒物浓度
SensorDeviceClass.PM25µg/m³小于2.5微米的颗粒物浓度
SensorDeviceClass.PM10µg/m³小于10微米的颗粒物浓度
SensorDeviceClass.POWERmW, W, kW, MW, GW, TW功率。
SensorDeviceClass.POWER_FACTOR%, None功率因数
SensorDeviceClass.PRECIPITATIONcm, in, mm累积降水量
SensorDeviceClass.PRECIPITATION_INTENSITYin/d, in/h, mm/d, mm/h降水强度
SensorDeviceClass.PRESSUREcbar, bar, hPa, mmHg, inHg, kPa, mbar, Pa, psi压力。
SensorDeviceClass.REACTIVE_ENERGYvarh, kvarh无功能量
SensorDeviceClass.REACTIVE_POWERvar, kvar无功功率
SensorDeviceClass.SIGNAL_STRENGTHdB, dBm信号强度
SensorDeviceClass.SOUND_PRESSUREdB, dBA声压
SensorDeviceClass.SPEEDft/s, in/d, in/h, in/s, km/h, kn, m/s, mph, mm/d, mm/s通用速度
SensorDeviceClass.SULPHUR_DIOXIDEµg/m³二氧化硫浓度
SensorDeviceClass.TEMPERATURE°C, °F, K温度。
SensorDeviceClass.TIMESTAMP时间戳。要求 native_value 返回一个带有时区信息的 Python datetime.datetime 对象,或 None
SensorDeviceClass.VOLATILE_ORGANIC_COMPOUNDSµg/m³, mg/m³挥发性有机化合物浓度
SensorDeviceClass.VOLATILE_ORGANIC_COMPOUNDS_PARTSppm, ppb挥发性有机化合物的比率
SensorDeviceClass.VOLTAGEV, mV, µV, kV, MV电压
SensorDeviceClass.VOLUMEL, mL, gal, fl. oz., m³, ft³, CCF通用体积,此设备类应用于表示消耗的传感器,例如车辆消耗的燃料量。
SensorDeviceClass.VOLUME_FLOW_RATEm³/h, m³/s, ft³/min, L/h, L/min, L/s, gal/min, mL/s体积流量,此设备类应用户表示某些体积的流动,例如瞬间消耗的水量。
SensorDeviceClass.VOLUME_STORAGEL, mL, gal, fl. oz., m³, ft³, CCF通用存储体积,此设备类应用户表示存储的体积,例如油箱中存储的燃料量。
SensorDeviceClass.WATERL, gal, m³, ft³, CCF水消费
SensorDeviceClass.WEIGHTkg, g, mg, µg, oz, lb, st通用质量;使用 weight 而不是 mass 以适应日常语言。
SensorDeviceClass.WIND_DIRECTION°风向,如果风速为0或太低以至于无法准确测量风向,则应设置为 None
SensorDeviceClass.WIND_SPEEDft/s, km/h, kn, m/s, mph风速

可用的状态类

caution

为传感器仔细选择状态类。在大多数情况下,应选择状态类 SensorStateClass.MEASUREMENT 或没有 last_reset 的状态类 SensorStateClass.TOTAL,详情见下文 如何选择 state_classlast_reset

类型描述
SensorStateClass.MEASUREMENT状态表示_当前的测量值_,而不是统计数据或未来的预测。例如,该类应该被分类为 SensorStateClass.MEASUREMENT 的有:当前温度、湿度或电力。 不该分类为 SensorStateClass.MEASUREMENT 的例子:明天的预测温度、昨天的能耗或任何其他不包括_当前_测量的内容。对于受支持的传感器,每小时的最小、最大和平均传感器读数的统计数据每5分钟更新一次。
SensorStateClass.MEASUREMENT_ANGLE类似于上述 SensorStateClass.MEASUREMENT,状态表示_当前的测量值_,用于以度(°)表示的角度。例如,当前风向应分类为 SensorStateClass.MEASUREMENT_ANGLE
SensorStateClass.TOTAL状态表示一种总量,可以增加或减少,例如净能量计。自传感器首次添加以来的累积增长或减少的统计数据每5分钟更新一次。此状态类不应用于绝对值更有趣的传感器,而应使用状态类为 SensorStateClass.MEASUREMENT,例如剩余电池容量或 CPU 负载。
SensorStateClass.TOTAL_INCREASING类似于 SensorStateClass.TOTAL,但状态表示单调递增的正总量,定期从0重新开始计数,例如每日消耗的气体量、每周水消耗或生命周期的能量消耗。自传感器首次添加以来的累积增长的统计数据每5分钟更新一次。减少的值被视为新的计量周期的开始或计量的更换。

实体选项

传感器可以由用户配置,这通过将传感器实体选项存储在传感器的实体注册条目中完成。

选项描述
unit_of_measurement传感器的测量单位可以为 SensorDeviceClass.PRESSURESensorDeviceClass.TEMPERATURE 的传感器覆盖。

恢复传感器状态

恢复状态的传感器在重启或重新加载后不应扩展 RestoreEntity,因为这不存储 native_value,而是存储可能已被传感器基本实体修改的 state。恢复状态的传感器应扩展 RestoreSensor,并在 async_added_to_hass 中调用 await self.async_get_last_sensor_data 以访问存储的 native_valuenative_unit_of_measurement

长期统计

Home Assistant 对于存储传感器作为长期统计具有支持,只要实体具有正确的属性。要选择统计,传感器必须具有 state_class 设置为有效状态类之一:SensorStateClass.MEASUREMENTSensorStateClass.TOTALSensorStateClass.TOTAL_INCREASING。对于某些设备类,统计单位会被归一化以便可以在单一图中绘制多个传感器。

不表示总量的实体

Home Assistant 跟踪统计期间的最小、最大和平均值。state_class 属性必须设置为 SensorStateClass.MEASUREMENT,且 device_class 不能是 SensorDeviceClass.DATESensorDeviceClass.ENUMSensorDeviceClass.ENERGYSensorDeviceClass.GASSensorDeviceClass.MONETARYSensorDeviceClass.TIMESTAMPSensorDeviceClass.VOLUMESensorDeviceClass.WATER

表示总量的实体

跟踪总量的实体具有可选周期性重置的值,例如本月的能耗、今天的能源生产、过去一周用于加热房屋的颗粒物重量或股票投资组合的年度增长。第一次编制统计时传感器的值用作初始零点。

如何选择 state_classlast_reset

建议在可能的情况下使用状态类 SensorStateClass.TOTAL 而不带 last_reset,状态类 SensorStateClass.TOTAL_INCREASINGSensorStateClass.TOTALlast_reset 仅在状态类 SensorStateClass.TOTAL 不适用于该传感器时使用。

示例:

  • 传感器的值永不重置,例如终生总能耗或生产:状态类 SensorStateClass.TOTALlast_reset 未设置或设置为 None
  • 传感器的值可能重置为0,并且其值只能增加:状态类 SensorStateClass.TOTAL_INCREASING。示例:与计费周期对齐的能耗,例如每月,断开连接时电表重置为0。
  • 传感器的值可能重置为0,其值可以增加也可以减少:状态类 SensorStateClass.TOTALlast_reset 在值重置时更新。示例:与计费周期对齐的净能耗,例如每月。
  • 传感器状态在每次状态更新时重置,例如每分钟更新一次的传感器,显示过去一分钟的能耗:状态类 SensorStateClass.TOTALlast_reset 在每次状态变化时更新。

状态类 SensorStateClass.TOTAL

对于状态类为 SensorStateClass.TOTAL 的传感器,last_reset 属性可以选择性设置,以手动控制计量周期。实体首次添加到 Home Assistant 时的状态用作初始零点。当 last_reset 更改时,零点将设置为0。如果没有设置 last_reset,则首次添加时传感器的值用作计算 sum 统计的零点。

换句话说:更新统计时的逻辑是用当前状态与先前状态之间的差值更新总和列,除非 last_reset 已被更改,在这种情况下,不添加任何内容。

没有 last_resetSensorStateClass.TOTAL 状态类的示例:

tstatesumsum_increasesum_decrease
2021-08-01T13:00:001000000
2021-08-01T14:00:00101010100
2021-08-01T15:00:000-1000101010
2021-08-01T16:00:005-995151010

带有 last_resetSensorStateClass.TOTAL 状态类的示例:

tstatelast_resetsumsum_increasesum_decrease
2021-08-01T13:00:0010002021-08-01T13:00:00000
2021-08-01T14:00:0010102021-08-01T13:00:0010100
2021-08-01T15:00:0010052021-08-01T13:00:005105
2021-08-01T16:00:0002021-09-01T16:00:005105
2021-08-01T17:00:0052021-09-01T16:00:0010155

状态类 SensorStateClass.TOTAL 的示例,其中新计量周期开始时的初始状态不是0,但使用0作为零点:

tstatelast_resetsumsum_increasesum_decrease
2021-08-01T13:00:0010002021-08-01T13:00:00000
2021-08-01T14:00:0010102021-08-01T13:00:0010100
2021-08-01T15:00:0010052021-08-01T13:00:005105
2021-08-01T16:00:0052021-09-01T16:00:0010155
2021-08-01T17:00:00102021-09-01T16:00:0015205

状态类 SensorStateClass.TOTAL_INCREASING

对于状态类为 SensorStateClass.TOTAL_INCREASING 的传感器,减少的值被解释为新的计量周期的开始或计量的替换。集成确保在计算来自传感器的值时,不能出现错误降低是重要的,并存在测量噪声。存在一定的容忍度,状态变化之间的减少 < 10% 将不会触发新的计量周期。此状态类对气体表、电表、水表等很有用。在传感器读数减少时的值将不用于计算 sum 统计,相反零点将设置为0。

换句话说:更新统计时的逻辑是用当前状态与先前状态之间的差值更新总和列,除非该差值为负数,在这种情况下,不添加任何内容。

状态类 SensorStateClass.TOTAL_INCREASING 的示例:

tstatesum
2021-08-01T13:00:0010000
2021-08-01T14:00:00101010
2021-08-01T15:00:00010
2021-08-01T16:00:00515

状态类 SensorStateClass.TOTAL_INCREASING 的示例,其中传感器未重置为0:

tstatesum
2021-08-01T13:00:0010000
2021-08-01T14:00:00101010
2021-08-01T15:00:00515
2021-08-01T16:00:001020