[gelöst] DOIF reagiert nicht, wenn Event "0" beinhaltet

Begonnen von abc2006, 27 März 2020, 08:42:01

Vorheriges Thema - Nächstes Thema

abc2006

Hallo,
ich habe ein DOIF, welches auf ein Event eines PID20 reagieren soll.Der PID erzeugt alle 60 Sekunden ein Event:
Dies funktioniert auch gut, solange der PID nicht "0" sendet.

Event:

2020-03-27 08:16:15.495 PID20 PID_HZFHEM actuation: 0


Doif:

Internals:
   DEF        (["^PID_HZFHEM$:^actuation$"])
(
set Mischer_HZG position [PID_HZFHEM:actuation],
set STM2 position [PID_HZFHEM:actuation],
set hzfhem_bot message [PID_HZFHEM:actuation]
)
   FUUID      5e763e74-f33f-0aaa-d633-1553233b7000fb2b
   MODEL      FHEM
   NAME       DF_PIDtoSTELLMOTOR
   NOTIFYDEV  PID_HZFHEM,global
   NR         91
   NTFY_ORDER 50-DF_PIDtoSTELLMOTOR
   STATE      0
   TYPE       DOIF
   VERSION    21224 2020-02-18 18:45:49
   READINGS:
     2020-03-27 08:13:10   cmd             0
     2020-03-27 08:13:10   mode            enabled
     2020-03-27 08:13:10   state           initialized
   Regex:
     accu:
     cond:
       :
         0:
           "^PID_HZFHEM$:^actuation$" ^PID_HZFHEM$:^actuation$
   condition:
     0          ::EventDoIf('^PID_HZFHEM$',$hash,'^actuation$',0)
   do:
     0:
       0           set Mischer_HZG position [PID_HZFHEM:actuation], set STM2 position [PID_HZFHEM:actuation], set hzfhem_bot message [PID_HZFHEM:actuation]
     1:
   helper:
     DEVFILTER  ^global$|^PID_HZFHEM$
     NOTIFYDEV  global|PID_HZFHEM
     globalinit 1
     last_timer 0
     sleeptimer -1
   perlblock:
   uiState:
   uiTable:
Attributes:
   do         always
   room       HZG,_doif
   stateFormat [PID_HZFHEM:actuation]


Das stateFormat funktioniert, aber die Befehle werden nicht ausgeführt.
Wo liegt mein Denkfehler?
Warum funktioniert es nur dann nicht, wenn der Wert "0" ist?
Arbeitsbereich des PID ist 0 <= $value <= 270

Für nen Tipp wär ich dankbar, hab nämlich keine Ahnung, in welche Richtung ich forschen soll..

Danke und Grüße,
Stephan


edit: nach dem update hatte ich vergessen, das list nochmal zu wiederholen. Ist jetzt aktuell
FHEM nightly auf Intel Atom (lubuntu) mit VDSL 50000 ;-)
Nutze zur Zeit OneWire und KNX

xenos1984

Warum DOIF und nicht Notify? Ich würde letzteres benutzen.

abc2006

Habe noch ein bisschen rumgetestet.

["^PID_HZFHEM$:^actuation$"]


Internals:
   CFGFN     
   DEF        (["^PID_HZFHEM$:^actuation$"])
(set hzfhem_bot message DF_test)
   FUUID      5e7dc543-f33f-0aaa-4a94-2b7a5c91e956f16a
   MODEL      FHEM
   NAME       DF_test
   NOTIFYDEV  PID_HZFHEM,global
   NR         150
   NTFY_ORDER 50-DF_test
   STATE      4
   TYPE       DOIF
   VERSION    21224 2020-02-18 18:45:49
   READINGS:
     2020-03-27 10:20:39   cmd             0
     2020-03-27 10:20:39   mode            enabled
     2020-03-27 10:20:39   state           initialized
   Regex:
     accu:
     cond:
       :
         0:
           "^PID_HZFHEM$:^actuation$" ^PID_HZFHEM$:^actuation$
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          ::EventDoIf('^PID_HZFHEM$',$hash,'^actuation$',0)
   do:
     0:
       0          set hzfhem_bot message DF_test
     1:
   helper:
     DEVFILTER  ^global$|^PID_HZFHEM$
     NOTIFYDEV  global|PID_HZFHEM
     globalinit 1
     last_timer 0
     sleeptimer -1
   uiState:
   uiTable:
Attributes:
   do         always
   room       HZG,_doif


löst gar nicht aus. Das vergrößert meine Verwirrung.

als (scheinbar) funktionierenden Workaround hab ich jetzt mal

[PID_HZFHEM:actuation] >= 0
eingetragen. Damit bekomme ich erstmal Werte, auch bei "0".

Grüße,
Stephan
FHEM nightly auf Intel Atom (lubuntu) mit VDSL 50000 ;-)
Nutze zur Zeit OneWire und KNX

abc2006

Zitat von: xenos1984 am 27 März 2020, 10:48:27
Warum DOIF und nicht Notify? Ich würde letzteres benutzen.

Warum? Kann ich nicht beantworten. Vermutlich weil ich fast nur noch DOIF einsetze, weil es flexibel ist, viele Möglichkeiten bietet und ich damit sicherer umgehen kann.
Ob es technische Vorteile hat, das eine oder das andere zu benutzen, kann ich nicht beurteilen.

Welchen Vorteil hätte das Notify in diesem konkreten Fall gegenüber dem DOIF?
Und: völlig unabhängig von der tatsächlichen Lösung würde ich gerne wissen, warum die meiner Meinung nach richtige Anwendung in diesem Fall nicht funktioniert. Rein aus technischem Interesse.

Grüße,
Stephan
FHEM nightly auf Intel Atom (lubuntu) mit VDSL 50000 ;-)
Nutze zur Zeit OneWire und KNX

xenos1984

Meine Vermutung, warum das ursprüngliche DOIF nicht funktioniert: DOIF triggert, wenn eine Bedingung wahr wird. "0" ist nicht wahr, sondern wird als "falsch" interpretiert. Notify dagegen sollte auf ein Ereignis triggern, unabhängig vom übergebenen Wert.

Damian

Mit der Angabe
["^PID_HZFHEM$:^actuation$"]
kannst du nicht auf

2020-03-27 08:16:15.495 PID20 PID_HZFHEM actuation: 0

triggern, denn hinter actuation kommt noch : 0

Dann eher:

["^PID_HZFHEM$:^actuation: 0$"]

oder z. B.

["^PID_HZFHEM$:^actuation"]

wenn der Rest egal ist.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

abc2006

Hallo zusammen und danke für eure Antworten!

Zitat von: xenos1984 am 27 März 2020, 12:55:57
DOIF triggert, wenn eine Bedingung wahr wird. "0" ist nicht wahr, sondern wird als "falsch" interpretiert.

Ja, da hast du recht. Das könnte durchaus ein Grund sein.
Dieses Problem hätte man mit notify tatsächlich so nicht.

Zitat von: Damian am 27 März 2020, 13:34:02
Mit der Angabe
["^PID_HZFHEM$:^actuation$"]
kannst du nicht auf

2020-03-27 08:16:15.495 PID20 PID_HZFHEM actuation: 0
triggern, denn hinter actuation kommt noch : 0


So gesehen, hast du natürlich recht.
Ich werds so versuchen.

Danke nochmal,
Stephan
FHEM nightly auf Intel Atom (lubuntu) mit VDSL 50000 ;-)
Nutze zur Zeit OneWire und KNX