Warum schaltet dieses DOIF nicht? **gelöst**

Begonnen von wk, 31 Juli 2019, 12:12:40

Vorheriges Thema - Nächstes Thema

wk

Wenn ich das folgende DOIF über restart neu starte, dann schaltet es je nach Vorgabetemperatur richtig ein oder aus. Verändere ich die Vorgabetemperatur, dann schaltet nichts.

Das folgende list entstand nach einem restart:
Internals:
   DEF        (([[$SELF:HAn]-[$SELF:HEn]])
and
([$SELF:Ventil] eq "auf"))
## Wenn zwischen Anfangs- und Endzeit die Temperatur unter den
## Vorgabewert sinkt, wird die Heizung eingeschaltet.
(set Shelly_4.1_1 on)
DOELSE
## Wenn die Endzeit erreicht wird oder die Vorgabetemperatur
## überschritten wird die Heizung ausgeschaltet.
(set Shelly_4.1_1 off)
   FUUID      5c42f42f-f33f-d4cb-e1c5-44bf9b5d5ff8e114
   MODEL      FHEM
   NAME       IHz
   NR         64
   NTFY_ORDER 50-IHz
   STATE      cmd_1
   TYPE       DOIF
   VERSION    19786 2019-07-05 21:47:08
   READINGS:
     2019-07-30 18:08:43   HAn             06:15
     2019-07-31 11:29:34   HEn             21:00
     2019-07-31 11:28:40   Temp            26.0
     2019-07-31 11:30:57   Ventil          auf
     2019-07-31 11:30:57   cmd             1
     2019-07-31 11:30:57   cmd_event       IHz
     2019-07-31 11:30:57   cmd_nr          1
     2019-07-31 11:30:57   e_IHz_Ventil    auf
     2019-07-31 11:27:41   mode            enabled
     2019-07-31 11:30:57   state           cmd_1
     2019-07-31 11:30:56   timer_01_c01    01.08.2019 06:15:00
     2019-07-31 11:30:56   timer_02_c01    31.07.2019 21:00:00
   Regex:
     accu:
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          (::DOIF_time($hash,0,1,$wday,$hms)) and (::ReadingValDoIf($hash,'IHz','Ventil') eq "auf")
   days:
   devices:
     0           IHz
     all         IHz
   do:
     0:
       0          set Shelly_4.1_1 on
     1:
       0          set Shelly_4.1_1 off
   helper:
     event      Ventil: auf
     globalinit 1
     last_timer 2
     sleeptimer -1
     timerdev   IHz
     timerevent Ventil: auf
     triggerDev IHz
     DOIF_eventas:
       cmd_nr: 1
       cmd: 1
       cmd_event: IHz
       state: cmd_1
     timerevents:
       Ventil: auf
       e_IHz_Ventil: auf
       cmd_nr: 1
       cmd: 1
       cmd_event: IHz
       cmd_1
       Ventil: auf
     timereventsState:
       Ventil: auf
       e_IHz_Ventil: auf
       cmd_nr: 1
       cmd: 1
       cmd_event: IHz
       cmd_1
       Ventil: auf
     triggerEvents:
       Ventil: auf
       e_IHz_Ventil: auf
       cmd_nr: 1
       cmd: 1
       cmd_event: IHz
       cmd_1
       Ventil: auf
     triggerEventsState:
       Ventil: auf
       e_IHz_Ventil: auf
       cmd_nr: 1
       cmd: 1
       cmd_event: IHz
       cmd_1
       Ventil: auf
   internals:
   interval:
     0          -1
     1          0
   intervalfunc:
   itimer:
     all         IHz
   localtime:
     0          1564632900
     1          1564599600
   perlblock:
   readings:
     0           IHz:Ventil
     all         IHz:Ventil
   realtime:
     0          06:15:00
     1          21:00:00
   time:
     0          [IHz:HAn]
     1          [IHz:HEn]
   timeCond:
     0          0
     1          0
   timer:
     0          0
     1          0
   timers:
     0           0  1
   trigger:
   triggertime:
     1564599600:
       localtime  1564599600
       hash:
     1564632900:
       localtime  1564632900
       hash:
   uiState:
   uiTable:
Attributes:
   alias      Ina Heizung
   devStateIcon cmd_1:sani_heating@red:cmd_2 cmd_2:sani_heating@blue:cmd_1
   do         always
   readingList HAn HEn Temp Ventil
   room       Heizung,Shelly
   setList    HAn:time HEn:time Temp:slider,18,0.1,26,1
   verbose    5
   webCmd     HAn:HEn:Temp
   webCmdLabel Anfang:Ende:Temperatur
   widgetOverride devStateIcon:textField-long


