Source code for caspia.pan.rules.thermostat

# pylint: disable=broad-except
import asyncio

from caspia.meadow.rules import ThermostatRule
from caspia.toolbox.services.thermostat import Thermostat
from caspia.toolbox.storage import ProxyStorage

from .base import RuleActivator


[docs]class ThermostatRuleActivator(RuleActivator): def __init__(self, rule): super().__init__(rule) self.rule: ThermostatRule
[docs] @classmethod def can_activate_rule(cls, rule): return isinstance(rule, ThermostatRule)
[docs] async def do_activate(self): from caspia.pan import get_global_pan storage = ProxyStorage(get_global_pan().storage, f'rule|{self.rule.identifier}|') # create the service service = _Thermostat(name=self.rule.identifier, storage=storage, current_temp=self.rule.temperature, heating=self.rule.heating, **self.rule.params) service.activator = self get_global_pan().gateway.add(service) self.service = service
[docs] async def do_deactivate(self): from caspia.pan import get_global_pan self.service.stop() get_global_pan().gateway.remove(self.service) self.service.activator = None self.service = None
class _Thermostat(Thermostat): async def update_periodically(self, interval): while True: with self.activator.running_status(): try: await self.update() except Exception as e: # try to inform the heating try: await self.heating.on_error(e) except Exception: pass # prefer reporting the original error # raising the error reports it raise await asyncio.sleep(interval)