notify mit at und fhem Befehl und Perl Befehl gleichzeitig

Begonnen von Betonklotz, 27 April 2020, 15:27:19

Vorheriges Thema - Nächstes Thema

Betonklotz

Hallo,

probiere gerade in meinem FHEM aufzuräumen, bzw. das zu erweitern. Bin gerade dabei ein notify für die Brunnenpumpe im Garten anzulegen und komfortabler auszulegen, das gute Wetter lässt grüßen. Dafür lasse ich mir den Status per Telegram Bot schicken und schreibe etwas ins Log. Da die Pumpe ein wenig zum Anlaufen benötigt, und auch der Sonoff Schalter ein wenig Latenz hat, scheitere ich allerdings an der Statusmeldung/Update nach dem Schaltvorgang den ich drei Sekunden verzögert abfrage. Dort würde ich gerne einen fhem Befehl und einen Perl Befehl in einem at verknüpfen.
Der Perl Befehl wird allerdings sofort (und nicht drei Sekunden verzögert) ausgeführt, das Log zeigt den neuen Status sofort an.

Update: verbose Level im code angepasst, und dann steht auch was im Log. ABER: nicht um drei Sekunden verzögert

code aus dem DEF Editor (in der fhem.cfg sieht es natürlich anders aus)

Gartenpumpe_an_Aktionen:Tiefbrunnenpumpe_an_Trigger.*
{
## Perl Ebene von hier ab an wegen geschweifter Klammer auf
Log3(undef, 3, "Die Tiefbrunnenpumpe soll angeschaltet werden, das Event dazu sah so aus: $EVENT");
if (ReadingsVal("Garten_Tiefbrunnenpumpe_MQTT2","POWER","") eq "OFF")
{
fhem ("set Garten_Tiefbrunnenpumpe_MQTT2 on");
fhem ("set Haus_bot message Schalte die Tiefbrunnenpumpe an, bitte warten...");
Log3(undef, 5, "Schalte die Tiefbrunnenpumpe an");
## Problemzeile
fhem("define Brunnenpumpe_Statusmeldung at +00:00:03 set Haus_bot message neuer Status der Tiefbrunnenpumpe ist [Garten_Tiefbrunnenpumpe_MQTT2:POWER]");;Log3(undef, 3, "neuer Status der Tiefbrunnenpumpe ist ".ReadingsVal("Garten_Tiefbrunnenpumpe_MQTT2","POWER",""));
}
}

Otto123

#1
Hi,

das geht nicht, entweder FHEM oder Perl :)

Wobei Du ja einfache zwei Perl Befehle hintereinander machst fhem(define at ...);;Log()

Das at wird definiert und der FHEM Befehl darin vom at ausgeführt. Der Perl Befehl danach natürlich sofort.

Du müsstest es so machen (nicht getestet):
fhem("define Brunnenpumpe_Statusmeldung at +00:00:03 {fhem("set Haus_bot message neuer Status der Tiefbrunnenpumpe ist [Garten_Tiefbrunnenpumpe_MQTT2:POWER]");;Log3(undef, 3, "neuer Status der Tiefbrunnenpumpe ist ".ReadingsVal("Garten_Tiefbrunnenpumpe_MQTT2","POWER",""))});

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Betonklotz

#2
Hallo Otto,

dein Code wollte er nicht schlucken, die } fehlt um die "innere" Perl Ebene zu schließen. Meinem Verständnis nach müsste die ans Ende, aber dann gibt es mecker wegen fehlenden Anführungszeichen, also dann wird das at nicht mehr erkannt.
Kurzum: ich gebe auf, ist nur ein Logeintrag den ich eh nur zu Testzwecken drin habe. Nehme ihn raus und schone meine Nerven...

Auch verstehe ich dein Vorgehen nicht: generell bin ich auf der Perl Ebene. Mit dem einleitenden fhem rufe ich in Perl den fhem Befehl auf und übergebe ihm alles was in der (runden) Klammer steht, nämlich das define at. Warum soll ich dann darin wieder auf Perl wechseln und direkt im Anschluss fhem aufrufen? Wenn dann hätte ich geschweifte Klammern hinten um das Log3 erwartet, weil das ja wieder Perl ist...

Gruß, Robert

Otto123

Hallo Robert,

nicht zu schnell aufgeben und Nerven lassen musst Du gleich gar nicht, da lohnt nicht :)
Ich habe den Fehler oben korrigiert.

