@@ -28,7 +28,8 @@ def __init__(self, ad: "AppDaemon"):
2828
2929 async def run_sequence_service (self , namespace , domain , service , kwargs ):
3030 if "entity_id" not in kwargs :
31- self .logger .warning ("entity_id not given in service call, so will not be executing %s" , service )
31+ self .logger .warning (
32+ "entity_id not given in service call, so will not be executing %s" , service )
3233 return
3334
3435 entity_id = kwargs ["entity_id" ]
@@ -54,7 +55,7 @@ async def add_sequences(self, sequences):
5455 if sequence_namespace is not None :
5556 attributes .update ({"namespace" : sequence_namespace })
5657
57- if not self .AD .state .entity_exists ("rules" , entity ):
58+ if not await self .AD .state .entity_exists ("rules" , entity ):
5859 # it doesn't exist so add it
5960 await self .AD .state .add_entity (
6061 "rules" ,
@@ -82,7 +83,7 @@ async def remove_sequences(self, sequences):
8283 await self .cancel_sequence (sequence )
8384 await self .AD .state .remove_entity ("rules" , "sequence.{}" .format (sequence ))
8485
85- async def run_sequence (self , _name : str , namespace : str , sequence : str | list [ str ] ):
86+ async def run_sequence (self , _name , namespace , sequence ):
8687 if isinstance (sequence , str ):
8788 if "." in sequence :
8889 # the entity given
@@ -127,14 +128,15 @@ async def cancel_sequence(self, sequence):
127128 self .AD .futures .cancel_futures (name )
128129 await self .AD .state .set_state ("_sequences" , "rules" , entity_id , state = "idle" )
129130
130- async def prep_sequence (self , _name : str , namespace : str , sequence : str | list [ str ] ):
131+ async def prep_sequence (self , _name , namespace , sequence ):
131132 ephemeral_entity = False
132133 loop = False
133134
134135 if isinstance (sequence , str ):
135136 entity_id = sequence
136- if self .AD .state .entity_exists ("rules" , entity_id ) is False :
137- self .logger .warning ('Unknown sequence "%s" in run_sequence()' , sequence )
137+ if await self .AD .state .entity_exists ("rules" , entity_id ) is False :
138+ self .logger .warning (
139+ 'Unknown sequence "%s" in run_sequence()' , sequence )
138140 return None
139141
140142 entity = await self .AD .state .get_state ("_services" , "rules" , sequence , attribute = "all" )
@@ -146,32 +148,20 @@ async def prep_sequence(self, _name: str, namespace: str, sequence: str | list[s
146148 #
147149 # Assume it's a list with the actual commands in it
148150 #
149- assert isinstance (sequence , list ) and all (isinstance (s , str ) for s in sequence )
150151 entity_id = "sequence.{}" .format (uuid .uuid4 ().hex )
151152 # Create an ephemeral entity for it
152153 ephemeral_entity = True
153154
154- await self .AD .state .add_entity (
155- namespace = "rules" ,
156- entity = entity_id ,
157- state = "idle" ,
158- attributes = {"steps" : sequence }
159- )
155+ await self .AD .state .add_entity ("rules" , entity_id , "idle" , attributes = {"steps" : sequence })
160156
161157 seq = sequence
162158 ns = namespace
163159
164160 coro = await self .do_steps (ns , entity_id , seq , ephemeral_entity , loop )
165161 return coro
166162
167- async def do_steps (self ,
168- namespace : str ,
169- entity_id : str ,
170- seq : str | list [str ],
171- ephemeral_entity : bool = False ,
172- loop : bool = False ):
163+ async def do_steps (self , namespace , entity_id , seq , ephemeral_entity , loop ):
173164 await self .AD .state .set_state ("_sequences" , "rules" , entity_id , state = "active" )
174-
175165 try :
176166 while True :
177167 steps = copy .deepcopy (seq )
@@ -191,7 +181,8 @@ async def do_steps(self,
191181
192182 elif command == "wait_state" :
193183 if ephemeral_entity is True :
194- self .logger .warning ("Cannot process command 'wait_state', as not supported in sequence" )
184+ self .logger .warning (
185+ "Cannot process command 'wait_state', as not supported in sequence" )
195186 continue
196187
197188 _ , entity_name = entity_id .split ("." )
@@ -200,7 +191,8 @@ async def do_steps(self,
200191 wait_entity = parameters .get ("entity_id" )
201192
202193 if wait_entity is None :
203- self .logger .warning ("Cannot process command 'wait_state', as entity_id not given" )
194+ self .logger .warning (
195+ "Cannot process command 'wait_state', as entity_id not given" )
204196 continue
205197
206198 state = parameters .get ("state" )
@@ -209,30 +201,43 @@ async def do_steps(self,
209201 timeout = parameters .get ("timeout" , 15 * 60 )
210202
211203 # now we create the wait entity object
212- entity_object = Entity (self .logger , self .AD , name , ns , wait_entity )
213- if not entity_object .exists ():
204+ entity_object = Entity (
205+ self .logger , self .AD , name , ns , wait_entity )
206+ if not await entity_object .exists ():
214207 self .logger .warning (
215- f"Waiting for an entity { wait_entity } , in sequence { entity_name } , that doesn't exist"
208+ f"Waiting for an entity { wait_entity } , in sequence {
209+ entity_name } , that doesn't exist"
216210 )
217211
218212 try :
219213 await entity_object .wait_state (state , attribute , duration , timeout )
220214 except TimeOutException :
221215 self .logger .warning (
222- f"{ entity_name } sequence wait for { wait_entity } timed out, so continuing sequence"
216+ f"{ entity_name } sequence wait for {
217+ wait_entity } timed out, so continuing sequence"
223218 )
224219
225220 else :
226221 domain , service = str .split (command , "/" )
222+ # parameters["__name"] = entity_id
227223 loop_step = parameters .pop ("loop_step" , None )
228224 params = copy .deepcopy (parameters )
229225 await self .AD .services .call_service (ns , domain , service , entity_id , params )
230226
231- if isinstance (loop_step , dict ): # we need to loop this command multiple times
227+ # we need to loop this command multiple times
228+ if isinstance (loop_step , dict ):
232229 await self .loop_step (ns , command , parameters , loop_step )
233230
234231 if loop is not True :
235232 break
233+
234+ except Exception :
235+ self .logger .error ("-" * 60 )
236+ self .logger .error ("Unexpected error in do_steps()" )
237+ self .logger .error ("-" * 60 )
238+ self .logger .error (traceback .format_exc ())
239+ self .logger .error ("-" * 60 )
240+
236241 finally :
237242 await self .AD .state .set_state ("_sequences" , "rules" , entity_id , state = "idle" )
238243
@@ -257,7 +262,13 @@ async def loop_step(self, namespace: str, command: str, parameters: dict, loop_s
257262
258263 except Exception :
259264 self .logger .error ("-" * 60 )
260- self .logger .error ("Unexpected error when attempting to loop step " )
265+ self .logger .error ("Unexpected error in loop_step() " )
261266 self .logger .error ("-" * 60 )
262267 self .logger .error (traceback .format_exc ())
263268 self .logger .error ("-" * 60 )
269+
270+ #
271+ # Placeholder for constraints
272+ #
273+ def list_constraints (self ):
274+ return []
0 commit comments