DOIF mit Regex für Device Reading /falscher Befehl wird ausgeführt?

Begonnen von andi11, 31 Januar 2017, 19:25:24

Vorheriges Thema - Nächstes Thema

andi11

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.

andi11

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?

Damian

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.

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

andi11

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.

Per


andi11

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.

andi11

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?

Per

Entweder
["Pflanze.:statMoistureTendency1h":d,0]
oder
["Pflanze.:statMoistureTendency1h:d",0]

Damian

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

Damian

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

andi11

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?

Damian

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

andi11

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.