feat: add EventSensor class for temporary binary sensor activation
This commit is contained in:
@@ -5,6 +5,7 @@ from kwargsparser import kwargsParser
|
||||
from expressionparser import ParsingException
|
||||
import time
|
||||
from logger_interface import LoggerInterface
|
||||
from ad_toolbox.eventhandler import EventHandler
|
||||
|
||||
class VirtualSensorBase:
|
||||
def __init__(self,ad_api,logger_interface, virtual_sensor_name = None, sensor_name = None,super_entity_id = None, yaml_block = None,templates_library = None, constants = None, app_name = None,self_initialize = False):
|
||||
@@ -525,6 +526,34 @@ class BinarySensor(VirtualSensorBase):
|
||||
assert len(splitted_name) == 2,f"Invalid virtual sensor name : {virtual_sensor_name}"
|
||||
return f"binary_sensor.{splitted_name[1]}"
|
||||
|
||||
# set a binary_sensor to true for x seconds when an event is received
|
||||
class EventSensor(VirtualSensorBase):
|
||||
def initialize(self):
|
||||
self.output_sensor = self.ad_api.get_entity(self.sensor_name)
|
||||
|
||||
if not self.output_sensor.exists():
|
||||
self.output_sensor.set_state(state = 'off',attributes = self.attributes)
|
||||
|
||||
self.retain_time = self.yaml_block['retain_time']
|
||||
self.cb_handle = None
|
||||
|
||||
self.event_handlers = []
|
||||
if "activation_events" in self.yaml_block:
|
||||
self.event_handlers.append(EventHandler(self.ad_api, self.yaml_block["activation_events"], self.on_activation_event,logger_interface = self.logger_interface))
|
||||
|
||||
def on_activation_event(self, event_name, data, kwargs):
|
||||
self.output_sensor.set_state(state = 'on')
|
||||
if self.cb_handle is not None:
|
||||
self.ad_api.cancel_timer(self.cb_handle)
|
||||
self.cb_handle = self.ad_api.run_in(self.on_retain_time_elapsed, self.retain_time)
|
||||
|
||||
def on_retain_time_elapsed(self, kwargs):
|
||||
self.output_sensor.set_state(state = 'off')
|
||||
self.cb_handle = None
|
||||
|
||||
def generate_sensor_name(self,virtual_sensor_name):
|
||||
return f"binary_sensor.{virtual_sensor_name}"
|
||||
|
||||
class ValueSensor(VirtualSensorBase):
|
||||
def initialize(self):
|
||||
# should be done in the base class
|
||||
@@ -609,6 +638,8 @@ class VirtualSensors():
|
||||
self.virtual_sensors[f"sensor.{splitted_sensor[1]}"] = ValueSelector(self.ad_api,self.logger_interface,splitted_sensor[1],super_entity_id = super_entity_id,yaml_block = yaml_block['sensors'][sensor],constants = constants,templates_library = templates_library,app_name = app_name)
|
||||
elif splitted_sensor[0] == 'retain_condition':
|
||||
self.virtual_sensors[f"binary_sensor.{splitted_sensor[1]}"] = RetainCondition(self.ad_api,self.logger_interface,splitted_sensor[1],super_entity_id = super_entity_id,yaml_block = yaml_block['sensors'][sensor],constants = constants,templates_library = templates_library,app_name = app_name)
|
||||
elif splitted_sensor[0] == 'event_sensor':
|
||||
self.virtual_sensors[f"binary_sensor.{splitted_sensor[1]}"] = EventSensor(self.ad_api,self.logger_interface,splitted_sensor[1],super_entity_id = super_entity_id,yaml_block = yaml_block['sensors'][sensor],constants = constants,templates_library = templates_library,app_name = app_name)
|
||||
else:
|
||||
self.logger_interface.log_error(f"Invalid sensor prefix {splitted_sensor[0]}")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user