Ohne erreichbare Anlage werden weder state.json noch Messverlauf geschrieben #3

Closed
opened 2026-08-22 00:32:14 +02:00 by Lyra · 1 comment
Collaborator

Beobachtet im Docker-Testlauf (v0.11.1), gilt aber nicht
docker-spezifisch — der Schreibpfad ist derselbe wie unter systemd.

Was passiert

Testlauf mit erreichbarem Shelly-Cloud-Sensor, aber nicht erreichbarer
Anlage (PortaSplit stromlos):

WARNING klimacontrol.runner: Authentifizierung gegen 192.168.180.104 fehlgeschlagen: Connect timeout.. (Fehlversuch 1..8)
INFO    klimacontrol.sensors: Temperatur wird aus 'temperature:0.tC' gelesen

Der Sensorwert kommt also an. Nach acht Zyklen (~2,5 min) war das
Datenverzeichnis trotzdem vollstaendig leer:

$ ls -la /data
drwxr-xr-x 2 klima klima 4096 .
drwxr-xr-x 1 root  root  4096 ..

Kein state.json bzw. state.json.dryrun, kein history/.

Ein Rechteproblem ist ausgeschlossen: touch /data/.schreibtest im selben
Container funktioniert. Sobald die Saisonpause gesetzt wurde (pause on) —
der Zyklus laeuft dann ohne Anlagenzugriff durch — entstanden sofort
state.json.dryrun, history/2026-08-22.csv und pause.state.

Der Zyklus bricht also beim fehlgeschlagenen Anlagenzugriff ab, bevor
Zustand und Messverlauf geschrieben werden.

Warum das stoert

  • Der Messverlauf hat genau dann eine Luecke, wenn man ihn zum Nachvollziehen
    braucht (Anlage weg, Sensor liefert weiter).
  • Die Weboberflaeche liest state.json und faellt mit aus, obwohl es einen
    gueltigen Sensorwert und einen bekannten Fehlerzustand zu zeigen gaebe.
  • Der Healthcheck des Containers prueft die Frische von state.json. Fehlt
    die Datei dauerhaft, meldet Docker den Container als unhealthy und ein
    restart: unless-stopped bringt es nicht zurueck — das Problem liegt
    nicht am Prozess.

Vorschlag

Zustand und Messverlauf auch dann schreiben, wenn der Anlagenzugriff
scheitert: Sensorwert, Zeitstempel, Fehlerzaehler und ein Feld wie
ac_reachable: false. Der Regelteil bleibt dabei aus.

Beobachtet im Docker-Testlauf (v0.11.1), gilt aber nicht docker-spezifisch — der Schreibpfad ist derselbe wie unter systemd. ## Was passiert Testlauf mit erreichbarem Shelly-Cloud-Sensor, aber nicht erreichbarer Anlage (PortaSplit stromlos): ``` WARNING klimacontrol.runner: Authentifizierung gegen 192.168.180.104 fehlgeschlagen: Connect timeout.. (Fehlversuch 1..8) INFO klimacontrol.sensors: Temperatur wird aus 'temperature:0.tC' gelesen ``` Der Sensorwert kommt also an. Nach acht Zyklen (~2,5 min) war das Datenverzeichnis trotzdem vollstaendig leer: ``` $ ls -la /data drwxr-xr-x 2 klima klima 4096 . drwxr-xr-x 1 root root 4096 .. ``` Kein `state.json` bzw. `state.json.dryrun`, kein `history/`. Ein Rechteproblem ist ausgeschlossen: `touch /data/.schreibtest` im selben Container funktioniert. Sobald die Saisonpause gesetzt wurde (`pause on`) — der Zyklus laeuft dann ohne Anlagenzugriff durch — entstanden sofort `state.json.dryrun`, `history/2026-08-22.csv` und `pause.state`. Der Zyklus bricht also beim fehlgeschlagenen Anlagenzugriff ab, bevor Zustand und Messverlauf geschrieben werden. ## Warum das stoert - Der Messverlauf hat genau dann eine Luecke, wenn man ihn zum Nachvollziehen braucht (Anlage weg, Sensor liefert weiter). - Die Weboberflaeche liest `state.json` und faellt mit aus, obwohl es einen gueltigen Sensorwert und einen bekannten Fehlerzustand zu zeigen gaebe. - Der Healthcheck des Containers prueft die Frische von `state.json`. Fehlt die Datei dauerhaft, meldet Docker den Container als `unhealthy` und ein `restart: unless-stopped` bringt es nicht zurueck — das Problem liegt nicht am Prozess. ## Vorschlag Zustand und Messverlauf auch dann schreiben, wenn der Anlagenzugriff scheitert: Sensorwert, Zeitstempel, Fehlerzaehler und ein Feld wie `ac_reachable: false`. Der Regelteil bleibt dabei aus.
Author
Collaborator

Behoben in 57c395f (Hauptdienst 0.12.0). tick() schreibt bei fehlendem Geraetestatus jetzt trotzdem state.json (ac: null, last_decision: null) und eine Verlaufszeile; geschaltet wird weiterhin nichts. Zwei Feinheiten ueber den Vorschlag hinaus: die Spalte anlage bleibt in diesen Zeilen leer statt "aus" - nicht erreichbar ist weder an noch aus, und infer_state_since() darf daraus keinen Schaltzustand ablesen (nur der Pausenfall traegt weiter "aus") - und eine ausstehende resume-Wechselmarke wird von so einer Zeile getragen, sonst ginge das Ereignis beim Pausenende mit toter Anlage verloren. Auf ein eigenes ac_reachable-Feld verzichtet: ac: null plus der bestehende ac_unreachable-Alarm sagen dasselbe. Die Weboberflaeche (0.10.1) zeigt bei ac: null ausserhalb der Pause "-" statt eines geratenen "aus". Drei neue Integrationstests.

Behoben in 57c395f (Hauptdienst 0.12.0). `tick()` schreibt bei fehlendem Geraetestatus jetzt trotzdem `state.json` (`ac: null`, `last_decision: null`) und eine Verlaufszeile; geschaltet wird weiterhin nichts. Zwei Feinheiten ueber den Vorschlag hinaus: die Spalte `anlage` bleibt in diesen Zeilen leer statt "aus" - nicht erreichbar ist weder an noch aus, und `infer_state_since()` darf daraus keinen Schaltzustand ablesen (nur der Pausenfall traegt weiter "aus") - und eine ausstehende `resume`-Wechselmarke wird von so einer Zeile getragen, sonst ginge das Ereignis beim Pausenende mit toter Anlage verloren. Auf ein eigenes `ac_reachable`-Feld verzichtet: `ac: null` plus der bestehende `ac_unreachable`-Alarm sagen dasselbe. Die Weboberflaeche (0.10.1) zeigt bei `ac: null` ausserhalb der Pause "-" statt eines geratenen "aus". Drei neue Integrationstests.
Lyra closed this issue 2026-08-22 01:00:06 +02:00
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
draventec/klimacontrol#3
No description provided.