Skip to content

Commit 6340521

Browse files
committed
Refactor entity resolution logic in devices schedules controller for improved clarity and efficiency
1 parent 943c48a commit 6340521

1 file changed

Lines changed: 29 additions & 58 deletions

File tree

devices_schedules_controller_full_llm.yaml

Lines changed: 29 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -298,82 +298,51 @@ sequence:
298298
{% else %}
299299
{% set parsed = raw %}
300300
{% endif %}
301-
{% if parsed is sequence %}
302-
{{ parsed }}
303-
{% else %}
304-
{{ [] }}
305-
{% endif %}
301+
{{ parsed if parsed is sequence else [] }}
306302
_resolved_details: >-
307303
{% set ns = namespace(items=[]) %}
308-
{% set alias_list = _alias_list if _alias_list is sequence else [] %}
309-
{% for name in _entity_names %}
310-
{% set name_l = (name | string | lower | trim) %}
311-
{% set prefixes = ['scene ', 'script ', 'light ', 'fan ', 'cover ', 'switch ', 'climate ', 'humidifier ', 'water heater ', 'water_heater ', 'media player ', 'media_player ', 'vacuum ', 'valve '] %}
312-
{% set name_alt = name_l %}
313-
{% for p in prefixes %}
314-
{% if name_alt[0:(p|length)] == p %}
315-
{% set name_alt = (name_alt[(p|length):] | trim) %}
316-
{% endif %}
317-
{% endfor %}
318-
{% set name_norm = (name_l | regex_replace('[^0-9a-z_ ]', ' ') | replace(' ', ' ') | trim) %}
319-
{% set name_alt_norm = (name_alt | regex_replace('[^0-9a-z_ ]', ' ') | replace(' ', ' ') | trim) %}
320-
{% set match = namespace(done=false) %}
304+
{% set alias_list = _alias_list %}
305+
{% set names = _entity_names %}
306+
{% for name in names %}
307+
{% set name_s = name | string | trim %}
308+
{% set name_l = name_s | lower %}
309+
{% set match = namespace(done=false, entity_id='') %}
321310
322-
{% if not match.done %}
323-
{% for s in states %}
324-
{% if not match.done %}
325-
{% set eid = s.entity_id | string %}
326-
{% set eid_l = eid | lower %}
327-
{% set eid_suffix = (eid_l.split('.')[-1] if '.' in eid_l else eid_l) %}
328-
{% if eid_l == name_l or eid_suffix == name_l or eid_suffix == name_alt or eid_suffix == name_norm or eid_suffix == name_alt_norm %}
329-
{% set ns.items = ns.items + [dict(name=name, entity_id=eid)] %}
330-
{% set match.done = true %}
331-
{% endif %}
332-
{% endif %}
333-
{% endfor %}
311+
{% if not match.done and states[name_s] is defined %}
312+
{% set match.entity_id = name_s %}
313+
{% set match.done = true %}
334314
{% endif %}
335315
336316
{% if not match.done %}
337-
{% for s in states %}
338-
{% if not match.done %}
339-
{% set fn = s.attributes.friendly_name if s.attributes.friendly_name is defined else '' %}
340-
{% set fn_l = (fn | string | lower | trim) %}
341-
{% set fn_norm = (fn_l | regex_replace('[^0-9a-z_ ]', ' ') | replace(' ', ' ') | trim) %}
342-
{% set norm_match = (name_norm | length > 0 and fn_norm | length > 0 and (fn_norm in name_norm or name_norm in fn_norm)) %}
343-
{% if fn_l == name_l or fn_l == name_alt or fn_norm == name_norm or fn_norm == name_alt_norm or norm_match %}
344-
{% set eid = s.entity_id | string %}
345-
{% set ns.items = ns.items + [dict(name=name, entity_id=eid)] %}
346-
{% set match.done = true %}
347-
{% endif %}
348-
{% endif %}
349-
{% endfor %}
317+
{% set s_match = states | selectattr('attributes.friendly_name', 'defined') | selectattr('attributes.friendly_name', 'eq', name_s) | list %}
318+
{% if s_match | length > 0 %}
319+
{% set match.entity_id = s_match[0].entity_id %}
320+
{% set match.done = true %}
321+
{% endif %}
350322
{% endif %}
351323
352324
{% if not match.done %}
353325
{% for device in alias_list %}
354326
{% if not match.done %}
355327
{% set aliases = device.aliases if device.aliases is sequence else [] %}
356-
{% for al in aliases %}
357-
{% if not match.done %}
358-
{% set al_l = (al | string | lower | trim) %}
359-
{% set al_norm = (al_l | regex_replace('[^0-9a-z_ ]', ' ') | replace(' ', ' ') | trim) %}
360-
{% set norm_match = (name_norm | length > 0 and al_norm | length > 0 and (al_norm in name_norm or name_norm in al_norm)) %}
361-
{% if al_l == name_l or al_l == name_alt or al_norm == name_norm or al_norm == name_alt_norm or norm_match %}
362-
{% set eid = device.entity_id | string %}
363-
{% set ns.items = ns.items + [dict(name=name, entity_id=eid)] %}
364-
{% set match.done = true %}
365-
{% endif %}
366-
{% endif %}
367-
{% endfor %}
328+
{% if name_s in aliases or name_l in (aliases | map('lower') | list) %}
329+
{% set match.entity_id = device.entity_id %}
330+
{% set match.done = true %}
331+
{% endif %}
368332
{% endif %}
369333
{% endfor %}
370334
{% endif %}
335+
336+
{% if match.done %}
337+
{% set ns.items = ns.items + [dict(name=name, entity_id=match.entity_id)] %}
338+
{% endif %}
371339
{% endfor %}
372340
{{ ns.items }}
373341
_resolved_entities: >-
374342
{% set ns = namespace(items=[]) %}
343+
{% set details = _resolved_details %}
375344
{% set ignored_domains = ['binary_sensor', 'calendar', 'device_tracker', 'person', 'sensor', 'sun', 'todo', 'weather', 'zone'] %}
376-
{% for item in _resolved_details %}
345+
{% for item in details %}
377346
{% set eid = item.entity_id | default('', true) | string %}
378347
{% set domain = eid.split('.')[0] if '.' in eid else '' %}
379348
{% if eid | length > 0 and eid not in ns.items and domain not in ignored_domains %}
@@ -382,9 +351,11 @@ sequence:
382351
{% endfor %}
383352
{{ ns.items }}
384353
_missing_entities: >-
385-
{% set resolved_names = _resolved_details | selectattr('entity_id','defined') | map(attribute='name') | list %}
354+
{% set details = _resolved_details %}
355+
{% set resolved_names = details | selectattr('entity_id','defined') | map(attribute='name') | list %}
356+
{% set names = _entity_names %}
386357
{% set ns = namespace(items=[]) %}
387-
{% for name in _entity_names %}
358+
{% for name in names %}
388359
{% if name not in resolved_names %}
389360
{% set ns.items = ns.items + [name] %}
390361
{% endif %}

0 commit comments

Comments
 (0)