Improve overview climate ribbon responsiveness

master
Carlo Costanzo 1 day ago
parent 64543c0e61
commit 5440d5415c

@ -902,6 +902,14 @@ bearstone_overview_ribbon_control:
raw_suffix: '' raw_suffix: ''
display_mode: state display_mode: state
humidity_entity: '' humidity_entity: ''
cooling_entity: ''
cooling_active: >
[[[
const coolingEntity = String(variables?.cooling_entity ?? '').trim();
return Boolean(coolingEntity && states[coolingEntity]?.state === 'on');
]]]
mobile_compact: >
[[[ return window.innerWidth <= 600; ]]]
state_display: > state_display: >
[[[ [[[
const raw = String(entity?.state ?? 'unknown').toLowerCase(); const raw = String(entity?.state ?? 'unknown').toLowerCase();
@ -913,6 +921,7 @@ bearstone_overview_ribbon_control:
const currentText = Number.isFinite(current) ? `${Math.round(current)}°` : 'n/a'; const currentText = Number.isFinite(current) ? `${Math.round(current)}°` : 'n/a';
const targetText = Number.isFinite(target) ? `${Math.round(target)}°` : 'n/a'; const targetText = Number.isFinite(target) ? `${Math.round(target)}°` : 'n/a';
const humidityText = Number.isFinite(humidity) ? ` · ${Math.round(humidity)}%` : ''; const humidityText = Number.isFinite(humidity) ? ` · ${Math.round(humidity)}%` : '';
if (variables?.mobile_compact) return `${currentText}/${targetText}${humidityText}`;
return `${currentText} / ${targetText}${humidityText}`; return `${currentText} / ${targetText}${humidityText}`;
} }
const labels = variables?.state_labels || {}; const labels = variables?.state_labels || {};
@ -923,12 +932,17 @@ bearstone_overview_ribbon_control:
]]] ]]]
styles: styles:
card: card:
- min-height: >
[[[ return variables?.mobile_compact ? '44px' : 'auto'; ]]]
- padding: >
[[[ return variables?.mobile_compact ? '5px 7px' : '10px 12px'; ]]]
- border-color: > - border-color: >
[[[ [[[
const raw = String(entity?.state ?? '').toLowerCase(); const raw = String(entity?.state ?? '').toLowerCase();
const ok = Array.isArray(variables?.ok_states) ? variables.ok_states.map(String) : []; const ok = Array.isArray(variables?.ok_states) ? variables.ok_states.map(String) : [];
const active = Array.isArray(variables?.active_states) ? variables.active_states.map(String) : []; const active = Array.isArray(variables?.active_states) ? variables.active_states.map(String) : [];
const warning = Array.isArray(variables?.warning_states) ? variables.warning_states.map(String) : []; const warning = Array.isArray(variables?.warning_states) ? variables.warning_states.map(String) : [];
if (variables?.cooling_active) return 'rgba(30,136,229,0.45)';
if (['unknown', 'unavailable', 'none', ''].includes(raw) || warning.includes(raw)) return 'rgba(245,124,0,0.45)'; if (['unknown', 'unavailable', 'none', ''].includes(raw) || warning.includes(raw)) return 'rgba(245,124,0,0.45)';
if (active.includes(raw)) return 'rgba(30,136,229,0.45)'; if (active.includes(raw)) return 'rgba(30,136,229,0.45)';
return ok.includes(raw) ? 'rgba(67,160,71,0.45)' : 'rgba(229,57,53,0.40)'; return ok.includes(raw) ? 'rgba(67,160,71,0.45)' : 'rgba(229,57,53,0.40)';
@ -939,24 +953,41 @@ bearstone_overview_ribbon_control:
const ok = Array.isArray(variables?.ok_states) ? variables.ok_states.map(String) : []; const ok = Array.isArray(variables?.ok_states) ? variables.ok_states.map(String) : [];
const active = Array.isArray(variables?.active_states) ? variables.active_states.map(String) : []; const active = Array.isArray(variables?.active_states) ? variables.active_states.map(String) : [];
const warning = Array.isArray(variables?.warning_states) ? variables.warning_states.map(String) : []; const warning = Array.isArray(variables?.warning_states) ? variables.warning_states.map(String) : [];
if (variables?.cooling_active) return 'rgba(227,242,253,0.90)';
if (['unknown', 'unavailable', 'none', ''].includes(raw) || warning.includes(raw)) return 'rgba(255,243,224,0.85)'; if (['unknown', 'unavailable', 'none', ''].includes(raw) || warning.includes(raw)) return 'rgba(255,243,224,0.85)';
if (active.includes(raw)) return 'rgba(227,242,253,0.90)'; if (active.includes(raw)) return 'rgba(227,242,253,0.90)';
return ok.includes(raw) ? 'rgba(232,245,233,0.85)' : 'rgba(255,235,238,0.85)'; return ok.includes(raw) ? 'rgba(232,245,233,0.85)' : 'rgba(255,235,238,0.85)';
]]] ]]]
grid:
- grid-template-areas: >
[[[ return variables?.mobile_compact ? '"n" "s"' : '"i n" "i s"'; ]]]
- grid-template-columns: >
[[[ return variables?.mobile_compact ? '1fr' : '28px 1fr'; ]]]
- column-gap: 0
icon: icon:
- display: >
[[[ return variables?.mobile_compact ? 'none' : 'block'; ]]]
- width: >
[[[ return variables?.mobile_compact ? '14px' : '18px'; ]]]
- color: > - color: >
[[[ [[[
const raw = String(entity?.state ?? '').toLowerCase(); const raw = String(entity?.state ?? '').toLowerCase();
const ok = Array.isArray(variables?.ok_states) ? variables.ok_states.map(String) : []; const ok = Array.isArray(variables?.ok_states) ? variables.ok_states.map(String) : [];
const active = Array.isArray(variables?.active_states) ? variables.active_states.map(String) : []; const active = Array.isArray(variables?.active_states) ? variables.active_states.map(String) : [];
const warning = Array.isArray(variables?.warning_states) ? variables.warning_states.map(String) : []; const warning = Array.isArray(variables?.warning_states) ? variables.warning_states.map(String) : [];
if (variables?.cooling_active) return 'rgba(25,118,210,1)';
if (['unknown', 'unavailable', 'none', ''].includes(raw) || warning.includes(raw)) return 'rgba(245,124,0,1)'; if (['unknown', 'unavailable', 'none', ''].includes(raw) || warning.includes(raw)) return 'rgba(245,124,0,1)';
if (active.includes(raw)) return 'rgba(25,118,210,1)'; if (active.includes(raw)) return 'rgba(25,118,210,1)';
return ok.includes(raw) ? 'rgba(46,125,50,1)' : 'rgba(198,40,40,1)'; return ok.includes(raw) ? 'rgba(46,125,50,1)' : 'rgba(198,40,40,1)';
]]] ]]]
name: name:
- font-size: 13px - font-size: >
[[[ return variables?.mobile_compact ? '10px' : '13px'; ]]]
- font-weight: 900 - font-weight: 900
- line-height: >
[[[ return variables?.mobile_compact ? '11px' : 'normal'; ]]]
- justify-self: >
[[[ return variables?.mobile_compact ? 'center' : 'start'; ]]]
- opacity: 1 - opacity: 1
state: state:
- color: > - color: >
@ -965,12 +996,18 @@ bearstone_overview_ribbon_control:
const ok = Array.isArray(variables?.ok_states) ? variables.ok_states.map(String) : []; const ok = Array.isArray(variables?.ok_states) ? variables.ok_states.map(String) : [];
const active = Array.isArray(variables?.active_states) ? variables.active_states.map(String) : []; const active = Array.isArray(variables?.active_states) ? variables.active_states.map(String) : [];
const warning = Array.isArray(variables?.warning_states) ? variables.warning_states.map(String) : []; const warning = Array.isArray(variables?.warning_states) ? variables.warning_states.map(String) : [];
if (variables?.cooling_active) return 'rgba(25,118,210,1)';
if (['unknown', 'unavailable', 'none', ''].includes(raw) || warning.includes(raw)) return 'rgba(230,81,0,1)'; if (['unknown', 'unavailable', 'none', ''].includes(raw) || warning.includes(raw)) return 'rgba(230,81,0,1)';
if (active.includes(raw)) return 'rgba(25,118,210,1)'; if (active.includes(raw)) return 'rgba(25,118,210,1)';
return ok.includes(raw) ? 'rgba(46,125,50,1)' : 'rgba(198,40,40,1)'; return ok.includes(raw) ? 'rgba(46,125,50,1)' : 'rgba(198,40,40,1)';
]]] ]]]
- font-size: 12px - font-size: >
[[[ return variables?.mobile_compact ? '9px' : '12px'; ]]]
- font-weight: 900 - font-weight: 900
- line-height: >
[[[ return variables?.mobile_compact ? '10px' : 'normal'; ]]]
- justify-self: >
[[[ return variables?.mobile_compact ? 'center' : 'start'; ]]]
- opacity: 1 - opacity: 1
bearstone_overview_sleep_summary: bearstone_overview_sleep_summary:

