# 2026-11-01

## Anlagenansicht auf der Container-Seite

**Was:** Die 3D-Ansicht aus `schwimmcontainer` steht oben auf `/container/{id}`. Klick auf Technik, Nassbereich oder Trockenbereich fährt die Kamera heran und blendet das Dach aus. Im Becken liegt eine bewegte Wasserfläche. Läuft eine Leistungsmessung, pulsiert die Technik-Kante.

**Warum:** Die Demo sollte ins SwimMonitor, mit den Daten, die ein Container wirklich hat, inklusive Energie.

**Festlegung:** Angezeigt werden nur vorhandene Werte (Stammdaten, Live-Werte, Grenzen, Standort, Zusatzfelder). Energie kommt aus Influx, wenn der Messname `power`, `strom`, `leistung`, `watt`, `energie` oder `kwh` enthält, sonst „kein Messwert“. Narwali 2 zeigt zusätzlich den Grafana-Verlauf (Panel 12). Die Abfrage bricht nach 4 Sekunden ab und lässt die Seite trotzdem laden.

**Dateien:** `src/Controller/ContainerController.php`, `templates/container/show.html.twig`, `public/js/container/ansicht.js`, `public/css/container/ansicht.css`, `public/container-ansicht/` (Modell, Folie, Three.js), `config/swimmonitor/changelog.yaml`, `docs/SWIMMONITOR-STYLE.md`.

**Prüfung:** Vorschau mit Beispieldaten über einen lokalen Webserver: Modell und Beschriftungen sichtbar, Klick in den Nassbereich öffnet das Panel (Temperatur, pH), Dach weg, Rückfahrt in die Gesamtansicht. Die angemeldete Container-Seite selbst nicht geöffnet. Vorschau-Datei danach gelöscht. Nichts committet, nichts deployt.

Danach den flachen grauen Bühnenhintergrund ersetzt: Himmel mit leichtem Boden, über CSS-Verlauf, getrennt für Hell und Dunkel (`public/css/container/ansicht.css`). Die Leinwand bleibt durchsichtig, damit der Verlauf sichtbar ist.

Unter den Messwerten liegt eine Linie aus dem Stundenmittel der letzten 24 Stunden (Influx, höchstens 24 Punkte, Abbruch nach 3 Sekunden). Sie zeichnet sich und läuft danach weiter. Ohne Messreihe bleibt die Zahl allein. Gleicher Verlauf in der Bereichsliste.

Die Grafana-Rahmen auf `/container/{id}` (Momentanwerte, Verläufe, Leistung) sind durch eigene Diagramme ersetzt. Daten: Viertelstunden-Mittel der letzten 24 Stunden aus denselben Influx-Messungen, gezeichnet mit dem lokalen Chart.js. Die TV-Ansicht bindet Grafana weiter ein.

Die Diagramme blieben leer, weil Twig das JSON im Skript-Tag als HTML maskiert hat (`&quot;`) und `JSON.parse` abbrach. Ausgabe jetzt mit `json_encode(15)|raw` (Anführungszeichen und Tags als Unicode). Die Wassertemperatur von Mobi liegt in `mobi_temp`, nicht in `mobi_wassertemp`.

Mobi hat zusätzlich `mobi_aussentemperatur`. Der letzte Viertelstunden-Mittelwert der letzten 24 Stunden steht als Pin „Außen“ vor dem Container (Übersicht und Trockenbereich) und als Diagramm im Tab Verläufe. Einen Live-Punkt dafür gibt es in der ioBroker-Abfrage nicht.

## Fehlerfinder: eingegrenzte Prüfung

Die im Auftrag genannten geänderten Dateien auf konkret auslösbare schwere Fehler geprüft; die zwei ausdrücklich ausgenommenen offenen Befunde nicht erneut untersucht. Kein neuer schwerer Fehler sicher belegt, keine Anwendungscodeänderungen. Prüfung durch Lesen der Controller, JavaScript-Abläufe, Vorlagen und zugehörigen Styles; keine Browserprüfung schreibender Aktionen und kein Gerätezugriff.

`python3 agents/helfer tests test_projekt`: erfolgreich, 7 Tests und 15 Assertions. Git nicht verwendet. Die noch offene Browserabnahme und die Ausrollschritte bleiben offen.

## Signage: interaktive Erste-Schritte-Führung

**Was:** Neuer Knopf „Anleitung“ rechts in der Signage-Navigation. Er startet eine Führung über zehn Schritte: Video hochladen, Playlist anlegen oder öffnen, Videos hinzufügen, Reihenfolge, Gerät öffnen, Standard-Playlist, Zeitplan (optional), Veröffentlichen, Stand der Veröffentlichung, Sofortwiedergabe. Jeder Schritt hebt das Element auf der Seite hervor und erklärt, was zu tun ist und was der Klick auslöst.

**Warum:** Wunsch des Nutzers: eine erste Anleitung, wohin man klicken muss, um ein Video auf einen Bildschirm zu bringen, und was das auslöst. Ausdrücklich keine eigene Seite, sondern interaktiv.

**Festlegungen:**
- Eine Datei `public/js/admin/signage-tour.js`, Styles am Ende von `public/css/admin/signage.css` (`.sg-tour-*`). Kein Inline-CSS/JS; Positionen per CSSOM.
- `signage/_layout.html.twig`: `data-sg-route` im `body_attr`, Startknopf in `.sg-nav`, Skript im `javascripts`-Block. Die Ziel-Templates sind unverändert, auch `device/show.html.twig` mit den offenen Änderungen vom 30.10.
- Fortschritt in `localStorage`, die Führung läuft beim Seitenwechsel weiter. Aktionsschritte (Playlist öffnen, Gerät öffnen, Standard-Playlist speichern, Veröffentlichen) gehen erst nach dem Klick bzw. Absenden weiter; Veröffentlichen erst nach der Bestätigung im Dialog. Wo sich nichts ändern muss, gibt es „Weiter“.
- Beim ersten Besuch markiert ein Punkt den Knopf, bis die Führung einmal gestartet wurde.

**Prüfung:** `lint:twig templates/signage`, `node --check`. Im Browser über eine temporäre lokale Vorschau (danach gelöscht) alle zehn Schritte durchgeklickt, nur Weiter und Navigationslinks, keine Formulare abgeschickt: Seitenwechsel Videos → Playlists → Playlist → Geräte → Gerät, Tabwechsel Einstellungen/Zeitplan/Übersicht, Popover-Lage bei hohen Elementen, Hell und Dunkel, „Fertig“ setzt den Fortschritt zurück. Nichts committet, nichts deployt.
