Home Assistant Git Exporter
This commit is contained in:
76
config/custom_components/pyscript/event.py
Normal file
76
config/custom_components/pyscript/event.py
Normal file
@@ -0,0 +1,76 @@
|
||||
"""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()])
|
||||
Reference in New Issue
Block a user