From b6e0286d71a02f19304b7ac48663a7a2a151c11c Mon Sep 17 00:00:00 2001 From: Open Home Automation Date: Wed, 12 Jul 2017 12:21:15 +0200 Subject: [PATCH] Implement a bridge between HASS event bus and KNX bus to send events (#8449) * Implement a bridge between HASS event bus and KNX bus to send events as KNX messages * Formatting --- homeassistant/components/knx.py | 45 +++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/homeassistant/components/knx.py b/homeassistant/components/knx.py index 30488113d7e..ec533a7850b 100644 --- a/homeassistant/components/knx.py +++ b/homeassistant/components/knx.py @@ -22,6 +22,7 @@ DEFAULT_PORT = 3671 DOMAIN = 'knx' EVENT_KNX_FRAME_RECEIVED = 'knx_frame_received' +EVENT_KNX_FRAME_SEND = 'knx_frame_send' KNXTUNNEL = None CONF_LISTEN = "listen" @@ -83,6 +84,50 @@ def setup(hass, config): listen, knxexception) hass.bus.listen_once(EVENT_HOMEASSISTANT_STOP, close_tunnel) + + # Listen to KNX events and send them to the bus + def handle_knx_send(event): + """Bridge knx_frame_send events to the KNX bus.""" + try: + addr = event.data["address"] + except KeyError: + _LOGGER.error("KNX group address is missing") + return + + try: + data = event.data["data"] + except KeyError: + _LOGGER.error("KNX data block missing") + return + + knxaddr = None + try: + addr = int(addr) + except ValueError: + pass + + if knxaddr is None: + try: + knxaddr = parse_group_address(addr) + except KNXException: + _LOGGER.error("KNX address format incorrect") + return + + knxdata = None + if isinstance(data, list): + knxdata = data + else: + try: + knxdata = [int(data) & 0xff] + except ValueError: + _LOGGER.error("KNX data format incorrect") + return + + KNXTUNNEL.group_write(knxaddr, knxdata) + + # Listen for when knx_frame_send event is fired + hass.bus.listen(EVENT_KNX_FRAME_SEND, handle_knx_send) + return True