Added support for the senseo

This commit is contained in:
2026-05-10 22:41:23 +02:00
parent 16af480ee2
commit c9d65b29fd
3 changed files with 119 additions and 2 deletions

View File

@@ -19,4 +19,75 @@ light_kitchen_sink_switch:
entity: light.kitchen_sink_switch
off_events:
- turn_off_all_lights
- turn_off_all_lights
senseo_quadrante:
module: senseo
class: Senseo
virtual_sensors:
default_values:
# this is done to break the circular dependencies between sensor.senseo_cup_icon and sensor.senseo_cup
sensor.senseo_cup_icon: "" # "mdi:coffee-off-outline"
sensors:
value_selector.senseo_cup:
attributes:
friendly_name: Tasse
sensor_attributes:
icon: sensor.senseo_cup_icon
values:
unavailable: sensor.senseo_quadrante_operating_state == 'unavailable'
Prête: binary_sensor.senseo_quadrante_cup_available and binary_sensor.senseo_quadrante_cup_full
Service en cours: binary_sensor.senseo_quadrante_cup_available and sensor.senseo_quadrante_operating_state == 'SENSEO_BREWING'
Vide: binary_sensor.senseo_quadrante_cup_available
Absente: True
value_selector.senseo_cup_icon:
"mdi:coffee": sensor.senseo_cup == 'Prête'
"mdi:coffee-outline": sensor.senseo_cup == 'Vide' or sensor.senseo_cup == 'Service en cours'
"mdi:coffee-off-outline": True
value_selector.senseo_programmation:
attributes:
friendly_name: Programme
icon: mdi:coffee-to-go
values:
unavailable: sensor.senseo_quadrante_operating_state == 'unavailable'
1 Tasse (douche): binary_sensor.senseo_quadrante_has_program and binary_sensor.senseo_quadrante_has_program.cup_size == 1 and binary_sensor.senseo_quadrante_has_program.power_pressed
2 Tasses (douche): binary_sensor.senseo_quadrante_has_program and binary_sensor.senseo_quadrante_has_program.cup_size == 2 and binary_sensor.senseo_quadrante_has_program.power_pressed
1 Tasse: binary_sensor.senseo_quadrante_has_program and binary_sensor.senseo_quadrante_has_program.cup_size == 1
2 Tasses: binary_sensor.senseo_quadrante_has_program and binary_sensor.senseo_quadrante_has_program.cup_size == 2
Aucun: True
clear_program_button: button.senseo_quadrante_clear_program
programs:
one_cup_shower:
events:
shower_finished:
event_name: shower_finished
button: button.senseo_quadrante_brew_coffee_normal
condition: binary_sensor.senseo_quadrante_has_program and binary_sensor.senseo_quadrante_has_program.cup_size == 1 and binary_sensor.senseo_quadrante_has_program.power_pressed
two_cup_shower:
events:
shower_finished:
event_name: shower_finished
button: button.senseo_quadrante_brew_coffee_double
condition: binary_sensor.senseo_quadrante_has_program and binary_sensor.senseo_quadrante_has_program.cup_size == 2 and binary_sensor.senseo_quadrante_has_program.power_pressed
one_cup_morning:
delay: 10
events:
good_morning:
event_name: good_morning
button: button.senseo_quadrante_brew_coffee_normal
condition: binary_sensor.senseo_quadrante_has_program and binary_sensor.senseo_quadrante_has_program.cup_size == 1 and not binary_sensor.senseo_quadrante_has_program.power_pressed
two_cup_morning:
delay: 10
events:
good_morning:
event_name: good_morning
button: button.senseo_quadrante_brew_coffee_double
condition: binary_sensor.senseo_quadrante_has_program and binary_sensor.senseo_quadrante_has_program.cup_size == 2 and not binary_sensor.senseo_quadrante_has_program.power_pressed

46
apps/senseo.py Normal file
View File

@@ -0,0 +1,46 @@
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'])