Skip to content

Instantly share code, notes, and snippets.

@dantz
Created May 2, 2026 07:51
Show Gist options
  • Select an option

  • Save dantz/13e7dd7c873dc40ea4ec7a4e7f94244d to your computer and use it in GitHub Desktop.

Select an option

Save dantz/13e7dd7c873dc40ea4ec7a4e7f94244d to your computer and use it in GitHub Desktop.
Das Küchendashboard, wie es in meinem Video unter https://youtu.be/YBZ8nEqh4RU zu sehen ist.
kiosk_mode:
hide_header: true
hide_sidebar: true
views:
- type: sections
sections:
- type: grid
cards:
- type: conditional
conditions:
- entity: sensor.stadt_xy_current_warning_level
state_not: '0'
grid_options:
columns: full
card:
type: markdown
title: Wetterwarnungen
content: >
{% set sensor = 'sensor.stadt_xy_current_warning_level' %} {%
set count = state_attr(sensor, 'warning_count') | int(0) %} {%
if count == 0 %} ✅ Keine aktiven Warnungen. {% else %} {% for i
in range(1, count + 1) %} {% set headline = state_attr(sensor,
'warning_' ~ i ~ '_headline') %} {% set start =
state_attr(sensor, 'warning_' ~ i ~ '_start') %} {% set end =
state_attr(sensor, 'warning_' ~ i ~ '_end') %} {% set level =
state_attr(sensor, 'warning_' ~ i ~ '_level') | int(0) %} {% set
start_ts = as_timestamp(start) %} {% set end_ts =
as_timestamp(end) %} {% set today = now().date() %} {% macro
rel_date(ts) %} {% set d = ts | timestamp_custom('%Y-%m-%d') |
as_datetime | as_local %} {% if d.date() == today %}Heute{% elif
d.date() == today + timedelta(days=1) %}Morgen{% elif d.date()
== today - timedelta(days=1) %}Gestern{% else %}{{ ts |
timestamp_custom('%d.%m.') }}{% endif %} {% endmacro %} {% if
level >= 3 %}🔴{% elif level == 2 %}🟠{% else %}🟡{% endif %}
**{{ headline | replace('Amtliche ', '') }}**
{{ rel_date(start_ts) | trim }} {{ start_ts |
timestamp_custom('%H:%M') }} – {{ rel_date(end_ts) | trim }} {{
end_ts | timestamp_custom('%H:%M') }} Uhr {% if not loop.last %}
{% endif %}
{% endfor %} {% endif %}
grid_options:
columns: full
text_only: true
- type: custom:apexcharts-card
grid_options:
columns: full
header:
show: true
title: Strompreise & PV-Prognose
graph_span: 48h
apex_config:
chart:
height: 250px
legend:
show: false
plotOptions:
bar:
columnWidth: 100%
span:
start: day
now:
show: true
label: Jetzt
yaxis:
- id: price
decimals: 1
min: 0
apex_config:
title:
text: ct/kWh
- id: pv
opposite: true
decimals: 0
apex_config:
title:
text: Watt
series:
- entity: sensor.epex_spot_data_total_price
name: Strompreis
type: area
yaxis_id: price
color: '#64B5F6'
curve: stepline
stroke_width: 1
opacity: 0.4
extend_to: false
data_generator: |
return entity.attributes.data.map((entry) => {
return [new Date(entry.start_time), entry.price_per_kwh * 100];
});
- entity: sensor.dach_energy_production_today
name: PV Heute
type: line
curve: smooth
yaxis_id: pv
color: orange
stroke_width: 2
data_generator: |
const watts = entity.attributes.watts;
return Object.entries(watts).map(([time, watt]) => {
return [new Date(time).getTime(), watt];
});
- entity: sensor.dach_energy_production_tomorrow
name: PV Morgen
type: line
curve: smooth
yaxis_id: pv
color: orange
opacity: 0.5
stroke_width: 2
stroke_dash: 4
data_generator: |
const watts = entity.attributes.watts;
return Object.entries(watts).map(([time, watt]) => {
return [new Date(time).getTime(), watt];
});
- entity: sensor.s10e_pro_compact_solar_production
name: PV Ist
type: area
yaxis_id: pv
color: green
stroke_width: 2
transform: return x * 1000;
opacity: 0.15
curve: smooth
extend_to: false
- type: custom:mushroom-template-card
primary: '{{ states(''sensor.wetter_lokal_temperatur'') }}°'
secondary: >-
📈{{ states('sensor.hochsttemperatur_heute') }}° 📉{{
states('sensor.tiefsttemperatur_nacht') }}°
icon: |
{% set c = states('sensor.wetter_lokal_wetterzustand') %}
{% set map = {
'sunny':'mdi:weather-sunny',
'clear-night':'mdi:weather-night',
'partlycloudy':'mdi:weather-partly-cloudy',
'cloudy':'mdi:weather-cloudy',
'rainy':'mdi:weather-rainy',
'pouring':'mdi:weather-pouring',
'snowy':'mdi:weather-snowy',
'snowy-rainy':'mdi:weather-snowy-rainy',
'lightning':'mdi:weather-lightning',
'lightning-rainy':'mdi:weather-lightning-rainy',
'fog':'mdi:weather-fog',
'windy':'mdi:weather-windy',
'hail':'mdi:weather-hail'
} %}
{{ map.get(c, 'mdi:weather-cloudy') }}
icon_color: |
{% set c = states('sensor.wetter_lokal_wetterzustand') %}
{% if c == 'sunny' %} orange
{% elif c in ['rainy','pouring'] %} blue
{% elif c in ['lightning','lightning-rainy'] %} deep-purple
{% elif c in ['snowy','snowy-rainy','hail'] %} light-blue
{% else %} grey
{% endif %}
grid_options:
columns: 4
rows: 1
- type: custom:mushroom-entity-card
entity: sensor.uv_index_heute
name: UV-Index
icon: mdi:sun-wireless
grid_options:
columns: 4
rows: auto
icon_color: amber
- type: custom:mushroom-template-card
primary: >-
Batterie {{ states('sensor.s10e_pro_compact_state_of_charge') |
int }}%
secondary: >
{% set soc = states('sensor.s10e_pro_compact_state_of_charge') |
int %} {% set charge =
states('sensor.s10e_pro_compact_battery_charge') | int %} {% set
discharge = states('sensor.s10e_pro_compact_battery_discharge') |
int %} {% if charge > 0 %} ↑ {{ charge }} KW laden {% elif
discharge > 0 %} ↓ {{ discharge }} KW entladen {% else %} {{ soc
}} % – Standby {% endif %}
icon: >
{% set soc = states('sensor.s10e_pro_compact_state_of_charge') |
int %} {% set charge =
states('sensor.s10e_pro_compact_battery_charge') | int %} {% if
charge > 0 %} mdi:battery-charging {% elif soc >= 90 %}
mdi:battery {% elif soc >= 70 %} mdi:battery-80 {% elif soc >= 50
%} mdi:battery-60 {% elif soc >= 30 %} mdi:battery-40 {% elif soc
>= 10 %} mdi:battery-20 {% else %} mdi:battery-alert {% endif %}
tap_action:
action: more-info
color: >
{% set soc = states('sensor.s10e_pro_compact_state_of_charge') |
int %} {% set charge =
states('sensor.s10e_pro_compact_battery_charge') | int %} {% if
charge > 0 %} green {% elif soc >= 50 %} green {% elif soc >= 20
%} orange {% else %} red {% endif %}
features_position: bottom
grid_options:
columns: 4
rows: 1
- type: custom:mushroom-entity-card
grid_options:
rows: 1
columns: 4
entity: sensor.dach_energy_production_today
name: Heute
icon: mdi:solar-power-variant
icon_color: amber
vertical: false
features_position: bottom
- type: custom:mushroom-entity-card
grid_options:
rows: 1
columns: 4
entity: sensor.dach_energy_production_tomorrow
name: Morgen
icon: mdi:solar-power-variant
icon_color: amber
vertical: false
features_position: bottom
- type: custom:mushroom-entity-card
grid_options:
rows: 1
columns: 4
entity: sensor.dach_energy_production_d2
name: Übermorgen
icon: mdi:solar-power-variant
icon_color: amber
column_span: 2
- type: grid
cards:
- name: Familienkalender
cardHeight: 100%
maxDaysToShow: 3
maxEventCount: 0
showLoader: true
showLocation: true
showMonth: false
fullTextTime: true
showCurrentEventLine: false
showDate: false
dateFormat: LL
startDaysAhead: 0
showLastCalendarWeek: false
sortBy: start
allDayBottom: false
disableEventLink: false
disableLocationLink: false
disableCalLocationLink: false
disableCalMonthLink: false
linkTarget: _blank
showDeclined: true
showPrivate: true
showHiddenText: true
showCalendarName: false
nameColor: var(--primary-text-color)
descColor: var(--primary-text-color)
descSize: 80
showNoEventsForToday: false
showNoEventDays: false
hideCardIfNoEvents: false
showHours: true
showEndTime: true
showRelativeTime: false
eventTitleColor: var(--primary-text-color)
locationIconColor: rgb(--primary-text-color)
locationTextSize: 90
hideFinishedEvents: true
dimFinishedEvents: true
finishedEventOpacity: 0.6
finishedEventFilter: grayscale(80%)
eventBarColor: var(--primary-color)
eventCalNameColor: var(--primary-text-color)
eventCalNameSize: 90
showProgressBar: false
showFullDayProgress: false
progressBarColor: var(--primary-color)
progressBarBackgroundColor: '#555'
enableModeChange: false
defaultMode: Event
calGridColor: rgba(86, 86, 86, .35)
calDayColor: var(--primary-text-color)
calWeekDayColor: var(--primary-text-color)
calDateColor: var(--primary-text-color)
defaultCalColor: var(--primary-text-color)
calEventBackgroundColor: rgba(86, 100, 86, .35)
calActiveEventBackgroundColor: rgba(86, 128, 86, .35)
calEventTime: false
firstDayOfWeek: 1
refreshInterval: 60
showEventIcon: false
eventDateFormat: dd D
hideDuplicates: false
showMultiDay: true
showMultiDayEventParts: false
showWeekNumber: false
showDescription: false
showEventDate: true
showDatePerEvent: false
showAllDayHours: true
showAllDayEvents: true
offsetHeaderDate: false
titleLength: 0
descLength: 0
plannerDaysToShow: 7
plannerRollingWeek: false
tap_action:
action: more-info
hold_action:
action: none
double_tap_action:
action: none
type: custom:atomic-calendar-revive
entities:
- calendar.familie
cardType: list
calShowDescription: false
compactMode: false
hoursOnSameLine: true
- type: grid
cards:
- type: custom:auto-entities
card:
type: horizontal-stack
card_param: cards
filter:
include:
- entity_id: sensor.biomull_tage
options:
type: custom:mushroom-template-card
primary: Biomüll
secondary: '{{ states(''sensor.biomull'') }}'
icon: mdi:leaf
icon_color: brown
layout: vertical
- entity_id: sensor.altpapier_tage
options:
type: custom:mushroom-template-card
primary: Papier
secondary: '{{ states(''sensor.altpapier'') }}'
icon: mdi:newspaper
icon_color: blue
layout: vertical
- entity_id: sensor.gelber_sack_tage
options:
type: custom:mushroom-template-card
primary: Gelber Sack
secondary: '{{ states(''sensor.gelber_sack'') }}'
icon: mdi:recycle
icon_color: yellow
layout: vertical
- entity_id: sensor.restmull_tage
options:
type: custom:mushroom-template-card
primary: Restmüll
secondary: '{{ states(''sensor.restmull'') }}'
icon: mdi:trash-can
icon_color: grey
layout: vertical
sort:
method: state
numeric: true
- type: custom:mushroom-template-card
entity: sensor.waschmaschine_operation_state
primary: Waschmaschine
secondary: >
{% set progress = states('sensor.waschmaschine_program_progress')
| int(0) %} {% set finish =
states('sensor.waschmaschine_program_finish_time') %} {{ progress
}}% – Fertig um {{ as_timestamp(finish) |
timestamp_custom('%H:%M') }}
icon: mdi:washing-machine
icon_color: blue
tap_action:
action: more-info
visibility:
- condition: state
entity: sensor.waschmaschine_operation_state
state_not: inactive
card_mod:
style: |
ha-state-icon {
{% if is_state('sensor.waschmaschine_operation_state', 'run') %}
animation: washing 2s ease-in-out infinite !important;
{% else %}
animation: none !important;
{% endif %}
}
@keyframes washing {
0% { transform: rotate(0deg); }
25% { transform: rotate(20deg); }
75% { transform: rotate(-20deg); }
100% { transform: rotate(0deg); }
}
- type: custom:mushroom-template-card
entity: sensor.trockner_operation_state
primary: Trockner
secondary: >
{% set progress = states('sensor.trockner_program_progress') |
int(0) %} {% set finish =
states('sensor.trockner_program_finish_time') %} {{ progress }}% –
Fertig um {{ as_timestamp(finish) | timestamp_custom('%H:%M') }}
icon: mdi:tumble-dryer
icon_color: orange
tap_action:
action: more-info
visibility:
- condition: state
entity: sensor.trockner_operation_state
state_not: inactive
card_mod:
style: |
ha-state-icon {
{% if is_state('sensor.trockner_operation_state', 'run') %}
animation: drying 3s linear infinite !important;
{% else %}
animation: none !important;
{% endif %}
}
@keyframes drying {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
- type: custom:mushroom-template-card
entity: sensor.spulmaschine_operation_state
primary: Spülmaschine
secondary: >
{% set progress = states('sensor.spulmaschine_program_progress') |
int(0) %} {% set finish =
states('sensor.spulmaschine_program_finish_time') %} {{ progress
}}% – Fertig um {{ as_timestamp(finish) |
timestamp_custom('%H:%M') }}
icon: mdi:dishwasher
tap_action:
action: more-info
visibility:
- condition: state
entity: sensor.spulmaschine_operation_state
state_not: inactive
- condition: state
entity: sensor.spulmaschine_operation_state
state_not: ready
color: cyan
features_position: bottom
card_mod:
style: |
ha-state-icon {
{% if is_state('sensor.spulmaschine_operation_state', 'run') %}
animation: washing 3s ease-in-out infinite !important;
{% else %}
animation: none !important;
{% endif %}
}
@keyframes washing {
0% { transform: translateX(0px); }
25% { transform: translateX(3px); }
75% { transform: translateX(-3px); }
100% { transform: translateX(0px); }
}
- type: custom:mushroom-template-card
grid_options:
rows: 1
columns: 6
entity: sensor.auto_battery_level
primary: Auto
secondary: >-
{{ states('sensor.auto_battery_level') }}% {% if
is_state('binary_sensor.auto_charge_cable', 'on') %} 🔌 {% endif
%}
icon: mdi:car
icon_color: red
- type: custom:mushroom-template-card
primary: Wallbox
secondary: |
{% if is_state('binary_sensor.wall_charging', 'on') %}
{% if is_state('binary_sensor.wall_sun_mode', 'on') %}
☀️ Solarladen – {{ states('sensor.s10e_pro_compact_wallbox_consumption') | int }} KW
{% else %}
⚡ Laden – {{ states('sensor.s10e_pro_compact_wallbox_consumption') | int }} KW
{% endif %}
{% elif is_state('binary_sensor.wall_plug', 'on') %}
Verbunden – nicht laden
{% else %}
Nicht verbunden
{% endif %}
icon: mdi:ev-station
tap_action:
action: more-info
visibility:
- condition: state
entity: binary_sensor.wall_plug
state: 'on'
color: >
{% if is_state('binary_sensor.wall_charging', 'on') %}
{% if is_state('binary_sensor.wall_sun_mode', 'on') %} yellow
{% else %} green
{% endif %}
{% elif is_state('binary_sensor.wall_plug', 'on') %} blue {% else
%} grey {% endif %}
features_position: bottom
card_mod:
style: |
ha-state-icon {
{% if is_state('binary_sensor.wall_charging', 'on') %}
animation: charging 1.5s ease-in-out infinite !important;
{% else %}
animation: none !important;
{% endif %}
}
@keyframes charging {
0% { transform: translateY(0px); }
50% { transform: translateY(-4px); }
100% { transform: translateY(0px); }
}
- type: tile
entity: switch.wall_sun_mode
name: Sonnenmodus
- type: tile
entity: counter.juit
vertical: false
features_position: bottom
- type: markdown
content: >
{% set pollen = [
('🌳 Erle', 'erle'),
('🌳 Birke', 'birke'),
('🌳 Hasel', 'hasel'),
('🌾 Gräser', 'graeser')
] %} {% set active = namespace(count=0) %} {% for name, typ in
pollen %} {% set sensor = 'sensor.pollenflug_' ~ typ ~ '_XX' %} {%
set val = states(sensor) | float(0) %} {% if val > 0 %} {% set
active.count = active.count + 1 %} {% if val <= 0.5 %}🟢{% elif
val <= 1.5 %}🟡{% elif val <= 2.5 %}🟠{% else %}🔴{% endif %} **{{
name }}** – {{ state_attr(sensor, 'state_today_desc') }}
_Morgen: {{ state_attr(sensor, 'state_tomorrow_desc') }}_
{% endif %} {% endfor %} {% if active.count == 0 %}✅ Keine
Pollenbelastung{% endif %}
max_columns: 2
cards: []
visible:
- user: USER_ID_1
- user: USER_ID_2
@fipiblitz
Copy link
Copy Markdown

Es wäre hilfreich, wenn Du den Code bzw. die verwendeten Entitäten/Sensoren beschreiben oder kommentieren würdest. Dann wäre es klarer, was man auf die eigenen Entitäten mappen soll.

@juwagn
Copy link
Copy Markdown

juwagn commented May 3, 2026

Es wäre hilfreich, wenn Du den Code bzw. die verwendeten Entitäten/Sensoren beschreiben oder kommentieren würdest. Dann wäre es klarer, was man auf die eigenen Entitäten mappen soll.

Dies würde ich befürworten.

@Zeichenfolge
Copy link
Copy Markdown

das, was die anderen sagen.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment