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'