mirror of
https://github.com/home-assistant/core.git
synced 2025-07-18 10:47:10 +00:00
Add ZHA battery sensor (#19363)
* add batery sensor * add additional battery sizes * remove blank line * lint * fix attribute report configuration * return None - review comments
This commit is contained in:
parent
fb226e3e3b
commit
b444dfe8a6
@ -62,11 +62,14 @@ async def make_sensor(discovery_info):
|
|||||||
)
|
)
|
||||||
from zigpy.zcl.clusters.smartenergy import Metering
|
from zigpy.zcl.clusters.smartenergy import Metering
|
||||||
from zigpy.zcl.clusters.homeautomation import ElectricalMeasurement
|
from zigpy.zcl.clusters.homeautomation import ElectricalMeasurement
|
||||||
|
from zigpy.zcl.clusters.general import PowerConfiguration
|
||||||
in_clusters = discovery_info['in_clusters']
|
in_clusters = discovery_info['in_clusters']
|
||||||
if 'sub_component' in discovery_info:
|
if 'sub_component' in discovery_info:
|
||||||
sensor = discovery_info['sub_component'](**discovery_info)
|
sensor = discovery_info['sub_component'](**discovery_info)
|
||||||
elif RelativeHumidity.cluster_id in in_clusters:
|
elif RelativeHumidity.cluster_id in in_clusters:
|
||||||
sensor = RelativeHumiditySensor(**discovery_info)
|
sensor = RelativeHumiditySensor(**discovery_info)
|
||||||
|
elif PowerConfiguration.cluster_id in in_clusters:
|
||||||
|
sensor = GenericBatterySensor(**discovery_info)
|
||||||
elif TemperatureMeasurement.cluster_id in in_clusters:
|
elif TemperatureMeasurement.cluster_id in in_clusters:
|
||||||
sensor = TemperatureSensor(**discovery_info)
|
sensor = TemperatureSensor(**discovery_info)
|
||||||
elif PressureMeasurement.cluster_id in in_clusters:
|
elif PressureMeasurement.cluster_id in in_clusters:
|
||||||
@ -83,7 +86,6 @@ async def make_sensor(discovery_info):
|
|||||||
|
|
||||||
if discovery_info['new_join']:
|
if discovery_info['new_join']:
|
||||||
await sensor.async_configure()
|
await sensor.async_configure()
|
||||||
|
|
||||||
return sensor
|
return sensor
|
||||||
|
|
||||||
|
|
||||||
@ -145,6 +147,71 @@ class Sensor(ZhaEntity):
|
|||||||
self._state = result.get(self.value_attribute, self._state)
|
self._state = result.get(self.value_attribute, self._state)
|
||||||
|
|
||||||
|
|
||||||
|
class GenericBatterySensor(Sensor):
|
||||||
|
"""ZHA generic battery sensor."""
|
||||||
|
|
||||||
|
report_attribute = 32
|
||||||
|
value_attribute = 33
|
||||||
|
battery_sizes = {
|
||||||
|
0: 'No battery',
|
||||||
|
1: 'Built in',
|
||||||
|
2: 'Other',
|
||||||
|
3: 'AA',
|
||||||
|
4: 'AAA',
|
||||||
|
5: 'C',
|
||||||
|
6: 'D',
|
||||||
|
7: 'CR2',
|
||||||
|
8: 'CR123A',
|
||||||
|
9: 'CR2450',
|
||||||
|
10: 'CR2032',
|
||||||
|
11: 'CR1632',
|
||||||
|
255: 'Unknown'
|
||||||
|
}
|
||||||
|
|
||||||
|
@property
|
||||||
|
def unit_of_measurement(self):
|
||||||
|
"""Return the unit of measurement of this entity."""
|
||||||
|
return '%'
|
||||||
|
|
||||||
|
@property
|
||||||
|
def zcl_reporting_config(self) -> dict:
|
||||||
|
"""Return a dict of attribute reporting configuration."""
|
||||||
|
return {
|
||||||
|
self.cluster: {
|
||||||
|
self.value_attribute: self.report_config,
|
||||||
|
self.report_attribute: self.report_config
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async def async_update(self):
|
||||||
|
"""Retrieve latest state."""
|
||||||
|
_LOGGER.debug("%s async_update", self.entity_id)
|
||||||
|
|
||||||
|
result = await helpers.safe_read(
|
||||||
|
self._endpoint.power,
|
||||||
|
[
|
||||||
|
'battery_size',
|
||||||
|
'battery_quantity',
|
||||||
|
'battery_percentage_remaining'
|
||||||
|
],
|
||||||
|
allow_cache=False,
|
||||||
|
only_cache=(not self._initialized)
|
||||||
|
)
|
||||||
|
self._device_state_attributes['battery_size'] = self.battery_sizes.get(
|
||||||
|
result.get('battery_size', 255), 'Unknown')
|
||||||
|
self._device_state_attributes['battery_quantity'] = result.get(
|
||||||
|
'battery_quantity', 'Unknown')
|
||||||
|
self._state = result.get('battery_percentage_remaining', self._state)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def state(self):
|
||||||
|
"""Return the state of the entity."""
|
||||||
|
if self._state == 'unknown' or self._state is None:
|
||||||
|
return None
|
||||||
|
|
||||||
|
return self._state
|
||||||
|
|
||||||
|
|
||||||
class TemperatureSensor(Sensor):
|
class TemperatureSensor(Sensor):
|
||||||
"""ZHA temperature sensor."""
|
"""ZHA temperature sensor."""
|
||||||
|
|
||||||
|
@ -136,6 +136,7 @@ def populate_data():
|
|||||||
zcl.clusters.measurement.IlluminanceMeasurement: 'sensor',
|
zcl.clusters.measurement.IlluminanceMeasurement: 'sensor',
|
||||||
zcl.clusters.smartenergy.Metering: 'sensor',
|
zcl.clusters.smartenergy.Metering: 'sensor',
|
||||||
zcl.clusters.homeautomation.ElectricalMeasurement: 'sensor',
|
zcl.clusters.homeautomation.ElectricalMeasurement: 'sensor',
|
||||||
|
zcl.clusters.general.PowerConfiguration: 'sensor',
|
||||||
zcl.clusters.security.IasZone: 'binary_sensor',
|
zcl.clusters.security.IasZone: 'binary_sensor',
|
||||||
zcl.clusters.hvac.Fan: 'fan',
|
zcl.clusters.hvac.Fan: 'fan',
|
||||||
})
|
})
|
||||||
|
Loading…
x
Reference in New Issue
Block a user