Introduces a simple, generic publish/subscribe event bus system.

This decouples hardware components (like the LED controller) from the core application logic, allowing for a more modular and extensible design.
This commit is contained in:
imonlinux
2025-10-11 12:33:40 -07:00
committed by GitHub
parent 710610035c
commit fd54c25303
+6 -12
View File
@@ -15,29 +15,28 @@ class EventBus:
"""
Subscribes a listener to a topic.
"""
# _LOGGER.debug(f'EventBus subscribe {topic}')
if topic not in self.topics:
self.topics[topic] = []
self.topics[topic].append(listener)
def publish(self, topic: str, data: [dict, None]) -> None:
def publish(self, topic: str, data: Optional[Dict[str, Any]] = None) -> None:
"""
Publishes an event to all subscribed listeners.
"""
# _LOGGER.debug(f'EventBus publish {topic}')
if data is None:
data = {}
data['__topic'] = topic
listeners = self.topics.get(topic, [])
for listener in listeners:
try:
listener(data)
except Exception:
_LOGGER.exception("Error in event listener for topic %s", topic)
# Client helpers for subscriptions
# The decorator to mark methods for subscription.
def subscribe(func: Callable) -> Callable:
"""Decorator to mark a method for event bus subscription."""
func._event_bus_subscribe = True
@@ -46,15 +45,10 @@ def subscribe(func: Callable) -> Callable:
class EventHandler:
"""
A base class for components that subscribe to events.
Subclasses should define event handlers as methods decorated with `@subscribe`.
The method name will automatically be used as the event topic.
"""
def __init__(self, state: Any):
self.state = state
self._subscribe_all_methods()
_LOGGER.debug(f"EventHandler {self.__class__.__name__} has subscribed to all decorated methods.")
def _subscribe_all_methods(self):
"""Finds and subscribes all methods decorated with @subscribe."""