Stundenplan im Home Assistant: Aktuelles und nächstes Fach automatisch anzeigen
Erfahre, wie du einen digitalen Stundenplan in Home Assistant integrierst. Zeige das aktuelle und nächste Fach automatisch im Dashboard an, inklusive praktischer Vorlage.
Ein digitaler Stundenplan im Home Assistant kann den Alltag deutlich erleichtern, besonders, wenn es darum geht, immer den Überblick über aktuelle und kommende Unterrichtsstunden zu behalten. Mit einer passenden Integration lässt sich der Stundenplan automatisiert im Dashboard anzeigen, inklusive der jeweiligen Fächer und Zeiten. Das sorgt für mehr Organisation und weniger vergessene Materialien.
Warum ein Stundenplan im Home Assistant sinnvoll ist
Wer Home Assistant nutzt, will meistens den Alltag strukturieren und wiederkehrende Abläufe automatisieren. Ein digitaler Stundenplan hilft dabei, stets zu wissen, welches Fach gerade stattfindet und welches als nächstes ansteht. Das ist besonders für Familien mit schulpflichtigen Kindern oder für Studierende praktisch, die ihre Stundenpläne flexibel verwalten möchten.
Die Integration eines Stundenplans ins Home Assistant Dashboard bietet nicht nur Übersicht, sondern auch die Möglichkeit, Erinnerungen und Automatisierungen zu verknüpfen. So kann beispielsweise eine Benachrichtigung ausgelöst werden, wenn ein bestimmtes Fach beginnt, oder das Licht im Arbeitszimmer passend zur Unterrichtszeit gesteuert werden.
Technische Umsetzung mit Home Assistant und Vorlagen
Die Umsetzung eines Stundenplans in Home Assistant erfordert einige vorbereitende Schritte. Zunächst wird eine YAML-Datei erstellt, in der die einzelnen Wochentage, Fächer und Uhrzeiten strukturiert hinterlegt sind. Mithilfe von Template-Sensoren kann dann ermittelt werden, welches Fach aktuell läuft und welches als nächstes folgt. Für die Anzeige im Dashboard werden benutzerdefinierte Karten genutzt, die die Informationen übersichtlich darstellen.
In vielen Haushalten ist der Schulalltag durch wiederkehrende Zeiten und Fächer geprägt. Dieser Snippet zeigt dir, wie du einen dynamischen Stundenplan direkt in Home Assistant abbilden kannst. Anstatt lediglich ein statisches Widget zu nutzen, erzeugt diese Konfiguration mehrere Home-Assistant-Sensoren, die dir zuverlässig anzeigen, welches Fach gerade läuft, was als Nächstes kommt und eine komplette Übersicht der Woche bereitstellen. So kannst du dein Smart Home nicht nur informieren, sondern auch Automationen daran ausrichten, etwa Benachrichtigungen vor dem Unterricht oder angepasste Szenen zu Schulbeginn.
Was macht dieser Stundenplan in Home Assistant?
Diese Konfiguration liest eine lokal gespeicherte JSON-Datei mit deinem Wochenstundenplan aus und erstellt mehrere Home-Assistant-Sensoren:
sensor.school_current_subject– aktuelles Fachsensor.school_next_subject– nächstes Fachsensor.school_schedule_table– vollständige Stundenplan-Tabellebinary_sensor.school_in_session– zeigt an, ob gerade Unterricht ist
Du kannst diese Werte z.B. in Lovelace-Karten anzeigen oder für Automationen verwenden, etwa um Benachrichtigungen vor Unterrichtsbeginn zu senden oder dein Smart-Home-Setup an Unterrichtszeiten anzupassen.
Voraussetzungen
Damit die Lösung funktioniert, brauchst du:
- Einen funktionierenden Home-Assistant-Server
- Die Möglichkeit, eine Datei unter
/config/data/abzulegen - Den Stundenplan als JSON-Datei im definierten Format
Stundenplan als JSON speichern
Lege die Datei /config/data/school_timetable.json an und fülle sie mit deinem Stundenplan im folgenden Format:
1{
2 "monday": [
3 { "subject": "Mathematik", "start": "08:00", "end": "08:45" },
4 { "subject": "Deutsch", "start": "08:50", "end": "09:35" }
5 ],
6 "tuesday": [
7 { "subject": "Englisch", "start": "08:00", "end": "08:45" }
8 ],
9 "wednesday": [],
10 "thursday": [],
11 "friday": [],
12 "saturday": [],
13 "sunday": []
14}Jeder Eintrag braucht genau drei Felder: subject, start und end. Die Uhrzeiten schreibst du zweistellig im Format HH:MM, sonst stimmt der Vergleich in den Templates nicht. JSON kennt keine Kommentare, lass sie also weg.
Du kannst alle Wochentage definieren, auch wenn manche leer bleiben. Der Plan bildet die Grundlage für die Sensoren, die nach aktuellen Uhrzeiten filtern und den Ablauf interpretieren.
Konfiguration in Home Assistant
Ergänze in deiner configuration.yaml oder einem Package-File folgende Sensordefinition:
1command_line:
2 - sensor:
3 name: School Timetable JSON
4 command: "bash -c 'cat /config/data/school_timetable.json'"
5 scan_interval: 3600
6 json_attributes:
7 - monday
8 - tuesday
9 - wednesday
10 - thursday
11 - friday
12 - saturday
13 - sunday
14template:
15 - trigger:
16 - platform: time_pattern
17 minutes: "/1"
18 - platform: state
19 entity_id: sensor.school_timetable_json
20 sensor:
21 - name: "School Current Subject"
22 unique_id: school_current_subject
23 state: >
24 {% set days = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday'] %}
25 {% set wd = days[now().weekday()] %}
26 {% set day = state_attr('sensor.school_timetable_json', wd) or [] %}
27 {% set current = day
28 | selectattr('start', 'le', now().strftime('%H:%M'))
29 | selectattr('end', 'gt', now().strftime('%H:%M'))
30 | list %}
31 {{ current[0].subject if current | count > 0 else 'Kein Unterricht' }}
32 attributes:
33 current_start: >
34 {% set days = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday'] %}
35 {% set day = state_attr('sensor.school_timetable_json', days[now().weekday()]) or [] %}
36 {% set current = day
37 | selectattr('start', 'le', now().strftime('%H:%M'))
38 | selectattr('end', 'gt', now().strftime('%H:%M'))
39 | list %}
40 {{ current[0].start if current | count > 0 else '' }}
41 current_end: >
42 {% set days = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday'] %}
43 {% set day = state_attr('sensor.school_timetable_json', days[now().weekday()]) or [] %}
44 {% set current = day
45 | selectattr('start', 'le', now().strftime('%H:%M'))
46 | selectattr('end', 'gt', now().strftime('%H:%M'))
47 | list %}
48 {{ current[0].end if current | count > 0 else '' }}
49 binary_sensor:
50 - name: "School In Session"
51 unique_id: school_in_session
52 state: >
53 {% set days = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday'] %}
54 {% set day = state_attr('sensor.school_timetable_json', days[now().weekday()]) or [] %}
55 {{ day
56 | selectattr('start', 'le', now().strftime('%H:%M'))
57 | selectattr('end', 'gt', now().strftime('%H:%M'))
58 | list | count > 0 }}Diese Definition verwendet den JSON-Stundenplan und ermittelt abhängig von der aktuellen Uhrzeit das passende Fach. Die scan_interval sorgt dafür, dass die JSON-Daten regelmäßig neu eingelesen werden. Der Trigger sorgt dafür, dass die Zwischensensoren jede Minute aktualisiert werden.
Nächste Stunde und Stundenplan-Tabelle
Die beiden restlichen Sensoren nutzen dieselbe Template-Logik. Sie kommen in denselben sensor:-Block wie oben, direkt hinter „School Current Subject":
1 - name: "School Next Subject"
2 unique_id: school_next_subject
3 state: >
4 {% set days = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday'] %}
5 {% set day = state_attr('sensor.school_timetable_json', days[now().weekday()]) or [] %}
6 {% set upcoming = day
7 | selectattr('start', 'gt', now().strftime('%H:%M'))
8 | sort(attribute='start')
9 | list %}
10 {{ upcoming[0].subject if upcoming | count > 0 else 'Kein weiterer Unterricht' }}
11
12 - name: "School Schedule Table"
13 unique_id: school_schedule_table
14 state: >
15 {% set days = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday'] %}
16 {% set ns = namespace(total=0) %}
17 {% for d in days %}
18 {% set ns.total = ns.total + (state_attr('sensor.school_timetable_json', d) or []) | count %}
19 {% endfor %}
20 {{ ns.total }}
21 unit_of_measurement: "Stunden"
22 attributes:
23 table: >-
24 {%- set labels = {'monday': 'Montag', 'tuesday': 'Dienstag', 'wednesday': 'Mittwoch', 'thursday': 'Donnerstag', 'friday': 'Freitag'} -%}
25 {%- set ns = namespace(rows=['| Tag | Zeit | Fach |', '|---|---|---|']) -%}
26 {%- for d, label in labels.items() -%}
27 {%- for lesson in (state_attr('sensor.school_timetable_json', d) or []) | sort(attribute='start') -%}
28 {%- set ns.rows = ns.rows + ['| ' ~ label ~ ' | ' ~ lesson.start ~ '-' ~ lesson.end ~ ' | ' ~ lesson.subject ~ ' |'] -%}
29 {%- endfor -%}
30 {%- endfor -%}
31 {{ ns.rows | join('\n') }}Den Zustand einer Entität begrenzt Home Assistant auf 255 Zeichen. Die Tabelle steckt deshalb im Attribut table und nicht im State. In einer Markdown-Card holst du sie dir mit {{ state_attr('sensor.school_schedule_table', 'table') }}.
Mit dem folgenden Snippet lasse ich mir das aktuelle Fach dann auf meinem Dashboard anzeigen. Wenn aktuell kein Unterricht stattfindet, ist diese Card automatisch ausgeblendet.
1type: conditional
2conditions:
3 - entity: binary_sensor.school_in_session
4 state: "on"
5card:
6 type: custom:mushroom-template-card
7 primary: "{{ states('sensor.school_current_subject') }}"
8 secondary: >
9 {{ state_attr('sensor.school_current_subject', 'current_start') }} – {{
10 state_attr('sensor.school_current_subject', 'current_end') }}
11 icon: mdi:school
12 icon_color: indigo
13 layout: vertical
14 tap_action:
15 action: more-infoPraxistipp
Für eine noch bessere Integration kannst du den Stundenplan automatisch aus einer externen Quelle generieren lassen, etwa einem Kalender. Alternativ lassen sich noch weitere Automationen bauen, die auf binary_sensor.school_in_session reagieren, wie etwa Erinnerungen oder das Einschalten von Lichtern am Morgen.
Fazit
Mit einem einfachen JSON-Datei-Ansatz und ein paar Template-Sensoren kannst du in Home Assistant einen voll funktionsfähigen Schulstundenplan abbilden. Neben aktueller und nächster Stunde hast du eine strukturierte Wochenübersicht und viele Möglichkeiten zur Einbindung in Automationen und Dashboards. Diese Lösung schafft Überblick und hilft, deine smarte Umgebung an den Alltag anzupassen.
Das Video zeigt, wie der Umgang mit „Dein Stundenplan in Home Assistant – Mit aktuellem & nächstem Fach automatisch im Dashboard“ konkret aussieht.
