@@ -75,6 +75,7 @@ def __init__(self, abitem, name: str):
7575 self .__delay = StateEngineValue .SeValue (self ._abitem , "delay" )
7676 self .__repeat = None
7777 self .__instanteval = None
78+ self .__overwrite = None
7879 self .nextconditionset = StateEngineValue .SeValue (self ._abitem , "nextconditionset" , True , "regex" )
7980 self .conditionset = StateEngineValue .SeValue (self ._abitem , "conditionset" , True , "regex" )
8081 self .previousconditionset = StateEngineValue .SeValue (self ._abitem , "previousconditionset" , True , "regex" )
@@ -124,9 +125,17 @@ def update_delay(self, value):
124125 return _issue
125126
126127 def update_instanteval (self , value ):
128+ if self .__instanteval is None :
129+ self .__instanteval = StateEngineValue .SeValue (self ._abitem , "instanteval" , False , "bool" )
127130 _issue = self ._update_value (self .__instanteval , value , 'instanteval' )
128131 return _issue
129132
133+ def update_overwrite (self , value ):
134+ if self .__overwrite is None :
135+ self .__overwrite = StateEngineValue .SeValue (self ._abitem , "overwrite" , False , "bool" )
136+ _issue = self ._update_value (self .__overwrite , value , 'overwrite' )
137+ return _issue
138+
130139 def update_mindelta (self , value ):
131140 self ._log_warning ("Mindelta is only relevant for set (force) actions - ignoring {}" , value )
132141 _issue = {self ._name : {'issue' : 'Mindelta not relevant for this action type' , 'attribute' : ['mindelta' ],
@@ -206,6 +215,10 @@ def write_to_logger(self):
206215 instanteval = self .__instanteval .write_to_logger ()
207216 else :
208217 instanteval = False
218+ if self .__overwrite is not None :
219+ overwrite = self .__overwrite .write_to_logger ()
220+ else :
221+ overwrite = None
209222 if self .nextconditionset is not None :
210223 nextconditionset = self .nextconditionset .write_to_logger ()
211224 else :
@@ -230,7 +243,7 @@ def write_to_logger(self):
230243 self ._info_dict .update ({'function' : str (self ._function ), 'nextconditionset' : nextconditionset ,
231244 'conditionset' : conditionset , 'repeat' : str (repeat ), 'delay' : str (delay ), 'mode' : mode ,
232245 'order' : str (order ), 'previousconditionset' : previousconditionset ,
233- 'instanteval' : str (instanteval ), 'previousstate_conditionset' : previousstate_conditionset ,
246+ 'instanteval' : str (instanteval ), 'overwrite' : str ( overwrite ), ' previousstate_conditionset' : previousstate_conditionset ,
234247 'actionstatus' : {}})
235248
236249 def set_source (self , current_condition , previous_condition , previousstate_condition , next_condition ):
@@ -600,42 +613,82 @@ def _waitforexecute(self, state, actionname: str, namevar: str = "", repeat_text
600613
601614 self ._log_decrease_indent (50 )
602615 self ._log_increase_indent ()
616+ vals = {
617+ 'state' : state ,
618+ 'actionname' : actionname ,
619+ 'namevar' : self ._name ,
620+ 'repeat_text' : repeat_text ,
621+ 'value' : None ,
622+ 'current_condition' : current_condition ,
623+ 'previous_condition' : previous_condition ,
624+ 'previousstate_condition' : previousstate_condition ,
625+ 'next_condition' : next_condition
626+ }
603627 if delay == 0 :
628+ self ._abitem .scheduler_remove (self ._scheduler_name )
604629 self ._log_info ("Action '{}': Running." , namevar )
605- self .real_execute (state , actionname , namevar , repeat_text , None , False , current_condition , previous_condition , previousstate_condition , next_condition )
630+ self .real_execute (
631+ state , actionname , namevar , repeat_text ,
632+ None , False , # False = kein Instant Eval
633+ current_condition , previous_condition ,
634+ previousstate_condition , next_condition
635+ )
606636 else :
607637 instanteval = None if self .__instanteval is None else self .__instanteval .get ()
608- self ._log_info ("Action '{0}': Add {1} second timer '{2}' "
609- "for delayed execution.{3} Instant Eval: {4}" , self ._name , delay ,
610- self ._scheduler_name , repeat_text , instanteval )
638+ overwrite = None if self .__overwrite is None else self .__overwrite .get ()
639+ self ._log_info (
640+ "Action '{0}': Add {1} second timer '{2}' for delayed execution.{3} Instant Eval: {4}. Overwrite: {5}" ,
641+ self ._name , delay , self ._scheduler_name , repeat_text , instanteval , overwrite
642+ )
643+
611644 next_run = self .shtime .now () + datetime .timedelta (seconds = delay )
645+
612646 if instanteval is True :
613647 self ._log_increase_indent ()
614648 self ._log_debug ("Evaluating value for delayed action '{}'." , namevar )
615- value = self .real_execute (state , actionname , namevar , repeat_text , None , True , current_condition , previous_condition , previousstate_condition , next_condition )
616- self ._log_debug ("Value for delayed action is going to be '{}'." , value )
649+
650+ vals ['value' ] = self .real_execute (
651+ state , actionname , self ._name , repeat_text ,
652+ None , True ,
653+ current_condition , previous_condition ,
654+ previousstate_condition , next_condition
655+ )
656+
657+ self ._log_debug ("Value for delayed action is going to be '{}'." , vals ['value' ])
617658 self ._log_decrease_indent ()
618- else :
619- value = None
620- self ._abitem .add_scheduler_entry (self ._scheduler_name )
659+
621660 self .update_webif_actionstatus (state , self ._name , 'Scheduled' )
622- self ._se_plugin .scheduler_add (self ._scheduler_name , self ._delayed_execute ,
623- value = {'actionname' : actionname , 'namevar' : self ._name ,
624- 'repeat_text' : repeat_text , 'value' : value ,
625- 'current_condition' : current_condition ,
626- 'previous_condition' : previous_condition ,
627- 'previousstate_condition' : previousstate_condition ,
628- 'next_condition' : next_condition , 'state' : state }, next = next_run )
629-
630- def _delayed_execute (self , actionname : str , namevar : str = "" , repeat_text : str = "" , value = None , current_condition = None , previous_condition = None , previousstate_condition = None , next_condition = None , state = None , caller = None ):
631- if state :
632- self ._log_debug ("Putting delayed action '{}' from state '{}' into queue. Caller: {}" , namevar , state , caller )
633- self .__queue .put (["delayedaction" , self , actionname , namevar , repeat_text , value , current_condition , previous_condition , previousstate_condition , next_condition , state ])
634- else :
635- self ._log_debug ("Putting delayed action '{}' into queue. Caller: {}" , namevar , caller )
636- self .__queue .put (["delayedaction" , self , actionname , namevar , repeat_text , value , current_condition , previous_condition , previousstate_condition , next_condition ])
661+
662+ self ._abitem .scheduler_add (
663+ self ._scheduler_name ,
664+ self ,
665+ value = vals ,
666+ next = next_run ,
667+ overwrite = overwrite
668+ )
669+
670+ def delayed_execute (self , actionname : str , namevar : str = "" , repeat_text : str = "" , value = None , current_condition = None , previous_condition = None , previousstate_condition = None , next_condition = None , state = None , caller = None ):
671+ self ._log_debug (
672+ "Putting action '{}'{} into queue. Caller: {}" , namevar ,
673+ f" from state '{ state } '" if state else "" , caller
674+ )
675+
676+ self .__queue .put ([
677+ "delayedaction" ,
678+ self ,
679+ actionname ,
680+ namevar ,
681+ repeat_text ,
682+ value ,
683+ current_condition ,
684+ previous_condition ,
685+ previousstate_condition ,
686+ next_condition ,
687+ state
688+ ])
637689 if not self ._abitem .update_lock .locked ():
638690 self ._log_debug ("Running queue" )
691+ self ._log_increase_indent ()
639692 self ._abitem .run_queue ()
640693
641694 # Really execute the action (needs to be implemented in derived classes)
0 commit comments