Bewaesserung meldet retained, ob sie gerade laeuft
Die Firmware der Ventilsteuerungen liefert seit heute ein retained Gartenwasser/<x>/Running mit "running", "running<Ventil>" und "mode", dazu das schon vorbereitete "daysSinceWatering<Ventil>" in LastWatering. Der Messwert "Laufende Automatik" las diese Angabe bisher aus Timers und weicht deshalb. Timers ist nicht retained und wird nur im Sekundentakt gesendet, solange etwas laeuft: der Runner sah im Ruhezustand gar nichts und behielt nach einem Lauf den zuletzt gesehenen Wert - also genau das Gegenteil von verlaesslich. Running ist retained und faellt ueber eine Last-Will-Nachricht auch dann auf false, wenn die Steuerung mitten im Giessen wegbricht. Neu sind damit je Steuerung "Bewaesserung laeuft" und "Laufender Modus", dazu je Zone ein eigener Laufmerker - aber nur, wo eine Steuerung mehr als eine Zone bedient. Bei "hinten" waere er derselbe Wert wie der Merker der Steuerung, und ein Messwert, der nie etwas anderes sagt, macht die Auswahl nur laenger. "Bewaesserung laeuft = NEIN" ist der Waechter fuer jede Regel, die hier etwas anstossen will: die Zonen einer Steuerung haengen an derselben Leitung, zwei gleichzeitig gibt es nicht. Die beiden alten Zeilen "Laufende Automatik" muessen von Hand aus actor_states verschwinden - das Discovery schreibt nur mit ON DUPLICATE KEY UPDATE und loescht nie. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -75,8 +75,11 @@ class GartenwasserModule(BaseModule):
|
|||||||
sie stimmt die Automatik nicht mehr:
|
sie stimmt die Automatik nicht mehr:
|
||||||
|
|
||||||
* LastWatering trägt je Ventil ein "daysSinceWatering<n>" - die Anzahl
|
* LastWatering trägt je Ventil ein "daysSinceWatering<n>" - die Anzahl
|
||||||
Tage, nicht den Zeitstempel.
|
Tage, nicht den Zeitstempel. Das Feld fehlt, solange für ein Ventil
|
||||||
|
keine Bewässerung bekannt ist.
|
||||||
* WateringToday wird um Mitternacht zurückgesetzt.
|
* WateringToday wird um Mitternacht zurückgesetzt.
|
||||||
|
* Running sagt retained, ob gerade etwas läuft, und fällt über eine
|
||||||
|
Last-Will-Nachricht auch dann auf false, wenn die Steuerung wegbricht.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def is_enabled(self) -> bool:
|
def is_enabled(self) -> bool:
|
||||||
@@ -110,18 +113,42 @@ class GartenwasserModule(BaseModule):
|
|||||||
"""
|
"""
|
||||||
topic = steuerung["topic"]
|
topic = steuerung["topic"]
|
||||||
|
|
||||||
|
# Läuft an dieser Steuerung gerade etwas? Der Wächter für jede Regel,
|
||||||
|
# die hier etwas anstoßen will - die Zonen einer Steuerung hängen an
|
||||||
|
# derselben Leitung, zwei gleichzeitig gibt es nicht.
|
||||||
|
#
|
||||||
|
# Gelesen wird das aus Running und nicht aus Timers: Timers ist nicht
|
||||||
|
# retained und wird nur im Sekundentakt gesendet, solange etwas läuft.
|
||||||
|
# Der Runner sähe im Ruhezustand gar nichts und behielte nach einem
|
||||||
|
# Lauf den zuletzt gesehenen Wert - also genau das Gegenteil von
|
||||||
|
# verlässlich. Running ist retained und fällt über eine
|
||||||
|
# Last-Will-Nachricht auch dann auf false, wenn die Steuerung mitten
|
||||||
|
# im Gießen wegbricht.
|
||||||
states = [{
|
states = [{
|
||||||
# Klartext der gerade laufenden Automatik, leer wenn keine läuft.
|
"name": "Bewässerung läuft",
|
||||||
# Ohne Werteliste: was die Steuerung bei Stillstand genau schickt,
|
"url": topic + "/Running",
|
||||||
# steht in keiner Dokumentation, und eine falsche Übersetzung wäre
|
"value_path": "running",
|
||||||
# schlimmer als der rohe Wert.
|
"type": "bool",
|
||||||
"name": "Laufende Automatik",
|
}, {
|
||||||
"url": topic + "/Timers",
|
# Klartext der laufenden Automatik ("Hoch", "Trog", "Vorn"), leer
|
||||||
"value_path": "auto",
|
# wenn von Hand oder gar nicht bewässert wird.
|
||||||
|
"name": "Laufender Modus",
|
||||||
|
"url": topic + "/Running",
|
||||||
|
"value_path": "mode",
|
||||||
"type": "string",
|
"type": "string",
|
||||||
}]
|
}]
|
||||||
|
|
||||||
for valve, zone in steuerung["zonen"]:
|
for valve, zone in steuerung["zonen"]:
|
||||||
|
if len(steuerung["zonen"]) > 1:
|
||||||
|
# Bei einer Steuerung mit nur einer Zone wäre das derselbe Wert
|
||||||
|
# wie "Bewässerung läuft" - ein zweiter Messwert, der nie etwas
|
||||||
|
# anderes sagt, macht die Auswahl nur länger.
|
||||||
|
states.append({
|
||||||
|
"name": "Bewässerung läuft " + zone,
|
||||||
|
"url": topic + "/Running",
|
||||||
|
"value_path": "running%d" % valve,
|
||||||
|
"type": "bool",
|
||||||
|
})
|
||||||
states.append({
|
states.append({
|
||||||
# Ersetzt die Zwölf-Stunden-Sperre von auto_watering.py:
|
# Ersetzt die Zwölf-Stunden-Sperre von auto_watering.py:
|
||||||
# "heute noch nicht bewässert" heißt hier schlicht "= 0".
|
# "heute noch nicht bewässert" heißt hier schlicht "= 0".
|
||||||
@@ -145,6 +172,11 @@ class GartenwasserModule(BaseModule):
|
|||||||
# Tage her" ist damit nicht formulierbar. Die Steuerung liefert
|
# Tage her" ist damit nicht formulierbar. Die Steuerung liefert
|
||||||
# deshalb gleich die Anzahl Tage - dafür wurde ihre Firmware
|
# deshalb gleich die Anzahl Tage - dafür wurde ihre Firmware
|
||||||
# erweitert, das Feld gab es vorher nicht.
|
# erweitert, das Feld gab es vorher nicht.
|
||||||
|
#
|
||||||
|
# Für ein Ventil, das noch nie lief, lässt sie das Feld weg
|
||||||
|
# statt eine 0 zu schicken. Eine 0 hieße "heute bewässert" und
|
||||||
|
# würde den Notlauf für immer unterdrücken; ohne Feld bleibt
|
||||||
|
# der Messwert leer, und die Bedingung greift schlicht nicht.
|
||||||
"name": "Tage seit Bewässerung " + zone,
|
"name": "Tage seit Bewässerung " + zone,
|
||||||
"url": topic + "/LastWatering",
|
"url": topic + "/LastWatering",
|
||||||
"value_path": "daysSinceWatering%d" % valve,
|
"value_path": "daysSinceWatering%d" % valve,
|
||||||
|
|||||||
Reference in New Issue
Block a user