77 lines
2.3 KiB
Python
77 lines
2.3 KiB
Python
"""Handles event firing and notification."""
|
|
|
|
import logging
|
|
|
|
from .const import LOGGER_PATH
|
|
|
|
_LOGGER = logging.getLogger(LOGGER_PATH + ".event")
|
|
|
|
|
|
class Event:
|
|
"""Define event functions."""
|
|
|
|
#
|
|
# Global hass instance
|
|
#
|
|
hass = None
|
|
|
|
#
|
|
# notify message queues by event type
|
|
#
|
|
notify = {}
|
|
notify_remove = {}
|
|
|
|
def __init__(self):
|
|
"""Warn on Event instantiation."""
|
|
_LOGGER.error("Event class is not meant to be instantiated")
|
|
|
|
@classmethod
|
|
def init(cls, hass):
|
|
"""Initialize Event."""
|
|
|
|
cls.hass = hass
|
|
|
|
@classmethod
|
|
async def event_listener(cls, event):
|
|
"""Listen callback for given event which updates any notifications."""
|
|
|
|
func_args = {
|
|
"trigger_type": "event",
|
|
"event_type": event.event_type,
|
|
"context": event.context,
|
|
}
|
|
func_args.update(event.data)
|
|
await cls.update(event.event_type, func_args)
|
|
|
|
@classmethod
|
|
def notify_add(cls, event_type, queue):
|
|
"""Register to notify for events of given type to be sent to queue."""
|
|
|
|
if event_type not in cls.notify:
|
|
cls.notify[event_type] = set()
|
|
_LOGGER.debug("event.notify_add(%s) -> adding event listener", event_type)
|
|
cls.notify_remove[event_type] = cls.hass.bus.async_listen(event_type, cls.event_listener)
|
|
cls.notify[event_type].add(queue)
|
|
|
|
@classmethod
|
|
def notify_del(cls, event_type, queue):
|
|
"""Unregister to notify for events of given type for given queue."""
|
|
|
|
if event_type not in cls.notify or queue not in cls.notify[event_type]:
|
|
return
|
|
cls.notify[event_type].discard(queue)
|
|
if len(cls.notify[event_type]) == 0:
|
|
cls.notify_remove[event_type]()
|
|
_LOGGER.debug("event.notify_del(%s) -> removing event listener", event_type)
|
|
del cls.notify[event_type]
|
|
del cls.notify_remove[event_type]
|
|
|
|
@classmethod
|
|
async def update(cls, event_type, func_args):
|
|
"""Deliver all notifications for an event of the given type."""
|
|
|
|
_LOGGER.debug("event.update(%s, %s)", event_type, func_args)
|
|
if event_type in cls.notify:
|
|
for queue in cls.notify[event_type]:
|
|
await queue.put(["event", func_args.copy()])
|