[Gelöst] Hilfe bei sleep in Kombination mit PerlFunc innerhalb eines IF

Begonnen von TheTrumpeter, 20 Mai 2022, 11:23:41

Vorheriges Thema - Nächstes Thema

TheTrumpeter

Verzweifle gerade an einem sleep in Kombination mit einer Perlfunktion innerhalb eines IFs.

Habe ein notify, das einmalig eine Bewässerung zu einer bestimmten Zeit triggern soll.

Wenn ich folgendes in die Befehlszeile auf der Weboberfläche eingebe, erhalte ich die richtige Anzahl an Sekunden bis zum gewünschten Start:
{sunrise_rel("HORIZON=-1",-66*60)=~/(\d\d).(\d\d).(\d\d)/;;$1*3600+$2*60+$3}

Wenn ich das in Kombination mit dem sleep im IF verwende, erhalte ich nur eine Fehlermeldung "IF: no right bracket: {sunrise_rel("HORIZON=-1"":
IF ("$EVTPART1" eq "once")
(
sleep {sunrise_rel("HORIZON=-1",-66*60)=~/(\d\d).(\d\d).(\d\d)/;;$1*3600+$2*60+$3} quiet, {Sprinkle ("flowers", 100)}
)


Habe schon verschiedene Hochkommas probiert, Leerzeichen und ohne, komme nicht auf den Fehler :-(
FHEM auf RPi3, THZ (LWZ404SOL), RPII2C & I2C_MCP342x (ADCPiZero), PowerMap, CustomReadings, RPI_GPIO, Twilight, nanoCUL (WMBus für Diehl Wasserzähler & Regenerationszähler für BWT AqaSmart), ESPEasy, TPLinkHS110

Damian

Beim IF-Befehl ist Komma ein Befehlstrenner, deswegen muss man andere Kommas schützen:


IF ("$EVTPART1" eq "once")
(
(sleep {sunrise_rel("HORIZON=-1",-66*60)=~/(\d\d).(\d\d).(\d\d)/;;$1*3600+$2*60+$3} quiet), {Sprinkle ("flowers", 100)}
)

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

TheTrumpeter

#2
Danke, die Fehlermeldung ist weg, dafür kommt jetzt "Can't find string terminator "'" anywhere before EOF at (eval 2389227) line 1."

Habe wieder die doppelten Hochkommas durch die einfache Variante ersetzt, bringt aber nix.

Nachtrag: Es wird zwar begonnen das FHEM-Kommando richtig zu erzeugen, aber es fehlt der Abschluss:
Zitatfhem('sleep {sunrise_rel("HORIZON=-1",-66*60)=~/(\d\d).(\d\d).(\d\d)/;;$1*3600+$2*60+$3} quiet;Sprinkle ("flowers", 100)}}: Can't find string terminator "'" anywhere before EOF at (eval 2390042) line 1.
FHEM auf RPi3, THZ (LWZ404SOL), RPII2C & I2C_MCP342x (ADCPiZero), PowerMap, CustomReadings, RPI_GPIO, Twilight, nanoCUL (WMBus für Diehl Wasserzähler & Regenerationszähler für BWT AqaSmart), ESPEasy, TPLinkHS110

Damian

Du hast ja noch mehr Kommas, die du maskieren musst :)

({Sprinkle ("flowers", 100)})


Eine Weiterentwicklung des IF-Befehls ist das DOIF-Modul. Das kann mit Events, Verzögerungen und if-Abfragen umgehen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

TheTrumpeter

Nein daran liegt's nicht, auf die Idee bin ich vorher auch schon gekommen.
(Ohne den vorhergehenden Sleep-Befehl funktioniert "{Sprinkle ("flowers", 100)}" auch ohne weitere Maskierung wie erwartet.)

Und was auch nicht funktioniert, ist alles zusammen zu "maskieren", also
(sleep {sunrise_rel("HORIZON=-1",-66*60)=~/(\d\d).(\d\d).(\d\d)/;;$1*3600+$2*60+$3} quiet, {Sprinkle ("flowers", 100)})
FHEM auf RPi3, THZ (LWZ404SOL), RPII2C & I2C_MCP342x (ADCPiZero), PowerMap, CustomReadings, RPI_GPIO, Twilight, nanoCUL (WMBus für Diehl Wasserzähler & Regenerationszähler für BWT AqaSmart), ESPEasy, TPLinkHS110

Damian

Hinter dem quiet muss statt Komma ein Semikolon stehen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

TheTrumpeter

Nein da kommt schon im Editor eine Fehlermeldung "syntax error at (eval 2400872) line 2, near "}) ""

Egal wie ich die Klammern setze...
FHEM auf RPi3, THZ (LWZ404SOL), RPII2C & I2C_MCP342x (ADCPiZero), PowerMap, CustomReadings, RPI_GPIO, Twilight, nanoCUL (WMBus für Diehl Wasserzähler & Regenerationszähler für BWT AqaSmart), ESPEasy, TPLinkHS110

TheTrumpeter

So kenne mich nun gar nicht mehr aus, bin nun noch darüber gestolpert: https://forum.fhem.de/index.php?topic=55033.0
Da steht nun eigentlich, dass es auch mit Komma funktionieren müsste.

Und jetzt habe ich nochmal den ersten Versuch probiert:
Zitat von: Damian am 20 Mai 2022, 12:02:09
Beim IF-Befehl ist Komma ein Befehlstrenner, deswegen muss man andere Kommas schützen:


IF ("$EVTPART1" eq "once")
(
(sleep {sunrise_rel("HORIZON=-1",-66*60)=~/(\d\d).(\d\d).(\d\d)/;;$1*3600+$2*60+$3} quiet), {Sprinkle ("flowers", 100)}
)


