Skip to content

Commit d905b23

Browse files
committed
detect old attribute values
1 parent a10fc2c commit d905b23

File tree

3 files changed

+40
-3
lines changed

3 files changed

+40
-3
lines changed

custom_components/pyscript/__init__.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,16 +210,49 @@ async def state_changed(event):
210210
else:
211211
new_val = event.data["new_state"].state
212212
old_val = event.data["old_state"].state if event.data["old_state"] else None
213+
214+
if old_val != new_val:
215+
val_change = False
216+
else:
217+
val_change = True
218+
213219
new_vars = {var_name: new_val, f"{var_name}.old": old_val}
214220
func_args = {
215221
"trigger_type": "state",
216222
"var_name": var_name,
217223
"value": new_val,
218224
"old_value": old_val,
225+
"change": val_change,
219226
"context": event.context,
220227
}
221228
await State.update(new_vars, func_args)
222229

230+
if "new_state" not in event.data or event.data["new_state"] is None:
231+
return
232+
233+
for attribute in event.data["new_state"].attributes:
234+
new_val = event.data["new_state"].attributes[attribute]
235+
if "old_state" in event.data and attribute in event.data["old_state"].attributes:
236+
old_val = event.data["old_state"].attributes[attribute]
237+
else:
238+
old_val = None
239+
240+
if old_val != new_val:
241+
val_change = False
242+
else:
243+
val_change = True
244+
245+
new_vars = {f"{var_name}.{attribute}": new_val, f"{var_name}.old.{attribute}": old_val}
246+
func_args = {
247+
"trigger_type": "state",
248+
"var_name": f"{var_name}.{attribute}",
249+
"value": new_val,
250+
"old_value": old_val,
251+
"change": val_change,
252+
"context": event.context,
253+
}
254+
await State.update(new_vars, func_args)
255+
223256
async def hass_started(event):
224257
_LOGGER.debug("adding state changed listener and starting global contexts")
225258
await State.get_service_params()

custom_components/pyscript/state.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,9 +77,13 @@ async def notify_add(cls, var_names, queue):
7777

7878
for var_name in var_names if isinstance(var_names, set) else {var_names}:
7979
parts = var_name.split(".")
80-
if len(parts) != 2 and len(parts) != 3:
80+
if len(parts) == 2:
81+
state_var_name = f"{parts[0]}.{parts[1]}"
82+
elif len(parts) == 3:
83+
state_var_name = f"{parts[0]}.{parts[1]}.{parts[2]}"
84+
else:
8185
continue
82-
state_var_name = f"{parts[0]}.{parts[1]}"
86+
8387
if state_var_name not in cls.notify:
8488
cls.notify[state_var_name] = {}
8589
cls.notify[state_var_name][queue] = var_names

custom_components/pyscript/trigger.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
_LOGGER = logging.getLogger(LOGGER_PATH + ".trigger")
2323

2424

25-
STATE_RE = re.compile(r"[a-zA-Z]\w*\.[a-zA-Z]\w*$")
25+
STATE_RE = re.compile(r"[a-zA-Z]\w*\.[a-zA-Z]\w*(\.[a-zA-Z]\w*)?$")
2626

2727

2828
def dt_now():

0 commit comments

Comments
 (0)