Skip to content

Commit 3ad5fda

Browse files
committed
Jinja test
1 parent 57ec5c3 commit 3ad5fda

1 file changed

Lines changed: 170 additions & 46 deletions

File tree

docs/smart-home/dashboards/room-management/settings.md

Lines changed: 170 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)