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 # 🪟 Gardiner - type: grid columns: 6 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 - type: button name: "" icon: mdi:silverware-fork-knife tap_action: action: call-service service: scene.turn_on target: entity_id: scene.n22_spisetid # 🧹 Støvsuger - type: horizontal-stack cards: - type: custom:button-card entity: sensor.roborock_last_clean_end_compact show_icon: false show_name: true show_state: true name: Sidst kørt tap_action: action: none hold_action: action: none styles: card: - padding: 8px name: - font-size: 11px - color: var(--secondary-text-color) - padding-bottom: 4px state: - white-space: normal - word-break: break-word - line-height: 1.2 - font-size: 13px - text-align: center - type: button name: Køkken icon: mdi:floor-plan tap_action: action: call-service service: button.press target: entity_id: button.roborock_s8_pro_ultra_kokken_bryggers - type: button name: Syd icon: mdi:floor-plan tap_action: action: call-service service: button.press target: entity_id: button.roborock_s8_pro_ultra_syd - type: button name: Mop icon: mdi:floor-plan tap_action: action: call-service service: button.press target: entity_id: button.roborock_s8_pro_ultra_vac_followed_by_mop # 💡 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 # 🎵 Sonos - type: grid columns: 3 square: false cards: - type: button name: Stop alt icon: mdi:stop-circle-outline tap_action: action: call-service service: media_player.media_stop target: entity_id: - 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 - type: button name: P3 i bad icon: mdi:radio tap_action: action: call-service service: media_player.select_source target: entity_id: media_player.badevaerelse data: source: "0 DR P3" - type: button name: P3 i alrum icon: mdi:radio tap_action: action: call-service service: media_player.select_source target: entity_id: media_player.alrum data: source: "0 DR P3" - type: button name: Daily Mix bad icon: mdi:music-circle-outline tap_action: action: call-service service: media_player.select_source target: entity_id: media_player.badevaerelse data: source: "Andreas Daily Mix 1" - type: button name: Daily Mix køkken icon: mdi:music-circle-outline tap_action: action: call-service service: media_player.select_source target: entity_id: media_player.kokken data: source: "Andreas Daily Mix 1" - type: button name: Family Mix køkken icon: mdi:music-note-outline tap_action: action: call-service service: media_player.select_source target: entity_id: media_player.kokken data: source: "1 Family Mix" # 🔊 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 # 🗑️ 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 # ⚡ El-priser - 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) })); # 🏠 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