bellows 0.3.0 changes the API to have both, renaming the attribute which used to be for input clusters in the process. This is in preparation for remotes.
91 lines
2.6 KiB
Python
91 lines
2.6 KiB
Python
"""
|
|
Sensors on Zigbee Home Automation networks.
|
|
|
|
For more details on this platform, please refer to the documentation
|
|
at https://home-assistant.io/components/sensor.zha/
|
|
"""
|
|
import asyncio
|
|
import logging
|
|
|
|
from homeassistant.components.sensor import DOMAIN
|
|
from homeassistant.components import zha
|
|
from homeassistant.const import TEMP_CELSIUS
|
|
from homeassistant.util.temperature import convert as convert_temperature
|
|
|
|
_LOGGER = logging.getLogger(__name__)
|
|
|
|
DEPENDENCIES = ['zha']
|
|
|
|
|
|
@asyncio.coroutine
|
|
def async_setup_platform(hass, config, async_add_devices, discovery_info=None):
|
|
"""Set up Zigbee Home Automation sensors."""
|
|
discovery_info = zha.get_discovery_info(hass, discovery_info)
|
|
if discovery_info is None:
|
|
return
|
|
|
|
sensor = yield from make_sensor(discovery_info)
|
|
async_add_devices([sensor])
|
|
|
|
|
|
@asyncio.coroutine
|
|
def make_sensor(discovery_info):
|
|
"""Create ZHA sensors factory."""
|
|
from bellows.zigbee.zcl.clusters.measurement import TemperatureMeasurement
|
|
in_clusters = discovery_info['in_clusters']
|
|
if TemperatureMeasurement.cluster_id in in_clusters:
|
|
sensor = TemperatureSensor(**discovery_info)
|
|
else:
|
|
sensor = Sensor(**discovery_info)
|
|
|
|
attr = sensor.value_attribute
|
|
if discovery_info['new_join']:
|
|
cluster = list(in_clusters.values())[0]
|
|
yield from cluster.bind()
|
|
yield from cluster.configure_reporting(
|
|
attr, 300, 600, sensor.min_reportable_change,
|
|
)
|
|
|
|
return sensor
|
|
|
|
|
|
class Sensor(zha.Entity):
|
|
"""Base ZHA sensor."""
|
|
|
|
_domain = DOMAIN
|
|
value_attribute = 0
|
|
min_reportable_change = 1
|
|
|
|
@property
|
|
def state(self) -> str:
|
|
"""Return the state of the entity."""
|
|
if isinstance(self._state, float):
|
|
return str(round(self._state, 2))
|
|
return self._state
|
|
|
|
def attribute_updated(self, attribute, value):
|
|
"""Handle attribute update from device."""
|
|
_LOGGER.debug("Attribute updated: %s %s %s", self, attribute, value)
|
|
if attribute == self.value_attribute:
|
|
self._state = value
|
|
self.schedule_update_ha_state()
|
|
|
|
|
|
class TemperatureSensor(Sensor):
|
|
"""ZHA temperature sensor."""
|
|
|
|
min_reportable_change = 50 # 0.5'C
|
|
|
|
@property
|
|
def unit_of_measurement(self):
|
|
"""Return the unit of measurement of this entityy."""
|
|
return self.hass.config.units.temperature_unit
|
|
|
|
@property
|
|
def state(self):
|
|
"""Return the state of the entity."""
|
|
if self._state == 'unknown':
|
|
return 'unknown'
|
|
celsius = round(float(self._state) / 100, 1)
|
|
return convert_temperature(
|
|
celsius, TEMP_CELSIUS, self.unit_of_measurement)
|