FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: phantom am 13 August 2017, 12:48:03

Titel: [gelöst] Filtern von mehreren Zahlen im Event
Beitrag von: phantom am 13 August 2017, 12:48:03
Hallo,

ich habe im DOIF das Problem ein Event mit mehreren Zahlen korrekt zu filtern:
Mein Device  WS2000IP erzeugt für TH5  z.B. das Event:   TH5 => T:23.8 C, H:53.2 %

Habe so versucht mit dem Filter 'd' die zweite Zahl herauszufiltern, um sie numerisch vergleichen zu können:
define doif_Test DOIF  ([WS2000IP:TH5:d:$2] gt 25) (set....)
oder
....... DOIF  ([WS2000IP:TH5:"(-?\d+(\.\d+)?) \%":$2] gt 25) (set....)        um die 53.2 aus 53.2 % zu erwischen

P.S: Wenn ich $2 (für die zweite Zahl) gibt's eine Warnung: "condition c01: Use of uninitialized value $2 in string"

Gibt es hierzu einen Tipp?
Gruß
Phantom
Titel: Antw:Filtern von mehreren Zahlen im Event
Beitrag von: Otto123 am 13 August 2017, 14:10:08
Hi,

eventuell hilft diese Diskussion als Anregung -> https://forum.fhem.de/index.php/topic,75024.msg667762.html#msg667762

Gruß Otto
Titel: Antw:Filtern von mehreren Zahlen im Event
Beitrag von: EIB-Fan am 13 August 2017, 14:39:11
Hallo phantom,

sollte es nicht einfach

define doif_Test DOIF ([WS2000IP:H:d] > 25) (set....)

heißen?

Wenn das nicht funktioniert, wäre ein List deines Device sinnvoll ...

Viel Erfolg!

Gruß Jens
Titel: Antw:Filtern von mehreren Zahlen im Event
Beitrag von: phantom am 13 August 2017, 15:08:04
Hi,

@Otto123:
Das Problem tritt m.E. innerhalb der DOIF-Definition auf. Lt. commandref sollte man mit  [mydevice:myreading:"(-?\d+(\.\d+)?)":"$1"] die erste Zahl aus dem Regex-Ergebnis filtern können.
Es klappt jedoch nur mit $1 und filtert damit nur die erste Zahl aus dem Reading raus. Nimmt man $2 oder $3, kommt die o.g. Fehlermeldung.
Wie bekomme ich deinen Tip zur Stringzerlegung mit split in den DOIF-Filter ?   


@EIB-Fan:
Das klappt leider nicht so einfach ;  Das Device (eine Wetterstation) sieht so aus:

   NAME       WS2000IP
   NR         61
   STATE      TH7 => T: 9 C, H: 0 %
   TYPE       WS2000
   READINGS:
     2017-08-13 14:27:20   TH1             TH1 => T: 20.9 C, H: 67 %
     2017-08-13 14:38:54   TH2             TH2 => T: 23.6 C, H: 52 %
     2017-08-13 14:35:48   TH4             TH4 => T: 24.7 C, H: 61 %
     2017-08-13 14:39:04   TH5             TH5 => T: 24.2 C, H: 61 %

Es werden laufend o.g. Readings erzeugt; mit dem DOIF möchte ich auf den Wert  H: größer als 25 %  von Reading  TH5  triggern.
D.h. ich muß die 61 aus dem Reading rausfiltern.


kleine Anmerkung: 
nimmt man     ... ([WS2000IP:TH5:d:$1] > 2)    klappt das Triggern auf   TH5 => T: 24.2 C, H: 61 %   , da die erste Zahl(=5 von TH5) gefiltert wird
es sollte also   ... ([WS2000IP:TH5:d:$3] > 25)  damit kann man jedoch nicht auf die dritte Zahl (die 61) triggern, da o.g. Fehlermeldung kommt

oder gibt es einen ganz anderen, einfacheren Weg dies zur erreichen, wenn DOIF das so nicht unterstützt?

Phantom
Titel: Antw:Filtern von mehreren Zahlen im Event
Beitrag von: EIB-Fan am 13 August 2017, 16:06:05
Hallo phantom,

versuch doch mal:

... ([WS2000IP:TH5:"(-?\d+(\.\d+)?):(-?\d+(\.\d+)?):(-?\d+(\.\d+)?)":$3] > 25)

Man kann das dann sicher noch kürzen.

Gruß Jens
Titel: Antw:Filtern von mehreren Zahlen im Event
Beitrag von: phantom am 13 August 2017, 16:15:13
Hi EIB-Fan,

leider kommt dann als Fehlermeldung:     warning   condition c01: Argument "" isn't numeric in numeric gt (>)

... ([WS2000IP:TH5:"(-?\d+(\.\d+)?):(-?\d+(\.\d+)?):(-?\d+(\.\d+)?)":$3] > 25)
... ([WS2000IP:TH5:"(-?\d+(\.\d+)?):(-?\d+(\.\d+)?):(-?\d+(\.\d+)?)":"$3"] > 25)


beide Varianten bringen die Fehlermeldung,  es scheint so als ob DOIF nur $1 versteht ??

schade, klingt eigentlich sinnvoll

