broke out button functionality
This commit is contained in:
52
button.py
Normal file
52
button.py
Normal file
@@ -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
|
||||
@@ -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():
|
||||
|
||||
Reference in New Issue
Block a user