[gelöst] Filtern von mehreren Zahlen im Event

Begonnen von phantom, 13 August 2017, 12:48:03

Vorheriges Thema - Nächstes Thema

phantom

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

Otto123

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

EIB-Fan

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

phantom

#3
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

EIB-Fan

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

phantom

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

EIB-Fan

Hallo phantom,

mein letzter Versuch ...  :o

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

Gruß Jens

phantom

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

Damian

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)...
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Gisbert

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
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY

EIB-Fan

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

phantom

@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

Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

phantom

#13
Danke noch für die Info zum Verständis.
Damit ist das Thema gelöst.
Phantom