Dokumentation

Benutzerhandbuch und technische Beschreibung des Dashboards „Katastrophenschutz – Wir helfen Berlin“
Benutzerhandbuch

Erste Schritte

Das Dashboard bündelt die wichtigsten Informationen für den Bevölkerungsschutz in Berlin: Wetter, Regenradar, amtliche Warnungen, Einsätze der Berliner Feuerwehr und Wasserstände. Standardort ist Berlin.

Live unter dashboard-projekt-lenny-kevin.vercel.app. Lokal starten: README.md oder Entwicklung & Deployment.

Dashboard mit Seitenleiste links und der Übersicht mit Wetter-Widgets
„Meine Übersicht“ mit der Standard-Auswahl. In der Seitenleiste stehen die Tastaturkürzel 1–5, darunter Gegen Langeweile, Dokumentation, Version und Einstellungen.
1. Seite wählenLinks in der Seitenleiste oder mit den Tasten 1–5 zwischen Übersicht, Wetter, Wasserpegel, Feuerwehr und Organisation wechseln.
2. Übersicht zusammenstellenAuf „Meine Übersicht“ mit „+ Widget“ genau die Kacheln einblenden, die du brauchst.
3. AnordnenMit „✥ Anordnen“ Widgets verschieben und ihre Größe ändern. Mit „✓ Fertig“ beenden.

Alle Einstellungen werden automatisch im Browser gespeichert und sind beim nächsten Öffnen wieder da.

Seitenleiste & Bedienung

Warn-Banner
In der Kopfzeile, zwischen Seitentitel und den Schaltflächen, läuft ein Hinweis von rechts nach links. Links und rechts steht immer „ACHTUNG“ (gelb-schwarz, auch bei Rot-Grün-Schwäche gut lesbar). Den Text stellst du unter Organisation im Widget „Warn-Banner“ ein. Ohne Text bleibt das Banner unsichtbar.
Gegen Langeweile
Zeigt Spielkacheln. Klondike-Solitaire kommt von solitaire-online.com, Tic Tac Toe und Dino Game von Jotform. „← Spiele“ führt zurück zur Auswahl.
Dokumentation
Öffnet diese Anleitung in einem eigenen Fenster.
Version
Zeigt die aktuelle Versionsnummer und öffnet das Changelog mit den Änderungen der Version 2.
Einstellungen
Tastaturkürzel für Übersicht, Wetter, Wasserpegel, Feuerwehr und Organisation. Standard ist 1–5. Eine Taste in der Liste anklicken und die neue Taste drücken; Rücktaste entfernt das Kürzel. In Suchfeldern greifen die Kürzel nicht.
Modus: Hell / Dunkel
Wechselt das Farbschema. Ohne eigene Wahl richtet sich das Dashboard nach der Systemeinstellung.
Sprache
Das Auswahlfeld neben dem Farbmodus stellt Dashboard und Dokumentation auf eine andere Sprache um (derzeit Deutsch und English). Die Seite lädt dabei kurz neu, alle Einstellungen bleiben erhalten. Ohne eigene Wahl gilt die Sprache des Browsers.
Aktualisieren
Lädt Wetter, Radar, Warnungen, Feuerwehr- und Pegeldaten neu. Die Kacheln laden kurz, der Knopf zeigt dann „aktualisiert“ und ist danach wieder der Knopf.
Auto-Aktualisierung
Bei „AN“ werden alle Daten alle 5 Minuten neu geladen. Ein Klick schaltet die Funktion aus oder wieder an.
Standort & Datum
Zeigt den aktuell gewählten Wetterort sowie Datum und Uhrzeit. Darunter steht, wann zuletzt aktualisiert wurde.
Übersicht im hellen Farbmodus
Dieselbe Übersicht im Modus „Hell“.
Dialog Einstellungen mit Tastaturkürzeln 1 bis 5
Einstellungen: Tasten 1–5 für die fünf Hauptseiten. Eine Taste anklicken, dann neu belegen.
Changelog-Fenster der Version 2.0.0
Das Changelog unter Version, mit den Änderungen seit dem 28. September 2026.

Übersicht

„Meine Übersicht“ ist frei zusammenstellbar. Beim ersten Start enthält sie aktuelles Wetter (Ort, Vorhersage und Stundenverlauf), Brandeinsätze pro Tag und die Pegel (Verlauf und Berliner Liste in einem Widget).

  • Widget hinzufügen: „+ Widget“ öffnet den Katalog. Ein Klick auf einen Eintrag fügt das Widget hinzu — auch wenn es schon da ist, für Vergleiche (z. B. zwei Wetterorte oder zwei Pegel). Eine Zahl am Eintrag zeigt, wie oft es auf der Seite liegt.
  • Widget entfernen: Im Anordnen-Modus erscheint oben rechts am Widget ein „ד.
  • Einklappen: Der Pfeil am Widget klappt es auf die Titelzeile zusammen. Die übrigen Widgets nutzen den frei gewordenen Platz.
  • Zurücksetzen: „↺ Zurücksetzen“ stellt nach einer Rückfrage die Standard-Auswahl und -Anordnung wieder her.

Widgets, die Daten einer anderen Seite zeigen (z. B. Temperatur oder Feuerwehr-Kennzahlen), sind Live-Kopien und aktualisieren sich automatisch mit. Zusätzliche Kacheln von „Aktuelles Wetter“ und „Pegelverlauf“ laden eigene Daten, damit du Orte und Pegel nebeneinander vergleichen kannst.

Dialog Widget hinzufügen mit Widgets nach Gruppen
Der Katalog „Widget hinzufügen“. Ein Klick fügt immer eine weitere Kachel hinzu; die Zahl zeigt, wie oft das Widget schon liegt.

Anordnen & Größe ändern

Jede Seite hat oben die Schaltflächen ↺ Zurücksetzen, ✥ Anordnen und + Widget.

  1. „✥ Anordnen“ anklicken. Widgets und Bereiche bekommen einen gestrichelten Rahmen und oben einen Griff ⋮⋮⋮.
  2. Am Griff ziehen und das Widget an der gewünschten Stelle loslassen. Es landet vor oder hinter dem Widget, über dem der Mauszeiger steht.
  3. Auf den Unterseiten lassen sich alle Widgets frei verschieben, auch einzelne Kennzahl-Karten, und zwar in jede Reihe und Spalte. Ziehst du ein Widget in den oberen Griffbereich einer Spalte, landet es neben dieser Spalte.
  4. Wird ein Bereich leer, erscheint dort „Hierher ziehen“ als Ablagefläche.
  5. Die Größe änderst du mit dem Griff unten rechts am Widget. Widgets nutzen eine Standardhöhe und nur so viel Breite wie ihr Inhalt braucht. Freier Platz in einer Zeile erscheint als Platzhalter „Widget hinzufügen“ — ein Klick öffnet den Katalog, im Anordnen-Modus kannst du Widgets dorthin ziehen. Am Griff ziehst du einzelne Kacheln größer oder kleiner.
  6. „✓ Fertig“ beendet den Modus. Alles wird automatisch gespeichert.
Wetterseite im Anordnen-Modus mit Griffen und gestrichelten Bereichen
Anordnen-Modus auf der Wetterseite: Griffe oben an jedem Widget und jedem Bereich, Größengriffe unten rechts.

Die Unterseiten haben ein festes Standard-Layout. „↺ Zurücksetzen“ stellt es nach einer Rückfrage wieder her, auch für Widgets, die in andere Bereiche verschoben wurden.

Rückfrage Layout zurücksetzen mit den Schaltflächen Abbrechen und Zurücksetzen
Die Rückfrage vor dem Zurücksetzen. „Abbrechen“ lässt alles, wie es ist.

Die Seiten

Wetter

Aktuelles Wetter mit Temperatur, Wetterlage, Luftdruck, Luftfeuchtigkeit, Wind (Geschwindigkeit und Richtung als Kompass bzw. Himmelsrichtung), gefühlter Temperatur, UV-Index und Sonnenzeiten. Die Kennzahlen stehen im F-Muster in einer Zeile. Dazu kommen eine 6-Tage-Vorhersage, ein Stundenverlauf und das Regenradar neben dem aktuellen Wetter. Über das Suchfeld lässt sich ein anderer Ort wählen, z. B. „Lissabon“. Ein Klick auf einen Tag zeigt dessen Details.

Wetterseite mit Kennzahlen in einer Zeile, aktuellem Wetter, Radar und Vorhersage
Wetterseite: oben die Kennzahlen in einer Zeile, daneben aktuelles Wetter, Regenradar und Vorhersage.

Das Regenradar sitzt auf derselben Seite: Ort suchen oder eine Schnellwahl (Berlin, Potsdam, München, Hamburg) anklicken. Unter „Niederschlag“ wählst du die Quelle:

  • RainViewer · Verlauf: Radarbilder der letzten Zeit. Mit ▶ abspielen oder mit dem Schieberegler durchblättern. Kostenlos bis Zoomstufe 7, darüber werden die Kacheln vergrößert.
  • OpenWeather · aktuelle Karte: aktuelle Niederschlagskarte. Sie funktioniert nur mit einem API-Key (siehe Entwicklung).
Regenradar mit Karte von Berlin und Brandenburg und Niederschlagsgebieten
Regenradar mit Ortssuche, Schnellwahl, Quellenwahl, Legende und Zeitleiste zum Abspielen.

Wasserpegel

Aktuelle Wasserstände der Bundeswasserstraßen, Standard ist Berlin-Köpenick. Andere Pegel findest du über die Suche (z. B. „Dresden“) oder in der Liste der Berliner Pegel. Der Verlauf zeigt die letzten 7 Tage mit den Richtwerten MNW (mittleres Niedrigwasser), MW (Mittelwasser) und MHW (mittleres Hochwasser).

Wasserpegelseite mit Kennzahlen, Pegelverlauf und Liste der Berliner Pegel
Wasserpegel: Ein Klick auf einen Pegel in der Liste rechts zeigt dessen Verlauf.

Feuerwehr

Brandeinsätze der Berliner Feuerwehr der letzten 7 Tage: Kennzahlen im Vergleich zur Vorwoche, Einsätze pro Tag (der Spitzentag ist orange), Anteil an allen Einsätzen sowie eine Tagesübersicht mit Bränden, Hilfeleistungen und Eintreffzeit. Mit „CSV exportieren“ lädst du die Tabelle als Datei herunter.

Feuerwehrseite mit Kennzahlen, Balkendiagramm, Anteil und Tagestabelle
Feuerwehr-Seite mit Kennzahlen, Diagrammen und Tagesübersicht.

Organisation

Amtliche Warnungen des Bundes (MoWaS, KATWARN, BIWAPP, DWD, Hochwasserzentralen), nach Ort filterbar und nach Schwere sortiert. Dazu gibt es die wichtigsten Notrufnummern, eine To-do-Liste (Vorschläge zur Notfallvorsorge, Einträge sind anpassbar) und das Warn-Banner in der Kopfzeile.

Seite Organisation mit Warnliste, Notrufnummern und To-do-Liste
Organisation: Die Warnungen sind nach Status markiert (Neu, Update, Aufgehoben) und lassen sich nach Ort filtern.

Gegen Langeweile

Optionale Spiele außerhalb der Lageübersicht: Klondike-Solitaire, Tic Tac Toe und Dino Game. Ein Klick auf eine Kachel startet das Spiel, „← Spiele“ führt zur Auswahl zurück.

Seite Gegen Langeweile mit drei Spielkacheln
Spielauswahl: Klondike, Tic Tac Toe und Dino Game.

Widget-Katalog

Diese Widgets lassen sich auf der Übersicht und auf jeder Unterseite über „+ Widget“ einblenden. Derselbe Typ darf mehrfach liegen; Wetter- und Pegelkacheln haben dann jeweils eine eigene Suche.

GruppeWidgetInhalt
WetterAktuelles WetterOrt, Suche, Vorhersage und Stundenverlauf
TemperaturAktuelle Temperatur im Vergleich zu gestern
WindWindgeschwindigkeit und -richtung (Kompass und Himmelsrichtung) im Vergleich zu gestern
LuftfeuchteRelative Luftfeuchtigkeit im Vergleich zu gestern
Regenchance heuteRegenchance für heute im Vergleich zu gestern
Vorhersage · HöchsttemperaturHöchstwerte der nächsten Tage als Balken
RegenwahrscheinlichkeitRegenchance für heute
TemperaturverlaufStündlicher Verlauf mit „jetzt“-Markierung
RegenradarKleine Karte mit dem letzten Radarbild
Kalender & OrganisationKalenderMonatsansicht mit Terminen zum Eintragen
Termine heuteHeutige Einträge aus dem Kalender
NotizenFreier Notizzettel, speichert automatisch
AufgabenTo-do-Liste zum Abhaken
CountdownTage bis zu einem Termin deiner Wahl
WeltzeituhrUhrzeit in mehreren Städten
SicherheitWarnungenAmtliche Warnungen (BBK/NINA), nach Ort filterbar
Warn-BannerLauftext in der Kopfzeile, links und rechts „ACHTUNG“
To-do-ListeAnpassbare Liste, Einträge untereinander, Vorschläge nach BBK
Notrufnummern112, 110 und weitere wichtige Nummern
FeuerwehrBrände vom VortagAnzahl der Brandeinsätze am letzten Meldetag
Brandeinsätze (7 Tage)Summe der letzten 7 Tage im Vergleich zur Vorwoche
Ø pro TagMittlere Zahl der Brandeinsätze pro Tag
SpitzentagTag mit den meisten Brandeinsätzen
Eintreffzeit 1. LöschfahrzeugMittlere Eintreffzeit des ersten Löschfahrzeugs
Brandeinsätze pro TagBalkendiagramm der letzten 7 Tage
Anteil BrandeinsätzeAnteil an allen Einsätzen der Woche
Feuerwehr-TagesübersichtTabelle mit Bränden, Hilfeleistungen und Eintreffzeit
WasserpegelWasserstandAktueller Wasserstand, Standard Berlin-Köpenick
EinordnungEinordnung zum Mittelwasser
Spanne 7 TageTiefster und höchster Wasserstand der letzten 7 Tage
Letzte MessungZeitpunkt der letzten Pegelmessung
Pegelverlauf7-Tage-Verlauf und aktuelle Berliner Wasserstände
Pegel in BerlinAktuelle Wasserstände der Berliner Pegel

Smartphone & Tablet

Das Layout passt sich an die Bildschirmgröße an und nutzt die volle Breite. Unter 760 px Breite:

  • Die Seitenleiste wird zur Kopfzeile. Das Menü öffnest du über die Schaltfläche ☰.
  • Widgets stehen untereinander, und die Seite scrollt.
Übersicht auf dem Smartphone
Übersicht auf dem Smartphone
Geöffnetes Menü auf dem Smartphone
Geöffnetes Menü mit allen Seiten und Einstellungen

Deine Daten

Termine, Notizen, Aufgaben, Checkliste, Countdown, Layout und Farbmodus werden nur im lokalen Speicher deines Browsers (localStorage) abgelegt. Es gibt kein Benutzerkonto und keinen eigenen Server, der diese Daten speichert.

  • Die Daten gelten nur für diesen Browser auf diesem Gerät.
  • Wer die Website-Daten im Browser löscht, setzt das Dashboard komplett zurück.
  • Für Wetter, Radar, Warnungen, Feuerwehr und Pegel ruft der Browser öffentliche Dienste ab (siehe Datenquellen). Dabei werden nur Ortsnamen bzw. Koordinaten übertragen.

Hilfe bei Problemen

Fällt eine Datenquelle aus, zeigt das betroffene Widget eine Meldung mit dem Grund und einem Knopf „Erneut versuchen“. Bereits geladene Daten bleiben dabei sichtbar („Angezeigt wird der letzte Stand“). Nach „Aktualisieren“ steht unten in der Seitenleiste rot, welche Bereiche nicht aktualisiert werden konnten.

„keine Internetverbindung“
Das Gerät ist offline. Sobald die Verbindung zurück ist, lädt das Dashboard automatisch neu.
„zu viele Anfragen“
Der Wetterdienst begrenzt viele Abrufe in kurzer Zeit. Eine Minute warten und erneut versuchen.
„der Dienst antwortet nicht“ / „Dienst gerade gestört“
Der externe Dienst ist langsam oder ausgefallen. Nach 12 Sekunden wird abgebrochen und einmal automatisch wiederholt. Später erneut versuchen.
Keine Warnungen
Die Warnungen laufen über den Server (/api/warnings). Beim direkten Öffnen der index.html oder mit „Live Server“ fehlt diese Schnittstelle. Starte das Projekt stattdessen mit node dev-server.js. „Unvollständig: …“ bedeutet, dass einzelne Warnsysteme gerade nicht erreichbar sind.
OpenWeather-Karte leer
Kein Key gesetzt. Auf Vercel die Variable OPENWEATHER_KEY eintragen, lokal js/config.js oder dieselbe Variable. Das Regenradar funktioniert dann nur mit RainViewer.
„Karte nicht verfügbar“
Die Kartenbibliothek Leaflet konnte nicht geladen werden (z. B. durch einen Werbeblocker oder Netzwerkfilter). Der Rest des Dashboards funktioniert weiter.
„Nicht gespeichert“
Der Browser erlaubt kein Speichern (privater Modus, Speicher voll). Notizen, Layout und Einstellungen gehen dann beim Schließen verloren.
Layout durcheinander
Im Anordnen-Modus auf „↺ Zurücksetzen“ klicken.
Port schon belegt
dev-server.js meldet das und beendet sich. Anderen Port wählen: PORT=3001 node dev-server.js.
Technische Dokumentation

Architektur & Dateien

Das Dashboard ist eine statische Single-Page-Anwendung aus HTML, CSS und Vanilla JavaScript ohne Build-Schritt und ohne Framework. Amtliche Warnungen und OpenWeather-Kacheln brauchen eine kleine Serverfunktion: warnung.bund.de sendet keine CORS-Header, der OpenWeather-Key soll nicht im Browser liegen.

DateiAufgabe
index.htmlStruktur aller Seiten (.page), Seitenleiste, Dialoge für „Widget hinzufügen“, „Zurücksetzen“, Einstellungen und Changelog
css/style.cssAlle Styles: Farbvariablen für Hell/Dunkel, Seitenleiste, Widgets, Container-Queries, Mobile-Ansicht
js/app.jsGesamte Logik: Navigation, Theme, Datenabrufe, Diagramme, Widget-Katalog, Layout-System
js/i18n.jsMehrsprachigkeit: Übersetzungsfunktion t(), Sprachwahl, Sprach-Auswahlfeld
js/lang/<code>.js, js/lang/docs.<code>.jsTexte des Dashboards bzw. der Dokumentation pro Sprache (de, en)
js/config.jsOptionaler OpenWeather-Key für den lokalen Fallback. Steht in .gitignore, Vorlage ist js/config.example.js. Auf Vercel gilt die Variable OPENWEATHER_KEY
api/warnings.jsServerless-Funktion (Vercel): holt MoWaS, KATWARN, BIWAPP, DWD und LHP und liefert sie gebündelt als JSON
api/radar.jsServerless-Funktion: liefert OpenWeather-Niederschlagskacheln, der Key bleibt auf dem Server
dev-server.jsLokaler Node-Server: liefert die Dateien aus und stellt /api/warnings und /api/radar bereit
package.json, playwright.config.js, tests/Playwright-Suite. Start mit npm test, siehe Tests
testresults/Markdown-Protokoll des letzten Testlaufs, eine Datei je Test plus Übersicht
docs.html, css/docs.css, js/docs.js, img/docs/Diese Dokumentation mit Screenshots (WebP, 1440 × 900 bzw. Smartphone 390 px bei doppelter Auflösung)