Keine Fehlermeldung im Log, bin gespannt was morgen Früh passiert.
FHEM auf RPi3, THZ (LWZ404SOL), RPII2C & I2C_MCP342x (ADCPiZero), PowerMap, CustomReadings, RPI_GPIO, Twilight, nanoCUL (WMBus für Diehl Wasserzähler & Regenerationszähler für BWT AqaSmart), ESPEasy, TPLinkHS110

TheTrumpeter

So, jetzt weiß ich auch warum keine Fehlermeldung im Log war... ich habe beim letzten Editieren versehentlich den Trigger gelöscht, d.h. das notify hatte keinen Trigger mehr. Drum gab's keine Fehlermeldung.
Nun ist es wieder so wie es sein soll und die Fehlermeldung "Can't find string terminator "'" anywhere before EOF" ist zurück.
FHEM auf RPi3, THZ (LWZ404SOL), RPII2C & I2C_MCP342x (ADCPiZero), PowerMap, CustomReadings, RPI_GPIO, Twilight, nanoCUL (WMBus für Diehl Wasserzähler & Regenerationszähler für BWT AqaSmart), ESPEasy, TPLinkHS110

Damian

Zitat von: TheTrumpeter am 22 Mai 2022, 07:52:45
So, jetzt weiß ich auch warum keine Fehlermeldung im Log war... ich habe beim letzten Editieren versehentlich den Trigger gelöscht, d.h. das notify hatte keinen Trigger mehr. Drum gab's keine Fehlermeldung.
Nun ist es wieder so wie es sein soll und die Fehlermeldung "Can't find string terminator "'" anywhere before EOF" ist zurück.

Solche Konstruktionen beinhalten einfach zu viele Fallen, daher würde ich davon Abstand nehmen und es mit einem Modul lösen. Die Kombination mehrerer Befehle bestehend aus Klammern, Trennzeichen und Leerzeichen birgt zu viele Fallen. Auch eine Wartezeit mit sleep von zwei Stunden ist ungünstig, da nach einem Restart des Systems während der Wartezeit, diese nicht neu berechnet wird.

Es sind noch zwei Probleme drin.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

jhohmann

Wenn man sleep mit quiet einsetzt, sollte man dem sleep nicht auch einen Namen geben? Sonst ist doch das quiet überflüssig, oder?
Und ich persönlich bin schon froh, dass ich mich halbwegs mit perl selbst auskenne. Da bin ich zu faul, mich mit den Besonderheiten von Spezialmodulen wie IF oder auch DOIF zu beschäftigen, und gehe dann direkt auf die perl Ebene. Aber jedem wie er will.
Hier mein Versuch (ohne eigenen Test) das ganze direkt mit perl umzusetzen:

{
if ("$EVTPART1" eq "once") {
   fhem("sleep {sunrise_rel(\"HORIZON=-1\",-66*60)=~/(\d\d).(\d\d).(\d\d)/;;$1*3600+$2*60+$3} slSunrise quiet;{Sprinkle (\"flowers\", 100)}");
}
}
Raspberry Pi 4 - bookworm / EnOcean - Rollo+Licht, deCONZ - Licht+Sensoren, ZWave - CO Messung, HMCCU mit piVCCU - Heizung+Rollo
plus dovecot, minidlna

Damian

Zitat von: jhohmann am 22 Mai 2022, 11:14:58
Wenn man sleep mit quiet einsetzt, sollte man dem sleep nicht auch einen Namen geben? Sonst ist doch das quiet überflüssig, oder?
Und ich persönlich bin schon froh, dass ich mich halbwegs mit perl selbst auskenne. Da bin ich zu faul, mich mit den Besonderheiten von Spezialmodulen wie IF oder auch DOIF zu beschäftigen, und gehe dann direkt auf die perl Ebene. Aber jedem wie er will.
Hier mein Versuch (ohne eigenen Test) das ganze direkt mit perl umzusetzen:

{
if ("$EVTPART1" eq "once") {
   fhem("sleep {sunrise_rel(\"HORIZON=-1\",-66*60)=~/(\d\d).(\d\d).(\d\d)/;;$1*3600+$2*60+$3} slSunrise quiet;{Sprinkle (\"flowers\", 100)}");
}
}


ja, wenn man ohnehin schon mit Perlfunktionen hantiert und sich mit regex auskennt, dann liegt es nahe alles in Perl zu formulieren. Am besten auch gleich den FHEM-sleep-Befehl :)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Beta-User

Zitat von: Damian am 22 Mai 2022, 11:59:05
Am besten auch gleich den FHEM-sleep-Befehl :)
Kann man machen. Aber wenn man sicherstellen will, dass der zu verzögernde Befehl auch nach einem Neustart ausgeführt wird, könnte man auch den "umgekehrten" Weg gehen und ein "defmod at ..." raushauen...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

TheTrumpeter

Zitat von: Beta-User am 22 Mai 2022, 12:23:45
Kann man machen. Aber wenn man sicherstellen will, dass der zu verzögernde Befehl auch nach einem Neustart ausgeführt wird, könnte man auch den "umgekehrten" Weg gehen und ein "defmod at ..." raushauen...
Genau so habe ich es nun auch gelöst. Das funktioniert problemlos.
FHEM auf RPi3, THZ (LWZ404SOL), RPII2C & I2C_MCP342x (ADCPiZero), PowerMap, CustomReadings, RPI_GPIO, Twilight, nanoCUL (WMBus für Diehl Wasserzähler & Regenerationszähler für BWT AqaSmart), ESPEasy, TPLinkHS110