und hier nach Veränderung der Vorgabetemperatur:

Internals:
   DEF        (([[$SELF:HAn]-[$SELF:HEn]])
and
([$SELF:Ventil] eq "auf"))
## Wenn zwischen Anfangs- und Endzeit die Temperatur unter den
## Vorgabewert sinkt, wird die Heizung eingeschaltet.
(set Shelly_4.1_1 on)
DOELSE
## Wenn die Endzeit erreicht wird oder die Vorgabetemperatur
## überschritten wird die Heizung ausgeschaltet.
(set Shelly_4.1_1 off)
   FUUID      5c42f42f-f33f-d4cb-e1c5-44bf9b5d5ff8e114
   MODEL      FHEM
   NAME       IHz
   NR         64
   NTFY_ORDER 50-IHz
   STATE      cmd_1
   TYPE       DOIF
   VERSION    19786 2019-07-05 21:47:08
   READINGS:
     2019-07-30 18:08:43   HAn             06:15
     2019-07-31 11:29:34   HEn             21:00
     2019-07-31 11:33:54   Temp            20.0
     2019-07-31 11:33:54   Ventil          zu
     2019-07-31 11:30:57   cmd             1
     2019-07-31 11:30:57   cmd_event       IHz
     2019-07-31 11:30:57   cmd_nr          1
     2019-07-31 11:30:57   e_IHz_Ventil    auf
     2019-07-31 11:27:41   mode            enabled
     2019-07-31 11:30:57   state           cmd_1
     2019-07-31 11:30:56   timer_01_c01    01.08.2019 06:15:00
     2019-07-31 11:30:56   timer_02_c01    31.07.2019 21:00:00
   Regex:
     accu:
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          (::DOIF_time($hash,0,1,$wday,$hms)) and (::ReadingValDoIf($hash,'IHz','Ventil') eq "auf")
   days:
   devices:
     0           IHz
     all         IHz
   do:
     0:
       0          set Shelly_4.1_1 on
     1:
       0          set Shelly_4.1_1 off
   helper:
     event      Temp: 20.0
     globalinit 1
     last_timer 2
     sleeptimer -1
     timerdev   IHz
     timerevent Ventil: auf
     triggerDev IHz
     DOIF_eventas:
       cmd_nr: 1
       cmd: 1
       cmd_event: IHz
       state: cmd_1
     timerevents:
       Ventil: auf
       e_IHz_Ventil: auf
       cmd_nr: 1
       cmd: 1
       cmd_event: IHz
       cmd_1
       Ventil: auf
     timereventsState:
       Ventil: auf
       e_IHz_Ventil: auf
       cmd_nr: 1
       cmd: 1
       cmd_event: IHz
       cmd_1
       Ventil: auf
     triggerEvents:
       Temp: 20.0
       Ventil: zu
     triggerEventsState:
       Temp: 20.0
       Ventil: zu
   internals:
   interval:
     0          -1
     1          0
   intervalfunc:
   itimer:
     all         IHz
   localtime:
     0          1564632900
     1          1564599600
   perlblock:
   readings:
     0           IHz:Ventil
     all         IHz:Ventil
   realtime:
     0          06:15:00
     1          21:00:00
   time:
     0          [IHz:HAn]
     1          [IHz:HEn]
   timeCond:
     0          0
     1          0
   timer:
     0          0
     1          0
   timers:
     0           0  1
   trigger:
   triggertime:
     1564599600:
       localtime  1564599600
       hash:
     1564632900:
       localtime  1564632900
       hash:
   uiState:
   uiTable:
Attributes:
   alias      Ina Heizung
   devStateIcon cmd_1:sani_heating@red:cmd_2 cmd_2:sani_heating@blue:cmd_1
   do         always
   readingList HAn HEn Temp Ventil
   room       Heizung,Shelly
   setList    HAn:time HEn:time Temp:slider,18,0.1,26,1
   verbose    5
   webCmd     HAn:HEn:Temp
   webCmdLabel Anfang:Ende:Temperatur
   widgetOverride devStateIcon:textField-long


triggerEvents und triggerEventsState haben sich geändert, d.h. die DOIF-Bedingung ist nicht mehr erfüllt, aber es bleibt trotzdem auf cmd_1.

