[gelöst] Richtiges Escapen in der 99_myUtils

Begonnen von t1me2die, 23 März 2018, 18:19:26

Vorheriges Thema - Nächstes Thema

t1me2die

Moin liebe Leute, ich habe ein Problem mit der richtigen Schreibweise in einer meiner Sub's in der 99_myUtils.
Ich versuche mir via Telegram Blitzerinformationen zuzuschicken.

Der Code ist nur ein kleiner Teilausschnitt!

Zuerst einmal reagiere ich auf die $message die ich via Telegram empfangen habe:

.....
        if (($message =~ /Blitzer/g) and ($message ne "Hilfe Blitzer"))
        {
            fhem "set Telegram message \@$id " .getBlitzer($message,$id);
        }
.....


Ich hole mir in der sub getBlitzer($$) die Informationen, wenn der jeweilige Blitzer schon als Device vorhanden ist.
Bis hier hin funktioniert alles.

Falls der Blitzer als Device noch nicht angelegt ist, lege ich diesen an
$error = 0 -> bedeutet das das Device schon vorhanden ist
$error = 1 -> bedeutet das ich das Device angelegt habe

    # Wenn kein Fehler vorhanden ist Daten auslesen
    if ($error != -1)
    {
        if ($error == 0)
        { return getInfoBlitzer($device); }
        elsif ($error == 1)
        {
            fhem "define temp_Blitzer at +00:00:07 { fhem \"set Telegram message \@$id \" .getInfoBlitzer(\"$device\") }";
            return "" .getEmoji(55) ."Sekunde, ich sammle alle Informationen!";
        }
    }


Und genau hier bekomme ich Probleme. Wenn ich das Device gerade erst angelegt habe, möchte ich gerne ein "at" weniger Sekunden danach noch einmal starten.
(das Auslesen via HTTPMOD und dem jeweiligen Regex kann ja manchmal ein paar Sekunden dauern)
Dummerweise kommt die Nachricht aber nicht bei der eigentlichen $id an, sondern immer bei dem defaultPeer, der bei Telegram hinterlegt ist.


Internals:
   CFGFN     
   COMMAND    { fhem "set Telegram message @2741XXXXX " .getInfoBlitzer("mb_Hamm") }
   DEF        2018-03-23T18:09:02 { fhem "set Telegram message @2741XXXXX " .getInfoBlitzer("mb_Hamm") }
   NAME       temp_Blitzer
   NR         17242
   NTM        18:09:02
   PERIODIC   no
   RELATIVE   yes
   STATE      Next: 18:09:02
   TIMESPEC   00:00:07
   TRIGGERTIME 1521824942.06834
   TRIGGERTIME_FMT 2018-03-23 18:09:02
   TYPE       at
   VOLATILE   1
   Helper:
     DBLOG:
       state:
         myDbLog:
           TIME       1521824935.07031
           VALUE      Next
   READINGS:
     2018-03-23 18:08:55   state           Next: 18:09:02
Attributes:
   DbLogExclude .*


An die ID: 2741XXXXX kommt die Nachricht leider nie an, wenn der "at" läuft.

Irgendwie verzweifel ich daran gerade und hoffe, dass wir jemand etwas Klarheit ins Dunkle bringen kann.

Gruß
Mathze

helmut

Zitat von: t1me2die am 23 März 2018, 18:19:26
            fhem "define temp_Blitzer at +00:00:07 { fhem \"set Telegram message \@$id \" .getInfoBlitzer(\"$device\") }";

Hallo Mathze,

mit
{ my ($id, $device);; fhem ("define temp_Blitzer at +00:00:07 { fhem \"set Telegram message \\\@\$id \" .getInfoBlitzer(\"\$device\") }") }
sieht das Ergebnis ganz gut aus:
   DEF        2018-03-23T19:54:25 { fhem "set Telegram message \@$id " .getInfoBlitzer("$device") }

Gruss Helmut
Intelligenz ist die Fähigkeit, Arbeit zu vermeiden, aber dafür zu sorgen, daß die Arbeit gemacht wird.
(Linus Torvalds)

t1me2die

Moin Helmut,

Hätte ich hier mal 20Minuten eher gelesen...
Ich habe es eben durch ausprobieren auch herausbekommen und ja, du hast Recht!

Es muss wie folgt ausschauen:


fhem "define temp_Blitzer at +00:00:07 { fhem \"set Telegram message [color=red]\\\[/color]@$id \" .getInfoBlitzer(\"$device\") }";


Ich musste den Backslash also auch noch einmal selbst escapen  :-X

Danke für deine Hilfe  :-*

Gruß
Mathze

helmut

Hallo Mathze,

und das funktioniert bei Dir ohne Maskierung der beiden "$" Zeichen? Merkwuerdig. Wenn ich das
versuche, bekomme ich eine Fehlermeldung:
Can't use an undefined value as an ARRAY reference at (eval 23242) line 1.

Gruss Helmut
Intelligenz ist die Fähigkeit, Arbeit zu vermeiden, aber dafür zu sorgen, daß die Arbeit gemacht wird.
(Linus Torvalds)