FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: FHEMAN am 17 September 2017, 00:12:42

Titel: [gelöst]How to fhem("defmod x at +*01:23:45 { myFunc01('a') ; myFunc02('b') }");
Beitrag von: FHEMAN am 17 September 2017, 00:12:42
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
Titel: Antw:Wie mache ich fhem("defmod at +*01:23:45 { myFunc01('aa') ; myFunc02('bb') }");
Beitrag von: amenomade am 17 September 2017, 01:17:58
Dein at muss einen Name haben.

define <name> at [<timespec>|<datespec>] <command>
Titel: Antw:Wie mache ich fhem("defmod at +*01:23:45 { myFunc01('aa') ; myFunc02('bb') }");
Beitrag von: FHEMAN am 18 September 2017, 21:31:54
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.
Titel: Antw:Wie mache ich fhem("defmod x at +*01:23:45 { myFunc01('a') ; myFunc02('b') }");
Beitrag von: Wzut am 19 September 2017, 06:55:45
openWindowAlertSent 1');}");   ???
Titel: Antw:Wie mache ich fhem("defmod x at +*01:23:45 { myFunc01('a') ; myFunc02('b') }");
Beitrag von: amenomade am 19 September 2017, 07:17:23
Zitat'Pushover') `; fhem('setreading
Das Rote ist m.A. zu viel
Titel: Antw:Wie mache ich fhem("defmod x at +*01:23:45 { myFunc01('a') ; myFunc02('b') }");
Beitrag von: Wzut am 19 September 2017, 09:29:45
Upps den Fliegenschiss hatte ich ganz übersehen ....
Titel: Antw:Wie mache ich fhem("defmod x at +*01:23:45 { myFunc01('a') ; myFunc02('b') }");
Beitrag von: FHEMAN am 22 September 2017, 20:57:40
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..
Titel: Antw:Wie mache ich fhem("defmod x at +*01:23:45 { myFunc01('a') ; myFunc02('b') }");
Beitrag von: amenomade am 22 September 2017, 21:48:38
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?
Titel: Antw:Wie mache ich fhem("defmod x at +*01:23:45 { myFunc01('a') ; myFunc02('b') }");
Beitrag von: FHEMAN am 11 Oktober 2017, 09:33:49
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
Titel: Antw:Wie mache ich fhem("defmod x at +*01:23:45 { myFunc01('a') ; myFunc02('b') }");
Beitrag von: FHEMAN am 19 Oktober 2017, 22:11:21
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