Hauptmenü

älteres DOIF läuft nicht

Begonnen von tomspatz, 11 August 2018, 10:22:42

Vorheriges Thema - Nächstes Thema

tomspatz

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

Pfriemler

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.
"Änd're nie in fhem.cfg, denn das tut hier allen weh!" *** Wheezy@Raspi(3), HMWLAN+HMUART, CUL868(SlowRF) für FHT+KS+FS20, miniCUL433, Rademacher DuoFern *** "... kaum macht man es richtig, funktioniert es ..."

Ellert

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.

tomspatz

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

tomspatz

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.

Ellert

Schau Dir die Events an, mit gesetztem "mseclog".

tomspatz

#6
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

Damian

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