from caspia.meadow.client import characteristic_read_handler, characteristic_write_handler
from caspia.node import components
[docs]class RelayBasedServiceMixin:
""" Mixin to be used in services that encapsulate relay components.
"""
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.relay_c = None
@property
def dependant_components(self):
return {self.relay_c}
[docs] async def on_component_event(self, component, event):
if self.relay_c == component:
if isinstance(event, components.Relay.StateOnEvent):
await self.notify(self.is_on, True)
elif isinstance(event, components.Relay.StateOffEvent):
await self.notify(self.is_on, False)
[docs] @characteristic_read_handler('is_on')
async def is_on_read(self, **kwargs):
if self.relay_c.state is None or self.relay_c.state.is_on is None:
await self.relay_c.load_state()
return self.relay_c.state.is_on
[docs] @characteristic_write_handler('is_on')
async def is_on_write(self, value, **kwargs):
if value:
await self.relay_c.on()
else:
await self.relay_c.off()
[docs] @characteristic_write_handler('toggle')
async def toggle_write(self, value, **kwargs):
await self.relay_c.toggle()