Dashboard views reorganized, mealie/roborock automations, indkorsel snapshots, wavin/sonoff docs, varme/sikkerhed updates

This commit is contained in:
2026-05-16 07:28:28 +02:00
parent bd134bafef
commit f2ac6064b5
214 changed files with 1812 additions and 675 deletions
+42 -405
View File
@@ -33,275 +33,19 @@ cards:
name: I morgen
icon: mdi:briefcase-outline
# 👨‍👩‍👧‍👦 Familien tryk for at toggle syg/rask
- type: grid
columns: 4
square: false
cards:
- type: custom:button-card
entity: person.daniel_schusler_dethlefsen
# 👨‍👩‍👧‍👦 Familien
- type: glance
entities:
- entity: person.daniel_schusler_dethlefsen
name: Daniel
show_name: true
show_state: false
show_label: true
show_icon: false
show_entity_picture: true
label: >
[[[
const s = entity.state;
const sick = states['input_select.daniel_status'] &&
states['input_select.daniel_status'].state === 'syg';
const loc = s === 'home' ? 'Hjemme' : s === 'not_home' ? 'Ude' : s;
return sick ? loc + ' · Syg' : loc;
]]]
styles:
card:
- padding: 8px 4px
- border: >
[[[
return states['input_select.daniel_status'] &&
states['input_select.daniel_status'].state === 'syg'
? '2px solid rgba(220,50,50,0.8)' : '2px solid transparent';
]]]
- border-radius: 12px
entity_picture:
- width: 60px
- height: 60px
- border-radius: 50%
- object-fit: cover
- filter: >
[[[
return states['input_select.daniel_status'] &&
states['input_select.daniel_status'].state === 'syg'
? 'grayscale(100%)' : 'none';
]]]
name:
- font-size: 12px
- font-weight: 600
- padding-top: 6px
- color: >
[[[
return states['input_select.daniel_status'] &&
states['input_select.daniel_status'].state === 'syg'
? 'rgb(220,50,50)' : 'var(--primary-text-color)';
]]]
label:
- font-size: 10px
- color: var(--secondary-text-color)
- padding-bottom: 2px
tap_action:
action: call-service
service: input_select.select_option
service_data:
entity_id: input_select.daniel_status
option: >
[[[
return states['input_select.daniel_status'] &&
states['input_select.daniel_status'].state === 'syg'
? 'hjemme' : 'syg';
]]]
hold_action:
action: more-info
entity: person.daniel_schusler_dethlefsen
- type: custom:button-card
entity: person.claus_dethlefsen
- entity: person.claus_dethlefsen
name: Claus
show_name: true
show_state: false
show_label: true
show_icon: false
show_entity_picture: true
label: >
[[[
const s = entity.state;
const sick = states['input_select.claus_status'] &&
states['input_select.claus_status'].state === 'syg';
const loc = s === 'home' ? 'Hjemme' : s === 'not_home' ? 'Ude' : s;
return sick ? loc + ' · Syg' : loc;
]]]
styles:
card:
- padding: 8px 4px
- border: >
[[[
return states['input_select.claus_status'] &&
states['input_select.claus_status'].state === 'syg'
? '2px solid rgba(220,50,50,0.8)' : '2px solid transparent';
]]]
- border-radius: 12px
entity_picture:
- width: 60px
- height: 60px
- border-radius: 50%
- object-fit: cover
- filter: >
[[[
return states['input_select.claus_status'] &&
states['input_select.claus_status'].state === 'syg'
? 'grayscale(100%)' : 'none';
]]]
name:
- font-size: 12px
- font-weight: 600
- padding-top: 6px
- color: >
[[[
return states['input_select.claus_status'] &&
states['input_select.claus_status'].state === 'syg'
? 'rgb(220,50,50)' : 'var(--primary-text-color)';
]]]
label:
- font-size: 10px
- color: var(--secondary-text-color)
- padding-bottom: 2px
tap_action:
action: call-service
service: input_select.select_option
service_data:
entity_id: input_select.claus_status
option: >
[[[
return states['input_select.claus_status'] &&
states['input_select.claus_status'].state === 'syg'
? 'hjemme' : 'syg';
]]]
hold_action:
action: more-info
entity: person.claus_dethlefsen
- type: custom:button-card
entity: person.anne_schusler_dethlefsen
- entity: person.anne_schusler_dethlefsen
name: Anne
show_name: true
show_state: false
show_label: true
show_icon: false
show_entity_picture: true
label: >
[[[
const s = entity.state;
const sick = states['input_select.anne_status'] &&
states['input_select.anne_status'].state === 'syg';
const loc = s === 'home' ? 'Hjemme' : s === 'not_home' ? 'Ude' : s;
return sick ? loc + ' · Syg' : loc;
]]]
styles:
card:
- padding: 8px 4px
- border: >
[[[
return states['input_select.anne_status'] &&
states['input_select.anne_status'].state === 'syg'
? '2px solid rgba(220,50,50,0.8)' : '2px solid transparent';
]]]
- border-radius: 12px
entity_picture:
- width: 60px
- height: 60px
- border-radius: 50%
- object-fit: cover
- filter: >
[[[
return states['input_select.anne_status'] &&
states['input_select.anne_status'].state === 'syg'
? 'grayscale(100%)' : 'none';
]]]
name:
- font-size: 12px
- font-weight: 600
- padding-top: 6px
- color: >
[[[
return states['input_select.anne_status'] &&
states['input_select.anne_status'].state === 'syg'
? 'rgb(220,50,50)' : 'var(--primary-text-color)';
]]]
label:
- font-size: 10px
- color: var(--secondary-text-color)
- padding-bottom: 2px
tap_action:
action: call-service
service: input_select.select_option
service_data:
entity_id: input_select.anne_status
option: >
[[[
return states['input_select.anne_status'] &&
states['input_select.anne_status'].state === 'syg'
? 'hjemme' : 'syg';
]]]
hold_action:
action: more-info
entity: person.anne_schusler_dethlefsen
- type: custom:button-card
entity: person.andreas_schusler_dethlefsen
- entity: person.andreas_schusler_dethlefsen
name: Andreas
show_name: true
show_state: false
show_label: true
show_icon: false
show_entity_picture: true
label: >
[[[
const s = entity.state;
const sick = states['input_select.andreas_status'] &&
states['input_select.andreas_status'].state === 'syg';
const loc = s === 'home' ? 'Hjemme' : s === 'not_home' ? 'Ude' : s;
return sick ? loc + ' · Syg' : loc;
]]]
styles:
card:
- padding: 8px 4px
- border: >
[[[
return states['input_select.andreas_status'] &&
states['input_select.andreas_status'].state === 'syg'
? '2px solid rgba(220,50,50,0.8)' : '2px solid transparent';
]]]
- border-radius: 12px
entity_picture:
- width: 60px
- height: 60px
- border-radius: 50%
- object-fit: cover
- filter: >
[[[
return states['input_select.andreas_status'] &&
states['input_select.andreas_status'].state === 'syg'
? 'grayscale(100%)' : 'none';
]]]
name:
- font-size: 12px
- font-weight: 600
- padding-top: 6px
- color: >
[[[
return states['input_select.andreas_status'] &&
states['input_select.andreas_status'].state === 'syg'
? 'rgb(220,50,50)' : 'var(--primary-text-color)';
]]]
label:
- font-size: 10px
- color: var(--secondary-text-color)
- padding-bottom: 2px
tap_action:
action: call-service
service: input_select.select_option
service_data:
entity_id: input_select.andreas_status
option: >
[[[
return states['input_select.andreas_status'] &&
states['input_select.andreas_status'].state === 'syg'
? 'hjemme' : 'syg';
]]]
hold_action:
action: more-info
entity: person.andreas_schusler_dethlefsen
- entity: binary_sensor.family_presence
name: Familie
# 🪟 Gardiner
- type: grid
@@ -389,71 +133,36 @@ cards:
icon: mdi:floor-plan
tap_action:
action: call-service
service: script.turn_on
service: button.press
target:
entity_id: script.roborock_manuelt_kokken
entity_id: button.roborock_s8_pro_ultra_kokken_bryggers
- type: button
name: Syd
icon: mdi:floor-plan
tap_action:
action: call-service
service: script.turn_on
service: button.press
target:
entity_id: script.roborock_manuelt_syd
entity_id: button.roborock_s8_pro_ultra_syd
- type: button
name: Mop
icon: mdi:floor-plan
tap_action:
action: call-service
service: script.turn_on
service: button.press
target:
entity_id: script.roborock_manuelt_mop
entity_id: button.roborock_s8_pro_ultra_vac_followed_by_mop
- type: custom:button-card
entity: vacuum.roborock_s8_pro_ultra
name: Start
icon: mdi:robot-vacuum
- type: button
name: Gå til dock
icon: mdi:home-import-outline
tap_action:
action: call-service
service: script.turn_on
service: vacuum.return_to_base
target:
entity_id: script.roborock_manuelt_start
state:
- value: cleaning
name: Dock
styles:
card:
- background-color: rgba(255, 200, 0, 0.25)
- border: 1px solid rgba(255, 200, 0, 0.8)
tap_action:
action: call-service
service: vacuum.return_to_base
target:
entity_id: vacuum.roborock_s8_pro_ultra
- value: returning
name: Dock
styles:
card:
- background-color: rgba(255, 200, 0, 0.25)
- border: 1px solid rgba(255, 200, 0, 0.8)
tap_action:
action: call-service
service: vacuum.return_to_base
target:
entity_id: vacuum.roborock_s8_pro_ultra
- value: paused
name: Dock
styles:
card:
- background-color: rgba(255, 200, 0, 0.25)
- border: 1px solid rgba(255, 200, 0, 0.8)
tap_action:
action: call-service
service: vacuum.return_to_base
target:
entity_id: vacuum.roborock_s8_pro_ultra
entity_id: vacuum.roborock_s8_pro_ultra
# 🏎️ Plæneklipper
- type: horizontal-stack
@@ -462,25 +171,8 @@ cards:
entity: input_datetime.ploeneklipper_sidst_koert
show_icon: false
show_name: true
show_state: false
show_label: true
show_state: true
name: Sidst klippet
label: >
[[[
const s = entity.state;
if (!s || s === 'unknown') return 'Ukendt';
const d = new Date(s.replace(' ', 'T'));
if (isNaN(d)) return s;
const now = new Date();
const isToday = d.toDateString() === now.toDateString();
const yesterday = new Date(now);
yesterday.setDate(now.getDate() - 1);
const isYesterday = d.toDateString() === yesterday.toDateString();
const t = d.toLocaleTimeString('da-DK', {hour: '2-digit', minute: '2-digit'});
if (isToday) return 'I dag ' + t;
if (isYesterday) return 'I g\u00e5r ' + t;
return d.toLocaleDateString('da-DK', {day: 'numeric', month: 'short'}) + ' ' + t;
]]]
tap_action:
action: none
styles:
@@ -490,34 +182,30 @@ cards:
- font-size: 11px
- color: var(--secondary-text-color)
- padding-bottom: 4px
label:
state:
- white-space: normal
- word-break: break-word
- line-height: 1.2
- font-size: 13px
- text-align: center
- type: custom:button-card
entity: lawn_mower.husqvarna_automower
- type: button
name: Klip
icon: mdi:robot-mower
tap_action:
action: call-service
service: script.turn_on
service: lawn_mower.start_mowing
target:
entity_id: script.ploeneklipper_manuelt_start
state:
- value: mowing
name: Stop
styles:
card:
- background-color: rgba(255, 200, 0, 0.25)
- border: 1px solid rgba(255, 200, 0, 0.8)
tap_action:
action: call-service
service: script.turn_on
target:
entity_id: script.ploeneklipper_manuelt_stop
entity_id: lawn_mower.husqvarna_automower
- type: button
name: Stop
icon: mdi:home-import-outline
tap_action:
action: call-service
service: lawn_mower.dock
target:
entity_id: lawn_mower.husqvarna_automower
# 💡 Lys kontrol
- type: horizontal-stack
@@ -542,60 +230,17 @@ cards:
action: more-info
show_state: true
- type: custom:button-card
- type: tile
entity: binary_sensor.garageport
name: Garage
show_name: true
show_state: false
show_label: true
label: >
[[[
const isOpen = entity.state === 'on';
const lastChanged = new Date(entity.last_changed);
const secsAgo = (Date.now() - lastChanged) / 1000;
const inMotion = secsAgo < 30;
if (inMotion) return isOpen ? 'Åbner...' : 'Lukker...';
return isOpen ? 'Åben' : 'Lukket';
]]]
icon: >
[[[
return entity.state === 'on'
? 'mdi:garage-open-variant'
: 'mdi:garage-variant';
]]]
extra_styles: |
@keyframes garage-pulse {
0% { opacity: 1; transform: scale(1); }
50% { opacity: 0.55; transform: scale(1.04); }
100% { opacity: 1; transform: scale(1); }
}
styles:
card:
- animation: >
[[[
const secsAgo = (Date.now() - new Date(entity.last_changed)) / 1000;
return secsAgo < 30 ? 'garage-pulse 0.8s ease-in-out infinite' : 'none';
]]]
icon:
- color: >
[[[
const isOpen = entity.state === 'on';
const secsAgo = (Date.now() - new Date(entity.last_changed)) / 1000;
if (secsAgo < 30) return 'dodgerblue';
return isOpen ? 'orange' : 'var(--primary-text-color)';
]]]
label:
- font-size: 11px
- color: >
[[[
const secsAgo = (Date.now() - new Date(entity.last_changed)) / 1000;
return secsAgo < 30 ? 'dodgerblue' : 'var(--secondary-text-color)';
]]]
features_position: bottom
vertical: false
tap_action:
action: call-service
service: cover.toggle
target:
entity_id: cover.anne
show_state: true
# 🎵 Sonos
- type: grid
@@ -741,18 +386,6 @@ cards:
action: call-service
service: script.tv_hygge_announcement
# 🏖️ Ferie
- type: entities
title: Ferie
icon: mdi:beach
entities:
- entity: input_datetime.vacation_start
name: Afrejse
- entity: input_datetime.vacation_end
name: Hjemkomst
- entity: input_boolean.vacation_mode
name: Ferietilstand aktiv
# 🗑️ Affald
- type: glance
columns: 3
@@ -897,6 +530,10 @@ cards:
- entity: input_boolean.guests_mode
name: Vi har gæster
icon: mdi:account-group
- entity: input_boolean.vacation_mode
name: 🌴 Vacation Mode
- entity: input_datetime.vacation_end
name: Slutter
- type: conditional
conditions: