# Journal 2026-11-02

## TV-Wand

Die TV-Ansicht unter `/live-dashboard/tv` hängt nicht mehr an Grafana. Pro Container kommt das 3D-Design aus `ContainerSceneCatalog` (Standard `schwimmcontainer`, Dateien unter `public/container-ansicht/`). Ein neues Design ist ein weiterer Eintrag dort plus Modelldateien. Am Container überschreibt das Zusatzfeld `sceneDesign` den Schlüssel und `influxPrefix` den Messreihen-Präfix (sonst Bayrol, Narwali 2, Mobi wie bisher).

Auf der TV-Wand laufen vorerst nur Container, deren Name mit „Mobi“ beginnt. Narwali und Narwali 2 bleiben ausgeblendet. Ein späteres Mobi 2 erscheint damit ohne weiteren Einbau. Die übrigen Seiten zeigen alle Anlagen weiter.

Dieselben Werte stehen als Schild am 3D-Modell und zeichnen ihre Linie in derselben Zeit mit. Die Schilder bleiben am Container, während er sich dreht. Ein fehlender Verlauf ist dort rot. Danach läuft ein heller Punkt über die Linie am Modell und in den Diagrammen, etwa alle 2,6 Sekunden. Bei reduzierter Bewegung bleibt das aus.

Die Verlaufslinien zeichnen sich in etwa 1,4 Sekunden. Schlägt eine Messreihe, das Modell oder das Laden der Tafel fehl, steht das rot auf der Fläche; eine spätere Aktualisierung, die scheitert, legt einen Balken über die laufende Ansicht.

Die Tafel dreht das Modell und wechselt nach der gespeicherten Dauer zur nächsten Anlage, danach zu den offenen To-dos und den nächsten Terminen. Die Diagramme sind Viertelstunden-Mittel der letzten 24 Stunden. Bekannte Rollen (Temperatur, Außen, Chlor, Redox, pH, eine Leistung) und bis zu sechs Reihen insgesamt.

Regen und Wind nur in dieser Bühne. Die Streifen hängen am Modell: ab etwa 2 m/s Windlinien, Regen bei Niederschlag. Scheint die Sonne (klar, überwiegend klar oder teils bewölkt, und trocken), steht eine weiche Lichtscheibe oben links über der Bühne, das Modell wird wärmer beleuchtet und der Himmel hellt sich auf. Nach Sonnenuntergang (`is_day`) bleibt die Scheibe aus, die Bühne wird dunkler. Bei Regen oder bedecktem Himmel ebenso.

Die Messkarten und die Schilder am Modell zeigen den Sollzustand (im Soll, Warnung, Alarm) samt Bereich. Oben in der Leiste steht der Stand der letzten Aktualisierung. Eine Leistungsreihe bekommt die Einheit W oder kWh, sobald eine passende Messung da ist. wttr.in ist von hier aus nicht erreichbar, deshalb kommen die Werte bei vorhandenen Koordinaten von Open-Meteo. Die Container-Seite bleibt unverändert.

Dieselben Balken stehen in der Container-Übersicht unter dem Verbindungsstatus und in der Detailansicht neben Online.

Neben dem Online-Status stehen vier Balken für den LTE-Empfang. Der RUT955 von Mobi schickt sie über Data to Server, Sammlung `lte`, alle 60 Sekunden als JSON auf das Thema `rtrmobi/lte` (eigener MQTT-Client `rtrmobi_lte`, derselbe Broker wie die bestehende Sammlung `dp`). Die Sammlung `dp` mit `rtrmobi/gpsdata` bleibt unverändert. SwimMonitor liest daraus RSRP, ersatzweise RSSI. Ein negativer Wert gilt als dBm (RSRP ab −80 dBm vier Balken, RSSI ab −65 dBm). Fehlt der Wert, bleiben die Balken leer.

Dateien: `src/Service/ContainerSceneCatalog.php`, `src/Service/ContainerTrendService.php`, `src/Service/WeatherService.php`, `src/Service/LteSignal.php`, `src/Service/ContainerApiService.php`, `src/Controller/LiveDashboardController.php`, `src/Controller/ApiController.php`, `src/Controller/ContainerController.php`, `config/routes.yaml`, `templates/live_dashboard/tv.html.twig`, `templates/api/show.html.twig`, `templates/container/show.html.twig`, `templates/swimmonitor/_macros.html.twig`, `public/css/live-dashboard/tv.css`, `public/css/swimmonitor.css`, `public/js/live-dashboard/tv.js`, `public/js/live-dashboard/tv-stage.js`, `config/swimmonitor/changelog.yaml`.

## Fehlerfinder: Container-Datenexport

## Fehlerfinder: Container-Datenexport

Prüfung auf die im Auftrag genannten Dateien eingegrenzt; die beiden ausdrücklich ausgenommenen offenen Befunde nicht untersucht. Kein Git, keine Geräte- oder Produktionszugriffe.

Drei konkrete Fehler im Export behoben:

- Bei mehr als 1000 Rohpunkten eines Parameters endete der Export durch `LIMIT 1000` vor dem gewählten Zeitraumende, ohne Hinweis. Die Abfrage liest jetzt höchstens 1001 Punkte und bricht bei Überschreitung ausdrücklich ab; Nutzer müssen den Zeitraum verkürzen. Kein unbegrenztes Laden großer Messreihen.
- Bei einer Zeile mit Redoxwert, aber fehlendem Chlorwert wurde Chlor nachträglich als letzte Spalte ergänzt; die CSV schrieb die Array-Reihenfolge und stellte dadurch Redox unter die Chlorüberschrift. Die Ausgabe verwendet jetzt für jede Zeile die Spaltenreihenfolge des Headers.
- Schlug die Messabfrage fehl, versuchte der Export eine auf 100 Punkte begrenzte Ersatzabfrage und übersprang bei erneutem Fehler den Parameter. Dadurch konnte ein leerer oder unvollständiger Export erfolgreich erscheinen. Abfrageausnahmen werden jetzt an die vorhandene Fehlerbehandlung des Export-Endpunkts weitergegeben.

Dateien: `src/Controller/ContainerController.php`, `tests/Controller/ContainerExportTest.php`, `config/swimmonitor/changelog.yaml`, `docs/TODO.md`, dieses Journal; PHPUnit hat außerdem `.phpunit.cache/test-results` aktualisiert.

Vier isolierte Regressionstests mit simulierten HTTP-Antworten: CSV-Zuordnung, Überschreiten der Grenze, genau 1000 Punkte, Abfragefehler. Vor der Korrektur scheiterten die drei Fehlerszenarien; nach der Korrektur besteht `python3 agents/helfer tests test_projekt` mit 11 Tests und 24 Assertions. Keine Datenbank und keine Messgeräte für die Regressionstests verwendet. Keine Browserabnahme; die bisherigen offenen Abnahme- und Ausrollpunkte bleiben offen. Weitere schwere Fehler wurden nicht sicher belegt.