Du liegst falsch mit Deinen Ebenen, mal sehen ob ich das darstellen kann:
rot-perl gelb-fhem
fhem("define Brunnenpumpe_Statusmeldung at +00:00:03 set Haus_bot message neuer Status der Tiefbrunnenpumpe ist [Garten_Tiefbrunnenpumpe_MQTT2:POWER]");;Log3(undef, 3, "neuer Status der Tiefbrunnenpumpe ist ".ReadingsVal("Garten_Tiefbrunnenpumpe_MQTT2","POWER",""));

Also so wie Dein Code jetzt ist, wird ein at angelegt aber der Log Eintrag sofort geschrieben!

Du wolltest aber eigentlich den Log Eintrag (Log3() ist ein Perl Befehl!)  mit im at ausführen, du willst also
define deinat at +00:00:03 set fhem bla; {Perlcode}
Das geht nicht! Also bleibt Dir nur:
define deinat at +00:00:03 { Alles als Perlcode}
Du musst also im at deinen fhem Befehl in Perl kapseln.

Jetzt klar?

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Betonklotz

#4
Hallo Otto,

danke dir.
Das hier war die für mich wichtigste Erkenntnis:

define deinat at +00:00:03 { Alles als Perlcode}

Ich wollte die Variante fhem + Perl Code mixen, da ich meinem Verständnis nach immer noch auf der fhem Ebene war und ich fhem mit dem ;; gesagt habe "da kommt noch ein Befehl der mit zum at gehört".
Jetzt kämpfe ich nur noch mit den Anführungszeichen

Can't find string terminator '"' anywhere before EOF at

aber das werde ich ncoh im Laufe des Tages hinbekommen.
Akteuller Stand:

fhem ("define Brunnenpumpe_Statusmeldung at +00:00:03 {fhem (\"set Haus_bot message neuer Status der Tiefbrunnenpumpe ist [Garten_Tiefbrunnenpumpe_MQTT2:POWER]\");;Log3 (undef, 5, neuer)}");

Der erste Teil (der FHEM Befehl mit der Telegram Nachricht) wird ausgeführt, der zweite Teil (der Logeintrag) fliegt mir noch um die Ohren.

Danke und Gruß,

Robert

Otto123

#5
Naja klar: Du musst fhem(" hier drin alle weiteren doppelten Anführungszeichen als \" schreiben ")
Oder die einfachen verwenden.
fhem("define Brunnenpumpe_Statusmeldung at +00:00:03 {fhem(\"set Haus_bot message neuer Status der Tiefbrunnenpumpe ist [Garten_Tiefbrunnenpumpe_MQTT2:POWER]\");;Log3(undef, 3, 'neuer Status der Tiefbrunnenpumpe ist '.ReadingsVal('Garten_Tiefbrunnenpumpe_MQTT2','POWER',''))}");
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Betonklotz

Hallo Otto,

die doppelten Anführungszeichen zu escapen, also immer \" zu schreiben hatte ich probiert und funktioniert auch im ersten Teil (dem fhem Stück). Im zweiten Teil funktioniert das aber nicht. Mit deiner Variante, die einfachen Anführungszeichen zu nutzen geht es.
Um es zu verstehen un in Zukunft besser zu machen: was ist der Unterschied zwischen einem \" (also Slash + doppelten Anführungszeichen) und einem ' (also einfachen Anführungszeichen). Wann nimmt man was von beiden?
Wie auch immer: DANKE!

Gruß, Robert

Otto123

#7
Hallo Robert,

das ist nicht so leicht zu sagen und es gibt viele Fallstricke. Ich hatte hier mal etwas aufgeschrieben, ist nicht komplett und aus meiner damaligen Situation entstanden.
Hier im Forum in der Perlecke gab es jüngst einen Beitrag über wann verwende ich einfache und wann doppelte. Daraus habe ich verstanden, eigentlich immer erstmal mal Einfache und wenn man braucht - Doppelte. Die doppelten erzeugen mehr "Aufwand" sie versuchen den Inhalt zu "verstehen" im Perl Sprachgebrauch auch Interpolation genannt. In erster Linie geht es darum Variablennamen durch deren Inhalt zu ersetzen.
Im Sinne von Strings kann man quasi durch einfache und doppelte die Strings schachteln.
" Text der auch noch 'anderen text' enthält. Dabei kann der Text 'mehrfach' kommen"