@ -8,6 +8,8 @@
# Systems first, then frequent entry points, climate, and vacuum access. # Systems first, then frequent entry points, climate, and vacuum access.
# ------------------------------------------------------------------- # -------------------------------------------------------------------
# Notes: Equal-width pills keep the whole ribbon compact and consistent. # Notes: Equal-width pills keep the whole ribbon compact and consistent.
# Notes: Thermostat pills use the climate cooling helpers for active light-blue shading.
# Notes: Mobile uses a compact four-column ribbon while preserving 44px tap targets.
###################################################################### ######################################################################
type: grid type: grid
@ -27,8 +29,9 @@ cards:
grid-gap: 10px grid-gap: 10px
margin: 0 margin: 0
mediaquery: mediaquery:
"(max-width: 900px)": "(max-width: 600px)":
grid-template-columns: repeat(2, minmax(0, 1fr)) grid-template-columns: repeat(4, minmax(0, 1fr))
grid-gap: 4px
cards: cards:
- type: custom:button-card - type: custom:button-card
template: bearstone_overview_ribbon_control template: bearstone_overview_ribbon_control
@ -89,6 +92,7 @@ cards:
variables: variables:
display_mode: climate display_mode: climate
humidity_entity: sensor.downstairs_humidity humidity_entity: sensor.downstairs_humidity
cooling_entity: binary_sensor.downstairs_ac_is_cooling
ok_states: ok_states:
- auto - auto
- cool - cool
@ -106,6 +110,7 @@ cards:
variables: variables:
display_mode: climate display_mode: climate
humidity_entity: sensor.upstairs_humidity humidity_entity: sensor.upstairs_humidity
cooling_entity: binary_sensor.upstairs_ac_is_cooling
ok_states: ok_states:
- auto - auto
- cool - cool

Loading…
Cancel
Save

Powered by TurnKey Linux.