Wenn ich sowas habe: ( ["Pflanze.:statMoistureTendency1h"]>2)
(setreading $DEVICE gotWater 1)
DOELSEIF( ["Pflanze.:statMoistureTendency1h"]<=0)
(setreading $DEVICE gotWater 0)
arbeitet doif dann für jeden Treffer von Pflanze? Also z.b. Pflanze1 und Pflanze2 oder entspricht es einem
([Pflanze1:statMoistureTendency1h]>2 or [Pflanze2:statMoistureTendency1h]>2)....
Also sind es unabhängige Instanzen, oder eine gemeinsame?
Mein Ziel ist es je Pflanze1, Pflanze2, PflanzeX ein Reading zu generieren, dass auf 1 ist wenn statMoistureTendency1h>2 war und zurücksetzen, wenn es <=0 war.
Vielleicht bring ich hier 2 Baustellen durcheinander:
Internals:
CFGFN
DEF ( ["Pflanze.:statMoistureTendency1h"]>2)
(setreading $DEVICE gotWater 1)
DOELSE
(setreading $DEVICE gotWater 0)
NAME doif_plantgotwater
NR 1624
NTFY_ORDER 50-doif_plantgotwater
STATE cmd_2
TYPE DOIF
Helper:
Dblog:
Cmd:
Logdb:
TIME 1485888093.41521
VALUE 2
Cmd_event:
Logdb:
TIME 1485888093.41521
VALUE Pflanze1
Cmd_nr:
Logdb:
TIME 1485888093.41521
VALUE 2
State:
Logdb:
TIME 1485888093.41521
VALUE cmd_2
Readings:
2017-01-31 19:41:33 Device Pflanze1
2017-01-31 19:41:33 cmd 2
2017-01-31 19:41:33 cmd_event Pflanze1
2017-01-31 19:41:33 cmd_nr 2
2017-01-31 19:41:33 matched_event_c1_1 statMoistureTendency1h +33
2017-01-31 19:41:33 state cmd_2
Condition:
0 EventDoIf('Pflanze.',$hash,'statMoistureTendency1h',0)>2
Devices:
Do:
0:
0 setreading $DEVICE gotWater 1
1:
0 setreading $DEVICE gotWater 0
Helper:
event statMoistureTendency1h +33
globalinit 1
last_timer 0
sleeptimer -1
timerdev Pflanze1
timerevent statMoistureTendency1h +33
triggerDev Pflanze1
timerevents:
statMoistureTendency1h +33
timereventsState:
statMoistureTendency1h +33
triggerEvents:
statMoistureTendency1h +33
triggerEventsState:
statMoistureTendency1h +33
Internals:
Itimer:
Readings:
Regexp:
0:
0 Pflanze.:statMoistureTendency1h
All:
0 Pflanze.:statMoistureTendency1h
State:
Trigger:
Attributes:
do always
room Pflanzen
Befehl: trigger Pflanze1 statMoistureTendency1h +33
Soll: das erste Kommando sollte ausgeführt werden, da >2
Ist: Es wird immer das 2te Komanndo ausgeführt.
Was mach ich verkehrt?
Zitat von: andi11 am 31 Januar 2017, 19:44:48
Vielleicht bring ich hier 2 Baustellen durcheinander:
Internals:
CFGFN
DEF ( ["Pflanze.:statMoistureTendency1h"]>2)
(setreading $DEVICE gotWater 1)
DOELSE
(setreading $DEVICE gotWater 0)
NAME doif_plantgotwater
NR 1624
NTFY_ORDER 50-doif_plantgotwater
STATE cmd_2
TYPE DOIF
Helper:
Dblog:
Cmd:
Logdb:
TIME 1485888093.41521
VALUE 2
Cmd_event:
Logdb:
TIME 1485888093.41521
VALUE Pflanze1
Cmd_nr:
Logdb:
TIME 1485888093.41521
VALUE 2
State:
Logdb:
TIME 1485888093.41521
VALUE cmd_2
Readings:
2017-01-31 19:41:33 Device Pflanze1
2017-01-31 19:41:33 cmd 2
2017-01-31 19:41:33 cmd_event Pflanze1
2017-01-31 19:41:33 cmd_nr 2
2017-01-31 19:41:33 matched_event_c1_1 statMoistureTendency1h +33
2017-01-31 19:41:33 state cmd_2
Condition:
0 EventDoIf('Pflanze.',$hash,'statMoistureTendency1h',0)>2
Devices:
Do:
0:
0 setreading $DEVICE gotWater 1
1:
0 setreading $DEVICE gotWater 0
Helper:
event statMoistureTendency1h +33
globalinit 1
last_timer 0
sleeptimer -1
timerdev Pflanze1
timerevent statMoistureTendency1h +33
triggerDev Pflanze1
timerevents:
statMoistureTendency1h +33
timereventsState:
statMoistureTendency1h +33
triggerEvents:
statMoistureTendency1h +33
triggerEventsState:
statMoistureTendency1h +33
Internals:
Itimer:
Readings:
Regexp:
0:
0 Pflanze.:statMoistureTendency1h
All:
0 Pflanze.:statMoistureTendency1h
State:
Trigger:
Attributes:
do always
room Pflanzen
Befehl: trigger Pflanze1 statMoistureTendency1h +33
Soll: das erste Kommando sollte ausgeführt werden, da >2
Ist: Es wird immer das 2te Komanndo ausgeführt.
Was mach ich verkehrt?
Du musst zwischen Readings und Ereignissen unterscheiden. Readings lassen sich im DOIF nur device-spezifisch angeben. Ereignissabfragen können auf verschiedene Devices reagieren. Es gibt ein neues Feature, das tatsächlich auch Abfrage nach Werten bei Ereignissen erlaubt. Auszug aus der Commandref:
ZitatAllgemeine Ereignistrigger können ebenfalls so definiert werden, dass sie nicht nur wahr zum Triggerzeitpunkt und sonst nicht wahr sind, sondern Inhalte des Ereignisses zurückliefern. Initiiert wird dieses Verhalten durch die Angabe eines Default-Wertes.
Syntax:
["regex for trigger",<default value>]
Anwendungsbeispiel:
define di_warning DOIF ([":^temperature",0]< 0 and [06:00-09:00] ) (set pushmsg danger of frost)
Damit wird auf alle Devices getriggert, die mit "temperature" im Event beginnen. Zurückgeliefert wird der Wert, der im Event hinter "temperature: " steht. Wenn kein Event stattfindet, wird der Defaultwert, hier 0, zurückgeliefert.
Dann müsste es so funktionieren oder?
( ["Pflanze.:statMoistureTendency1h",0]>2)
(setreading $DEVICE gotWater 1)
DOELSE
(setreading $DEVICE gotWater 0)
(Attribut do always ist gesetzt)
Aber bei einem trigger Pflanze1 statMoistureTendency1h +5 führt er trotzdem Befehl 2 aus.
Wenn ich als Default Wert 3 nehme, dann wird der erste Befehl ausgeführt. Also liefert "Pflanze.:statMoistureTendency1h" scheinbar nichts brauchbares.
Selbst mit ( [Pflanze1:statMoistureTendency1h]>2) wird immer Befehl 2 ausgeführt.
Inhalt vom Reading ist +33 bei meinen Tests.
Wirklich +33? Dann versuch mal mit :d (https://fhem.de/commandref_DE.html#DOIF_Filtern_nach_Zahlen) zu arbeiten.
Ja es ist wirklich +3. Ansonsten z.b. +0 oder -3
Ich teste jetzt fix mit Pflanze1 auch wenn mir PflanzeXXX lieber wäre:
( [Pflanze1:statMoistureTendency1h:d]>2)
(setreading $DEVICE gotWater 1)
DOELSE
(setreading $DEVICE gotWater 0)
und ein trigger Pflanze1 statMoistureTendency1h +5 ergibt dann folgendes list des doif
Internals:
CFGFN
DEF ( [Pflanze1:statMoistureTendency1h:d]>2)
(setreading $DEVICE gotWater 1)
DOELSE
(setreading $DEVICE gotWater 0)
NAME doif_plantgotwater
NR 1624
NTFY_ORDER 50-doif_plantgotwater
STATE cmd_2
TYPE DOIF
Helper:
Dblog:
Cmd:
Logdb:
TIME 1485964637.64327
VALUE 2
Cmd_event:
Logdb:
TIME 1485964637.64327
VALUE Pflanze1
Cmd_nr:
Logdb:
TIME 1485964637.64327
VALUE 2
State:
Logdb:
TIME 1485964637.64327
VALUE cmd_2
Readings:
2017-02-01 16:57:17 Device Pflanze1
2017-02-01 16:57:17 cmd 2
2017-02-01 16:57:17 cmd_event Pflanze1
2017-02-01 16:57:17 cmd_nr 2
2017-02-01 16:57:17 e_Pflanze1_statMoistureTendency1h -3
2017-02-01 16:57:17 state cmd_2
Condition:
0 ReadingValDoIf($hash,'Pflanze1','statMoistureTendency1h','','(-?\d+(\.\d+)?)')>2
Devices:
0 Pflanze1
all Pflanze1
Do:
0:
0 setreading $DEVICE gotWater 1
1:
0 setreading $DEVICE gotWater 0
Helper:
event call data,lightintegral: 63788157.1461302,lightintegralday: 738.288855857988,lightintegraldaystate: 738.29,statTemperatureDayAvg: 23.1
globalinit 1
last_timer 0
sleeptimer -1
timerdev Pflanze1
timerevent call data,lightintegral: 63788157.1461302,lightintegralday: 738.288855857988,lightintegraldaystate: 738.29,statTemperatureDayAvg: 23.1
triggerDev Pflanze1
timerevents:
call data
lightintegral: 63788157.1461302
lightintegralday: 738.288855857988
lightintegraldaystate: 738.29
statTemperatureDayAvg: 23.1
timereventsState:
state: call data
lightintegral: 63788157.1461302
lightintegralday: 738.288855857988
lightintegraldaystate: 738.29
statTemperatureDayAvg: 23.1
triggerEvents:
call data
lightintegral: 63788157.1461302
lightintegralday: 738.288855857988
lightintegraldaystate: 738.29
statTemperatureDayAvg: 23.1
triggerEventsState:
state: call data
lightintegral: 63788157.1461302
lightintegralday: 738.288855857988
lightintegraldaystate: 738.29
statTemperatureDayAvg: 23.1
Internals:
Itimer:
Readings:
0 Pflanze1:statMoistureTendency1h
all Pflanze1:statMoistureTendency1h
Regexp:
0:
All:
State:
Trigger:
Attributes:
do always
room Pflanzen
Interessant dabei ist das e_Pflanze1_statMoistureTendency1h reading mit -3
Und als kleine Randnotiz. Ich weis dass ich das auch mit einem Userreading lösen könnte, aber für die Fehlersuche hab ich das DOIF erstmal so einfach wie möglich gelassen.
jetzt tut es irgendwie, habe wohl vor lauter testen gerade mit "trigger" Mist gebaut.
( [Pflanze1:statMoistureTendency1h:d]>2)
(setreading $DEVICE gotWater 1)
DOELSE
(setreading $DEVICE gotWater 0)
Wie ist dafür die korrekte Schreibeweise mit regexp für Pflanze1,Pflanze2...?
["Pflanze.:statMoistureTendency1h",0]
aber wie bekomme ich da dass :d mit rein?
Entweder
["Pflanze.:statMoistureTendency1h":d,0]
oder
["Pflanze.:statMoistureTendency1h:d",0]
Zitat von: Per am 02 Februar 2017, 14:38:59
Entweder
["Pflanze.:statMoistureTendency1h":d,0]
wird zukünftig funktionieren, ist aber noch nicht ausprogrammiert. Daher muss man sich noch etwas behelfen und die voreingestellte Regex: "[^\:]*: (.*)" für Zahlen anpassen z. B. hier:
["^Pflanze:statMoistureTendency1h":"[^\:]*: [^\d]*(\d+)",0]
Zitat von: Damian am 02 Februar 2017, 16:43:28
wird zukünftig funktionieren, ist aber noch nicht ausprogrammiert. Daher muss man sich noch etwas behelfen und die voreingestellte Regex: "[^\:]*: (.*)" für Zahlen anpassen z. B. hier:
["^Pflanze:statMoistureTendency1h":"[^\:]*: [^\d]*(\d+)",0]
Ich sehe, dass du ein Vorzeichen übernehmen musst, das würde hier nicht übernommen werden.
Allerdings sollte ["^Pflanze:statMoistureTendency1h",0] mit der aktuellen Version funktionieren, bei mir funktioniert es zumindest korrekt.
irgendwie mag mich die letze Variante nicht. Allerdings habe ich nicht die aktuelle Version sondern 12961 2017-01-04 22:23:57Z Damian
drauf. Da ist zwar laut SVN nichts geändert in dem Bereich, denke ich, aber ich werde es nach dem aktualisieren nochmal probieren.
Testest du sowas mit trigger Pflanze1 statMoistureTendency1h +33
?
Zitat von: andi11 am 02 Februar 2017, 17:51:45
irgendwie mag mich die letze Variante nicht. Allerdings habe ich nicht die aktuelle Version sondern 12961 2017-01-04 22:23:57Z Damian
drauf. Da ist zwar laut SVN nichts geändert in dem Bereich, denke ich, aber ich werde es nach dem aktualisieren nochmal probieren.
Testest du sowas mit trigger Pflanze1 statMoistureTendency1h +33
?
Mit diesem Trigger wird es auch nicht funktionieren - es fehlt ein Doppelpunkt ;)
siehe:
setreading Pflanze1 statMoistureTendency1h +33
ah jetzt geht es mit ( ["^Pflanze:statMoistureTendency1h",0]>2)
(setreading $DEVICE gotWater 1)
DOELSEIF (["^Pflanze:statMoistureTendency1h",0]<=0 )
(setreading $DEVICE gotWater 0)
sehr mächtiges Werkzeug, danke dafür.