Ab und zu stoße ich über das im Betreff genannte Konstrukt. Meistens ein Anruf von Funktionen in einem define, was wiederum Teil einer Funktion in der myUtils ist. Das Escapen gelingt mir anscheinend nicht. Wie wäre denn die korrekte Syntax für
//edit: Schreibfehler entfernt - danke amenomade!
fhem("defmod x at +*01:23:45 { myFunc01('a') ; myFunc02('b') }");
Gruß
Ronny
Dein at muss einen Name haben.
define <name> at [<timespec>|<datespec>] <command>
Blöder Fehler bei der Vereinfachung meinerseits.. das at hat natürlich einen Namen. Hier einmal der vollständige Aufruf innerhalb meines Notifys:
my $duration = 30;
my $devalias = alias("$NAME");
fhem("defmod at.WindowOrDoorOpen.$NAME.timer at +*{2}00:$duration:00 { SendMessage('$devalias offen', 'Seit '.(sprintf('%.d', (time - time_str2num(ReadingsTimestamp('$NAME','state',0 ))) / 60)).' Minuten offen.', 'Pushover') `; fhem('setreading at.WindowOrDoorOpen.$NAME.timer openWindowAlertSent 1')}");
//edit: Die Fehlermeldung im Log lautet
2017.09.18 20:49:55.038 3: defmod at.WindowOrDoorOpen.TFK.Terrasse.Rechts.Sw.02.Verschluss.timer at +*{2}00:24:00 { SendMessage('Fenster Terrasse rechts offen', 'Seit '.(sprintf('%.d', (time - time_str2num(ReadingsTimestamp('TFK.Terrasse.Rechts.Sw.02.Verschluss','state',0 ))) / 60)).' Minuten offen.', 'Pushover') `; fhem('setreading at.WindowOrDoorOpen.TFK.Terrasse.Rechts.Sw.02.Verschluss.timer openWindowAlertSent 1')} : Unknown command fhem('setreading, try help.
openWindowAlertSent 1');}"); ???
Zitat'Pushover') `; fhem('setreading
Das Rote ist m.A. zu viel
Upps den Fliegenschiss hatte ich ganz übersehen ....
Ohne dem "`" geht es anscheinend auch nicht. Bzw. muss ich das ";" irgendwie maskieren, denke ich.
Gibt es denn für defmod/define nicht ein Perl-Derivat? So dass ich nicht erst wieder in die fhem Syntax switchen muss. Dieses Hin und Her macht es für mich unübersichtlich..
Ne, es gibt keine Perl Alternativ zum defmod. Schau mal kurz im Modul die define Funktion des at, Du wirst sehen...
M.A. musst Du alle Anführungszeichen escapen, und die ' vermeiden, da zwischen single quotes die Variable nicht interpretiert werden. Etwas wie ReadingsTimestamp('$NAME','state',0 )
kann z.B. nicht funktionieren: $NAME wird nicht durch den Name ersetzt.
Kannst Du mal die gesamte nicht funktionierende Definition deines Notify zeigen, statt nach und nach unvollständige Stückchen von deinem Code erwähnen?
Ich habe jetzt alle " innerhalb des define escapet und es geht trotzdem nicht.
Das Notify ist eine Sammlung an "Features", die beim Öffnen der Fenster/Türen passieren. Hier einmal der komplette Auszug der Fenter-offern-überwachung-und-beachrichtigung:
# Open Window Alert Timer
if (($EVENT =~ "open") && (($NAME =~ "Nebeneingang") || (ReadingsVal("TempDiffSen.01","Aussentemperatur",0) < 13)) && (AttrVal("$NAME", "WindowOpenWatchdog", 1))) {
my $duration = ReadingsVal("TempDiffSen.01","Aussentemperatur",0) + 13;
$duration = sprintf("%.f", $duration);
my $devalias = alias("$NAME");
if ($devalias =~ m"[Ee]ingang") {
$devalias = "Tür " . $devalias;
} else {
$devalias = "Fenster " . $devalias;
}
# my $devLastAction = sprintf("%.d", (time - time_str2num(ReadingsTimestamp('$NAME','state',0 ))) / 60);
fhem("defmod at.WindowOrDoorOpen.$NAME.timer at +*{2}00:$duration:00 { SendMessage(\"$devalias offen\", \"Seit \".(sprintf(\"%.d\", (time - time_str2num(ReadingsTimestamp(\"$NAME\",\"state\",0 ))) / 60)).\" Minuten offen.\", \"Pushover\")\; fhem(\"setreading at.WindowOrDoorOpen.$NAME.timer openWindowAlertSent 1\")}");
} elsif (($EVENT eq "closed") && Value("at.WindowOrDoorOpen.$NAME.timer")) {
fhem("delete at.WindowOrDoorOpen.$NAME.timer");
if (ReadingsVal("at.WindowOrDoorOpen.$NAME.timer", "openWindowAlertSent", 0)) {
# Die Closed Benachrichtigung interessiert nur, wenn d. Fenster/Tür vorher zu lange geöffnet war.
SendMessage(alias("$NAME") . " $EVENT", "$EVENT", "Pushover", "silent");
}
}
Also die zusammgefasst konkrete Frage ist, denke ich, wie geht folgendes Konstrukt bzw. geht das überhaupt oder muss ich das zwangsläufig in eine eigene Funktion auslagern?:
fhem("defmod at.myAt1 at +*00:XX:00 { myFunc1("a"); fhem("setreading at.myAt1 myAttr 1")}")
Grüße
Ronny
Ich habe die Lösung: die Semikolons zwischen den Funktionen müssen verdoppelt und verdoppelt werden --> ";;;;"
Also
fhem("defmod x at +*01:23:45 { myFunc01('a') ;;;; myFunc02('b') }");
Gruß
Ronny