FHEM Forum

FHEM => Automatisierung => Thema gestartet von: Kharim am 15 März 2016, 07:04:17

Titel: FHEM/Perl String Erkennung
Beitrag von: Kharim am 15 März 2016, 07:04:17
Hallo Zusammen,

ich habe hier einen SMS gesteuerten Raspi/FHEM.
Der SMS Inhalt wird von extern auf einen Dummy übergeben.
Somit enthält der Dummy sozusagen den zu verarbeitenden Befehl.
Mit einer einfachenn if dummy eq "string" kann ich soweit schon arbeiten.

Nun möchte ich aber Befehle der Art "befehl wert" (also zb "Heizung 20" für 20°C) verarbeiten können.
Ich will nun also nur auf den ersten Teil des Strings vergleichen und den zweiten Teil als Wert zur Weiterverarbeitung speichern.

Wie stelle ich das an?

Danke,
Kharim
Titel: Antw:FHEM/Perl String Erkennung
Beitrag von: Otto123 am 15 März 2016, 09:18:20
Moin Kharim,

das setzen des Dummy erzeugt eigentlich einen Event, Du kannst ein notify auf den Dummy triggern lassen und hast als "Übergabe" den Event --> $EVENT. Und mittels $EVTPART1 und $EVTPART2 Zugriff auf die Teilstücke.

Du willst ja sowieso nur dann etwas auslösen wenn die SMS den Dummy setzt.

Gruß Otto
Titel: Antw:FHEM/Perl String Erkennung
Beitrag von: Ellert am 15 März 2016, 17:34:56
Mit DOIF etwa so:

define deinDOIF DOIF ([dummy:"^ersterTeil"]) (setreading dummy nurWert [dummy:state:d])

und dem Attribut "do always".
Titel: Antw:FHEM/Perl String Erkennung
Beitrag von: Kharim am 15 März 2016, 21:05:20
Zitat von: Otto123 am 15 März 2016, 09:18:20
Moin Kharim,

das setzen des Dummy erzeugt eigentlich einen Event, Du kannst ein notify auf den Dummy triggern lassen und hast als "Übergabe" den Event --> $EVENT. Und mittels $EVTPART1 und $EVTPART2 Zugriff auf die Teilstücke.

Du willst ja sowieso nur dann etwas auslösen wenn die SMS den Dummy setzt.

Gruß Otto

Hm, gute Idee, aber wenn ich das jetzt versuche umzusetzen bekomme ich folgende Meldung im Log:
2016.03.15 21:00:31 3: nf_SMSEmpfang return value: Global symbol "$EVTPART1" requires explicit package name at (eval 3031) line 36.
Global symbol "$EVTPART2" requires explicit package name at (eval 3031) line 38.


Die Bedingung dazu sieht folgend aus (Am Beispiel eines Guthabens):
if($EVTPART1 eq "Guthaben")
{
fhem("set Guthaben $EVTPART2");
}


Das ist ein Teil einer Notify, die an dem Dummy des SMS Strings hängt und wiederum einen Dummy "Guthaben" setzen soll....

Danke,
Kharim
Titel: Antw:FHEM/Perl String Erkennung
Beitrag von: dev0 am 15 März 2016, 21:24:04
Da Du weder die Notify Definition noch das Event gepostet hast, kann man nur raten, dass die regexp des Notify zu weit gefasst ist.
Titel: Antw:FHEM/Perl String Erkennung
Beitrag von: Kharim am 16 März 2016, 07:02:08
Sorry, ich versuch es nochmal zusammen zu fassen.

Die Notify ist wie folgt definiert:

SMSEmpfang:.* {
[...]
if($EVTPART1 eq "Guthaben")
{
   fhem("set Guthaben $EVTPART2");
}
}

Der Dummy SMSEmpfang selbst wird von einem Shell Script mittels "fhem.pl ip:port set SMSEmpfang 'Guthaben 345'" gesetzt - das funktioniert auch.
Aber eben die IF, die den Befehl "Guthaben" erkennen und den Wert auf den Dummy Guthaben schreiben soll, reagiert nicht.
Titel: Antw:FHEM/Perl String Erkennung
Beitrag von: dev0 am 16 März 2016, 09:55:30
Zitat
SMSEmpfang:.*
Ich gehe immer noch davon aus, dass .* zu weit gefasst ist und ein Event das Notify triggert, dass kein $EVTPART1 beinhaltet.
Wenn Du in einem Notify Events mit unterschiedlich vielen Argumenten verarbeiten möchtest, dann kannst Du abfragen ob das Argument definiert ist "if(defined $EVTPART1)" oder mehrere Notifies verwenden, die die regexp des Notify enger fassen, damit diese Situation nicht auftritt.
Titel: Antw:FHEM/Perl String Erkennung
Beitrag von: Otto123 am 16 März 2016, 11:46:03
Sorry Kharim, was ich gerade sehe Du hast den $EVTPART einfach so genommen, das "Array" beginnt aber bei 0. Also
$EVTPART0 $EVTPART1 usw...

Wie der Event genau aussieht, solltest Du Dir im Eventmonitor anschauen. Und dann den Filter schärfer bauen, nicht nur .*

Gruß Otto
Titel: Antw:FHEM/Perl String Erkennung
Beitrag von: Kharim am 18 März 2016, 06:49:26
Zitat von: Otto123 am 16 März 2016, 11:46:03
Sorry Kharim, was ich gerade sehe Du hast den $EVTPART einfach so genommen, das "Array" beginnt aber bei 0. Also
$EVTPART0 $EVTPART1 usw...

Wie der Event genau aussieht, solltest Du Dir im Eventmonitor anschauen. Und dann den Filter schärfer bauen, nicht nur .*

Gruß Otto

Das war der Fehler.
if($EVTPART0 eq "Guthaben")
{
fhem("set Guthaben $EVTPART1");
}

So funktioniert es nun :-)
Erstaunlicher Weise erscheint im EventMonitor erst das Setzen vom Dummy Guthaben und danach das Setzen von Dummy SMSEmpfang, an dem ja erst die Notify hängt.
Hätte es genau anders herum erwartet...
2016-03-18 06:45:15 dummy SMSEmpfang bla
2016-03-18 06:45:23 dummy Guthaben 3,45
2016-03-18 06:45:23 dummy SMSEmpfang Guthaben 3,45

Ich danke euch,
Kharim