From ff033c174d0b72681a96a24d52132b75516ac427 Mon Sep 17 00:00:00 2001 From: John Lancaster <32917998+jsl12@users.noreply.github.com> Date: Fri, 24 Nov 2023 23:10:37 -0600 Subject: [PATCH] broke out button functionality --- button.py | 52 +++++++++++++++++++++++++++++++++++++++++++++++++ room_control.py | 40 ------------------------------------- 2 files changed, 52 insertions(+), 40 deletions(-) create mode 100644 button.py diff --git a/button.py b/button.py new file mode 100644 index 0000000..ca9f2c3 --- /dev/null +++ b/button.py @@ -0,0 +1,52 @@ + +import json + +from appdaemon.plugins.hass.hassapi import Hass +from appdaemon.plugins.mqtt.mqttapi import Mqtt +from room_control import RoomController + + +class ButtonController(Mqtt): + def initialize(self): + self.setup_buttons(self.args['button']) + self.app: RoomController = self.get_app(self.args['app']) + + def setup_buttons(self, buttons): + if isinstance(buttons, list): + for button in buttons: + self.setup_button(button) + else: + self.setup_button(buttons) + + def setup_button(self, name: str): + topic = f'zigbee2mqtt/{name}' + self.mqtt_subscribe(topic, namespace='mqtt') + self.listen_event(self.handle_button, "MQTT_MESSAGE", topic=topic, namespace='mqtt', button=name) + self.log(f'{name} controls app {self.args["app"]}') + + def handle_button(self, event_name, data, kwargs): + topic = data['topic'] + # self.log(f'Button event for: {topic}') + try: + payload = json.loads(data['payload']) + action = payload['action'] + button = kwargs['button'] + except json.JSONDecodeError: + self.log(f'Error decoding JSON from {data["payload"]}', level='ERROR') + except KeyError as e: + return + else: + self.log(f'{button}: {action}') + self.handle_action(action) + + def handle_action(self, action: str): + if action == '': + return + elif action == 'single': + cause = 'button single click' + if self.app.entity_state: + self.app.deactivate(cause=cause) + else: + self.app.activate(cause=cause) + else: + pass \ No newline at end of file diff --git a/room_control.py b/room_control.py index 55c5c5b..6f697d6 100755 --- a/room_control.py +++ b/room_control.py @@ -32,16 +32,6 @@ class RoomController(Hass, Mqtt): self.log(f'Setting up input button: {self.friendly_name(ha_button)}') self.listen_state(callback=self.activate_any_on, entity_id=ha_button) - if (button := self.args.get('button')): - if not isinstance(button, list): - button = [button] - for button in button: - self.log(f'Setting up button: {button}') - self.listen_event(self.handle_button, event='deconz_event', id=button, button=button) - topic = f'zigbee2mqtt/{button}' - self.mqtt_subscribe(topic, namespace='mqtt') - self.listen_event(self.handle_button, "MQTT_MESSAGE", topic=topic, namespace='mqtt', button=button) - @property def sensor(self) -> str: return self.args['sensor'] @@ -346,36 +336,6 @@ class RoomController(Hass, Mqtt): except Exception as e: self.log(f'Failed with {type(e)}: {e}') - def handle_button(self, event_name, data, kwargs): - if event_name == 'MQTT_MESSAGE': - topic = data['topic'] - payload = json.loads(data['payload']) - try: - action = payload['action'] - except KeyError as e: - # self.log(f'No action in: {payload}') - return - else: - if action == '': - # self.log(f'{topic}: {payload}') - pass - elif action == 'single': - self.button_single_click(kwargs['button']) - else: - self.log(f'Unhandled button event: {event_name}') - finally: - return - else: - self.log(f'Unhandled button event: {event_name}') - - def button_single_click(self, name: str): - self.log(f'button: {name}: single') - cause = 'button single click' - if self.entity_state: - self.deactivate(cause=cause) - else: - self.activate(cause=cause) - def get_app_callbacks(self, name: str = None): name = name or self.name for app_name, callbacks in self.get_callback_entries().items():