47 lines
2.1 KiB
Python
47 lines
2.1 KiB
Python
from ad_toolbox.smartobject import SmartObject
|
|
import ad_toolbox.smartcondition as SmartCondition
|
|
from ad_toolbox.eventhandler import EventHandler
|
|
|
|
class Senseo(SmartObject):
|
|
|
|
def on_initialize_smart_object(self):
|
|
super().on_initialize_smart_object()
|
|
self.delay_cb_handle = None
|
|
self.smartconditions = dict()
|
|
self.event_handlers = list()
|
|
|
|
try: self.program_configs = self.args['programs']
|
|
except KeyError: self.program_configs = None
|
|
|
|
for config_name in self.program_configs:
|
|
config = self.program_configs[config_name]
|
|
self.smartconditions[config_name] = SmartCondition.Evaluator(self,config['condition'],condition_name = config_name)
|
|
if not self.entity_exists(config['button']): self.log_error(f"Entity not found {config['button']}")
|
|
|
|
self.event_handlers.append(EventHandler(self,config["events"],self.on_event,config_name))
|
|
|
|
def on_event(self, event_name, event_data,config_name):
|
|
self.log_info(f"Event {event_name} received. Config name = {config_name}")
|
|
config = self.program_configs[config_name]
|
|
|
|
try: delay = config['delay']
|
|
except KeyError: delay = 0
|
|
|
|
if self.smartconditions[config_name].evaluate() == SmartCondition.Result.Succeeded:
|
|
if (delay > 0):
|
|
if self.delay_cb_handle: self.cancel_timer(self.delay_cb_handle)
|
|
self.log_info(f"The coffee will be prepared in {delay}s")
|
|
self.delay_cb_handle = self.run_in(self.on_delay_elapse,delay,config_name = config_name)
|
|
else:
|
|
self.prepare_coffee(config_name)
|
|
|
|
def on_delay_elapse(self, kwargs):
|
|
self.delay_cb_handle = None
|
|
self.prepare_coffee(kwargs['config_name'])
|
|
|
|
def prepare_coffee(self,config_name):
|
|
config = self.program_configs[config_name]
|
|
self.log_info(f"Preparing Coffee ({config_name})")
|
|
self.call_service("button/press", entity_id = config['button'])
|
|
self.call_service("button/press", entity_id = self.args['clear_program_button'])
|