SORRY ich weis das der Titel nicht wirklich aussagekräftig ist. Das DOIF ist schon bestimmt ein Jahr alt. fhem auch so in etwa das letzte Update, jezuz fhem aktuell und das DOIF "tut" nicht.
Zur Erklärung:
ThermostatBuero ist ein z-wave Heizungsthermostat
HeizungReglerBuero ist ein dummy mit dem man in der web die gewünschte Temperatur einstellen kann.
defmod HeizungReglerDOIFBuero DOIF ([ThermostatBuero:"wakeup"] and [HeizungReglerBuero:state] ne [ThermostatBuero:setpointTemp:d]) (set ThermostatBuero thermostatSetpointSet [HeizungReglerBuero]) DOELSE()
attr HeizungReglerDOIFBuero group Heizung Einstellungen
attr HeizungReglerDOIFBuero room Steuerung-Heizung
Um so länger ich mir das anschaue umso mehr verwundert mich das es überhaupt funktionierte, sollte es nicht eher sein.....
defmod HeizungReglerDOIFBuero DOIF ([ThermostatBuero:"wakeup"] and [?HeizungReglerBuero:state] ne [?ThermostatBuero:setpointTemp:d]) (set ThermostatBuero thermostatSetpointSet [HeizungReglerBuero]) DOELSE()
attr HeizungReglerDOIFBuero group Heizung Einstellungen
attr HeizungReglerDOIFBuero room Steuerung-Heizung
und wenn wir schon dabei sind, was ist der Unterschied zwischen:
DOELSE()
und
attr HeizungReglerDOIFBuero do always
vielen dank
LG
Tom
leicht orakelt: es gab unlängst eine Änderung der Defaults in der Triggerung eines DOIF bezüglich der Events (checkReadingEvents o.ä., sorry, habe mein FHEM gerade nicht zur Hand - wer weiß es genauer?). Durch Setzen eines Wertes kann man das "alte" Verhalten wiederherstellen.
Ansonsten dürften Deine beiden Varianten ähnlich funktionieren - das "?" bedeutet nur, dass die fraglichen Readings bei Änderung das DOIF nicht triggern - richtigerweise, weil Du sie von der Logik her nur abfragst, andererseits dürfte das "wakup" enthaltende Event ThermostatBuero und eine Statusänderung nur gleichzeitig auftauchen, so dass es vom Ablauf her nicht unterschiedlich ist.
Und dann verhält sich ein einzweigiges DOIF m.W. stets wie als ob "do always" gesetzt ist (weil es ja nie einen zweiten Zustand einnehmen kann), während DOELSE () einen zweiten Zustand ermöglicht, wenn bei Triggerung des DOIF die definierten Bedingungen nicht wahr sind. Hier würde das DOIF ohne do always dann nur tätig werden, wenn zuvor in DOELSE() gekippt war.
Jm2c.
Konkret zum alten DOIF: es sollte weiterhin funktionieren, checkReadingEvent betrifft [<device>:"<regex>"] nicht.
DOELSE: Jedes Event des Gerätes ThermostatBuero das ungleich "wakeup" ist, schaltet in den DOELSE-Zweig um.
Falls diese Events neuerdings fehlen, könnte das der Grund für "tut nix" sein.
hier noch ein list:
Internals:
DEF ([ThermostatBuero:"wakeup"] and [HeizungReglerBuero:state] ne [ThermostatBuero:setpointTemp:d]) (set ThermostatBuero thermostatSetpointSet [HeizungReglerBuero]) DOELSE()
MODEL FHEM
NAME HeizungReglerDOIFBuero
NR 54
NTFY_ORDER 50-HeizungReglerDOIFBuero
STATE cmd_2
TYPE DOIF
READINGS:
2018-08-11 13:40:55 Device ThermostatBuero
2018-07-28 22:36:57 cmd 2
2018-07-28 22:36:57 cmd_event ThermostatBuero
2018-07-28 22:36:57 cmd_nr 2
2018-07-28 22:30:00 e_HeizungReglerBuero_events 19.00
2018-08-11 09:23:07 e_HeizungReglerBuero_state 12.00
2018-08-11 13:40:55 e_ThermostatBuero_events wakeup: notification
2018-08-11 13:40:55 e_ThermostatBuero_setpointTemp 19.00 C heating
2018-07-28 22:36:57 state cmd_2
Regex:
attr:
waitdel:
condition:
0 EventDoIf('ThermostatBuero',$hash,'wakeup',1) and ReadingValDoIf($hash,'HeizungReglerBuero','state') ne ReadingValDoIf($hash,'ThermostatBuero','setpointTemp','','d')
devices:
0 ThermostatBuero HeizungReglerBuero
all ThermostatBuero HeizungReglerBuero
do:
0:
0 set ThermostatBuero thermostatSetpointSet [HeizungReglerBuero]
1:
0
helper:
event wakeup: notification
globalinit 1
last_timer 0
sleeptimer -1
timerdev ThermostatBuero
timerevent setpointTemp: 19.00 C heating
triggerDev ThermostatBuero
timerevents:
setpointTemp: 19.00 C heating
timereventsState:
setpointTemp: 19.00 C heating
triggerEvents:
wakeup: notification
triggerEventsState:
wakeup: notification
internals:
itimer:
perlblock:
readings:
0 HeizungReglerBuero:state ThermostatBuero:setpointTemp
all HeizungReglerBuero:state ThermostatBuero:setpointTemp
trigger:
all ThermostatBuero
uiState:
uiTable:
Attributes:
group Heizung Einstellungen
room Steuerung-Heizung
ZitatDOELSE: Jedes Event des Gerätes ThermostatBuero das ungleich "wakeup" ist, schaltet in den DOELSE-Zweig um.
d.h. es wäre in diesem Falle ein:
attr HeizungReglerDOIFBuero do always
die bessere Wahl, frage mich nur warum das jetzt nicht "tut". :-[
LG
Tom
hmm das DOIF steckt ja in cmd_2 und die wakeup kommen und werden auch im DOIF erkannt.
Die Berechnung war auch schon immer so.
Schau Dir die Events an, mit gesetztem "mseclog".
was sollen denn diese dann mehr aussagen ??
Ich kann doch im DOIF selbst sehen das es die Events mitbekommt
e_ThermostatBuero_events wakeup: notification 2018-08-12 16:47:20
und das ist identisch mit dem Eintrag im Event Monitor
2018-08-12 16:47:20 ZWave ThermostatBuero wakeup: notification
Zitat2018-08-11 13:40:55 e_ThermostatBuero_events wakeup: notification
2018-08-11 13:40:55 e_ThermostatBuero_setpointTemp 19.00 C heating
kommt wakeup immer mit setpointTemp? wenn ja, dann probiere mal:
define di_test DOIF ([HeizungReglerBuero:state] != [ThermostatBuero:setpointTemp:d])