@@ -286,7 +286,7 @@ def __init__(self, func_def, code_list, code_str, global_ctx):
286286 self .exception_obj = None
287287 self .exception_long = None
288288 self .trigger = []
289- self .trigger_service = False
289+ self .trigger_service = set ()
290290 self .has_closure = False
291291
292292 def get_name (self ):
@@ -320,9 +320,9 @@ async def trigger_init(self):
320320 "mqtt_trigger" : {"arg_cnt" : {1 , 2 }, "rep_ok" : True },
321321 "state_active" : {"arg_cnt" : {1 }},
322322 "state_trigger" : {"arg_cnt" : {"*" }, "type" : {list , set }, "rep_ok" : True },
323- "service" : {"arg_cnt" : {0 }},
323+ "service" : {"arg_cnt" : {0 , "*" }},
324324 "task_unique" : {"arg_cnt" : {1 }},
325- "time_active" : {"arg_cnt" : {0 , "*" }},
325+ "time_active" : {"arg_cnt" : {"*" }},
326326 "time_trigger" : {"arg_cnt" : {0 , "*" }, "rep_ok" : True },
327327 }
328328 kwarg_check = {
@@ -388,8 +388,6 @@ async def trigger_init(self):
388388 if dec_kwargs is None :
389389 dec_kwargs = {}
390390 if dec_name == "service" :
391- if self .name in (SERVICE_RELOAD , SERVICE_JUPYTER_KERNEL_START ):
392- raise SyntaxError (f"{ exc_mesg } : @service conflicts with builtin service" )
393391 desc = self .doc_string
394392 if desc is None or desc == "" :
395393 desc = f"pyscript function { self .name } ()"
@@ -436,9 +434,17 @@ async def do_service_call(func, ast_ctx, data):
436434
437435 return pyscript_service_handler
438436
439- Function .service_register (DOMAIN , self .name , pyscript_service_factory (self .name , self ))
440- async_set_service_schema (Function .hass , DOMAIN , self .name , service_desc )
441- self .trigger_service = True
437+ for srv_name in dec_args if dec_args else [f"{ DOMAIN } .{ self .name } " ]:
438+ if type (srv_name ) is not str or srv_name .count ("." ) != 1 :
439+ raise ValueError (f"{ exc_mesg } : @service argument must be a string with one period" )
440+ domain , name = srv_name .split ("." , 1 )
441+ if name in (SERVICE_RELOAD , SERVICE_JUPYTER_KERNEL_START ):
442+ raise SyntaxError (f"{ exc_mesg } : @service conflicts with builtin service" )
443+ Function .service_register (
444+ self .global_ctx_name , domain , name , pyscript_service_factory (self .name , self )
445+ )
446+ async_set_service_schema (Function .hass , domain , name , service_desc )
447+ self .trigger_service .add (srv_name )
442448 continue
443449
444450 if dec_name not in trig_decs :
@@ -457,7 +463,7 @@ async def do_service_call(func, ast_ctx, data):
457463 return
458464
459465 if len (trig_decs ) == 0 :
460- if self .trigger_service :
466+ if len ( self .trigger_service ) > 0 :
461467 self .global_ctx .trigger_register (self )
462468 return
463469
@@ -501,9 +507,10 @@ def trigger_stop(self):
501507 for trigger in self .trigger :
502508 trigger .stop ()
503509 self .trigger = []
504- if self .trigger_service :
505- self .trigger_service = False
506- Function .service_remove (DOMAIN , self .name )
510+ for srv_name in self .trigger_service :
511+ domain , name = srv_name .split ("." , 1 )
512+ Function .service_remove (self .global_ctx_name , domain , name )
513+ self .trigger_service = set ()
507514
508515 async def eval_decorators (self , ast_ctx ):
509516 """Evaluate the function decorators arguments."""
0 commit comments