Skip to content

Commit 5f7a5b5

Browse files
committed
fixed @state_trigger when there is just a .old variable
1 parent c5e3cac commit 5f7a5b5

File tree

3 files changed

+30
-3
lines changed

3 files changed

+30
-3
lines changed

custom_components/pyscript/trigger.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,10 +97,13 @@ def ident_values_changed(func_args, ident):
9797

9898
for check_var in ident:
9999
var_pieces = check_var.split(".")
100-
if len(var_pieces) == 2 and check_var == var_name:
100+
if len(var_pieces) < 2 or len(var_pieces) > 3:
101+
continue
102+
var_root = f"{var_pieces[0]}.{var_pieces[1]}"
103+
if var_root == var_name and (len(var_pieces) == 2 or var_pieces[2] == "old"):
101104
if value != old_value:
102105
return True
103-
elif len(var_pieces) == 3 and f"{var_pieces[0]}.{var_pieces[1]}" == var_name:
106+
elif len(var_pieces) == 3 and var_root == var_name:
104107
if getattr(value, var_pieces[2], None) != getattr(old_value, var_pieces[2], None):
105108
return True
106109

docs/new_features.rst

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,11 @@ Breaking changes since 1.2.1 include:
5151

5252
Bug fixes since 1.2.1 include:
5353

54+
- Fixed ``@state_trigger`` with only a ``.old`` variable, which previously never triggered; reported by stigvi.
55+
- Fixed subscripts when running python 3.9.x.
5456
- Timeouts that implement time triggers might infrequenctly occur a tiny time before the target time. A fix was added
5557
to do an additional short timeout when there is an early timeout, to make sure any time trigger occurs at or shortly
5658
after the target time (and never before).
57-
- Fixed subscripts when running python 3.9.x.
5859
- When exception text is created, ensure lineno is inside code_list[]; with lambda function or eval it might not be.
5960
- An exception is raised when a function is called with unexpected keyword parameters that don't have corresponding
6061
keyword arguments (however, the trigger parameter names are excluded from this check, since trigger functions

tests/test_function.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,14 @@ def func2c(var_name=None, value=None):
264264
log.info(f"func2c var = {var_name}, value = {value}")
265265
pyscript.done = [seq_num, var_name, int(value)]
266266
267+
@state_trigger("pyscript.f1var2.old == '15'")
268+
def func2d(var_name=None, value=None, old_value=None):
269+
global seq_num
270+
271+
seq_num += 1
272+
log.info(f"func2d var = {var_name}, value = {value}")
273+
pyscript.done = [seq_num, var_name, int(value), int(old_value)]
274+
267275
268276
@event_trigger("fire_event")
269277
def fire_event(**kwargs):
@@ -402,6 +410,7 @@ def func9(var_name=None, value=None, old_value=None):
402410
# initialize the trigger and active variables
403411
seq_num = 0
404412
hass.states.async_set("pyscript.f1var1", 0)
413+
hass.states.async_set("pyscript.f1var2", 0)
405414
hass.states.async_set("pyscript.f2var2", 0)
406415
hass.states.async_set("pyscript.f2var3", 0)
407416
hass.states.async_set("pyscript.f2var4", 0)
@@ -466,6 +475,20 @@ def func9(var_name=None, value=None, old_value=None):
466475
seq_num += 1
467476
assert literal_eval(await wait_until_done(notify_q)) == [seq_num, "pyscript.f1var1", num]
468477

478+
#
479+
# check that just a .old variable triggers
480+
#
481+
seq_num += 1
482+
hass.states.async_set("pyscript.f1var2", 10)
483+
hass.states.async_set("pyscript.f1var2", 15)
484+
hass.states.async_set("pyscript.f1var2", 10)
485+
assert literal_eval(await wait_until_done(notify_q)) == [
486+
seq_num,
487+
"pyscript.f1var2",
488+
10,
489+
15,
490+
]
491+
469492
seq_num += 1
470493
hass.states.async_set("pyscript.f2var4", 4)
471494
hass.states.async_set("pyscript.f2var2", 2)

0 commit comments

Comments
 (0)