483 lines
13 KiB
YAML
483 lines
13 KiB
YAML
title: Overblik
|
||
path: home
|
||
icon: mdi:home
|
||
|
||
cards:
|
||
|
||
# 🌤️ Vejr + dato + sol
|
||
- type: vertical-stack
|
||
cards:
|
||
- type: weather-forecast
|
||
entity: weather.norgardsvej
|
||
show_forecast: true
|
||
|
||
- type: glance
|
||
columns: 5
|
||
show_icon: true
|
||
show_name: true
|
||
show_state: true
|
||
entities:
|
||
- entity: sensor.dato
|
||
name: Dato
|
||
icon: mdi:calendar
|
||
- entity: sensor.solopgang
|
||
name: Sol op
|
||
icon: mdi:weather-sunset-up
|
||
- entity: sensor.solnedgang
|
||
name: Sol ned
|
||
icon: mdi:weather-sunset-down
|
||
- entity: binary_sensor.arbejdsdag
|
||
name: I dag
|
||
icon: mdi:briefcase
|
||
- entity: binary_sensor.arbejdsdagimorgen
|
||
name: I morgen
|
||
icon: mdi:briefcase-outline
|
||
|
||
# 👨👩👧👦 Familien
|
||
- type: glance
|
||
entities:
|
||
- entity: person.daniel_schusler_dethlefsen
|
||
name: Daniel
|
||
- entity: person.claus_dethlefsen
|
||
name: Claus
|
||
- entity: person.anne_schusler_dethlefsen
|
||
name: Anne
|
||
- entity: person.andreas_schusler_dethlefsen
|
||
name: Andreas
|
||
- entity: binary_sensor.family_presence
|
||
name: Familie
|
||
|
||
# 🗑️ Affald
|
||
- type: glance
|
||
columns: 3
|
||
show_icon: true
|
||
show_name: false
|
||
show_state: true
|
||
entities:
|
||
- entity: sensor.affalddk_norgardsvej_22_restaffald
|
||
icon: mdi:trash-can-outline
|
||
- entity: sensor.affalddk_norgardsvej_22_papir_plast
|
||
icon: mdi:recycle
|
||
- entity: sensor.affalddk_norgardsvej_22_haveaffald
|
||
icon: mdi:leaf
|
||
|
||
# 🏠 Hus kontrol
|
||
- type: entities
|
||
title: Modes
|
||
entities:
|
||
- 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
|
||
|
||
# 🔊 Receiver presets
|
||
- type: grid
|
||
columns: 4
|
||
square: false
|
||
cards:
|
||
- type: button
|
||
name: Sonos
|
||
icon: mdi:speaker-multiple
|
||
tap_action:
|
||
action: call-service
|
||
service: script.receiver_sonos_mch_stereo
|
||
- type: button
|
||
name: TV Dolby
|
||
icon: mdi:television-speaker
|
||
tap_action:
|
||
action: call-service
|
||
service: script.receiver_tv_dolby_digital
|
||
- type: button
|
||
name: TV Stereo
|
||
icon: mdi:surround-sound
|
||
tap_action:
|
||
action: call-service
|
||
service: script.receiver_tv_mch_stereo
|
||
- type: horizontal-stack
|
||
cards:
|
||
- type: vertical-stack
|
||
cards:
|
||
- type: button
|
||
name: ""
|
||
icon: mdi:power
|
||
tap_action:
|
||
action: call-service
|
||
service: media_player.turn_off
|
||
target:
|
||
entity_id: media_player.denon_avr_x2300w
|
||
- type: button
|
||
name: ""
|
||
icon: mdi:volume-plus
|
||
tap_action:
|
||
action: call-service
|
||
service: script.receiver_volume_up_5
|
||
- type: button
|
||
name: ""
|
||
icon: mdi:volume-minus
|
||
tap_action:
|
||
action: call-service
|
||
service: script.receiver_volume_down_5
|
||
|
||
# 🪟 Gardiner
|
||
- type: grid
|
||
columns: 5
|
||
square: false
|
||
cards:
|
||
- type: button
|
||
name: ""
|
||
icon: mdi:blinds-open
|
||
tap_action:
|
||
action: call-service
|
||
service: scene.turn_on
|
||
target:
|
||
entity_id: scene.alle_lidt_nede
|
||
- type: button
|
||
name: ""
|
||
icon: mdi:blinds
|
||
tap_action:
|
||
action: call-service
|
||
service: scene.turn_on
|
||
target:
|
||
entity_id: scene.n22_alt_ned
|
||
- type: button
|
||
name: ""
|
||
icon: mdi:blinds-horizontal
|
||
tap_action:
|
||
action: call-service
|
||
service: scene.turn_on
|
||
target:
|
||
entity_id: scene.morgen
|
||
- type: button
|
||
name: ""
|
||
icon: mdi:window-shutter
|
||
tap_action:
|
||
action: call-service
|
||
service: scene.turn_on
|
||
target:
|
||
entity_id: scene.syd_ned_venstre_halvt_ned
|
||
- type: button
|
||
name: ""
|
||
icon: mdi:television-ambient-light
|
||
tap_action:
|
||
action: call-service
|
||
service: scene.turn_on
|
||
target:
|
||
entity_id: scene.n22_tv
|
||
|
||
# 💡 Lys kontrol
|
||
- type: horizontal-stack
|
||
cards:
|
||
- type: tile
|
||
entity: light.indendorslamper
|
||
name: Indenfor
|
||
icon: mdi:lightbulb-group
|
||
tap_action:
|
||
action: toggle
|
||
hold_action:
|
||
action: more-info
|
||
show_state: true
|
||
|
||
- type: tile
|
||
entity: light.udendorslamper
|
||
name: Udenfor
|
||
icon: mdi:outdoor-lamp
|
||
tap_action:
|
||
action: toggle
|
||
hold_action:
|
||
action: more-info
|
||
show_state: true
|
||
|
||
- type: tile
|
||
entity: cover.anne
|
||
name: Garage
|
||
icon: mdi:garage
|
||
features_position: bottom
|
||
vertical: false
|
||
tap_action:
|
||
action: toggle
|
||
show_state: true
|
||
|
||
# 🌡️ Temperatur + CO2 + Fugt (grupperet pr type)
|
||
- type: vertical-stack
|
||
cards:
|
||
|
||
# Temperatur
|
||
- type: horizontal-stack
|
||
cards:
|
||
- type: gauge
|
||
entity: sensor.sovevaerelse_temperatur
|
||
name: Soveværelse
|
||
min: 15
|
||
max: 30
|
||
unit: '°C'
|
||
- type: gauge
|
||
entity: sensor.sovevaerelse_stue_temperatur
|
||
name: Andreas
|
||
min: 15
|
||
max: 30
|
||
unit: '°C'
|
||
- type: gauge
|
||
entity: sensor.sovevaerelse_daniel_temperatur
|
||
name: Daniel
|
||
min: 15
|
||
max: 30
|
||
unit: '°C'
|
||
|
||
# CO2
|
||
- type: horizontal-stack
|
||
cards:
|
||
- type: gauge
|
||
entity: sensor.sovevaerelse_carbon_dioxide
|
||
name: Soveværelse
|
||
min: 0
|
||
max: 2000
|
||
unit: 'ppm'
|
||
severity:
|
||
green: 800
|
||
yellow: 1200
|
||
red: 2000
|
||
- type: gauge
|
||
entity: sensor.sovevaerelse_stue_carbon_dioxide
|
||
name: Andreas
|
||
min: 0
|
||
max: 2000
|
||
unit: 'ppm'
|
||
severity:
|
||
green: 800
|
||
yellow: 1200
|
||
red: 2000
|
||
- type: gauge
|
||
entity: sensor.sovevaerelse_daniel_carbon_dioxide
|
||
name: Daniel
|
||
min: 0
|
||
max: 2000
|
||
unit: 'ppm'
|
||
severity:
|
||
green: 800
|
||
yellow: 1200
|
||
red: 2000
|
||
|
||
# Luftfugtighed
|
||
- type: horizontal-stack
|
||
cards:
|
||
- type: gauge
|
||
entity: sensor.sovevaerelse_luftfugtighed
|
||
name: Soveværelse
|
||
min: 20
|
||
max: 80
|
||
unit: '%'
|
||
severity:
|
||
green: 60
|
||
yellow: 70
|
||
red: 80
|
||
|
||
- type: gauge
|
||
entity: sensor.sovevaerelse_stue_luftfugtighed
|
||
name: Andreas
|
||
min: 20
|
||
max: 80
|
||
unit: '%'
|
||
severity:
|
||
green: 60
|
||
yellow: 70
|
||
red: 80
|
||
|
||
- type: gauge
|
||
entity: sensor.sovevaerelse_daniel_luftfugtighed
|
||
name: Daniel
|
||
min: 20
|
||
max: 80
|
||
unit: '%'
|
||
severity:
|
||
green: 60
|
||
yellow: 70
|
||
red: 80
|
||
|
||
|
||
# ⚡ El-priser + 🍽️ Opvaskemaskine
|
||
- type: vertical-stack
|
||
cards:
|
||
- type: custom:apexcharts-card
|
||
graph_span: 24h
|
||
span:
|
||
start: hour
|
||
stacked: false
|
||
header:
|
||
show: true
|
||
title: El-priser næste 24 timer
|
||
show_states: true
|
||
colorize_states: true
|
||
now:
|
||
show: true
|
||
label: Nu
|
||
all_series_config:
|
||
stroke_width: 0
|
||
apex_config:
|
||
chart:
|
||
height: 260
|
||
grid:
|
||
strokeDashArray: 2
|
||
xaxis:
|
||
type: datetime
|
||
labels:
|
||
datetimeFormatter:
|
||
hour: HH:mm
|
||
yaxis:
|
||
decimalsInFloat: 2
|
||
tickAmount: 5
|
||
plotOptions:
|
||
bar:
|
||
columnWidth: 82%
|
||
borderRadius: 3
|
||
series:
|
||
- entity: sensor.energi_data_service
|
||
name: Pris
|
||
type: column
|
||
float_precision: 2
|
||
unit: ' kr/kWh'
|
||
show:
|
||
in_header: raw
|
||
in_chart: true
|
||
data_generator: |
|
||
const startOfHour = new Date();
|
||
startOfHour.setMinutes(0, 0, 0);
|
||
const endTime = startOfHour.getTime() + (24 * 60 * 60 * 1000);
|
||
|
||
const rawToday = entity.attributes.raw_today || [];
|
||
const rawTomorrow = entity.attributes.tomorrow_valid ? (entity.attributes.raw_tomorrow || []) : [];
|
||
const forecast = entity.attributes.forecast || [];
|
||
|
||
const allKnown = [...rawToday, ...rawTomorrow];
|
||
const data = [];
|
||
const seen = new Set();
|
||
|
||
const pushPoint = (item) => {
|
||
const timestamp = new Date(item.hour).getTime();
|
||
if (Number.isNaN(timestamp) || timestamp < startOfHour.getTime() || timestamp >= endTime || seen.has(timestamp)) {
|
||
return;
|
||
}
|
||
|
||
const price = Number(item.price);
|
||
if (Number.isNaN(price)) {
|
||
return;
|
||
}
|
||
|
||
seen.add(timestamp);
|
||
data.push({ x: timestamp, y: price });
|
||
};
|
||
|
||
allKnown.forEach(pushPoint);
|
||
|
||
if (data.length < 24) {
|
||
forecast.forEach(pushPoint);
|
||
}
|
||
|
||
data.sort((left, right) => left.x - right.x);
|
||
|
||
const trimmed = data.slice(0, 24);
|
||
if (!trimmed.length) {
|
||
return [];
|
||
}
|
||
|
||
const prices = trimmed.map((item) => item.y);
|
||
const minPrice = Math.min(...prices);
|
||
const maxPrice = Math.max(...prices);
|
||
|
||
const mix = (start, end, ratio) => Math.round(start + ((end - start) * ratio));
|
||
const toHex = (value) => value.toString(16).padStart(2, '0');
|
||
const rgbToHex = (red, green, blue) => `#${toHex(red)}${toHex(green)}${toHex(blue)}`;
|
||
|
||
const colorByValue = (value) => {
|
||
if (maxPrice === minPrice) {
|
||
return '#16a34a';
|
||
}
|
||
|
||
const normalized = (value - minPrice) / (maxPrice - minPrice);
|
||
|
||
if (normalized <= 0.5) {
|
||
const ratio = normalized / 0.5;
|
||
return rgbToHex(
|
||
mix(22, 250, ratio),
|
||
mix(163, 204, ratio),
|
||
mix(74, 21, ratio)
|
||
);
|
||
}
|
||
|
||
const ratio = (normalized - 0.5) / 0.5;
|
||
return rgbToHex(
|
||
mix(250, 220, ratio),
|
||
mix(204, 38, ratio),
|
||
mix(21, 38, ratio)
|
||
);
|
||
};
|
||
|
||
return trimmed.map((item) => ({
|
||
x: item.x,
|
||
y: item.y,
|
||
fillColor: colorByValue(item.y)
|
||
}));
|
||
|
||
- type: horizontal-stack
|
||
cards:
|
||
- type: tile
|
||
entity: sensor.dishwasher_next_start_compact
|
||
name: Næste opvask
|
||
|
||
- type: tile
|
||
entity: sensor.opvask_tid_tilbage
|
||
name: Tid tilbage
|
||
|
||
# 🧹 Støvsuger (forenklet – mindre støj)
|
||
- type: entities
|
||
title: Støvsuger
|
||
entities:
|
||
- vacuum.roborock_s8_pro_ultra
|
||
- sensor.roborock_s8_pro_ultra_status
|
||
|
||
# 🎵 Sonos
|
||
- type: glance
|
||
title: Sonos
|
||
entities:
|
||
- media_player.stue
|
||
- media_player.andreas
|
||
- media_player.daniel
|
||
- media_player.kokken
|
||
- media_player.alrum
|
||
- media_player.badevaerelse
|
||
- media_player.sovevaerelse
|
||
- media_player.lille_badevaerelse
|
||
|
||
# 📡 Kamera indikator
|
||
- type: glance
|
||
title: Kamera
|
||
entities:
|
||
- binary_sensor.indkoersel_person
|
||
- binary_sensor.indkoersel_vehicle
|
||
- binary_sensor.terrasse_person
|
||
|
||
# 🌐 System (let trimmet)
|
||
- type: horizontal-stack
|
||
cards:
|
||
- type: sensor
|
||
entity: sensor.home_assistant_website
|
||
name: HA Version
|
||
- type: entity
|
||
entity: binary_sensor.home_assistant_website_update_available
|
||
name: Opdatering
|
||
icon: mdi:update
|
||
- type: gauge
|
||
entity: sensor.speedtest_download
|
||
name: Download
|
||
min: 0
|
||
max: 1000
|
||
unit: 'Mbit/s'
|
||
- type: gauge
|
||
entity: sensor.speedtest_upload
|
||
name: Upload
|
||
min: 0
|
||
max: 500
|
||
unit: 'Mbit/s'
|