feat: add EventSensor class for temporary binary sensor activation

This commit is contained in:
2026-07-09 23:07:30 +02:00
parent c71094641b
commit b997836401
2 changed files with 46 additions and 8 deletions

View File

@@ -60,8 +60,10 @@ import json
# =============================================================================
class EventDispatcher:
def __init__(self,ad_api,event_name,callback,event_data,reset_data,event_context,debounce_seconds=None):
self.ad_api = ad_api
def __init__(self,ad_api,logger_interface,event_name,callback,event_data,reset_data,event_context,debounce_seconds=None):
self.ad_api = ad_api
self.logger_interface = logger_interface
event_data = self._resolve_zha_device_name(event_data)
reset_data = self._resolve_zha_device_name(reset_data)
self.event_name = event_name
@@ -126,7 +128,7 @@ class EventDispatcher:
result = resp.read().decode('utf-8').strip()
return result if result else None
except Exception as e:
self.ad_api.log_error(f"[EventDispatcher] Failed to resolve ZHA device name '{device_name}': {e}")
self.logger_interface.log_error(f"[EventDispatcher] Failed to resolve ZHA device name '{device_name}': {e}")
return None
def _resolve_zha_device_name(self, data):
@@ -139,10 +141,10 @@ class EventDispatcher:
ieee = self._lookup_zha_ieee(name)
resolved = {k: v for k, v in data.items() if k != 'device_name'}
if ieee is not None:
self.ad_api.log_info(f"[EventDispatcher] Resolved ZHA device name '{name}' to IEEE '{ieee}'")
self.logger_interface.log_info(f"[EventDispatcher] Resolved ZHA device name '{name}' to IEEE '{ieee}'")
resolved['device_ieee'] = ieee
else:
self.ad_api.log_error(f"[EventDispatcher] ZHA device '{name}' not found — 'device_name' filter ignored")
self.logger_interface.log_error(f"[EventDispatcher] ZHA device '{name}' not found — 'device_name' filter ignored")
return resolved
def process_event(self,data):
@@ -183,11 +185,15 @@ class EventDispatcher:
return False
class EventHandler:
def __init__(self, ad_api,events_block,callback,event_context = None): #event_context is passed back to the CB has a context
def __init__(self, ad_api,events_block,callback,event_context = None, logger_interface = None): #event_context is passed back to the CB has a context
def register_event_with_params(event_block,callback,event_context):
self.add_dispatcher(event_block['event_name'],callback,event_block['event_data'] if 'event_data' in event_block else None, event_block['reset_data'] if 'reset_data' in event_block else None,event_context, event_block.get('debounce_seconds'))
self.__ad_api = ad_api
if logger_interface:
self.__logger_interface = logger_interface
else:
self.__logger_interface = ad_api
self.event_dispatchers = []
if isinstance(events_block, list):
@@ -198,6 +204,7 @@ class EventHandler:
register_event_with_params(event_block,callback,event_context)
def add_dispatcher(self,event_name,callback,event_data = None,reset_data = None ,event_context = None, debounce_seconds = None):
self.__ad_api.log_info(f'Registering dispatcher {callback.__name__} for event "{event_name}" ({event_data})')
dispatcher = EventDispatcher(self.__ad_api,event_name,callback,event_data,reset_data,event_context,debounce_seconds)
if self.__logger_interface:
self.__logger_interface.log_info(f'Registering dispatcher {callback.__name__} for event "{event_name}" ({event_data})')
dispatcher = EventDispatcher(self.__ad_api,self.__logger_interface,event_name,callback,event_data,reset_data,event_context,debounce_seconds)
self.event_dispatchers.append(dispatcher)