(gelöst) DOIF: Für Ereignis muss zunächst Zahl aus String extrahiert werden

Begonnen von heikoh81, 17 Januar 2016, 17:19:30

Vorheriges Thema - Nächstes Thema

heikoh81

Hallo zusammen,

ich möchte wie im commandref_DE-Beispiel beschrieben eine Fritz!Dect 200 ausschalten, wenn der gemessene Verbrauch länger als 5min < 10 Watt war.

Problem: Das Reading "power" der FritzDect wird als String ausgegeben, z.B. "0.00 W"
Es muss also die Zahl aus dem String extrahiert werden. Im Notify habe ich das in Perl wie folgt gelöst:

{ if ( substr(ReadingsVal("FBDECT_01_Wasch","power",""), 0, length(ReadingsVal("FBDECT_01_Wasch","power",""))-2) <= 4
...
}


Leider wirft mir DOIF eine Fehlermeldung aus, dass er eine gültige Timespec erwartet, wenn ich den DOIF wie folgt schreibe:

define KellerSSD_5min_AutoOff DOIF ([{substr(ReadingsVal("FBDECT_05_KellerSSD","power",""), 0, length(ReadingsVal("FBDECT_05_KellerSSD","power",""))-2)}] < 10)
(set FBDECT_05_KellerSSD off)


Wie könnte ich also als Ereignis die Watt-Zahl numerisch extrahieren?
Oder ist das ohne Zwischenschritt nicht möglich?

Viele Grüße,
Heiko


heikoh81

Zitat von: Ellert am 17 Januar 2016, 18:01:44
Ohne Worte: http://fhem.de/commandref_DE.html#DOIF_Filtern_nach_Zahlen  ;)

Danke, Wald vor Bäumen wohl nicht gesehen :-)
Desto mehr ich DOIF verwende, desto genialer wird es.
Alle meine Probleme einfach gelöst.

Viele Grüße,
Heiko

heikoh81

Muss den Thread nochmal aufmachen.
Habe das DOIF jetzt wie folgt aufgebaut:


(([FBDECT_05_KellerSSD:power:d] < 10) and (?[FBDECT_05_KellerSSD:power:d] > 0))
(set NAME=FBDECT_05_KellerSSD:FILTER=STATE=on off)
DOELSEIF (([FBDECT_05_KellerSSD:power:d] == 0) or ([FBDECT_05_KellerSSD:power:d] >= 10))


Im Log erscheint:

2016.01.18 23:37:33 1: PERL WARNING: Use of ?PATTERN? without explicit operator is deprecated at (eval 83050) line 1.
2016.01.18 23:37:33 2: di_KellerSSD_5min_AutoOff: perl error in condition: (ReadingValDoIf('FBDECT_05_KellerSSD','power','(-?\d+(\.\d+)?)') < 10) and (?ReadingValDoIf('FBDECT_05_KellerSSD','power','(-?\d+(\.\d+)?)') > 0): Unmatched ( in regex; marked by <-- HERE in m/ReadingValDoIf('FBDECT_05_KellerSSD','power','( <-- HERE -/ at (eval 83050) line 1.


Mit dieser Fehlermeldung stehe ich jetzt auf dem Schlauch, v.a. wegen der "deprecated"-Warnung (Befehl veraltet).

Viele Grüße,
Heiko

Ellert

Zitat(([FBDECT_05_KellerSSD:power:d] < 10) and (?[FBDECT_05_KellerSSD:power:d] > 0))
   (set NAME=FBDECT_05_KellerSSD:FILTER=STATE=on off)
DOELSEIF (([FBDECT_05_KellerSSD:power:d] == 0) or ([FBDECT_05_KellerSSD:power:d] >= 10))
Das Fragezeichen sitzt an der falschen Stelle.

heikoh81