Dashboard views reorganized, mealie/roborock automations, indkorsel snapshots, wavin/sonoff docs, varme/sikkerhed updates
This commit is contained in:
+42
-405
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user