Neuigkeiten:

Am Sonntag den 8.12.2024 kann es ab ca. 8:00 Uhr zu kurzzeitigen Einschränkungen / Ausfällen bei den Diensten des FHEM Vereines kommen.
Die Server müssen mal gewartet und dabei neu gestartet werden ;)

Hauptmenü

[gelöst] Sequenz mit relativen Zeiten durch Ereignis oder Uhrzeit auslösen

Begonnen von kpwg, 08 September 2024, 12:42:51

Vorheriges Thema - Nächstes Thema

kpwg

Hallo miteinander,

obwohl ich schon viele Mechanismen erfolgreich mit DOIF steuern kann, bereitet mir die Automatik zum Befüllen der Tanks unseres Gewächshauses Kopfzerbrechen. Eine DOIF-Sequenz mit absoluten Zeiten ist kein Problem und funktioniert, mit relativen Zeiten bekommen ich es aber nicht hin. Ausgehend vom jetzigen Stand mit absoluten Zeiten möchte ich die Startzeit variabel haben bzw. auch die gesamte Sequenz manuell starten.

Die funktionierende Ausgangslage:
(([19:45]) and [ESPEasy_ESP_G1_Schwimmer] eq "on" and [ESPEasy_ESP_G3_Schwimmer] eq "off" and [ESPEasy_ESP_G1_M3] eq "off")
    (set ESPEasy_ESP_G1_8_Rel on, set ESPEasy_ESP_G3_Bewaesserung off, set ESPEasy_ESP_G1_M3 on)
DOELSEIF ([19:50])
    (set ESPEasy_ESP_G1_M3 on)
DOELSEIF ([19:55])
    (set ESPEasy_ESP_G1_M3 on)
DOELSEIF ([19:56])
    (set ESPEasy_ESP_G1_8_Rel off)
DOELSEIF ([19:58] and [ESPEasy_ESP_G1_M3] eq "on")
    (set ESPEasy_ESP_G1_M3 off)
Hier frage ich zwei Schwimmer und ein Motorventil ab, um deren Verfügbarkeit und deren Zustand zu prüfen. Das sollte als Eingangsbedingung erhalten bleiben, allerdings ändert sich deren Zustand während der Ausführung der Sequenz (G1_Schwimmer wird "off"). Attribute sind hier keine gesetzt, es funktioniert täglich.

Mein neuer Ansatz:
(([12:13]) and [ESPEasy_ESP_G1_Schwimmer] eq "on" and [ESPEasy_ESP_G3_Schwimmer] eq "off" and [ESPEasy_ESP_G1_M3] eq "off")
    (set ESPEasy_ESP_G3_Bewaesserung off,
     set ESPEasy_ESP_G1_8_Rel on,
     set ESPEasy_ESP_G1_M3 on,
     set ESPEasy_ESP_G1_M3 on,
     set ESPEasy_ESP_G1_M3 on,
     set ESPEasy_ESP_G1_8_Rel off,
     set ESPEasy_ESP_G1_M3 off)
Gesetzt ist zudem das Attribut "wait 5,10,15,20,25,30,35,40"
Hier habe ich eine zum Testen geeignete Startzeit gewählt, die Zeiten beim "wait" sind auch stark verkürzt, um schnelle Ergebnisse zu haben. Die Ausführung von "ESP_G1_M3 on" erfolgt mehrfach hintereinander, um den befüllten Behälter über eine Verbindung mit einem anderen Behälter auszugleichen. Der Behälter wird mit Druck betankt, schaltet bei "voll" das Ventil wieder ab und braucht dann etwas Zeit, das Wasser zu verteilen. Danach kann er noch zweimal mit entsprechend weniger Volumen bedient werden (nur so als technischer Hintergrund... :) )