Gruß Phantom
Titel: Antw:Filtern von mehreren Zahlen im Event
Beitrag von: EIB-Fan am 13 August 2017, 16:20:13
Hallo phantom,

mein letzter Versuch ...  :o

... ([WS2000IP:TH5:"(.*):(.*):(-?\d+(\.\d+)?)":$3] > 25)

Gruß Jens
Titel: Antw:Filtern von mehreren Zahlen im Event
Beitrag von: phantom am 13 August 2017, 16:27:52
Hi EIB-Fan,

dies bringt leider die gleiche Fehelrmeldung :-(
Es scheint so, als ob DOIF daran scheitert, denn lt. commandref, sollte so etwas möglich sein:
[mydevice:myreading:"(\d\d):(\d\d):(\d\d)":"hours: $1, minutes $2, seconds: $3"]


evtl. ein Bug im DOIF, wenn man nicht nur $1 nimmt ?

Dennoch besten Dank für deine Ideen.
Gruß Phantom
Titel: Antw:Filtern von mehreren Zahlen im Event
Beitrag von: Damian am 13 August 2017, 17:03:18
Zitat von: EIB-Fan am 13 August 2017, 16:20:13
Hallo phantom,

mein letzter Versuch ...  :o

... ([WS2000IP:TH5:"(.*):(.*):(-?\d+(\.\d+)?)":$3] > 25)

Gruß Jens
mein erster und wahrscheinlich auch mein letzter Versuch :)

...([WS2000IP:TH5:"H: (.*) %",0] > 25)...
Titel: Antw:Filtern von mehreren Zahlen im Event
Beitrag von: Gisbert am 13 August 2017, 17:21:52
Mal ne ganz andere Idee:

{substr(ReadingsVal('WS2000IP','TH5',''),2,4} liefert 23.8.
Man fängt bei Null an zu zählen, die erste Stelle, die dich interessiert, hat die Nr. 2 und dann kommen die 4 Stellen, die du auslesen willst.
Ob man damit innerhalb eines DOIF's rechnen kann, da bin ich mir aber nicht im klaren drüber.
Es wäre aber einen Versuch Wert.

Was du auch machen kannst, ist ein userReading zu definieren:
attr WS2000IP userReadings myTemp {substr(ReadingsVal('WS2000IP','TH5',''),2,4}, myHum {substr(ReadingsVal('WS2000IP','TH5',''),12,4}
Dadurch werden neue Readings erzeugt, die du in DOIF genauso wie schon vorhandene Readings verwenden kannst.

Viele Grüße
Gisbert
Titel: Antw:Filtern von mehreren Zahlen im Event
Beitrag von: EIB-Fan am 13 August 2017, 17:34:22
Zitatmein erster und wahrscheinlich auch mein letzter Versuch :)

Code: [Auswählen]

...([WS2000IP:TH5:"H: (.*) %",0] > 25)...


@Damian: Ich hatte es befürchtet ...  ??? ;D

Gruß Jens
Titel: Antw:Filtern von mehreren Zahlen im Event
Beitrag von: phantom am 13 August 2017, 17:41:39
@Damian:

so einfach kann das gehen :-)  -> es klappt
dann reicht wohl DOIF  bei deinem vorgeschlagenen regex nur die Zahl 61 weiter und nicht den ganzen Teilstring  H: 61 %   
wie es die normalen regex-tester machen; das hatte ich so nicht gesehen
die $1, $2, $3 Methode ist dann wohl müßig noch weiterzuverfolgen
DANKE für die einfache Lösung


@Gisbert:
Auch deine Idee kann ich direkt an andere Stelle gebrauchen
Danke auch Dir

Gruß phantom
Titel: Antw:Filtern von mehreren Zahlen im Event
Beitrag von: Damian am 13 August 2017, 18:16:21
Zitat von: phantom am 13 August 2017, 17:41:39
@Damian:

so einfach kann das gehen :-)  -> es klappt
dann reicht wohl DOIF  bei deinem vorgeschlagenen regex nur die Zahl 61 weiter und nicht den ganzen Teilstring  H: 61 %   
wie es die normalen regex-tester machen; das hatte ich so nicht gesehen
die $1, $2, $3 Methode ist dann wohl müßig noch weiterzuverfolgen
DANKE für die einfache Lösung


@Gisbert:
Auch deine Idee kann ich direkt an andere Stelle gebrauchen
Danke auch Dir

Gruß phantom

aus der Commandref:

Zitat<Output> - ist ein optionaler Parameter, hier können die in den Variablen $1, $2, usw. aus der Regex-Suche gespeicherten Informationen für die Aufbereitung genutzt werden. Sie werden in Anführungszeichen bei Texten oder in Perlfunktionen angegeben. Wird kein Output-Parameter angegeben, so wird automatisch $1 genutzt.

die Syntax entspricht also:

...([WS2000IP:TH5:"H: (.*) %":$1, 0] > 25)...


Regex mit runden Klammern gehört dann zum Perl-Teil und lässt sich in der entsprechenden Perldoku nachlesen.
Titel: [gelöst] Filtern von mehreren Zahlen im Event
Beitrag von: phantom am 13 August 2017, 21:50:26
Danke noch für die Info zum Verständis.
Damit ist das Thema gelöst.
Phantom