Support for rfxtrx sensors

This commit is contained in:
Daniel Hoyer Iversen 2015-07-23 19:36:05 +02:00
parent e277decd4c
commit 44ce756cba

View file

@ -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