[gelöst]How to fhem("defmod x at +*01:23:45 { myFunc01('a') ; myFunc02('b') }");

Begonnen von FHEMAN, 17 September 2017, 00:12:42

Vorheriges Thema - Nächstes Thema

FHEMAN

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
NUC7i5 | PROXMOX | FHEM 6.2 | 1 HMLAND | 2 UART | HM | LMS | HIFIBERRY | DOORBIRD | BLINK | BUDERUS | HUE | ALEXA | MILIGHT | LUFTDATENINFO | MQTT| ZIGBEE2MQTT | INDEGO | ROBOROCK | SMA | APC | OPENWB

amenomade

Dein at muss einen Name haben.

define <name> at [<timespec>|<datespec>] <command>
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

FHEMAN

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.
NUC7i5 | PROXMOX | FHEM 6.2 | 1 HMLAND | 2 UART | HM | LMS | HIFIBERRY | DOORBIRD | BLINK | BUDERUS | HUE | ALEXA | MILIGHT | LUFTDATENINFO | MQTT| ZIGBEE2MQTT | INDEGO | ROBOROCK | SMA | APC | OPENWB

Wzut

Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

amenomade

Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Wzut

Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

FHEMAN

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..
NUC7i5 | PROXMOX | FHEM 6.2 | 1 HMLAND | 2 UART | HM | LMS | HIFIBERRY | DOORBIRD | BLINK | BUDERUS | HUE | ALEXA | MILIGHT | LUFTDATENINFO | MQTT| ZIGBEE2MQTT | INDEGO | ROBOROCK | SMA | APC | OPENWB

amenomade

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?
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

FHEMAN

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
NUC7i5 | PROXMOX | FHEM 6.2 | 1 HMLAND | 2 UART | HM | LMS | HIFIBERRY | DOORBIRD | BLINK | BUDERUS | HUE | ALEXA | MILIGHT | LUFTDATENINFO | MQTT| ZIGBEE2MQTT | INDEGO | ROBOROCK | SMA | APC | OPENWB

FHEMAN

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
NUC7i5 | PROXMOX | FHEM 6.2 | 1 HMLAND | 2 UART | HM | LMS | HIFIBERRY | DOORBIRD | BLINK | BUDERUS | HUE | ALEXA | MILIGHT | LUFTDATENINFO | MQTT| ZIGBEE2MQTT | INDEGO | ROBOROCK | SMA | APC | OPENWB