Mir fällt gerade auf, bei mir fehlte am Ende noch ein " ich habe das oben mal geändert.
Das hier sollte auch funktionieren.
{fhem(\"set Haus_bot message neuer Status der Tiefbrunnenpumpe ist [Garten_Tiefbrunnenpumpe_MQTT2:POWER]\");;Log3(undef, 3, \"neuer Status der Tiefbrunnenpumpe ist \".ReadingsVal(\"Garten_Tiefbrunnenpumpe_MQTT2\",\"POWER\",\"\"))}");

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Betonklotz

Hallo Otto,

danke dir.
Das mit dem escapen der Anführungszeichen hatte ich eigentlich probiert (sagte ich ja auch), aber weil ich mit der Perl und fhem Ebene auf Kriegsfuss stand, hatte ich das letzte Anführungszeichen auch mit escaped. Wenn ich darüber nachdenke und deine Lösung sehe: das ist natürlich falsch, weil die } Klammer vorher die (innere) Perl Ebene verlässt und das " zum fhem Kommando der äußeren Perl Ebene gehört.
Da \" auch funktioniert, nutze ich das. Das ist für mich irgendwie logischer: bin ich in Perl, rufe von dort fhem auf und mache dann wieder perl auf, dann sind die Zeichen zu escapen. "Ganz einfach", wenn man es denn weiß. Hab es mir gleich als ## Kommentar mit reingeschrieben in den Code warum und wieso.
Danke für die ausfühlichen Erklärungen, wieder was gelernt.

Gruß, Robert

P.S. das " hatte ich schon bei mir/für mich hinzugefügt

Betonklotz

Hallo Otto,

darf ich noch einmal stören und dich um Rat fragen? Da es immer umfangreicher wurde, wollte ich alles in eine externe Datei/Scriptdatei auslagern. Der Code dazu sieht wie folgt aus:

# Texte um nette Satusmeldungen im Log und per Telegram auszugeben
my $text_Pumpenstatus = "neuer Status der Tiefbrunnenpumpe ist: ";

# Festlegung wie eine Nachricht ans Handy verschickt wird
my $send_msg = "set Haus_bot message \@-38xxxxxxx";



#########################################################################
# ab hier nichts mehr anpassen
#########################################################################

fhem ("set Garten_Tiefbrunnenpumpe_MQTT2 on");
fhem ($send_msg." ".$text_Pumpe_an);
# fhem (define mein_Name at +00:00:03 {Perlcode});
# jegliche Sonderzeichen im inneren Perlcode müssen escaped werden
fhem ("define Brunnenpumpe_Statusmeldung at +00:00:03 {fhem (\"$send_msg $text_Pumpenstatus [Garten_Tiefbrunnenpumpe_MQTT2:POWER]\");;Log3 (undef, 3, \"$text_Pumpenstatus\".ReadingsVal(\"Garten_Tiefbrunnenpumpe_MQTT2\",\"POWER\",\"\"))}");

