@@ -43,7 +43,7 @@ sections:
4343 heading : Add / Update Room
4444 icon : mdi:home-plus
4545 - type : markdown
46- content : |
46+ content : |-
4747 **Instructions:**
4848
4949 1. Select a **Native Area** from the list.
@@ -74,7 +74,7 @@ sections:
7474 action : call-service
7575 service : script.create_room_settings
7676 card_mod :
77- style : |
77+ style : |-
7878 ha-card {
7979 border: none;
8080 background: var(--green-color);
@@ -109,7 +109,7 @@ sections:
109109 action : call-service
110110 service : script.delete_room_settings
111111 card_mod :
112- style : |
112+ style : |-
113113 ha-card {
114114 border: none;
115115 background: var(--red-color);
@@ -128,49 +128,173 @@ sections:
128128 type : entities
129129 show_header_toggle : false
130130 filter :
131- template : " {% set ns = namespace(cards=[]) %}\n {# Broader search for any select\
132- \ entity with 'automation_mode' in the ID #}\n {% set mode_selectors = states.select\
133- \ | selectattr('entity_id', 'search', 'automation_mode') | list %}\n\n {% for\
134- \ sel in mode_selectors %}\n {# Extract slug. Handles \" select.bathroom_automation_mode\" \
135- \ or \" select.room_bathroom_automation_mode\" #}\n {% set raw_id = sel.entity_id.split('.')[1]\
136- \ %}\n {% if raw_id.startswith('room_') %}\n {% set slug = raw_id[5:] | replace('_automation_mode','')\
137- \ %}\n {% else %}\n {% set slug = raw_id.replace('_automation_mode','') %}\n \
138- {% endif %}\n\n \n {# UPDATED: Generate Name purely from Slug (Cleaner)\
139- \ #}\n {% set name = slug.replace('_', ' ') | title %}\n \n {# --- Header\
140- \ --- #}\n {% set ns.cards = ns.cards + [{'type': 'section', 'label': name}]\
141- \ %}\n \n {# --- Controls --- #}\n \n {# Mode Selector #}\n {% set ns.cards\
142- \ = ns.cards + [{'entity': sel.entity_id, 'name': 'Mode'}] %}\n \n {# Room\
143- \ State #}\n {% set state_select = 'select.room_' ~ slug ~ '_state' %}\n \
144- \ {% if states[state_select] is defined %}\n {% set ns.cards = ns.cards\
145- \ + [{'entity': state_select, 'name': 'Current State'}] %}\n {% endif %}\n \
146- \n {# Occupancy #}\n {% set occ_sensor = 'binary_sensor.room_' ~ slug ~\
147- \ '_occupancy' %}\n {% if states[occ_sensor] is defined %}\n {% set ns.cards\
148- \ = ns.cards + [{'entity': occ_sensor, 'name': 'Occupancy'}] %}\n {% endif\
149- \ %}\n \n {# Idle Time #}\n {% set idle_entity = 'number.room_' ~ slug\
150- \ ~ '_presence_idle_time' %}\n {% if states[idle_entity] is defined %}\n \
151- \ {% set ns.cards = ns.cards + [{'entity': idle_entity, 'name': 'Idle Time\
152- \ (sec)'}] %}\n {% endif %}\n \n {# Off Delay #}\n {% set delay_entity\
153- \ = 'number.room_' ~ slug ~ '_lights_presence_delay' %}\n {% if states[delay_entity]\
154- \ is defined %}\n {% set ns.cards = ns.cards + [{'entity': delay_entity,\
155- \ 'name': 'Off Delay (sec)'}] %}\n {% endif %}\n \n {# Lux Sensor #}\n \
156- \ {% set lux_s = 'text.room_' ~ slug ~ '_lux_sensor' %}\n {% if states[lux_s]\
157- \ is defined %}\n {% set ns.cards = ns.cards + [{'entity': lux_s, 'name':\
158- \ 'Lux Sensor ID'}] %}\n {% endif %}\n \n {# Lux Threshold #}\n {% set\
159- \ lux_t = 'number.room_' ~ slug ~ '_lux_threshold' %}\n {% if states[lux_t]\
160- \ is defined %}\n {% set ns.cards = ns.cards + [{'entity': lux_t, 'name':\
161- \ 'Lux Threshold (lx)'}] %}\n {% endif %}\n \n {# Bed Sensor #}\n {% set\
162- \ bed_s = 'text.room_' ~ slug ~ '_bed_sensor' %}\n {% if states[bed_s] is\
163- \ defined %}\n {% set ns.cards = ns.cards + [{'entity': bed_s, 'name':\
164- \ 'Bed Sensor ID'}] %}\n \n {# Only show sleep timers if a bed sensor\
165- \ ID is entered #}\n {% if states(bed_s) not in ['unknown', 'unavailable',\
166- \ '', 'none'] %}\n {% set sleep_entry = 'number.room_' ~ slug ~ '_sleep_entry_delay'\
167- \ %}\n {% if states[sleep_entry] is defined %}\n {% set ns.cards\
168- \ = ns.cards + [{'entity': sleep_entry, 'name': 'Sleep Entry Delay (sec)'}]\
169- \ %}\n {% endif %}\n \n {% set sleep_exit = 'number.room_'\
170- \ ~ slug ~ '_sleep_exit_delay' %}\n {% if states[sleep_exit] is defined\
171- \ %}\n {% set ns.cards = ns.cards + [{'entity': sleep_exit, 'name':\
172- \ 'Sleep Exit Delay (sec)'}] %}\n {% endif %}\n {% endif %}\n {%\
173- \ endif %}\n \n {% endfor %}\n {{ ns.cards | to_json }}\n "
131+ template : |-
132+ {% set ns = namespace(rows=[]) %} {% set mode_selectors = states.select | selectattr('entity_id','search','automation_mode') | list %}
133+ {% for sel in mode_selectors %}
134+ {# Extract base id and normalize to room_key #}
135+ {% set raw_id = sel.entity_id.split('.')[1] %}
136+ {% set base = raw_id.replace('_automation_mode','') %}
137+ {% if base.startswith('room_') %}
138+ {% set room_key = base[5:] %}
139+ {% else %}
140+ {% set room_key = base %}
141+ {% endif %}
142+ {% set name = room_key.replace('_',' ') | title %}
143+
144+ {# Compose downstream entity ids with exactly one room_ prefix #}
145+ {% set state_select = 'select.room_' ~ room_key ~ '_state' %}
146+ {% set occ_sensor = 'binary_sensor.room_' ~ room_key ~ '_occupancy' %}
147+ {% set idle_entity = 'number.room_' ~ room_key ~ '_presence_idle_time' %}
148+ {% set delay_entity = 'number.room_' ~ room_key ~ '_lights_presence_delay' %}
149+ {% set lux_s = 'text.room_' ~ room_key ~ '_lux_sensor' %}
150+ {% set lux_t = 'number.room_' ~ room_key ~ '_lux_threshold' %}
151+ {% set bed_s = 'text.room_' ~ room_key ~ '_bed_sensor' %}
152+ {% set sleep_entry = 'number.room_' ~ room_key ~ '_sleep_entry_delay' %}
153+ {% set sleep_exit = 'number.room_' ~ room_key ~ '_sleep_exit_delay' %}
154+
155+ {# Build the collapsible group's entity list, conditionally #}
156+ {% set entities = [] %}
157+ {% set entities = entities + [{'entity': sel.entity_id, 'name': 'Mode'}] %}
158+
159+ {% if states[state_select] is defined %}
160+ {% set entities = entities + [{'entity': state_select, 'name': 'Current State'}] %}
161+ {% endif %}
162+ {% if states[occ_sensor] is defined %}
163+ {% set entities = entities + [{'entity': occ_sensor, 'name': 'Occupancy'}] %}
164+ {% endif %}
165+ {% if states[idle_entity] is defined %}
166+ {% set entities = entities + [{'entity': idle_entity, 'name': 'Idle Time (sec)'}] %}
167+ {% endif %}
168+ {% if states[delay_entity] is defined %}
169+ {% set entities = entities + [{'entity': delay_entity, 'name': 'Off Delay (sec)'}] %}
170+ {% endif %}
171+ {% if states[lux_s] is defined %}
172+ {% set entities = entities + [{'entity': lux_s, 'name': 'Lux Sensor ID'}] %}
173+ {% endif %}
174+ {% if states[lux_t] is defined %}
175+ {% set entities = entities + [{'entity': lux_t, 'name': 'Lux Threshold (lx)'}] %}
176+ {% endif %}
177+
178+ {# Bed sensor and sleep timers only if bed sensor has a usable value #}
179+ {% if states[bed_s] is defined %}
180+ {% set entities = entities + [{'entity': bed_s, 'name': 'Bed Sensor ID'}] %}
181+ {% set bed_val = states(bed_s) | lower %}
182+ {% if bed_val not in ['unknown','unavailable','','none'] %}
183+ {% if states[sleep_entry] is defined %}
184+ {% set entities = entities + [{'entity': sleep_entry, 'name': 'Sleep Entry Delay (sec)'}] %}
185+ {% endif %}
186+ {% if states[sleep_exit] is defined %}
187+ {% set entities = entities + [{'entity': sleep_exit, 'name': 'Sleep Exit Delay (sec)'}] %}
188+ {% endif %}
189+ {% endif %}
190+ {% endif %}
191+
192+ {# Only add the group if it has rows (it always has at least Mode) #}
193+ {% set group = {
194+ 'type': 'custom:fold-entity-row',
195+ 'head': {'type':'section','label': name},
196+ 'entities': entities
197+ } %}
198+ {% set ns.rows = ns.rows + [group] %}
199+ {% endfor %}
200+ {{ ns.rows | to_json }}
201+ sort :
202+ method : none
203+ - type : grid
204+ cards :
205+ - type : heading
206+ heading : Configured Rooms
207+ icon : mdi:view-dashboard-outline
208+ heading_style : title
209+ - type : custom:auto-entities
210+ show_empty : true
211+ card :
212+ type : entities
213+ show_header_toggle : false
214+ filter :
215+ template : |-
216+ {% set ns = namespace(cards=[]) %}
217+ {# Broader search for any select entity with 'automation_mode' in the ID #}
218+ {% set mode_selectors = states.select | selectattr('entity_id', 'search', 'automation_mode') | list %}
219+
220+ {% for sel in mode_selectors %}
221+ {# Extract slug. Handles "select.bathroom_automation_mode" or "select.room_bathroom_automation_mode" #}
222+ {% set raw_id = sel.entity_id.split('.')[1] %}
223+ {% if raw_id.startswith('room_') %}
224+ {% set slug = raw_id[5:] | replace('_automation_mode','') %}
225+ {% else %}
226+ {% set slug = raw_id.replace('_automation_mode','') %}
227+ {% endif %}
228+
229+
230+ {# UPDATED: Generate Name purely from Slug (Cleaner) #}
231+ {% set name = slug.replace('_', ' ') | title %}
232+
233+ {# --- Header --- #}
234+ {% set ns.cards = ns.cards + [{'type': 'section', 'label': name}] %}
235+
236+ {# --- Controls --- #}
237+
238+ {# Mode Selector #}
239+ {% set ns.cards = ns.cards + [{'entity': sel.entity_id, 'name': 'Mode'}] %}
240+
241+ {# Room State #}
242+ {% set state_select = 'select.room_' ~ slug ~ '_state' %}
243+ {% if states[state_select] is defined %}
244+ {% set ns.cards = ns.cards + [{'entity': state_select, 'name': 'Current State'}] %}
245+ {% endif %}
246+
247+ {# Occupancy #}
248+ {% set occ_sensor = 'binary_sensor.room_' ~ slug ~ '_occupancy' %}
249+ {% if states[occ_sensor] is defined %}
250+ {% set ns.cards = ns.cards + [{'entity': occ_sensor, 'name': 'Occupancy'}] %}
251+ {% endif %}
252+
253+ {# Idle Time #}
254+ {% set idle_entity = 'number.room_' ~ slug ~ '_presence_idle_time' %}
255+ {% if states[idle_entity] is defined %}
256+ {% set ns.cards = ns.cards + [{'entity': idle_entity, 'name': 'Idle Time (sec)'}] %}
257+ {% endif %}
258+
259+ {# Off Delay #}
260+ {% set delay_entity = 'number.room_' ~ slug ~ '_lights_presence_delay' %}
261+ {% if states[delay_entity] is defined %}
262+ {% set ns.cards = ns.cards + [{'entity': delay_entity, 'name': 'Off Delay (sec)'}] %}
263+ {% endif %}
264+
265+ {# Lux Sensor #}
266+ {% set lux_s = 'text.room_' ~ slug ~ '_lux_sensor' %}
267+ {% if states[lux_s] is defined %}
268+ {% set ns.cards = ns.cards + [{'entity': lux_s, 'name': 'Lux Sensor ID'}] %}
269+ {% endif %}
270+
271+ {# Lux Threshold #}
272+ {% set lux_t = 'number.room_' ~ slug ~ '_lux_threshold' %}
273+ {% if states[lux_t] is defined %}
274+ {% set ns.cards = ns.cards + [{'entity': lux_t, 'name': 'Lux Threshold (lx)'}] %}
275+ {% endif %}
276+
277+ {# Bed Sensor #}
278+ {% set bed_s = 'text.room_' ~ slug ~ '_bed_sensor' %}
279+ {% if states[bed_s] is defined %}
280+ {% set ns.cards = ns.cards + [{'entity': bed_s, 'name': 'Bed Sensor ID'}] %}
281+
282+ {# Only show sleep timers if a bed sensor ID is entered #}
283+ {% if states(bed_s) not in ['unknown', 'unavailable', '', 'none'] %}
284+ {% set sleep_entry = 'number.room_' ~ slug ~ '_sleep_entry_delay' %}
285+ {% if states[sleep_entry] is defined %}
286+ {% set ns.cards = ns.cards + [{'entity': sleep_entry, 'name': 'Sleep Entry Delay (sec)'}] %}
287+ {% endif %}
288+
289+ {% set sleep_exit = 'number.room_' ~ slug ~ '_sleep_exit_delay' %}
290+ {% if states[sleep_exit] is defined %}
291+ {% set ns.cards = ns.cards + [{'entity': sleep_exit, 'name': 'Sleep Exit Delay (sec)'}] %}
292+ {% endif %}
293+ {% endif %}
294+ {% endif %}
295+
296+ {% endfor %}
297+ {{ ns.cards | to_json }}
174298 sort :
175299 method : none
176300
0 commit comments