Ablauf in js/app.js

  1. Uhr, Navigation (NAV_CATEGORIES) und Farbmodus initialisieren.
  2. Daten laden: loadWeatherForPlace, loadRadar, loadDisasterWarnings, loadFireData, loadWaterData.
  3. Widget-Boards aufbauen (OVERVIEW_WIDGETS, mountBoardWidget) und das gespeicherte Layout anwenden (initLayout).
  4. refreshDashboardData lädt alles neu, manuell oder alle 5 Minuten (AUTO_REFRESH_INTERVAL_MS), und löst danach das Event dashboard-refresh aus.

Entwicklung & Deployment

Voraussetzungen

Zum Starten: Node.js 18 oder neuer (LTS von nodejs.org, enthält npm) und Git zum Klonen. Prüfung: node -v, npm -v. Details und Installationsbefehle stehen in der README.md.

Lokal starten

git clone https://github.com/Kevin-Stein/Dashboard_Projekt_Lenny_Kevin.git
cd Dashboard_Projekt_Lenny_Kevin
node dev-server.js
# → http://localhost:3000  (anderer Port: PORT=3123 node dev-server.js)

Ein npm install ist zum Starten nicht nötig. Die Playwright-Tests brauchen zusätzlich die Pakete aus package.json (Chromium kommt mit npm install).

OpenWeather-Key (optional)

Auf Vercel unter Settings → Environment Variables OPENWEATHER_KEY eintragen (Production und Preview). Die Kacheln laufen über /api/radar, der Key erscheint nicht im Browser.

Lokal derselbe Key als Umgebungsvariable oder in js/config.js (Vorlage: js/config.example.js). js/config.js darf nicht committet werden. Beim direkten Öffnen der index.html ohne dev-server.js bleibt nur dieser Fallback, dann ist der Key in den Netzwerkanfragen sichtbar.

cp js/config.example.js js/config.js
# eigenen Key eintragen
# oder: OPENWEATHER_KEY=… node dev-server.js

Deployment auf Vercel

Die öffentliche Instanz: https://dashboard-projekt-lenny-kevin.vercel.app/

  • Die statischen Dateien werden direkt ausgeliefert, api/warnings.js und api/radar.js laufen als Serverless-Funktionen unter /api/warnings bzw. /api/radar.
  • Die Antwort wird mit Cache-Control: s-maxage=60, stale-while-revalidate=300 gecacht.
  • .vercelignore schließt lokale Ordner wie .cursor/ und .claude/ vom Upload aus, falls sie vorhanden sind.

Die automatisierten Tests stehen im Abschnitt Tests.

Tests

Die Oberfläche wird mit Playwright im echten Chromium geprüft. Die Suite startet selbst dev-server.js auf Port 3125 (127.0.0.1), damit ein lokal laufendes Dashboard und dessen localStorage unberührt bleiben. Wetter, Radar, Warnungen, Pegel und Feuerwehr werden im Test nachgebaut, es gehen also keine echten API-Aufrufe raus.

Starten

npm install          # einmalig: Pakete und Chromium
npm test             # alle Tests, unsichtbar
npm run test:headed  # dieselben Tests, Browser sichtbar

npm install lädt Chromium über das Skript postinstall. Einzelne Dateien: npx playwright test tests/injection.spec.js.

Nach jedem Lauf schreibt tests/markdown-reporter.js die Ergebnisse nach testresults/: README.md als Übersicht und eine Markdown-Datei je Test mit Zweck, Ablauf, Erwartung und Status.

Dateien