Das Verhalten:
Es schaltet G1_8_Rel on und sofort wieder off, G1_M3 on bleibt an und das wars dann.  >:(
Mein "Konstruktionsfehler" besteht wohl darin, das sich die Eingangsbedingungen zwischendurch ändern und so den Wait-Timer zurück setzen. Gilt das für Befehle UND Sequenzen oder nur Befehle; entsprechend spielt es bei Sequenzen keine Rolle?

Wer hat eine Idee für einen besseren Ansatz?

Viele Grüße, Ricardo

Damian

Für eine Sequenz musst du die Befehle einzeln klammern:

(set ESPEasy_ESP_G3_Bewaesserung off)
(set ESPEasy_ESP_G1_8_Rel on)
...
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

kpwg

Hallo Damian,

danke für Deine Antwort. Das habe ich bereits versucht, die Zeiten in "wait" dann entsprechend durch Doppelpunkte getrennt. Das funktioniert nicht, da die Eingangsbedingungen sich zwischendurch ändern und den Timer zurücksetzen.

Kann ich den während der Laufzeit geänderten Eingangsbedingungen ein triggern der Timer verbieten? Oder sollte ich die Sequenz in Perl auslagern?

Per

Da du fixe Zeiten zum Triggern hast, kannst du alle anderen Bedingungen als Abfrage [?xxx] gestalten, so gibt es keine weitere Störung durch andere Events.
Ansonsten kannst du natürlich auch zusätzlich abfragen, ob das DOIF in Ruhe ist oder noch eine Sequenz abarbeitet, indem du das Sub Cmd vergleichst.

kpwg

Der aktuelle Stand aus der raw def:
defmod di_Speicher_fuellen1 DOIF (([11:57]) and [?ESPEasy_ESP_G1_Schwimmer] eq "on" and [?ESPEasy_ESP_G3_Schwimmer] eq "off" and [?ESPEasy_ESP_G1_M3] eq "off")\
    (set ESPEasy_ESP_G3_Bewaesserung off)\
    (set ESPEasy_ESP_G1_8_Rel on)\
    (set ESPEasy_ESP_G1_M3 on)\
    (set ESPEasy_ESP_G1_M3 on)\
    (set ESPEasy_ESP_G1_M3 on)\
    (set ESPEasy_ESP_G1_8_Rel off)\
    (set ESPEasy_ESP_G1_M3 off)\
attr di_Speicher_fuellen1 wait 5:10:15:20:25:30:35:40
Ich habe nun wieder einzeln geklammert und durch [?xxx] das triggern versucht zu deaktivieren. Auch die dritte Bedingung (ESPEasy_ESP_G1_M3) habe ich testweise entfernt, da sie nicht zwingend nötig ist. Die Beobachtung zeigt, das wait nicht greift und cmd sofort bis zum state 1.7 durch läuft, als gäbe es kein "wait".

Nobbynews

#5
Zitat von: kpwg am 09 September 2024, 12:25:26defmod di_Speicher_fuellen1 DOIF (([11:57]) and [?ESPEasy_ESP_G1_Schwimmer] eq "on" and [?ESPEasy_ESP_G3_Schwimmer] eq "off" and [?ESPEasy_ESP_G1_M3] eq "off")\
    (set ESPEasy_ESP_G3_Bewaesserung off)\
    (set ESPEasy_ESP_G1_8_Rel on)\
    (set ESPEasy_ESP_G1_M3 on)\
    (set ESPEasy_ESP_G1_M3 on)\
    (set ESPEasy_ESP_G1_M3 on)\
    (set ESPEasy_ESP_G1_8_Rel off)\
    (set ESPEasy_ESP_G1_M3 off)\
attr di_Speicher_fuellen1 wait 5:10:15:20:25:30:35:40
Die Syntax von wait ist falsch.

Aus der commandref:
ZitatBeispieldefinition bei mehreren DO-Blöcken mit Befehlssequenzen:

DOIF (Bedingung1)
(set ...) ## erster Befehl der ersten Sequenz soll um eine Sekunde verzögert werden
(set ...) ## zweiter Befehl der ersten Sequenz soll um 2 Sekunden nach dem ersten Befehl verzögert werden
DOELSEIF (Bedingung2)
(set ...) ## erster Befehl der zweiten Sequenz soll um 3 Sekunden verzögert werden
(set ...) ## zweiter Befehl der zweiten Sequenz soll um 0,5 Sekunden nach dem ersten Befehl verzögert werden

attr <DOIF-module> wait 1,2:3,0.5
Also müsste es heißen:
attr di_Speicher_fuellen1 wait 5,10,15,20,25,30,35 Der 8. Parameter erschließt sich mir nicht, da Deine def nur 7 Befehle enthält.

kpwg

Es funktioniert!

Die Ursachen:
- Die Syntax von wait war tatsächlich falsch. Die Zeiten müssen mit Komma getrennt sein, da es eine Sequenz ist. Die Doppelpunkte werden bei weiteren Bedingungen (doelseif, ...) benötigt, was ich nicht habe.
- Acht wait-Timer waren der Testerei geschuldet und sind so stehen geblieben. Es macht natürlich keinen Sinn, schadet aber der Funktion auch nicht. Ich habe das Timining nun auch weiter optimiert (verkürzt) und alles praktisch getestet.
- Events, welche sich während der Laufzeit der Sequenz durch Änderung nicht negativ auswirken dürfen, muss man als Bedingung mit [?xxx] gestalten.

Besten Dank für die Unterstützung an Euch. Im Prinzip steht das alles auch schon in der commandref, wenn man liest...  8)

Per

Zitat von: kpwg am 11 September 2024, 11:00:38Events, welche sich während der Laufzeit der Sequenz durch Änderung nicht negativ auswirken dürfen, muss man als Bedingung mit [?xxx] gestalten.
Kannst du so nicht sagen, das geht nämlich auch nur, wenn du sie nicht als Event brauchst.