@@ -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