From fbd60ab6ac930a6f563cf4a89e6e0305ba4669cc Mon Sep 17 00:00:00 2001 From: John Lancaster <32917998+jsl12@users.noreply.github.com> Date: Tue, 2 Dec 2025 10:50:30 -0600 Subject: [PATCH] started moes pad driver and app --- apps/drivers/moes.yaml | 7 ++++ apps/drivers/moes_pad.py | 73 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+) create mode 100644 apps/drivers/moes.yaml create mode 100644 apps/drivers/moes_pad.py diff --git a/apps/drivers/moes.yaml b/apps/drivers/moes.yaml new file mode 100644 index 0000000..02dcd10 --- /dev/null +++ b/apps/drivers/moes.yaml @@ -0,0 +1,7 @@ +moes_driver: + module: moes_pad + class: MoesBridge + +moes2: + module: moes_pad + class: MoesPad \ No newline at end of file diff --git a/apps/drivers/moes_pad.py b/apps/drivers/moes_pad.py new file mode 100644 index 0000000..3c64062 --- /dev/null +++ b/apps/drivers/moes_pad.py @@ -0,0 +1,73 @@ +from enum import Enum +from typing import Any + +from appdaemon.adapi import ADAPI +from appdaemon.adbase import ADBase + + +class MoesButtons(int, Enum): + TOP_LEFT = 1 + TOP_RIGHT = 2 + BOTTOM_LEFT = 3 + BOTTOM_RIGHT = 4 + + +class MoesActions(str, Enum): + SINGLE_PRESS = 'single' + DOUBLE_PRESS = 'double' + LONG_PRESS = 'hold' + + +class MoesBridge(ADBase): + """Class for an app that listens for state changes generated by 4 button Moes Pads and makes the events more + sensible with enums.""" + + adapi: ADAPI + + def initialize(self): + self.adapi = self.get_ad_api() + self.log = self.adapi.log + self.event_handle = self.adapi.listen_state(self.handle_state_change) + + def handle_state_change(self, entity: str, attribute: str, old: Any, new: Any, **kwargs: Any) -> None: + if new == '' or not new[0].isdigit(): + return + + domain, ent = entity.split('.', 1) + if domain == 'sensor' and ent.startswith('moes'): + button, action = new.split('_') + button = MoesButtons(int(button)) + button_str = button.name.lower().replace('_', ' ') + action = MoesActions(action) + self.log(f'Moes Pad action detected: {action.value} on button {button_str}') + self.adapi.fire_event( + 'moes_pad', + device=entity, + button=button, + action=action, + ) + + +class MoesPad(ADBase): + def initialize(self): + self.adapi = self.get_ad_api() + self.log = self.adapi.log + self.event_handle = self.adapi.listen_event(self.handle_moes_event, 'moes_pad') + + def handle_moes_event(self, event_name: str, data: dict[str, Any], **kwargs: Any) -> None: + button = MoesButtons(data.get('button')) + action = MoesActions(data.get('action')) + self.log(f'Received Moes Pad event: {action} on button {button}') + + match action: + case MoesActions.SINGLE_PRESS: + self.handle_single_press(button) + + def handle_single_press(self, button: MoesButtons) -> None: + match button: + case MoesButtons.TOP_LEFT: + self.adapi.call_service('light/toggle', entity_id='light.bedroom_sydney') + case MoesButtons.TOP_RIGHT: + self.adapi.call_service('light/toggle', entity_id='light.bedroom_john') + case MoesButtons.BOTTOM_LEFT: + self.adapi.call_service('light/toggle', entity_id='light.h6076_2')