weitere Befehle erst NACH Ablauf einer on-for-timer Anweisung ausführen?

Begonnen von rbs, 26 September 2018, 19:39:18

Vorheriges Thema - Nächstes Thema

rbs

Guten Abend alle zusammen, ich hoffe, die Forum Kategorie ist richtig.

Könnt Ihr mir etwas beim Syntax helfen?
Für meine Heizung habe ich eine Timer funktion, welche eine Steckdose für x Minuten einschaltet. Ich möchte nun NACHDEM der Timer der eingeschalteten Steckdose abgelaufen ist im Anschluss daran ein Log eintrag und auch eine globale Variable setzen. So wie ich den Syntax jetzt allerdings habe, werden alle Anweisungen kurz nacheinander ausgeführt.
Wie kann ich das am besten umschreiben?


define act_on_HCAutomatikPartyWarm notify HCAutomatik:minutes.* {\
$main::last_HeizungModus=$main::HeizungModus;; $main::HeizungModus='minutes';;\
Log(3,"Heizung Steuerung erfolgt nun:  $main::HeizungModus");; fhem ("set HCAutomatik . $main::HeizungModus");; \
my $seconds=$EVTPART1*60;;\
Log(3,"Heizung Modus Timer aktiviert Dauer in Sekunden: " . $seconds);;\
fhem ("set Wz.TvReceiver showText Heizung bleibt für die nächsten $EVTPART1 Minuten eingeschaltet.;;")  ;;\
        fhem ("set Steckdose.Pufferspeicher_Sw  on-for-timer $seconds;; set HCAutomatik $main::last_HeizungModus;;") ;; \
$main::HeizungModus=$main::last_HeizungModus;; \
Log(3,"Heizung Modus nach abgelaufenen Timer wieder auf vorherigen Modus zurück gesetzt:  $main::last_HeizungModus");;\
}


rabehd

Wieso Off-Topic?
Klingt eher nach Anfänger.
Mal nach sleep/SLEEP gesucht?
Auch funktionierende Lösungen kann man hinterfragen.

rbs

ja, wirst wohl recht haben, sorry. gerne verschieben .
Mit sleep habe ich in der Tat auch schon versucht gestern das umzusetzen. Das scheint auch der richtige Weg, alelrdings habe ich beim Syntax doch noch Probleme, gerade mit dem setzen der Variablen:


$main::HeizungModus=$main::last_HeizungModus;;


und auch beim setzen des dummy HCAutomatik:


set HCAutomatik . $main::last_HeizungModus

direkt in der sleep Anweisung.

So ist mein letzter Versuchsstand, der aber noch Fehler wirft. Hab schon einiges versucht, aber die korrekte Schreibweise (Zugriff auf die Variablen) klappt auch nach mehreren Versuchen nicht richtig. Da tue ich mich halt noch etwas schwer ;-)


define act_on_HCAutomatikPartyWarm notify HCAutomatik:minutes.* {\
$main::last_HeizungModus=$main::HeizungModus;; $main::HeizungModus='minutes';;\
Log(3,"Heizung Steuerung erfolgt nun:  $main::HeizungModus");; fhem ("set HCAutomatik . $main::HeizungModus");; \
my $seconds=$EVTPART1*60;;\
Log(3,"Heizung Modus Timer aktiviert Dauer in Sekunden: " . $seconds);;\
fhem ("set Wz.TvReceiver showText Heizung bleibt für die nächsten $EVTPART1 Minuten eingeschaltet.;;")  ;;\
fhem ("set Steckdose.Pufferspeicher_Sw  on-for-timer $seconds;;") ;; \
fhem ("sleep " . $seconds . ";;  set HCAutomatik . $main::last_HeizungModus;;;;") ;; \
$main::HeizungModus=$main::last_HeizungModus;; \
Log(3,"Heizung Modus nach abgelaufenen Timer wieder auf vorherigen Modus zurück gesetzt:  $main::last_HeizungModus");;\
}


