diff --git a/homeassistant/components/sensor/rfxtrx.py b/homeassistant/components/sensor/rfxtrx.py new file mode 100644 index 00000000000..879e3326eb8 --- /dev/null +++ b/homeassistant/components/sensor/rfxtrx.py @@ -0,0 +1,119 @@ +""" +homeassistant.components.sensor.rfxtrx +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Shows sensor values from rfxtrx sensors. + +Possible config keys: + +path to rfxtrx device +device=/dev/serial/by-id/usb-rfxtrx_RFXtrx433_A1Y0NJGR-if00-port0 + +id of the sensor: Name the sensor with ID +135=Outside + +only_named: Only show the named sensors +only_named=1 + +datatype_mask: mask to determine which sensor values to show based on + +datatype_mask=1 # only show temperature +datatype_mask=127 # show all sensor values +""" +import logging +from collections import OrderedDict + +from homeassistant.const import ( + ATTR_BATTERY_LEVEL, TEMP_CELCIUS) +from homeassistant.helpers.entity import Entity + +REQUIREMENTS = ['https://github.com/Danielhiversen/pyRFXtrx/archive/master.zip' + '#RFXtrx>=0.15'] + +DATA_TYPES = OrderedDict([ + ('Temperature', TEMP_CELCIUS), + ('Humidity', '%'), + ('Forecast', ''), + ('Barometer', ''), + ('Wind direction', ''), + ('Humidity status', ''), + ('Humidity status numeric', ''), + ('Forecast numeric', ''), + ('Rain rate', ''), + ('Rain total', ''), + ('Wind average speed', ''), + ('Wind gust', ''), + ('Chill', ''), + ('Battery numeric', ATTR_BATTERY_LEVEL), + ('Rssi numeric', '')]) + + +def setup_platform(hass, config, add_devices, discovery_info=None): + """ Setup the rfxtrx platform. """ + logger = logging.getLogger(__name__) + + devices = {} # keep track of devices added to HA + + def sensor_update(event): + """ Callback for sensor updates from the MySensors gateway. """ + if event.device.id_string in devices: + devices[event.device.id_string].event = event + else: + logger.info("adding new devices: %s", event.device.type_string) + new_device = RfxtrxSensor(event) + devices[event.device.id_string] = new_device + add_devices([new_device]) + try: + import RFXtrx as rfxtrx + except ImportError: + logger.exception( + "Failed to import rfxtrx") + return False + + device = config.get("device", True) + rfxtrx.Core(device, sensor_update) + + +class RfxtrxSensor(Entity): + """ Represents a Vera Sensor. """ + + def __init__(self, event): + self.event = event + + self._unit_of_measurement = None + self._data_type = None + for data_type in DATA_TYPES: + if data_type in self.event.values: + self._unit_of_measurement = DATA_TYPES[data_type] + self._data_type = data_type + break + + id_string = int(event.device.id_string.replace(":", ""), 16) + self._name = "{} {} ({})".format(self._data_type, + self.event.device.type_string, + id_string) + + def __str__(self): + return self._name + + @property + def state(self): + if self._data_type: + return self.event.values[self._data_type] + return None + + @property + def name(self): + """ Get the mame of the sensor. """ + return self._name + + @property + def state_attributes(self): + attr = super().state_attributes + for data_type in DATA_TYPES: + if data_type in self.event.values: + attr[data_type] = self.event.values[data_type] + return attr + + @property + def unit_of_measurement(self): + return self._unit_of_measurement