# 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)