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
Warum DOIF und nicht Notify? Ich würde letzteres benutzen.
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
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
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.
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.
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