FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: Ralli am 29 Dezember 2018, 09:44:38

Titel: DOIF_Readings und Selbst-Trigger
Beitrag von: Ralli am 29 Dezember 2018, 09:44:38
Guten Morgen zusammen,

zum Testen habe ich folgende Definition erstellt:


def Aussensensor_test ([$SELF:max] > 250) (setreading $SELF 1.$DEVICE $EVENT)
DOELSEIF ([$SELF:max] > 220) (setreading $SELF 2.$DEVICE $EVENT)
DOELSEIF ([$SELF:max] > 200) (setreading $SELF 3.$DEVICE $EVENT)
DOELSEIF ([$SELF:max] > 100) (setreading $SELF 4.$DEVICE $EVENT)
DOELSEIF ([$SELF:average] <= 50) (setreading $SELF 5.$DEVICE $EVENT)

attr Aussensensor_test DOIF_Readings max:[#max:d0:"((?!test).)*_BW_aussen($|_Terrasse$):brightness":brightness],
min:[#min:d0:"((?!test).)*_BW_aussen($|_Terrasse$):brightness":brightness],
average:[#average:d0:"((?!test).)*_BW_aussen($|_Terrasse$):brightness":brightness]


Damit möchte ich - zunächst zum Testen und Verstehen - von allen Außen-Bewegungssensoren mit Lichtmessung die Werte einfangen und in min, max und avarage des DOIF-Devices speichern. Um auch zu sehen, welches Device was geliefert hat, lasse ich das DOIF-Device selbst noch die auslösenden Devices mit ihren Werten in Readings des DOIF-Devices speichern.

Interessanterweise wird auch jeweils ein Reading mit dem DOIF-Device (hier: "4.Aussensensor_test" mit dem Wert "min: 130") selbst angelegt, obwohl dies nach meinem Verständnis eigentlich nicht passieren dürfte.


READINGS:
     2018-12-29 09:30:17   4.Aussensensor_test min: 130
     2018-12-29 09:36:17   Device          Aussensensor_test
     2018-12-29 09:36:17   average         149
     2018-12-29 09:30:17   cmd             4
     2018-12-29 09:30:17   cmd_event       Aussensensor_test
     2018-12-29 09:30:17   cmd_nr          4
     2018-12-29 09:36:17   e_Aussensensor_test_average 149
     2018-12-29 09:32:17   e_Aussensensor_test_max 171
     2018-12-29 09:30:17   error           max: 167: Unknown command max:, try help. average: 146: Unknown command average:, try help.
     2018-12-29 09:32:17   max             171
     2018-12-29 09:36:17   min             134
     2018-12-29 09:30:17   state           cmd_4


Warum wird das DOIF-Device selbst hier mit aus Trigger ausgewertet? Wieso kommt es zu den Fehlermeldungen (error)? Wie gesagt, hier geht es nicht um Sinn und Unsinn sondern um das Verstehen  :D .

Der Vollständig halber noch das komplette List:


Internals:
   DEF        ([$SELF:max] > 250) (setreading $SELF 1.$DEVICE $EVENT)
DOELSEIF ([$SELF:max] > 220) (setreading $SELF 2.$DEVICE $EVENT)
DOELSEIF ([$SELF:max] > 200) (setreading $SELF 3.$DEVICE $EVENT)
DOELSEIF ([$SELF:max] > 100) (setreading $SELF 4.$DEVICE $EVENT)
DOELSEIF ([$SELF:average] <= 50) (setreading $SELF 5.$DEVICE $EVENT)
   MODEL      FHEM
   NAME       Aussensensor_test
   NR         304
   NTFY_ORDER 50-Aussensensor_test
   STATE      cmd_4
   TYPE       DOIF
   DOIF_Readings:
     average    ::AggregateDoIf($hash,'#average:d0:','((?!test).)*_BW_aussen($|_Terrasse$)','brightness')
     max        ::AggregateDoIf($hash,'#max:d0:','((?!test).)*_BW_aussen($|_Terrasse$)','brightness')
     min        ::AggregateDoIf($hash,'#min:d0:','((?!test).)*_BW_aussen($|_Terrasse$)','brightness')
   Helper:
     DBLOG:
       4.Aussensensor_test:
         Eventlog:
           TIME       1546072217.50559
           VALUE      min
       5.Aussensensor_test:
         Eventlog:
           TIME       1546014737.54041
           VALUE      min
       cmd:
         Eventlog:
           TIME       1546072217.77761
           VALUE      4
       cmd_event:
         Eventlog:
           TIME       1546072217.77761
           VALUE      Aussensensor_test
       cmd_nr:
         Eventlog:
           TIME       1546072217.77761
           VALUE      4
       error:
         Eventlog:
           TIME       1546072217.77761
           VALUE      max: 167: Unknown command max:, try help. average: 146: Unknown command average:, try help.
       state:
         Eventlog:
           TIME       1546072217.77761
           VALUE      cmd_4
   OLDREADINGS:
   READINGS:
     2018-12-29 09:30:17   4.Aussensensor_test min: 130
     2018-12-29 09:36:17   Device          Aussensensor_test
     2018-12-29 09:36:17   average         149
     2018-12-29 09:30:17   cmd             4
     2018-12-29 09:30:17   cmd_event       Aussensensor_test
     2018-12-29 09:30:17   cmd_nr          4
     2018-12-29 09:36:17   e_Aussensensor_test_average 149
     2018-12-29 09:32:17   e_Aussensensor_test_max 171
     2018-12-29 09:30:17   error           max: 167: Unknown command max:, try help. average: 146: Unknown command average:, try help.
     2018-12-29 09:32:17   max             171
     2018-12-29 09:36:17   min             134
     2018-12-29 09:30:17   state           cmd_4
   Regex:
     DOIF_Readings:
       :
         average:
           "((?!test).)*_BW_aussen($|_Terrasse$):brightness" ((?!test).)*_BW_aussen($|_Terrasse$):brightness
         max:
           "((?!test).)*_BW_aussen($|_Terrasse$):brightness" ((?!test).)*_BW_aussen($|_Terrasse$):brightness
         min:
           "((?!test).)*_BW_aussen($|_Terrasse$):brightness" ((?!test).)*_BW_aussen($|_Terrasse$):brightness
       Aussensensor_test:
         average:
         max:
         min:
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          ::ReadingValDoIf($hash,'Aussensensor_test','max') > 250
     1          ::ReadingValDoIf($hash,'Aussensensor_test','max') > 220
     2          ::ReadingValDoIf($hash,'Aussensensor_test','max') > 200
     3          ::ReadingValDoIf($hash,'Aussensensor_test','max') > 100
     4          ::ReadingValDoIf($hash,'Aussensensor_test','average') <= 50
   devices:
     0           Aussensensor_test
     1           Aussensensor_test
     2           Aussensensor_test
     3           Aussensensor_test
     4           Aussensensor_test
     all         Aussensensor_test
   do:
     0:
       0          setreading Aussensensor_test 1.$DEVICE $EVENT
     1:
       0          setreading Aussensensor_test 2.$DEVICE $EVENT
     2:
       0          setreading Aussensensor_test 3.$DEVICE $EVENT
     3:
       0          setreading Aussensensor_test 4.$DEVICE $EVENT
     4:
       0          setreading Aussensensor_test 5.$DEVICE $EVENT
     5:
   helper:
     DOIF_Readings_events
     event      min: 134,average: 149
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   Aussensensor_test
     timerevent max: 171,average: 148
     triggerDev Aussensensor_test
     DOIF_eventas:
       cmd_nr: 4
       cmd: 4
       cmd_event: Aussensensor_test
       error: max: 167: Unknown command max:, try help. average: 146: Unknown command average:, try help.
       state: cmd_4
     timerevents:
       max: 171
       average: 148
       e_Aussensensor_test_max: 171
     timereventsState:
       max: 171
       average: 148
     triggerEvents:
       min: 134
       average: 149
       e_Aussensensor_test_average: 149
     triggerEventsState:
       min: 134
       average: 149
   internals:
   itimer:
   perlblock:
   readings:
     0           Aussensensor_test:max
     1           Aussensensor_test:max
     2           Aussensensor_test:max
     3           Aussensensor_test:max
     4           Aussensensor_test:average
     all         Aussensensor_test:max Aussensensor_test:average
   trigger:
   uiState:
   uiTable:
Attributes:
   DOIF_Readings max:[#max:d0:"((?!test).)*_BW_aussen($|_Terrasse$):brightness":brightness],
min:[#min:d0:"((?!test).)*_BW_aussen($|_Terrasse$):brightness":brightness],
average:[#average:d0:"((?!test).)*_BW_aussen($|_Terrasse$):brightness":brightness]
Titel: Antw:DOIF_Readings und Selbst-Trigger
Beitrag von: DasQ am 29 Dezember 2018, 09:56:41
Hab zwar selber nicht den Plan, mein aber im Wiki gelesen zu haben, das doif einen Schutz eingebaut hat und sich nicht selbst triggern kann um loops zu vermeiden

Titel: Antw:DOIF_Readings und Selbst-Trigger
Beitrag von: Damian am 29 Dezember 2018, 10:11:46
Offenbar stimmt deine DOIF_Readings-Definition nicht (ggf. falsche Regex). Das max-Reading z. B. wird erst gar nicht angelegt.
Auch die Abfrage von $DEVICE und $EVENT bei der Nutzung von DOIF_Readings ist nicht sinnvoll, weil sich das Modul (ohne Events nach außen)  selbst triggert.

Titel: Antw:DOIF_Readings und Selbst-Trigger
Beitrag von: Ralli am 29 Dezember 2018, 10:24:58
Die Regex stimmt leider. Max wird auch angelegt - ist ja auch bereits zu sehen.

Zitat
2018-12-29 09:32:17   max             171

Auch ich war der Meinung, dass sich das DOIF nicht selbst triggert, es sei denn, es ist über das Attribut selftrigger etwas anderes definiert.

In der aktuellen Ref steht drin:

Zitat
Standardmäßig unterbindet das DOIF-Modul Selbsttriggerung.
Titel: Antw:DOIF_Readings und Selbst-Trigger
Beitrag von: Damian am 29 Dezember 2018, 10:31:45
Zitat von: Ralli am 29 Dezember 2018, 10:24:58
Die Regex stimmt leider. Max wird auch angelegt - ist ja auch bereits zu sehen.

Auch ich war der Meinung, dass sich das DOIF nicht selbst triggert, es sei denn, es ist über das Attribut selftrigger etwas anderes definiert.

In der aktuellen Ref steht drin:

ok.

Selbsttriggerung bezieht sich hier auf Events, die DOIF selbst nach außen produziert z. B. "set bla on". DOIF_Readings zählt hier nicht dazu, es ist ja gerade dazu da ein eigenes Reading zu setzen, welches man unmittelbar in der DOIF-Bedingung abfragt. Dafür ist eine interne "Selbsttriggerung" ja notwendig. Dabei wird das eigene $DEVICE und $EVENT gesetzt, um bei der internen Abarbeitung im DOIF mit den "echten" Events von außen kompatibel zu sein.