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
Hi,
eventuell hilft diese Diskussion als Anregung -> https://forum.fhem.de/index.php/topic,75024.msg667762.html#msg667762
Gruß Otto
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
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
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
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
Hallo phantom,
mein letzter Versuch ... :o
... ([WS2000IP:TH5:"(.*):(.*):(-?\d+(\.\d+)?)":$3] > 25)
Gruß Jens
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
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)...
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
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
@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
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.
Danke noch für die Info zum Verständis.
Damit ist das Thema gelöst.
Phantom