def _create_rfx(config): """Construct a rfx object based on config.""" modes = config.get(CONF_PROTOCOLS) if modes: _LOGGER.debug("Using modes: %s", ",".join(modes)) else: _LOGGER.debug("No modes defined, using device configuration") if config[CONF_PORT] is not None: # If port is set then we create a TCP connection rfx = rfxtrxmod.Connect( (config[CONF_HOST], config[CONF_PORT]), None, transport_protocol=rfxtrxmod.PyNetworkTransport, modes=modes, ) else: rfx = rfxtrxmod.Connect( config[CONF_DEVICE], None, modes=modes, ) return rfx
def setup(hass, config): """Set up the RFXtrx component.""" # Declare the Handle event def handle_receive(event): """Handle received messages from RFXtrx gateway.""" # Log RFXCOM event if not event.device.id_string: return _LOGGER.debug( "Receive RFXCOM event from " "(Device_id: %s Class: %s Sub: %s, Pkt_id: %s)", slugify(event.device.id_string.lower()), event.device.__class__.__name__, event.device.subtype, "".join(f"{x:02x}" for x in event.data), ) # Callback to HA registered components. for subscriber in RECEIVED_EVT_SUBSCRIBERS: subscriber(event) device = config[DOMAIN].get(ATTR_DEVICE) host = config[DOMAIN].get(CONF_HOST) port = config[DOMAIN].get(CONF_PORT) debug = config[DOMAIN][ATTR_DEBUG] dummy_connection = config[DOMAIN][ATTR_DUMMY] if dummy_connection: rfx_object = rfxtrxmod.Connect( device, None, debug=debug, transport_protocol=rfxtrxmod.DummyTransport2, ) elif port is not None: # If port is set then we create a TCP connection rfx_object = rfxtrxmod.Connect( (host, port), None, debug=debug, transport_protocol=rfxtrxmod.PyNetworkTransport, ) else: rfx_object = rfxtrxmod.Connect(device, None, debug=debug) def _start_rfxtrx(event): rfx_object.event_callback = handle_receive hass.bus.listen_once(EVENT_HOMEASSISTANT_START, _start_rfxtrx) def _shutdown_rfxtrx(event): """Close connection with RFXtrx.""" rfx_object.close_connection() hass.bus.listen_once(EVENT_HOMEASSISTANT_STOP, _shutdown_rfxtrx) hass.data[DATA_RFXOBJECT] = rfx_object return True
def _create_rfx(config): """Construct a rfx object based on config.""" if config[CONF_PORT] is not None: # If port is set then we create a TCP connection rfx = rfxtrxmod.Connect( (config[CONF_HOST], config[CONF_PORT]), None, transport_protocol=rfxtrxmod.PyNetworkTransport, ) else: rfx = rfxtrxmod.Connect(config[CONF_DEVICE], None) return rfx
def setup(hass, config): """Set up the RFXtrx component.""" # Declare the Handle event def handle_receive(event): """Handle received messages from RFXtrx gateway.""" # Log RFXCOM event if not event.device.id_string: return _LOGGER.debug( "Receive RFXCOM event from " "(Device_id: %s Class: %s Sub: %s, Pkt_id: %s)", slugify(event.device.id_string.lower()), event.device.__class__.__name__, event.device.subtype, "".join("{0:02x}".format(x) for x in event.data)) # Callback to HA registered components. for subscriber in RECEIVED_EVT_SUBSCRIBERS: subscriber(event) # Try to load the RFXtrx module. import RFXtrx as rfxtrxmod device = config[DOMAIN][ATTR_DEVICE] debug = config[DOMAIN][ATTR_DEBUG] dummy_connection = config[DOMAIN][ATTR_DUMMY] if dummy_connection: rfx_object = rfxtrxmod.Connect( device, None, debug=debug, transport_protocol=rfxtrxmod.DummyTransport2) else: rfx_object = rfxtrxmod.Connect(device, None, debug=debug) def _start_rfxtrx(event): rfx_object.event_callback = handle_receive hass.bus.listen_once(EVENT_HOMEASSISTANT_START, _start_rfxtrx) def _shutdown_rfxtrx(event): """Close connection with RFXtrx.""" rfx_object.close_connection() hass.bus.listen_once(EVENT_HOMEASSISTANT_STOP, _shutdown_rfxtrx) hass.data[DATA_RFXOBJECT] = rfx_object return True
def test_receive(self): core = RFXtrx.Connect(self.path, event_callback=_callback, debug=False, transport_protocol=RFXtrx.DummyTransport) # Lighting1 bytes_array = bytearray( [0x07, 0x10, 0x00, 0x2a, 0x45, 0x05, 0x01, 0x70]) event = core.transport.receive(bytes_array) self.assertEquals(RFXtrx.ControlEvent, type(event)) self.assertEquals( event.__str__(), "<class 'RFXtrx.ControlEvent'> device=[<class 'RFXtrx.LightingDevice'> type='X10 lighting' id='E5'] values=[('Command', 'On'), ('Rssi numeric', 7)]" ) #status bytes_array = bytearray(b'\x0D\x01\x00\x01\x02\x53\x45' b'\x10' # msg3: rsl b'\x0C' # msg4: hideki lacrosse b'\x2F' # msg5: x10 arc ac homeeasy oregon b'\x01' # msg6: keeloq b'\x01\x00\x00' # unused ) event = core.transport.receive(bytes_array) self.assertEquals(RFXtrx.StatusEvent, type(event)) self.assertEquals( event.__str__(), "<class 'RFXtrx.StatusEvent'> device=[Status [subtype=433.92MHz, firmware=69, output_power=0, devices=['ac', 'arc', 'hideki', 'homeeasy', 'keeloq', 'lacrosse', 'oregon', 'rsl', 'x10']]]" ) core.close_connection()
def test_set_recmodes(self): core = RFXtrx.Connect(self.path, event_callback=_callback, debug=False, transport_protocol=RFXtrx.DummyTransport) self.assertEquals(None, core._modes) modes = [ 'ac', 'arc', 'hideki', 'homeeasy', 'keeloq', 'lacrosse', 'oregon', 'rsl', 'x10' ] bytes_array = bytearray(b'\x0D\x01\x00\x01\x02\x53\x45' b'\x10' # msg3: rsl b'\x0C' # msg4: hideki lacrosse b'\x2F' # msg5: x10 arc ac homeeasy oregon b'\x01' # msg6: keeloq b'\x01\x00\x00' # unused ) core._status = core.transport.receive(bytes_array) core.set_recmodes(modes) self.assertEquals(modes, core._modes) # set an unknown mode with self.assertRaises(ValueError): core.set_recmodes(['arc', 'oregon', 'unknown-mode'])
def test_equal_device_check(self): core = RFXtrx.Connect(self.path, event_callback=_callback, debug=False, transport_protocol=RFXtrx.DummyTransport) data1 = bytearray(b'\x11\x5A\x01\x00\x2E\xB2\x03\x00\x00' b'\x02\xB4\x00\x00\x0C\x46\xA8\x11\x69') energy = core.transport.receive(data1) data2 = bytearray(b'\x0A\x14\x00\xAD\xF3\x94\xAB' b'\x01\x01\x00\x60') light = core.transport.receive(data2) light2 = core.transport.receive(data2) data3 = bytearray(b'\x0A\x52\x02\x11\x70\x02\x00\xA7' b'\x2D\x00\x89') temphum = core.transport.receive(data3) bytes_array = bytearray( b'\x0A\x14\x00\xAD\xF3\x94\xAB\x01\x10\x00\x60') lighting5_subtype0 = core.transport.receive(bytes_array) bytes_array = bytearray( b'\x0A\x14\x01\xAD\xF3\x94\xAB\x01\x10\x00\x60') lighting5_subtype1 = core.transport.receive(bytes_array) self.assertFalse(light == light2) self.assertFalse(light == energy) self.assertFalse(temphum == energy) self.assertTrue(light.device == light2.device) self.assertFalse(light.device == energy.device) self.assertFalse(temphum.device == energy.device) self.assertFalse( lighting5_subtype0.device == lighting5_subtype1.device) core.close_connection()
def setup(hass, config): """Setup the RFXtrx component.""" # Declare the Handle event def handle_receive(event): """Callback all subscribers for RFXtrx gateway.""" # Log RFXCOM event if not event.device.id_string: return _LOGGER.info( "Receive RFXCOM event from " "(Device_id: %s Class: %s Sub: %s)", slugify(event.device.id_string.lower()), event.device.__class__.__name__, event.device.subtype) # Callback to HA registered components. for subscriber in RECEIVED_EVT_SUBSCRIBERS: subscriber(event) # Try to load the RFXtrx module. import RFXtrx as rfxtrxmod # Init the rfxtrx module. global RFXOBJECT device = config[DOMAIN][ATTR_DEVICE] debug = config[DOMAIN][ATTR_DEBUG] dummy_connection = config[DOMAIN][ATTR_DUMMY] if dummy_connection: RFXOBJECT =\ rfxtrxmod.Connect(device, handle_receive, debug=debug, transport_protocol=rfxtrxmod.DummyTransport2) else: RFXOBJECT = rfxtrxmod.Connect(device, handle_receive, debug=debug) def _shutdown_rfxtrx(event): """Close connection with RFXtrx.""" RFXOBJECT.close_connection() hass.bus.listen_once(EVENT_HOMEASSISTANT_STOP, _shutdown_rfxtrx) return True
def setup_rfxtrx(config, loop, mqtt_client, debug): def rfxtrx_event_callback(event): asyncio.run_coroutine_threadsafe(handle_event(event, mqtt_client, config), loop) try: rfxtrx_device = config["rfxtrx"]["device"] log.info(f"Using RFXtrx device '{rfxtrx_device}'") # RFXtrx.Connect starts and runs its own thread rfxtrx_conn = RFXtrx.Connect(rfxtrx_device, rfxtrx_event_callback, debug=debug) return rfxtrx_conn except Exception: log.exception("Failed to setup RFXtrx device") sys.exit(2)
def test_get_device(self): core = RFXtrx.Connect(self.path, event_callback=_callback, transport_protocol=RFXtrx.DummyTransport) # Lighting1 bytes_array = bytearray([0x07, 0x10, 0x00, 0x2a, 0x45, 0x05, 0x01, 0x70]) event = core.transport.parse(bytes_array) device = RFXtrx.get_device(event.device.packettype, event.device.subtype, event.device.id_string) self.assertTrue(device==event.device) # Lighting2 bytes_array =[0x0b, 0x11, 0x00, 0x2a, 0x01, 0x23, 0x45, 0x67, 0x05, 0x02, 0x07, 0x70] event = core.transport.parse(bytes_array) device = RFXtrx.get_device(event.device.packettype, event.device.subtype, event.device.id_string) self.assertTrue(device==event.device) # Lighting3 bytes_array = [0x08, 0x12, 0x00, 0x2a, 0x01, 0x34, 0x02, 0x15, 0x79] event = core.transport.parse(bytes_array) device = RFXtrx.get_device(event.device.packettype, event.device.subtype, event.device.id_string) self.assertTrue(device==event.device) # Lighting4 bytes_array = [0x09, 0x13, 0x00, 0x2a, 0x12, 0x34, 0x56, 0x01, 0x5e, 0x70] event = core.transport.parse(bytes_array) device = RFXtrx.get_device(event.device.packettype, event.device.subtype, event.device.id_string) self.assertTrue(device==event.device) # Lighting5 bytes_array = bytearray(b'\x0A\x14\x00\xAD\xF3\x94\xAB' b'\x01\x01\x00\x60') event = core.transport.parse(bytes_array) device = RFXtrx.get_device(event.device.packettype, event.device.subtype, event.device.id_string) self.assertTrue(device==event.device) #Lighting 6 bytes_array = [0x0b, 0x15, 0x00, 0x2a, 0x12, 0x34, 0x41, 0x05, 0x03, 0x01, 0x00, 0x70] event = core.transport.parse(bytes_array) device = RFXtrx.get_device(event.device.packettype, event.device.subtype, event.device.id_string) self.assertTrue(device==event.device) #energy sensor bytes_array = bytearray(b'\x11\x5A\x01\x00\x2E\xB2\x03\x00\x00' b'\x02\xB4\x00\x00\x0C\x46\xA8\x11\x69') event = core.transport.parse(bytes_array) self.assertRaises(ValueError, RFXtrx.get_device,event.device.packettype, event.device.subtype, event.device.id_string) core.close_connection()
def main(): if len(sys.argv) >= 2: rfxcom_device = sys.argv[1] else: rfxcom_device = '/dev/serial/by-id/usb-RFXCOM_RFXtrx433_A1Y0NJGR-if00-port0' modes_list = sys.argv[2].split() if len(sys.argv) > 2 else None print("modes: ", modes_list) conn = RFXtrx.Connect(rfxcom_device, print_callback, debug=True, modes=modes_list) try: print(conn) while True: print(conn.sensors()) time.sleep(2) finally: conn.close_connection()
def main(): if len(sys.argv) >= 2: rfxcom_device = sys.argv[1] else: rfxcom_device = '/dev/serial/by-id/usb-RFXCOM_RFXtrx433XL_DO2ZW4OB-if00-port0' def on_message(client, userdata, message): print('message topic=', message.topic) if message.topic == '/seav_fan/t1': fan.send_high(conn.transport) elif message.topic == '/seav_fan/t2': fan.send_medium(conn.transport) elif message.topic == '/seav_fan/t3': fan.send_low(conn.transport) elif message.topic == '/seav_fan/t4': fan.send_off(conn.transport) time.sleep(3) try: conn = RFXtrx.Connect(rfxcom_device, print_callback, debug=True) print(conn) fan = RFXtrx.get_device(0x17, 0x03, "005545") print('creating new mqtt client instance') client = mqtt.Client("P1") print('connecting to broker') client.connect(broker_address) print('subscribing to topics') client.subscribe('/seav_fan/t1') client.subscribe('/seav_fan/t2') client.subscribe('/seav_fan/t3') client.subscribe('/seav_fan/t4') client.on_message = on_message client.loop_forever() finally: conn.close_connection() client.loop_stop()
def test_format_packet(self): # Lighting1 core = RFXtrx.Connect(self.path, event_callback=_callback, debug=False, transport_protocol=RFXtrx.DummyTransport) bytes_array = bytearray( [0x07, 0x10, 0x00, 0x2a, 0x45, 0x05, 0x01, 0x70]) event = core.transport.parse(bytes_array) self.assertEquals(RFXtrx.ControlEvent, type(event)) self.assertEquals(event.device.type_string, 'X10 lighting') self.assertEquals(event.device.id_string, 'E5') self.assertEquals(event.values['Command'], 'On') self.assertEquals(event.values['Rssi numeric'], 7) event.device.send_on(core.transport) event.device.send_off(core.transport) self.assertRaises(ValueError, event.device.send_dim, core.transport, 50) # Lighting2 bytes_array = [ 0x0b, 0x11, 0x00, 0x2a, 0x01, 0x23, 0x45, 0x67, 0x05, 0x02, 0x07, 0x70 ] event = core.transport.parse(bytes_array) event.device.send_on(core.transport) event.device.send_off(core.transport) self.assertRaises(ValueError, event.device.send_dim, core.transport, 150) self.assertRaises(ValueError, event.device.send_dim, core.transport, -1) event.device.send_dim(core.transport, 50) event.device.send_dim(core.transport, 0) # Lighting3 bytes_array = [0x08, 0x12, 0x00, 0x2a, 0x01, 0x34, 0x02, 0x15, 0x79] event = core.transport.parse(bytes_array) event.device.send_on(core.transport) event.device.send_off(core.transport) self.assertRaises(ValueError, event.device.send_dim, core.transport, 50) # Lighting4 bytes_array = [ 0x09, 0x13, 0x00, 0x2a, 0x12, 0x34, 0x56, 0x01, 0x5e, 0x70 ] event = core.transport.parse(bytes_array) self.assertEquals(RFXtrx.ControlEvent, type(event)) self.assertEquals(RFXtrx.LightingDevice, type(event.device)) event.device.send_on(core.transport) event.device.send_off(core.transport) self.assertRaises(ValueError, event.device.send_dim, core.transport, 50) # Lighting5, subtype0 bytes_array = bytearray( b'\x0A\x14\x00\xAD\xF3\x94\xAB\x01\x10\x00\x60') event = core.transport.parse(bytes_array) event.device.send_on(core.transport) event.device.send_off(core.transport) event.device.send_open(core.transport) event.device.send_close(core.transport) event.device.send_stop(core.transport) self.assertRaises(ValueError, event.device.send_openclosestop, core.transport, 0x0c) self.assertRaises(ValueError, event.device.send_dim, core.transport, 150) self.assertRaises(ValueError, event.device.send_dim, core.transport, -1) event.device.send_dim(core.transport, 50) event.device.send_dim(core.transport, 0) # Lighting5, subtype0, rollershutter bytes_array = bytearray( b'\x0A\x14\x00\xAD\xF3\x94\xAB\x01\x0D\x00\x60') event = core.transport.parse(bytes_array) event.device.send_open(core.transport) event.device.send_close(core.transport) event.device.send_stop(core.transport) # Lighting5, subtype1 bytes_array = bytearray( b'\x0A\x14\x01\xAD\xF3\x94\xAB\x01\x10\x00\x60') event = core.transport.parse(bytes_array) event.device.send_on(core.transport) event.device.send_off(core.transport) self.assertRaises(ValueError, event.device.send_dim, core.transport, 150) self.assertRaises(ValueError, event.device.send_dim, core.transport, -1) event.device.send_dim(core.transport, 50) event.device.send_dim(core.transport, 0) # Lighting5, subtype2 bytes_array = bytearray( b'\x0A\x14\x02\xAD\xF3\x94\xAB\x01\x10\x00\x60') event = core.transport.parse(bytes_array) event.device.send_on(core.transport) event.device.send_off(core.transport) self.assertRaises(ValueError, event.device.send_dim, core.transport, 150) self.assertRaises(ValueError, event.device.send_dim, core.transport, -1) event.device.send_dim(core.transport, 50) event.device.send_dim(core.transport, 0) # Lighting5, subtype3 bytes_array = bytearray( b'\x0A\x14\x03\xAD\xF3\x94\xAB\x01\x10\x00\x60') event = core.transport.parse(bytes_array) event.device.send_on(core.transport) event.device.send_off(core.transport) self.assertRaises(ValueError, event.device.send_dim, core.transport, 150) self.assertRaises(ValueError, event.device.send_dim, core.transport, -1) event.device.send_dim(core.transport, 50) event.device.send_dim(core.transport, 0) # Lighting5, subtype4 bytes_array = bytearray( b'\x0A\x14\x04\xAD\xF3\x94\xAB\x01\x10\x00\x60') event = core.transport.parse(bytes_array) event.device.send_on(core.transport) event.device.send_off(core.transport) self.assertRaises(ValueError, event.device.send_dim, core.transport, 150) self.assertRaises(ValueError, event.device.send_dim, core.transport, -1) event.device.send_dim(core.transport, 50) event.device.send_dim(core.transport, 0) # Lighting5, subtype5 bytes_array = bytearray( b'\x0A\x14\x05\xAD\xF3\x94\xAB\x01\x10\x00\x60') event = core.transport.parse(bytes_array) event.device.send_on(core.transport) event.device.send_off(core.transport) self.assertRaises(ValueError, event.device.send_dim, core.transport, 150) self.assertRaises(ValueError, event.device.send_dim, core.transport, -1) event.device.send_dim(core.transport, 50) event.device.send_dim(core.transport, 0) # Lighting5, subtype6 . unknown bytes_array = bytearray( b'\x0A\x14\x06\xAD\xF3\x94\xAB\x01\x10\x00\x60') event = core.transport.parse(bytes_array) event.device.send_on(core.transport) event.device.send_off(core.transport) self.assertRaises(ValueError, event.device.send_dim, core.transport, 150) self.assertRaises(ValueError, event.device.send_dim, core.transport, -1) event.device.send_dim(core.transport, 50) event.device.send_dim(core.transport, 0) #Lighting 6 bytes_array = [ 0x0b, 0x15, 0x00, 0x2a, 0x12, 0x34, 0x41, 0x05, 0x03, 0x01, 0x00, 0x70 ] event = core.transport.parse(bytes_array) event.device.send_on(core.transport) event.device.send_off(core.transport) self.assertRaises(ValueError, event.device.send_dim, core.transport, 50) #rain bytes_array = [ 0x0b, 0x55, 0x02, 0x03, 0x12, 0x34, 0x02, 0x50, 0x01, 0x23, 0x45, 0x57 ] event = core.transport.parse(bytes_array) self.assertEquals(RFXtrx.SensorEvent, type(event)) self.assertEquals( event.__str__(), "<class 'RFXtrx.SensorEvent'> device=[<class 'RFXtrx.RFXtrxDevice'> type='PCR800' id='12:34'] values=[('Battery numeric', 7), ('Rain rate', 5.92), ('Rain total', 7456.5), ('Rssi numeric', 5)]" ) #bbq bytes_array = [ 0x0a, 0x4e, 0x01, 0x06, 0xfc, 0xd8, 0x00, 0x13, 0x00, 0x13, 0x79 ] event = core.transport.parse(bytes_array) self.assertEquals(RFXtrx.SensorEvent, type(event)) self.assertEquals( event.__str__(), "<class 'RFXtrx.SensorEvent'> device=[<class 'RFXtrx.RFXtrxDevice'> type='BBQ1 - Maverick ET-732' id='fcd800:78'] values=[('Battery numeric', 9), ('Rssi numeric', 7), ('Temperature', 19), ('Temperature2', 19)]" ) #baro bytes_array = [ 0x09, 0x53, 0x01, 0x2a, 0x96, 0x03, 0x04, 0x06, 0x00, 0x79 ] event = core.transport.parse(bytes_array) self.assertEquals(RFXtrx.SensorEvent, type(event)) self.assertEquals( event.__str__(), "<class 'RFXtrx.SensorEvent'> device=[<class 'RFXtrx.RFXtrxDevice'> type='Unknown type (0x53/0x01)' id='96:03'] values=[('Barometer', 1030), ('Battery numeric', 9), ('Forecast', 'no forecast available'), ('Forecast numeric', 0), ('Rssi numeric', 7)]" ) #wind bytes_array = [ 0x10, 0x56, 0x01, 0x03, 0x2F, 0x00, 0x00, 0xF7, 0x00, 0x20, 0x00, 0x24, 0x81, 0x60, 0x82, 0x50, 0x59 ] event = core.transport.parse(bytes_array) self.assertEquals(RFXtrx.SensorEvent, type(event)) self.assertEquals( event.__str__(), "<class 'RFXtrx.SensorEvent'> device=[<class 'RFXtrx.RFXtrxDevice'> type='WTGR800' id='2f:00'] values=[('Battery numeric', 9), ('Chill', -59.2), ('Rssi numeric', 5), ('Temperature', -35.2), ('Wind average speed', 3.2), ('Wind direction', 247), ('Wind gust', 3.6)]" ) #uv bytes_array = [ 0x09, 0x57, 0x02, 0x02, 0x64, 0x00, 0x20, 0x02, 0x3c, 0x69 ] event = core.transport.parse(bytes_array) self.assertEquals(RFXtrx.SensorEvent, type(event)) self.assertEquals( event.__str__(), "<class 'RFXtrx.SensorEvent'> device=[<class 'RFXtrx.RFXtrxDevice'> type='UVN800' id='64:00'] values=[('Battery numeric', 9), ('Rssi numeric', 6), ('UV', 3.2)]" ) #Elec4 bytes_array = [ 0x13, 0x5b, 0x01, 0x04, 0x2e, 0xB2, 0x01, 0x11, 0x12, 0x14, 0x15, 0x17, 0x18, 0x17, 0x18, 0x19, 0x20, 0x21, 0x22, 0x69 ] event = core.transport.parse(bytes_array) self.assertEquals(RFXtrx.SensorEvent, type(event)) self.assertEquals( event.__str__(), "<class 'RFXtrx.SensorEvent'> device=[<class 'RFXtrx.RFXtrxDevice'> type='CM180i' id='2e:b2'] values=[('Battery numeric', 9), ('Count', 1), ('Current Ch. 1', 437.0), ('Current Ch. 2', 514.1), ('Current Ch. 3', 591.2), ('Rssi numeric', 6), ('Total usage', 113527617921.3023)]" ) #Lighting5 bytes_array = bytearray(b'\x0A\x14\x00\xAD\xF3\x94\xAB' b'\x01\x01\x00\x60') event = core.transport.receive(bytes_array) self.assertEquals(RFXtrx.ControlEvent, type(event)) self.assertEquals( event.__str__(), "<class 'RFXtrx.ControlEvent'> device=[<class 'RFXtrx.LightingDevice'> type='LightwaveRF, Siemens' id='f394ab:1'] values=[('Command', 'On'), ('Rssi numeric', 6)]" ) #RollerTrol bytes_array = bytearray(b'\x09\x19\x00\x00\x00\x9b\xa8\x01\x01\x00') event = core.transport.receive(bytes_array) self.assertEquals(RFXtrx.ControlEvent, type(event)) self.assertEquals( event.__str__(), "<class 'RFXtrx.ControlEvent'> device=[<class 'RFXtrx.RollerTrolDevice'> type='RollerTrol' id='009ba8:1'] values=[('Command', 'Down'), ('Rssi numeric', 0)]" ) event.device.send_open(core.transport) event.device.send_close(core.transport) event.device.send_stop(core.transport) #Rfy bytes_array = bytearray(b'\x08\x1A\x00\x00\x0A\x00\x01\x01\x03') event = core.transport.receive(bytes_array) self.assertEquals(RFXtrx.ControlEvent, type(event)) self.assertEquals( event.__str__(), "<class 'RFXtrx.ControlEvent'> device=[<class 'RFXtrx.RfyDevice'> type='Rfy' id='0a0001:1'] values=[('Command', 'Down')]" ) event.device.send_open(core.transport) event.device.send_close(core.transport) event.device.send_stop(core.transport) #temphumid bytes_array = [ 0x0a, 0x52, 0x01, 0x2a, 0x96, 0x03, 0x81, 0x41, 0x60, 0x03, 0x79 ] event = core.transport.parse(bytes_array) self.assertEquals(RFXtrx.SensorEvent, type(event)) self.assertEquals( event.__str__(), "<class 'RFXtrx.SensorEvent'> device=[<class 'RFXtrx.RFXtrxDevice'> type='THGN122/123, THGN132, THGR122/228/238/268' id='96:03'] values=[('Battery numeric', 9), ('Humidity', 96), ('Humidity status', 'wet'), ('Humidity status numeric', 3), ('Rssi numeric', 7), ('Temperature', -32.1)]" ) #Chime bytes_array = [ 0x0a, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ] event = core.transport.parse(bytes_array) self.assertEquals(RFXtrx.SensorEvent, type(event)) self.assertEquals( event.__str__(), "<class 'RFXtrx.SensorEvent'> device=[<class 'RFXtrx.RFXtrxDevice'> type='Byron SX' id='00:00'] values=[('Battery numeric', 0), ('Rssi numeric', 0), ('Sound', 0)]" ) #security1 bytes_array = [ 0x0a, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ] event = core.transport.parse(bytes_array) self.assertEquals(RFXtrx.SensorEvent, type(event)) self.assertEquals( event.__str__(), "<class 'RFXtrx.SensorEvent'> device=[<class 'RFXtrx.RFXtrxDevice'> type='X10 Security' id='000000:32'] values=[('Battery numeric', 0), ('Rssi numeric', 0), ('Sensor Status', 'Normal')]" ) #temp bytes_array = [ 0x0a, 0x50, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ] event = core.transport.parse(bytes_array) self.assertEquals(RFXtrx.SensorEvent, type(event)) self.assertEquals( event.__str__(), "<class 'RFXtrx.SensorEvent'> device=[<class 'RFXtrx.RFXtrxDevice'> type='THR128/138, THC138' id='00:00'] values=[('Battery numeric', 0), ('Rssi numeric', 0), ('Temperature', 0.0)]" ) #humid bytes_array = [ 0x0a, 0x51, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ] event = core.transport.parse(bytes_array) self.assertEquals(RFXtrx.SensorEvent, type(event)) self.assertEquals( event.__str__(), "<class 'RFXtrx.SensorEvent'> device=[<class 'RFXtrx.RFXtrxDevice'> type='LaCrosse TX3' id='00:00'] values=[('Battery numeric', 0), ('Humidity', 0), ('Humidity status', 'dry'), ('Humidity status numeric', 0), ('Rssi numeric', 0)]" ) #temphumidBaro bytes_array = [ 0x10, 0x54, 0x01, 0x03, 0x2F, 0x00, 0x00, 0xF7, 0x00, 0x20, 0x00, 0x24, 0x81, 0x60, 0x82, 0x50, 0x59 ] event = core.transport.parse(bytes_array) self.assertEquals(RFXtrx.SensorEvent, type(event)) self.assertEquals( event.__str__(), "<class 'RFXtrx.SensorEvent'> device=[<class 'RFXtrx.RFXtrxDevice'> type='BTHR918' id='2f:00'] values=[('Barometer', 36), ('Battery numeric', 0), ('Forecast', 'unknown forecast'), ('Forecast numeric', 129), ('Humidity', 0), ('Humidity status', 'unknown humidity'), ('Humidity status numeric', 32), ('Rssi numeric', 6), ('Temperature', 24.7)]" ) #rfxmeter # A 71 0 1F 21 D1 0 20 1F A4 60 bytes_array = [ 0x0A, 0x71, 0x00, 0x1F, 0x21, 0xD1, 0x00, 0x20, 0x1F, 0xA4, 0x60 ] event = core.transport.parse(bytes_array) self.assertEquals(RFXtrx.SensorEvent, type(event)) self.assertEqual(event.device.subtype, 0x00) self.assertEqual(event.device.type_string, 'RFXMeter Data Packet') self.assertEqual(event.device.id_string, '21') self.assertEquals(event.values['Counter value'], 2105252) #temphumidBaro, too short package length bytes_array = [ 0x10, 0x54, 0x01, 0x03, 0x2F, 0x00, 0x00, 0xF7, 0x00, 0x20, 0x00, 0x24, 0x81, 0x60, 0x82, 0x50 ] event = core.transport.parse(bytes_array) self.assertEquals(None, event) core.close_connection()
def test_invalid_packet(self): bytes_array = bytearray([0x09, 0x11, 0xd7, 0x00, 0x01, 0x1d, 0x14, 0x02, 0x79, 0x0a]) core = RFXtrx.Connect(self.path, event_callback=_callback, transport_protocol=RFXtrx.DummyTransport) event = core.transport.parse(bytes_array) self.assertIsNone(event)
def test_format_packet(self): # Lighting1 core = RFXtrx.Connect(self.path, event_callback=_callback, debug=False, transport_protocol=RFXtrx.DummyTransport) bytes_array = bytearray( [0x07, 0x10, 0x00, 0x2a, 0x45, 0x05, 0x01, 0x70]) event = core.transport.parse(bytes_array) self.assertEquals(RFXtrx.ControlEvent, type(event)) self.assertEquals(event.device.type_string, 'X10 lighting') self.assertEquals(event.device.id_string, 'E5') self.assertEquals(event.values['Command'], 'On') self.assertEquals(event.values['Rssi numeric'], 7) event.device.send_on(core.transport) event.device.send_off(core.transport) self.assertRaises(ValueError, event.device.send_dim, core.transport, 50) # Lighting2 bytes_array = [ 0x0b, 0x11, 0x00, 0x2a, 0x01, 0x23, 0x45, 0x67, 0x05, 0x02, 0x07, 0x70 ] event = core.transport.parse(bytes_array) event.device.send_on(core.transport) event.device.send_off(core.transport) self.assertRaises(ValueError, event.device.send_dim, core.transport, 150) self.assertRaises(ValueError, event.device.send_dim, core.transport, -1) event.device.send_dim(core.transport, 50) event.device.send_dim(core.transport, 0) # Lighting3 bytes_array = [0x08, 0x12, 0x00, 0x2a, 0x01, 0x34, 0x02, 0x15, 0x79] event = core.transport.parse(bytes_array) event.device.send_on(core.transport) event.device.send_off(core.transport) self.assertRaises(ValueError, event.device.send_dim, core.transport, 50) # Lighting4, not supported yet bytes_array = [ 0x09, 0x13, 0x00, 0x2a, 0x12, 0x34, 0x56, 0x01, 0x5e, 0x70 ] event = core.transport.parse(bytes_array) self.assertEquals(RFXtrx.ControlEvent, type(event)) self.assertEquals(RFXtrx.RFXtrxDevice, type(event.device)) # event.device.send_on(core.transport) # event.device.send_off(core.transport) # self.assertRaises(ValueError,event.device.send_dim,core.transport,50) # Lighting5, subtype0 bytes_array = bytearray( b'\x0A\x14\x00\xAD\xF3\x94\xAB\x01\x10\x00\x60') event = core.transport.parse(bytes_array) event.device.send_on(core.transport) event.device.send_off(core.transport) event.device.send_open(core.transport) event.device.send_close(core.transport) event.device.send_stop(core.transport) self.assertRaises(ValueError, event.device.send_openclosestop, core.transport, 0x0c) self.assertRaises(ValueError, event.device.send_dim, core.transport, 150) self.assertRaises(ValueError, event.device.send_dim, core.transport, -1) event.device.send_dim(core.transport, 50) event.device.send_dim(core.transport, 0) # Lighting5, subtype0, rollershutter bytes_array = bytearray( b'\x0A\x14\x00\xAD\xF3\x94\xAB\x01\x0D\x00\x60') event = core.transport.parse(bytes_array) event.device.send_open(core.transport) event.device.send_close(core.transport) event.device.send_stop(core.transport) # Lighting5, subtype1 bytes_array = bytearray( b'\x0A\x14\x01\xAD\xF3\x94\xAB\x01\x10\x00\x60') event = core.transport.parse(bytes_array) event.device.send_on(core.transport) event.device.send_off(core.transport) self.assertRaises(ValueError, event.device.send_dim, core.transport, 150) self.assertRaises(ValueError, event.device.send_dim, core.transport, -1) event.device.send_dim(core.transport, 50) event.device.send_dim(core.transport, 0) # Lighting5, subtype2 bytes_array = bytearray( b'\x0A\x14\x02\xAD\xF3\x94\xAB\x01\x10\x00\x60') event = core.transport.parse(bytes_array) event.device.send_on(core.transport) event.device.send_off(core.transport) self.assertRaises(ValueError, event.device.send_dim, core.transport, 150) self.assertRaises(ValueError, event.device.send_dim, core.transport, -1) event.device.send_dim(core.transport, 50) event.device.send_dim(core.transport, 0) # Lighting5, subtype3 bytes_array = bytearray( b'\x0A\x14\x03\xAD\xF3\x94\xAB\x01\x10\x00\x60') event = core.transport.parse(bytes_array) event.device.send_on(core.transport) event.device.send_off(core.transport) self.assertRaises(ValueError, event.device.send_dim, core.transport, 150) self.assertRaises(ValueError, event.device.send_dim, core.transport, -1) event.device.send_dim(core.transport, 50) event.device.send_dim(core.transport, 0) # Lighting5, subtype4 bytes_array = bytearray( b'\x0A\x14\x04\xAD\xF3\x94\xAB\x01\x10\x00\x60') event = core.transport.parse(bytes_array) event.device.send_on(core.transport) event.device.send_off(core.transport) self.assertRaises(ValueError, event.device.send_dim, core.transport, 150) self.assertRaises(ValueError, event.device.send_dim, core.transport, -1) event.device.send_dim(core.transport, 50) event.device.send_dim(core.transport, 0) # Lighting5, subtype5 bytes_array = bytearray( b'\x0A\x14\x05\xAD\xF3\x94\xAB\x01\x10\x00\x60') event = core.transport.parse(bytes_array) event.device.send_on(core.transport) event.device.send_off(core.transport) self.assertRaises(ValueError, event.device.send_dim, core.transport, 150) self.assertRaises(ValueError, event.device.send_dim, core.transport, -1) event.device.send_dim(core.transport, 50) event.device.send_dim(core.transport, 0) # Lighting5, subtype6 . unknown bytes_array = bytearray( b'\x0A\x14\x06\xAD\xF3\x94\xAB\x01\x10\x00\x60') event = core.transport.parse(bytes_array) event.device.send_on(core.transport) event.device.send_off(core.transport) self.assertRaises(ValueError, event.device.send_dim, core.transport, 150) self.assertRaises(ValueError, event.device.send_dim, core.transport, -1) event.device.send_dim(core.transport, 50) event.device.send_dim(core.transport, 0) #Lighting 6 bytes_array = [ 0x0b, 0x15, 0x00, 0x2a, 0x12, 0x34, 0x41, 0x05, 0x03, 0x01, 0x00, 0x70 ] event = core.transport.parse(bytes_array) event.device.send_on(core.transport) event.device.send_off(core.transport) self.assertRaises(ValueError, event.device.send_dim, core.transport, 50) #rain bytes_array = [ 0x0b, 0x55, 0x02, 0x03, 0x12, 0x34, 0x02, 0x50, 0x01, 0x23, 0x45, 0x57 ] event = core.transport.parse(bytes_array) self.assertEquals(RFXtrx.SensorEvent, type(event)) self.assertEquals( event.__str__(), "<class 'RFXtrx.SensorEvent'> device=[<class 'RFXtrx.RFXtrxDevice'> type='PCR800' id='12:34'] values=[('Battery numeric', 7), ('Rain rate', 5.92), ('Rain total', 7456.5), ('Rssi numeric', 5)]" ) #baro bytes_array = [ 0x09, 0x53, 0x01, 0x2a, 0x96, 0x03, 0x04, 0x06, 0x00, 0x79 ] event = core.transport.parse(bytes_array) self.assertEquals(RFXtrx.SensorEvent, type(event)) self.assertEquals( event.__str__(), "<class 'RFXtrx.SensorEvent'> device=[<class 'RFXtrx.RFXtrxDevice'> type='Unknown type (0x53/0x01)' id='96:03'] values=[('Barometer', 1030), ('Battery numeric', 9), ('Forecast', 'no forecast available'), ('Forecast numeric', 0), ('Rssi numeric', 7)]" ) #wind bytes_array = [ 0x10, 0x56, 0x01, 0x03, 0x2F, 0x00, 0x00, 0xF7, 0x00, 0x20, 0x00, 0x24, 0x81, 0x60, 0x82, 0x50, 0x59 ] event = core.transport.parse(bytes_array) self.assertEquals(RFXtrx.SensorEvent, type(event)) self.assertEquals( event.__str__(), "<class 'RFXtrx.SensorEvent'> device=[<class 'RFXtrx.RFXtrxDevice'> type='WTGR800' id='2f:00'] values=[('Battery numeric', 9), ('Chill', -59.2), ('Rssi numeric', 5), ('Temperature', -35.2), ('Wind average speed', 3.2), ('Wind direction', 247), ('Wind gust', 3.6)]" ) #Lighting5 bytes_array = bytearray(b'\x0A\x14\x00\xAD\xF3\x94\xAB' b'\x01\x01\x00\x60') event = core.transport.receive(bytes_array) self.assertEquals(RFXtrx.ControlEvent, type(event)) self.assertEquals( event.__str__(), "<class 'RFXtrx.ControlEvent'> device=[<class 'RFXtrx.LightingDevice'> type='LightwaveRF, Siemens' id='f394ab:1'] values=[('Command', 'On'), ('Rssi numeric', 6)]" ) #temphumid bytes_array = [ 0x0a, 0x52, 0x01, 0x2a, 0x96, 0x03, 0x81, 0x41, 0x60, 0x03, 0x79 ] event = core.transport.parse(bytes_array) self.assertEquals(RFXtrx.SensorEvent, type(event)) self.assertEquals( event.__str__(), "<class 'RFXtrx.SensorEvent'> device=[<class 'RFXtrx.RFXtrxDevice'> type='THGN122/123, THGN132, THGR122/228/238/268' id='96:03'] values=[('Battery numeric', 9), ('Humidity', 96), ('Humidity status', 'wet'), ('Humidity status numeric', 3), ('Rssi numeric', 7), ('Temperature', -32.1)]" ) #Chime bytes_array = [ 0x0a, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ] event = core.transport.parse(bytes_array) self.assertEquals(RFXtrx.SensorEvent, type(event)) self.assertEquals( event.__str__(), "<class 'RFXtrx.SensorEvent'> device=[<class 'RFXtrx.RFXtrxDevice'> type='Byron SX' id='00:00'] values=[('Battery numeric', 0), ('Rssi numeric', 0), ('Sound', 0)]" ) #security1 bytes_array = [ 0x0a, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ] event = core.transport.parse(bytes_array) self.assertEquals(RFXtrx.SensorEvent, type(event)) self.assertEquals( event.__str__(), "<class 'RFXtrx.SensorEvent'> device=[<class 'RFXtrx.RFXtrxDevice'> type='X10 Security' id='000000:32'] values=[('Battery numeric', 0), ('Rssi numeric', 0), ('Sensor Status', 'Normal')]" ) #temp bytes_array = [ 0x0a, 0x50, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ] event = core.transport.parse(bytes_array) self.assertEquals(RFXtrx.SensorEvent, type(event)) self.assertEquals( event.__str__(), "<class 'RFXtrx.SensorEvent'> device=[<class 'RFXtrx.RFXtrxDevice'> type='THR128/138, THC138' id='00:00'] values=[('Battery numeric', 0), ('Rssi numeric', 0), ('Temperature', 0.0)]" ) #humid bytes_array = [ 0x0a, 0x51, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ] event = core.transport.parse(bytes_array) self.assertEquals(RFXtrx.SensorEvent, type(event)) self.assertEquals( event.__str__(), "<class 'RFXtrx.SensorEvent'> device=[<class 'RFXtrx.RFXtrxDevice'> type='LaCrosse TX3' id='00:00'] values=[('Battery numeric', 0), ('Humidity', 0), ('Humidity status', 'dry'), ('Humidity status numeric', 0), ('Rssi numeric', 0)]" ) #temphumidBaro bytes_array = [ 0x10, 0x54, 0x01, 0x03, 0x2F, 0x00, 0x00, 0xF7, 0x00, 0x20, 0x00, 0x24, 0x81, 0x60, 0x82, 0x50, 0x59 ] event = core.transport.parse(bytes_array) self.assertEquals(RFXtrx.SensorEvent, type(event)) self.assertEquals( event.__str__(), "<class 'RFXtrx.SensorEvent'> device=[<class 'RFXtrx.RFXtrxDevice'> type='BTHR918' id='2f:00'] values=[('Barometer', 36), ('Battery numeric', 0), ('Forecast', 'unknown forecast'), ('Forecast numeric', 129), ('Humidity', 0), ('Humidity status', 'unknown humidity'), ('Humidity status numeric', 32), ('Rssi numeric', 6), ('Temperature', 24.7)]" ) #temphumidBaro, too short package length bytes_array = [ 0x10, 0x54, 0x01, 0x03, 0x2F, 0x00, 0x00, 0xF7, 0x00, 0x20, 0x00, 0x24, 0x81, 0x60, 0x82, 0x50 ] event = core.transport.parse(bytes_array) self.assertEquals(None, event) core.close_connection()
def setup_internal(hass, config): """Set up the RFXtrx component.""" # Setup some per device config device_events = set() device_bits = {} for event_code, event_config in hass.data[DATA_RFXTRX_CONFIG][ CONF_DEVICES].items(): event = get_rfx_object(event_code) device_id = get_device_id(event.device, data_bits=event_config.get(CONF_DATA_BITS)) device_bits[device_id] = event_config.get(CONF_DATA_BITS) if event_config[CONF_FIRE_EVENT]: device_events.add(device_id) # Declare the Handle event def handle_receive(event): """Handle received messages from RFXtrx gateway.""" # Log RFXCOM event if not event.device.id_string: return event_data = { "packet_type": event.device.packettype, "sub_type": event.device.subtype, "type_string": event.device.type_string, "id_string": event.device.id_string, "data": "".join(f"{x:02x}" for x in event.data), "values": getattr(event, "values", None), } _LOGGER.debug("Receive RFXCOM event: %s", event_data) data_bits = get_device_data_bits(event.device, device_bits) device_id = get_device_id(event.device, data_bits=data_bits) # Callback to HA registered components. hass.helpers.dispatcher.dispatcher_send(SIGNAL_EVENT, event, device_id) # Signal event to any other listeners if device_id in device_events: hass.bus.fire(EVENT_RFXTRX_EVENT, event_data) device = config[CONF_DEVICE] host = config[CONF_HOST] port = config[CONF_PORT] debug = config[CONF_DEBUG] if port is not None: # If port is set then we create a TCP connection rfx_object = rfxtrxmod.Connect( (host, port), None, debug=debug, transport_protocol=rfxtrxmod.PyNetworkTransport, ) else: rfx_object = rfxtrxmod.Connect(device, None, debug=debug) def _start_rfxtrx(event): rfx_object.event_callback = handle_receive hass.bus.listen_once(EVENT_HOMEASSISTANT_START, _start_rfxtrx) def _shutdown_rfxtrx(event): """Close connection with RFXtrx.""" rfx_object.close_connection() hass.bus.listen_once(EVENT_HOMEASSISTANT_STOP, _shutdown_rfxtrx) hass.data[DATA_RFXOBJECT] = rfx_object def send(call): event = call.data[ATTR_EVENT] rfx_object.transport.send(event) hass.services.register(DOMAIN, SERVICE_SEND, send, schema=SERVICE_SEND_SCHEMA)