Der gleiche Effekt ist bei umgekehrten Voraussetzungen, d.h. beim restart aus und Temperaturerhöhung.

Wer zeigt mir den Fehler bitte?

Per

Wo wird denn die Temperatur abgefragt? Ich sehe nur Zeit und Ventil.

wk

Die Temperatur wird wegen der Hysterese über ein threshold-device abgefragt, das das reading Ventil auf oder zu steuert. Wie die lists zeigen funktioniert das gut und ist schon über Monate bewährt.
Als triggerEvent kommt ja auch Ventil: zu

amenomade

Ich glaube eben nicht, dass er ein Event für "Ventil zu" sieht. Das Reading wird doch aktualisiert:
Zitat2019-07-31 11:33:54   Temp            20.0
     2019-07-31 11:33:54   Ventil          zu
aber
Zitat2019-07-31 11:30:57   cmd_nr          1
     2019-07-31 11:30:57   e_IHz_Ventil    auf
und
Zitathelper:
     event      Temp: 20.0
     globalinit 1
     last_timer 2
     sleeptimer -1
     timerdev   IHz
     timerevent Ventil: auf

Schaltet er, wenn Du "setreading IHz Ventil zu" machst?
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

wk

Ja, wenn ich den Befehl direkt eingebe, dann schaltet es.

amenomade

Dann zeig mal bitte ein "list" von deinem THRESHOLD Device.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

wk

Internals:
   DEF        Prologue_158:temperature:0.2:IHz:Temp IHz|set IHz Ventil zu|set IHz Ventil auf|
   FUUID      5c42f430-f33f-d4cb-1462-5866a451a17159c4
   NAME       IThr
   NR         103
   NTFY_ORDER 50-IThr
   STATE      Vorgabe: 20.3  Ist:     23.9
   TYPE       THRESHOLD
   cmd1_gt    set IHz Ventil zu
   cmd2_lt    set IHz Ventil auf
   cmd_default 0
   hysteresis 0.2
   offset     0
   sensor     Prologue_158
   sensor_reading temperature
   target_reading Temp
   target_sensor IHz
   READINGS:
     2019-07-31 11:33:54   cmd             cmd1_gt
     2019-08-01 17:30:23   desired_value   20.3
     2019-07-31 11:30:54   mode            external
     2019-08-01 18:31:48   sensor_value    23.9
     2019-08-01 18:31:48   state           Vorgabe: 20.3  Ist:     23.9
     2019-08-01 17:30:23   threshold_max   20.3
     2019-08-01 17:30:23   threshold_min   20.1
Attributes:
   number_format %.1f
   room       Heizung
   state_cmd1_gt off
   state_cmd2_lt on
   state_format Vorgabe: _dv  Ist:     _s1v

amenomade

Also... wenn ich richtig verstanden habe, steuert IHz:Temp das Setzen von IHz Ventil.
Ich vermute, dass der Mechanismus, der das Selbsttriggern vom DOIF unterdruckt, das Schalten bei Änderung von Temp ablehnt.
Zitat von: CommandRefStandardmäßig unterbindet das DOIF-Modul Selbsttriggerung. D. h. das Modul reagiert nicht auf Events, die es selbst direkt oder indirekt auslöst. Dadurch werden Endlosschleifen verhindert.

Das kann am besten @Damian erklären.

Versuch mal ein Timer hinzufügen: statt
|set IHz Ventil zu|set IHz Ventil auf|

|sleep 0.1;;set IHz Ventil zu|sleep 0.1;;set IHz Ventil auf|
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

wk

Das mit dem Timer hat nichts gebracht. Jetzt schaltet das threshold-device nicht mal mehr das Ventil.

Ich glaube aber, Du hast recht mit der Schleife. Ich war nur zu ungeduldig und habe immer mit dem Schieberegler gespielt. Wie oben geschrieben, hat es ja schon länger funktioniert, wenn die gemessene Temperatur sich verändert hat.
Ich habe nur jetzt neue Aktoren für die Ventile und wollte es schnell testen. Vielleicht hilft Geduld.  ;)

wk

Es hat jetzt so wie gewünscht funktioniert.

Der Fehler lag bei mir und meiner Ungeduld. Wie von amenomade richtig festgestellt ist das eine Selbstttriggerung gewesen und konnte daher nicht funktionieren.

Vielen Dank amenomade. Dieser Absatz ist mir auch bei mehrmaligem Lesen nicht als relevant aufgefallen.

cu
Walter