hass-core/homeassistant/components/sensor/rfxtrx.py
2015-07-23 19:50:26 +02:00

113 lines
3.1 KiB
Python

"""
homeassistant.components.sensor.rfxtrx
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Shows sensor values from rfxtrx sensors.
Possible config keys:
device="path to rfxtrx device"
Example:
sensor 2:
platform: rfxtrx
device : /dev/serial/by-id/usb-RFXCOM_RFXtrx433_A1Y0NJGR-if00-port0
"""
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