Das funktioniert auch soweit ganz gut. Das einzige Problem ist im Bereich der Telegram Nachrichten (aufs Handy). Dort kommen (wie gewünscht) kurz nacheinander zwei Nachrichten an, die zweite aber nicht an der übergebenen Nummer (my $send_msg =  \@-38xxxxxxx";), sondern an der default Nr. die im (Telegram)Device hinterlegt ist.
Die zweite Nachricht (also die problematische) sieht zudem so aus:

038xxxxxxx neuer Status der Tiefbrunennpumpe ist: OFF

Es wurde also eine "Null" zu Beginn eingefügt (anstatt des at/Klammeraffen  und Minuszeichens) und die gesamte Nummer als Text interpretiert und nicht als Parameter für die Rufnr. an die es gehen soll.

Es schient so als ob FHEM da einen Parameter verschluckt, aber ich habe keine Ahnung wieso

Gruß, Robert

Otto123

#10
Hallo Robert,

Du meinst diese fhem ($send_msg." ".$text_Pumpe_an); kommt an?
Und diese aus dem at {fhem (\"$send_msg $text_Pumpenstatus ... nicht?
Uff - ich würde spontan sagen, Du bist nochmal ein Etage tiefer:
$send_msg = "set Haus_bot message \@-38xxxxxxx";
Jetzt steht "set Haus_bot message @-38xxxxxxx" in der Variable.
Diese kommt wieder in einem fhem (" ") Aufruf, der versucht wieder die Variable zu interpolieren.

Probier es aus, im Prinzip so in der FHEM Kommandozeile:
1. Stufe:
{my $send_msg = "set Haus_bot message \@-38xxxxxxx";;return $send_msg}
2. Stufe
{my $send_msg = "set Haus_bot message @-38xxxxxxx";;return $send_msg}

Du musst im at fhem(' ') nehmen
fhem ("define Brunnenpumpe_Statusmeldung at +00:00:03 {fhem ('$send_msg $text_Pumpenstatus [Garten_Tiefbrunnenpumpe_MQTT2:POWER]');;Log3 (undef, 3, \"$text_Pumpenstatus\".ReadingsVal(\"Garten_Tiefbrunnenpumpe_MQTT2\",\"POWER\",\"\"))}");

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Betonklotz

Hallo Otto,

danke dir für deinen Einsatz.
Glaube das Problem liegt diesmal eher im Telegram Bot/Modul, denn dein Vorschlag mit dem \@ habe ich ja schon umgesetzt und erzeugt den Fehler.
Eingabe in Kommandozeile
==> Ausgabe


{my $send_msg = "set Haus_bot message \@-38xxxxxxx Testnachricht";;return $send_msg}
==> set Haus_bot message @-387274359 Testnachricht


ohne Slash vorm Klammeraffen

{my $send_msg = "set Haus_bot message @-38xxxxxxx Testnachricht";;return $send_msg}
==> set Haus_bot message 0387274359 Testnachricht


Wenn ich das richtig sehe, müsste also die erste Variante die korrekte sein, da durch den Slash der Klammeraffe geschützt wird. Aber genau die habe ich ja (so denke/hoffe ich zumindest) schon umgesetzt, bzw. deshalb hatte ich ja

my $send_msg = "set Haus_bot message \@-38xxxxxxx";

definiert (also mit dem "schützenden" Slash).

Auch deine Variante mit den einfachen Hochkommas schlägt fehl und die Telegram ID wird irgendwie nicht korrekt ausgewertet.
Habe daraufhin ein Update gemacht (vorher ein Backup), jetzt ist das Verhalten anders: nun haben beide Nachrichten das Problem, d.h.

fhem ($send_msg." ".$text_Pumpe_an);

kommt ebenfalls beim falschen Empfänger an. Wenigstens ist jetzt beides (gleich) falsch...
Aber lass sonst gut sein. Mach das "hartcodiert", denn damit lief alles wunderbar. Ist ja letztendlich nur Spielkram das auch noch mit Variablen zu machen.

Gruß, Robert

Betonklotz

Ich glaub mein Hamster bohnert...
Warum auch immer:

fhem ($send_msg." ".$text_Pumpe_an);

funktioniert jetzt wieder (ich habe kein Update, Neustart o.ä. gemacht, selbst die Handays und Tablets wurden nicht neu gestartet) wie es soll, während hingegen ein

fhem ("define Brunnenpumpe_Statusmeldung at +00:00:03 {fhem (\"$send_msg $text_Pumpenstatus [Garten_Tiefbrunnenpumpe_MQTT2:POWER]\");;Log3 (undef, 5, \"$text_Pumpenstatus\".ReadingsVal(\"Garten_Tiefbrunnenpumpe_MQTT2\",\"POWER\",\"\"))}");

wieder beim falschen Empfänger ankommt.
Hart codiert läuft es aber so wie es soll, d.h. ersetze ich $send_msg und $text_Pumpenstatus im ersten Teil (also dem fhem (\"$send_msg $text_Pumpenstatus [Garten_Tiefbrunnenpumpe_MQTT2:POWER]\")), dann ist alles so wie es sein soll...

Gruß, Robert

Otto123

Und Du bist sicher, das meine Variante aus #10 nicht auch funktioniert?

Dein eigentlich ist es analog zu dem, was man in der FHEM Kommandozeile probieren und anschauen kann. Man sieht was passiert.
{my $send_msg = "set Haus_bot message \@-38xxxxxxx";;my $ret= $send_msg."\n";;return $ret."Der Befehl lautet: '$send_msg'"}
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Betonklotz

Hallo Otto,

leider ja.

{my $send_msg = "set Haus_bot message \@-38xxxxxxx Testnachricht";;my $ret= $send_msg."\n";;return $ret."Der Befehl lautet: '$send_msg'"}
set Haus_bot message @-38xxxxxxx Testnachricht
Der Befehl lautet: 'set Haus_bot message @-38xxxxxxx Testnachricht'

Schaut also in meinen Augen alles super aus. Aus der Hilfe des Telegram Moduls zum set Befehl an sich:

set aTelegramBotDevice message @1234567 Bye
    to send the message "Bye" to a contact or chat with the id "1234567". Chat ids might be negative and need to be specified with a leading hyphen (-).

Da meine/die Chat ID negativ ist, habe ich bei mir ein "-" davor. So funktioniert es ja auch überall wenn ich es aufrufe. Aus meiner Laiensicht schient es nur irgendwo in den Tiefen von FHEM und/oder des Moduls bei der Übergabe/Weiterreichung ein Problem zu geben. Ich frage im TelegramBot Thread mal nach ob da was bekannt ist, da gibt es z.b. gerade ein Update weil sie "\n" gesondert behandeln. Von daher passiert da evtl. was demnächst.

Gruß, Robert