FHEM Forum

Verschiedenes => Off-Topic => Thema gestartet von: rbs am 26 September 2018, 19:39:18

Titel: weitere Befehle erst NACH Ablauf einer on-for-timer Anweisung ausführen?
Beitrag von: rbs am 26 September 2018, 19:39:18
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");;\
}

Titel: Antw:weitere Befehle erst NACH Ablauf einer on-for-timer Anweisung ausführen?
Beitrag von: rabehd am 27 September 2018, 08:34:41
Wieso Off-Topic?
Klingt eher nach Anfänger.
Mal nach sleep/SLEEP gesucht?
Titel: Antw:weitere Befehle erst NACH Ablauf einer on-for-timer Anweisung ausführen?
Beitrag von: rbs am 27 September 2018, 15:29:20
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.
Titel: Antw:weitere Befehle erst NACH Ablauf einer on-for-timer Anweisung ausführen?
Beitrag von: rabehd am 27 September 2018, 15:40:01
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.
Titel: Antw:weitere Befehle erst NACH Ablauf einer on-for-timer Anweisung ausführen?
Beitrag von: rbs am 27 September 2018, 20:29:53

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?
Titel: Antw:weitere Befehle erst NACH Ablauf einer on-for-timer Anweisung ausführen?
Beitrag von: KölnSolar am 28 September 2018, 09:14:18
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...
Titel: Antw:weitere Befehle erst NACH Ablauf einer on-for-timer Anweisung ausführen?
Beitrag von: rbs am 28 September 2018, 18:07:19
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.
Titel: Antw:weitere Befehle erst NACH Ablauf einer on-for-timer Anweisung ausführen?
Beitrag von: KölnSolar am 28 September 2018, 20:11:07
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 ......
Titel: Antw:weitere Befehle erst NACH Ablauf einer on-for-timer Anweisung ausführen?
Beitrag von: rbs am 28 September 2018, 22:44:20
ah jetzt verstehe ich. Danke für den Denkanstoß. Ich werd's mal so probieren.