DateiAufgabe
playwright.config.jsPort 3125, Locale de-DE, Reporter (Liste + Markdown)
tests/helpers.jsSprache setzen, Seiten öffnen, Widgets hinzufügen, API-Stubs
tests/dashboard.spec.jsNavigation, Sprachen, Theme, Widget-Katalog, Doku, Smartphone-Menü
tests/inputs.spec.jsFormulare, Suche, Speichern
tests/injection.spec.jsXSS- und HTML-Payloads in allen Eingabefeldern
tests/stress.spec.jsViele Klicks, lange Texte, viele Widgets
tests/markdown-reporter.jsSchreibt testresults/*.md

Was die Suite prüft

Dashboard und Dokumentation

  • Sprachmenü steht neben dem Farbmodus, Einträge Deutsch und English.
  • Start auf Deutsch, Wechsel auf Englisch inkl. Reload: Titel, Navigation, Übersicht.
  • Alle fünf Seiten (Übersicht, Wetter inkl. Regenradar, Wasserpegel, Feuerwehr, Organisation) und Tastaturkürzel 1–5.
  • Widget-Katalog auf Deutsch und Englisch öffnen und schließen.
  • Gegen Langeweile: Spielkacheln, Klondike, Tic Tac Toe und Dino Game.
  • Dasselbe Widget mehrfach hinzufügen (Wetter und Pegel mit eigener Suche).
  • Farbmodus Hell → Dunkel.
  • Smartphone (390×844): Navigation verborgen, Menü öffnet die Seitenleiste.
  • Dokumentation: deutsche Texte, Sprachwechsel, Abschnitt Mehrsprachigkeit, Knopf „Zum Dashboard“.

Eingabefelder

  • Leeres Absenden bei Wetter, Radar und Pegel ändert nichts.
  • Ortssuche: Treffer (Hamburg), unbekannter Name, Radar-Schnellwahl Potsdam.
  • Notrufnummern und To-do-Liste auf der Organisations-Seite.
  • Warnungsfilter (Dresden / kein Treffer) und Checkliste abhaken.
  • Pegelsuche: Dresden anzeigen, unbekannter Name als Toast.
  • Aufgaben anlegen, abhaken, löschen; Notizen speichern; Kalendertermin; Countdown.
  • Radar-Quelle OpenWeather und Auto-Aktualisierung aus.

Code-Injection

Payloads wie <script>alert(1)</script>, <img src=x onerror=alert(1)>, SVG-onload, Textarea-Breakout, javascript:-URLs und Template-Injection in Aufgaben, Notizen, Kalender, Countdown, Wetter-/Radar-/Pegelsuche und Warnungsfilter. Erwartung: kein Dialog, Payload nur als Text, keine eingeschleusten img/script-Knoten. Ortsnamen im Radar-Popup werden per textContent gesetzt, nicht als HTML.

Belastung

  • Alle Seiten achtmal hintereinander umschalten.
  • Theme, Widget-Katalog und Anordnen sehr oft klicken.
  • Leere Formulare und 4000-Zeichen-Text mit HTML und Umlauten.
  • 40 Aufgaben, mehrere Widgets hinzufügen und wieder entfernen.
  • Aktualisieren, Auto-Aktualisierung und Sprachwechsel mehrfach.

Datenquellen & APIs

BereichEndpunktHinweise
Wetterapi.open-meteo.com/v1/forecastforecast_days=6&past_days=1. Der Vortag wird abgetrennt (splitOffYesterday) und für den Vergleich „gegenüber gestern“ genutzt
Ortssuchegeocoding-api.open-meteo.com/v1/searchErster Treffer, Sprache Deutsch
Radarapi.rainviewer.com/public/weather-maps.jsonListe der Radarbilder, Kacheln als Leaflet-Layer, Animation alle 850 ms
Niederschlag/api/radar → tile.openweathermap.org/map/precipitation_newKey über Vercel OPENWEATHER_KEY oder lokal js/config.js. Ohne Server fällt der Browser auf den Key in js/config.js zurück
Karteserver.arcgisonline.com/…/World_Light_Gray_BaseHintergrundkacheln von Esri
Warnungen/api/warnings → warnung.bund.de/api31/<quelle>/mapData.jsonQuellen: mowas, katwarn, biwapp, dwd, lhp. Timeout 8 s pro Quelle; ausgefallene Quellen stehen im Header X-Warnings-Failed, erst wenn alle ausfallen gibt es HTTP 502
Feuerwehrraw.githubusercontent.com/Berliner-Feuerwehr/BF-Open-Data/…/BFw_mission_data_daily.csvTägliche CSV, ausgewertet werden die letzten 7 Tage und die Vorwoche
Wasserpegelwww.pegelonline.wsv.de/webservices/rest-api/v2Stationen, aktueller Wert, 7-Tage-Messreihe, Kennwerte MNW/MW/MHW

Fehlerbehandlung

Datenabrufe: fetchData(url, optionen)

Alle Abrufe in js/app.js laufen über diese Funktion. Sie bricht nach FETCH_TIMEOUT_MS (12 s) per AbortController ab und wiederholt bei Timeout, Netzfehler, HTTP 429 und 5xx einmal (mit Retry-After bzw. kurzer Wartezeit). Fehler werden als FetchError mit kind geworfen:

kindBedeutungText von describeError
offlinenavigator.onLine ist falsekeine Internetverbindung
timeoutAbbruch nach Timeoutder Dienst antwortet nicht
networkDNS, CORS, blockiertDienst nicht erreichbar
httpStatus ≠ 2xx, in statusje nach Status (429, 401/403, 404, 5xx)
datakein gültiges JSON oder Pflichtfelder fehlen (dataError())Antwort unvollständig oder fehlerhaft

Muster für einen Loader

async function loadX() {
  try {
    const data = await fetchData(URL, { source: "X" });
    if (!data.items) throw dataError("X", "keine Einträge");
    render(data);
    return true;
  } catch (err) {
    reportError("X", err);                  // console.warn mit Quelle
    renderRetry(el, `X nicht verfügbar – ${describeError(err)}.`, loadX);
    return false;                            // alte Daten bleiben stehen
  }
}
  • refreshDashboardData nutzt Promise.allSettled und wertet die Rückgabe true/false aus. Fehlgeschlagene Quellen erscheinen in #refreshErrors und bei manuellem Klick als roter Toast (showToast(text, "error")). Parallele Aufrufe werden zusammengefasst.
  • Die Events offline/online zeigen einen Hinweis bzw. starten eine Aktualisierung.
  • storageSet(key, value) ersetzt localStorage.setItem und meldet einmalig, wenn Speichern nicht möglich ist.
  • Wirft ein Widget beim Start eine Exception, zeigt nur dieses Widget eine Fehlermeldung (mountBoardWidget).
  • Ohne Leaflet (LEAFLET_AVAILABLE) ersetzt ein Platzhalter L, damit das restliche Skript weiterläuft.
  • Globale Handler für error und unhandledrejection protokollieren unerwartete Fehler und zeigen höchstens alle 15 s einen Hinweis.
  • Serverseitig: api/warnings.js antwortet mit 405 bei falscher Methode und 502 als JSON, dev-server.js mit 400/403/404/500 statt abzustürzen.

Layout-System

Container und Elemente

Jede Seite hat eine gemeinsame Widget-Fläche: das Raster .overview-grid. Darin liegen die Standard-Kacheln der Seite und alle hinzugefügten Widgets. Verschieben und Skalieren im Modus Anordnen gilt nur innerhalb dieses Rasters.

  • Reihenfolge: saveLayoutOrder und applySavedLayoutOrder speichern und laden die Reihenfolge der Kacheln im Raster.
  • Freies Verschieben: startRoamDrag ermittelt mit document.elementsFromPoint das Ziel im Raster. Ob das Element davor oder dahinter landet, hängt davon ab, ob der Zeiger vor oder hinter der Mitte des Ziels liegt.
  • Größe: Standard ist Breite nach Inhalt. Im Anordnen-Modus speichert der Griff unten rechts Pixelmaße (data-layout-h, data-layout-w, Mindestgröße 260 × 170 px).
  • Zurücksetzen: Das Raster merkt sich die Standardreihenfolge (_defaultOrder). resetPageLayout stellt sie wieder her, löscht gespeicherte Größen und setzt auf der Übersicht die Standard-Widgets (aktuelles Wetter, Feuerwehr-Diagramm, Pegel) wieder ein statt die Fläche zu leeren.

Skalierung mit Container-Queries

Widget-Inhalte skalieren über CSS-Container-Queries statt über die Fenstergröße: .ov-body (ovbody), Kennzahl-Karten (statcard) und Diagramme (chartcard). Schriftgrößen nutzen cqh/cqw mit clamp(). Bei sehr kleinen Widgets werden Nebenelemente wie Icons, Beschriftungen oder Datumszeilen ausgeblendet.

Live-Kopien (Mirror-Widgets)

Widgets mit source klonen das komplette Panel einer anderen Seite (gleiche Überschrift und gleicher Inhalt). mirror klont nur Fragmente (z. B. Kennzahl-Reihen). IDs erhalten ein Suffix, damit sie eindeutig bleiben.

Speicherschlüssel (localStorage)

SchlüsselInhalt
dashboard-themelight oder dark. Fehlt der Wert, gilt die Systemeinstellung
dashboard-langSprachcode, z. B. de oder en. Fehlt der Wert, gilt die Browsersprache
dashboard-auto-refreshAuto-Aktualisierung an/aus
dashboard-overview-widgetsWidget-Typen der Übersicht
dashboard-page-widgets-<seite>Zusätzliche Widgets einer Unterseite
dashboard-layout-<container>Reihenfolge der Elemente in einem Container
dashboard-layout-sizesGrößen (height, width, frac, ggf. älteres grow) pro Element
dashboard-widget-placesIn andere Container verschobene Elemente: { elementId: "seite:container" }
dashboard-collapsedIDs eingeklappter Widgets
dashboard-cal-eventsKalendertermine
dashboard-banner-textLauftext des Warn-Banners
dashboard-shortcutsTastaturkürzel der fünf Hauptseiten (Standard 1–5)
dashboard-widget-notes, -todo, -countdown, -checklistInhalte der jeweiligen Widgets
dashboard-water-stationGewählter Pegel (UUID). Standard ist Berlin-Köpenick

Erweitern

Neues Widget

Einen Eintrag in OVERVIEW_WIDGETS (js/app.js) ergänzen und Titel und Beschreibung in jeder Sprachdatei eintragen. Das Widget erscheint dann automatisch im Katalog jeder Seite.

// js/lang/de.js (und entsprechend en.js)
"widget.mein-widget.title": "Mein Widget",
"widget.mein-widget.desc": "Kurze Beschreibung für den Katalog",

// js/app.js
"mein-widget": {
  group: "calendar",                  // Gruppe im Katalog (Schlüssel groups.calendar)
  icon: OVERVIEW_ICONS.notes,
  mount: mountMeinWidget,             // oder: mirror: ["#quellElement"]
  wide: true,                         // optional: startet breiter
},

function mountMeinWidget(body) {
  body.innerHTML = `<div class="mein-inhalt">${t("widget.mein-widget.empty")}</div>`;
  const timer = setInterval(update, 60000);
  return () => clearInterval(timer);   // optional: Aufräumen beim Entfernen
}

Größen im Widget möglichst mit Container-Einheiten (cqh, cqw) innerhalb von .ov-body angeben, damit das Widget beim Ändern der Größe mitskaliert.

Neue Seite

  1. In index.html ein <div id="meinePage" class="page"> mit der .overview-bar (Titel und die drei Schaltflächen) anlegen.
  2. Direkt unter der Leiste das Widget-Raster <div class="overview-grid" id="meinePageWidgets"> anlegen und die Standard-Kacheln darin einfügen. Die ID muss <Seiten-ID>Widgets lauten, damit „+ Widget“ funktioniert.
  3. In NAV_CATEGORIES einen Eintrag mit target: "meinePage" und einem SVG-Icon ergänzen. Den Seitennamen als nav.<id> in jede Sprachdatei eintragen, sichtbare Texte der Seite mit data-i18n auszeichnen.

Mehrsprachigkeit

Alle sichtbaren Texte kommen aus Sprachdateien. js/i18n.js wählt die Sprache in dieser Reihenfolge: gespeicherte Wahl (dashboard-lang), Browsersprache, Deutsch. Fehlt ein Text in einer Sprache, wird der deutsche verwendet.

  • In JavaScript: t("weather.loadingFor", { place: "Berlin" }). Platzhalter stehen in geschweiften Klammern im Text.
  • In HTML: data-i18n="schlüssel" setzt den Text, data-i18n-html erlaubt Auszeichnungen, data-i18n-attr="placeholder=schlüssel;aria-label=schlüssel2" übersetzt Attribute.
  • Datum und Zahlen nutzen I18N.locale() (z. B. de-DE, en-GB) mit toLocaleString bzw. Intl.
  • Beim Sprachwechsel lädt die Seite neu. Ein zweites offenes Fenster (Dashboard oder Dokumentation) übernimmt die Sprache automatisch.

Neue Sprache hinzufügen

  1. js/lang/en.js nach z. B. js/lang/fr.js kopieren, Code, Name und Locale anpassen und alle Texte übersetzen:
    I18N.register("fr", {
      name: "Français",
      locale: "fr-FR",
      strings: {
        "nav.overview": "Aperçu",
        …
      },
    });
  2. In index.html und docs.html unter den anderen Sprachdateien <script src="js/lang/fr.js"></script> einfügen.
  3. Optional die Dokumentation übersetzen: js/lang/docs.en.js nach docs.fr.js kopieren, übersetzen und ebenfalls in docs.html einbinden. Ohne diese Datei erscheint die Dokumentation auf Deutsch.

Die neue Sprache erscheint danach automatisch im Auswahlfeld.

Lizenzen & Quellen

QuelleLizenz / Bedingungen
Open-MeteoCC BY 4.0, kostenlos für nicht-kommerzielle Nutzung (Bedingungen). Ortsdaten von GeoNames (CC BY 4.0)
RainViewerKostenlose öffentliche API mit Namensnennung (Nutzungsbedingungen)
OpenWeatherODbL 1.0, Namensnennung „Weather data provided by OpenWeather“ (Bedingungen)
Esri World Light Gray BaseEsri-Nutzungsbedingungen. Namensnennung: Esri, HERE, Garmin, FAO, NOAA, USGS
Berliner Feuerwehr – BF-Open-DataCC BY 4.0, © Berliner Feuerwehr
PEGELONLINE (WSV / ITZBund)Datenlizenz Deutschland – Zero – 2.0
warnung.bund.de (BBK, NINA)Keine ausdrückliche Lizenz. Quelle: BBK und die jeweils herausgebende Stelle
Leaflet 1.9.4BSD 2-Clause
Outfit, Source Sans 3SIL Open Font License 1.1
Klondike (solitaire-online.com), Tic Tac Toe und Dino Game (Jotform)Eingebettete Spiele unter „Gegen Langeweile“, Nutzungsbedingungen der jeweiligen Anbieter