aktuelles Fehlerlog:
2018.09.27 15:28:38 3: act_on_HCAutomatikPartyWarm return value: Unknown command {
, try help.
Unknown command $main::HeizungModus='minutes', try help.
Unknown command Log(3,"Heizung, try help.
Unknown command fhem, try help.
Unknown command my, try help.
Unknown command Log(3,"Heizung, try help.
Unknown command fhem, try help.
Unknown command "), try help.
Unknown command fhem, try help.
Unknown command "), try help.
Unknown command fhem, try help.
Unknown command \, try help.

rabehd

Log(3,"Heizung Modus nach abgelaufenen Timer wieder auf vorherigen Modus zurück gesetzt:  $main::last_HeizungModus")
Wenn Du das reparierst, dann wären schon mal einige Meldungen weg.
Dann solltest Du die Variablen auf defineren.
Auch funktionierende Lösungen kann man hinterfragen.

rbs


Die variablen habe ich definiert.

Ich habe es jetzt so gut wie zum laufen bekommen. Fehler kommen keine mehr und die steckdose wird eingeschaltet für X Minuten und durch die sleep Anweisung kann ich zeitverzögert die HCAutomatik wieder erfolgreich zurück setzen.

:

define act_on_HCAutomatikPartyWarm notify HCAutomatik:minutes.* {\
$main::last_HeizungModus=$main::HeizungModus;; $main::HeizungModus='minutes';;\
Log(3,"Heizung Steuerung erfolgt nun:  $main::HeizungModus");; \
fhem ("set HCAutomatik  $main::HeizungModus");; \
my $seconds=$EVTPART1*60;;\
Log(3,"Heizung Modus Timer aktiviert Dauer in Sekunden: " . $seconds);;\
fhem ("set Wz.TvReceiver showText Heizung bleibt für die nächsten $EVTPART1 Minuten eingeschaltet.;;")  ;;\
fhem (" set Steckdose.Pufferspeicher_Sw  on-for-timer $seconds;;") ;; \
fhem ("sleep " . $seconds . ";;  set HCAutomatik $main::last_HeizungModus ;;") ;; \
Log(3,"Heizung Modus nach abgelaufenen Timer wieder auf vorherigen Modus zurück gesetzt:  $main::last_HeizungModus");;\
}


Ich hatte tatsächlich wohl nur ganz am Ende der define Sektion die geschweifte Klammer zu vergessen;-)

Eine Frage hätte ich aber noch:
Den letzten Log Eintrag:

Log(3,"Heizung Modus nach abgelaufenen Timer wieder auf vorherigen Modus zurück gesetzt:  $main::last_HeizungModus");;\
kann ich doch nicht in die Fhem "sleep" Anweisung noch mit rein nehmen, da der ja wiederrum kein Fhem, sondern Perl Befehl ist (wenn ich das richtig verstehe)? Wie kann ich den auch erst nach ablaufen des timer/sleep Dauer ins Log eintragen lassen ohne Fhem zu blockieren?

KölnSolar

Alternative zum sleep ist ein temporär angelegtes at mit Deinen letzten Codezeilen, also etwas so

...
defmod temp_HCAutomatik at +00:00:$seconds {fhem (set HCAutomatik $main::last_HeizungModus ;;") ;; \
Log(3,"Heizung Modus nach abgelaufenen Timer wieder auf vorherigen Modus zurück gesetzt:  $main::last_HeizungModus")}\
}


Inwieweit das mit den Variablen klappt, müsstest Du ausprobieren...
RPi3/2 buster/stretch-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-zigbee2mqtt

rbs

ic hglaub das geht nicht, weil ich auf $seconds beim gesonderten defmod nicht zugreifen kann, weil $seconds ja während des notify in define act_on_HCAutomatikPartyWarm erst belegt wird. Jedenfalls erhalte ich beim speichern der Config:


define act_on_HCAutomatikPartyWarm notify HCAutomatik:minutes.* {\
$main::last_HeizungModus=$main::HeizungModus;; $main::HeizungModus='minutes';;\
Log(3,"Heizung Steuerung erfolgt nun:  $main::HeizungModus");; \
fhem ("set HCAutomatik  $main::HeizungModus");; \
my $seconds=$EVTPART1*60;;\
Log(3,"Heizung Modus Timer aktiviert Dauer in Sekunden: " . $seconds);;\
fhem ("set Wz.TvReceiver showText Heizung bleibt für die nächsten $EVTPART1 Minuten eingeschaltet.;;")  ;;\
fhem ("set Steckdose.Pufferspeicher_Sw  on-for-timer $seconds;;") ;; \
#fhem ("sleep " . $seconds . ";;  set HCAutomatik $main::last_HeizungModus ;;") ;; \
#Log(3,"Heizung Modus nach ablaufen des Timer in $EVTPART1 Minuten wieder auf vorherigen Modus zurück gesetzt:  $main::last_HeizungModus");;\
}

define act_on_HCAutomatikPartyWarm1 notify HCAutomatik:minutes.* defmod temp_HCAutomatik at +00:00:$seconds {fhem ("set HCAutomatik $main::last_HeizungModus ;;") ;; \
Log(3,"Heizung Modus nach abgelaufenen Timer wieder auf vorherigen Modus zurück gesetzt:  $main::last_HeizungModus")}\
}


einen Fehler Wrong timespec 00:00:$seconds: either HH:MM:SS or {perlcode}, was ich ja an der Stelle auch verstehe.

Ich glaub mir ist das zu hoch und ich verzichte auf den letzten Log Eintrag einfach ;-) Der Rest funktioniert ja dank der sleep Anweisung innerhalb des Fhem Kommandos prima.

KölnSolar

so nicht aber ich meinte
define act_on_HCAutomatikPartyWarm notify HCAutomatik:minutes.* {\
$main::last_HeizungModus=$main::HeizungModus;; $main::HeizungModus='minutes';;\
Log(3,"Heizung Steuerung erfolgt nun:  $main::HeizungModus");; \
fhem ("set HCAutomatik  $main::HeizungModus");; \
my $seconds=$EVTPART1*60;;\
Log(3,"Heizung Modus Timer aktiviert Dauer in Sekunden: " . $seconds);;\
fhem ("set Wz.TvReceiver showText Heizung bleibt für die nächsten $EVTPART1 Minuten eingeschaltet.;;")  ;;\
fhem ("set Steckdose.Pufferspeicher_Sw  on-for-timer $seconds;;") ;; \
       fhem ("defmod temp_HCAutomatik at +00:00:$seconds {fhem ("set HCAutomatik $main::last_HeizungModus ;;");; \
Log(3,"Heizung Modus nach abgelaufenen Timer wieder auf vorherigen Modus zurück gesetzt:  $main::last_HeizungModus")}
}


So aber sicherlich noch nicht funktionsfähig wg. Klammersetzung und " vs. ' und ......
RPi3/2 buster/stretch-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-zigbee2mqtt

rbs

ah jetzt verstehe ich. Danke für den Denkanstoß. Ich werd's mal so probieren.