From d64dae8fcffaef0c09649455ff8136572c54585c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20H=C3=B8yer=20Iversen?= Date: Wed, 20 Jul 2016 04:15:50 +0200 Subject: [PATCH] Rfxtrx sensor (#2563) * fire event rfxtrx sensor * Add fire_event to rfxtrx sensor config * Add test for rfxtrx fire event in sensor --- homeassistant/components/rfxtrx.py | 1 + homeassistant/components/sensor/rfxtrx.py | 21 ++++++++++---- tests/components/test_rfxtrx.py | 34 +++++++++++++++++++++++ 3 files changed, 51 insertions(+), 5 deletions(-) diff --git a/homeassistant/components/rfxtrx.py b/homeassistant/components/rfxtrx.py index e5ffba44d40..d684d319117 100644 --- a/homeassistant/components/rfxtrx.py +++ b/homeassistant/components/rfxtrx.py @@ -100,6 +100,7 @@ DEVICE_SCHEMA = vol.Schema({ DEVICE_SCHEMA_SENSOR = vol.Schema({ vol.Optional(ATTR_NAME, default=None): cv.string, + vol.Optional(ATTR_FIREEVENT, default=False): cv.boolean, vol.Optional(ATTR_DATA_TYPE, default=[]): vol.All(cv.ensure_list, [vol.In(DATA_TYPES.keys())]), }) diff --git a/homeassistant/components/sensor/rfxtrx.py b/homeassistant/components/sensor/rfxtrx.py index cee54644629..7560adbc93a 100644 --- a/homeassistant/components/sensor/rfxtrx.py +++ b/homeassistant/components/sensor/rfxtrx.py @@ -12,8 +12,8 @@ import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity from homeassistant.util import slugify from homeassistant.components.rfxtrx import ( - ATTR_AUTOMATIC_ADD, ATTR_NAME, - CONF_DEVICES, ATTR_DATA_TYPE, DATA_TYPES) + ATTR_AUTOMATIC_ADD, ATTR_NAME, ATTR_FIREEVENT, + CONF_DEVICES, ATTR_DATA_TYPE, DATA_TYPES, ATTR_ENTITY_ID) DEPENDENCIES = ['rfxtrx'] @@ -48,7 +48,7 @@ def setup_platform(hass, config, add_devices_callback, discovery_info=None): break for _data_type in data_types: new_sensor = RfxtrxSensor(None, entity_info[ATTR_NAME], - _data_type) + _data_type, entity_info[ATTR_FIREEVENT]) sensors.append(new_sensor) sub_sensors[_data_type] = new_sensor rfxtrx.RFX_DEVICES[device_id] = sub_sensors @@ -65,7 +65,17 @@ def setup_platform(hass, config, add_devices_callback, discovery_info=None): if device_id in rfxtrx.RFX_DEVICES: sensors = rfxtrx.RFX_DEVICES[device_id] for key in sensors: - sensors[key].event = event + sensor = sensors[key] + sensor.event = event + # Fire event + if sensors[key].should_fire_event: + sensor.hass.bus.fire( + "signal_received", { + ATTR_ENTITY_ID: + sensors[key].entity_id, + } + ) + return # Add entity if not exist and the automatic_add is True @@ -94,10 +104,11 @@ def setup_platform(hass, config, add_devices_callback, discovery_info=None): class RfxtrxSensor(Entity): """Representation of a RFXtrx sensor.""" - def __init__(self, event, name, data_type): + def __init__(self, event, name, data_type, should_fire_event=False): """Initialize the sensor.""" self.event = event self._name = name + self.should_fire_event = should_fire_event if data_type not in DATA_TYPES: data_type = "Unknown" self.data_type = data_type diff --git a/tests/components/test_rfxtrx.py b/tests/components/test_rfxtrx.py index 7ee1cd6d90e..61a8f3bd82d 100644 --- a/tests/components/test_rfxtrx.py +++ b/tests/components/test_rfxtrx.py @@ -113,3 +113,37 @@ class TestRFXTRX(unittest.TestCase): self.assertEqual(1, len(calls)) self.assertEqual(calls[0].data, {'entity_id': 'switch.test', 'state': 'on'}) + + def test_fire_event_sensor(self): + """Test fire event.""" + self.assertTrue(_setup_component(self.hass, 'rfxtrx', { + 'rfxtrx': { + 'device': '/dev/serial/by-id/usb' + + '-RFXCOM_RFXtrx433_A1Y0NJGR-if00-port0', + 'dummy': True} + })) + self.assertTrue(_setup_component(self.hass, 'sensor', { + 'sensor': {'platform': 'rfxtrx', + 'automatic_add': True, + 'devices': + {'0a520802060100ff0e0269': { + 'name': 'Test', + rfxtrx.ATTR_FIREEVENT: True} + }}})) + + calls = [] + + def record_event(event): + """Add recorded event to set.""" + calls.append(event) + + self.hass.bus.listen("signal_received", record_event) + event = rfxtrx.get_rfx_object('0a520802060101ff0f0269') + event.data = bytearray(b'\nR\x08\x01\x07\x01\x00\xb8\x1b\x02y') + rfxtrx.RECEIVED_EVT_SUBSCRIBERS[0](event) + + self.hass.pool.block_till_done() + self.assertEqual(1, len(rfxtrx.RFX_DEVICES)) + self.assertEqual(1, len(calls)) + self.assertEqual(calls[0].data, + {'entity_id': 'sensor.test'})