[Gelöst] Sporadische Aussetzer im DOIF

Begonnen von dan1180, 13 Dezember 2021, 16:06:00

Vorheriges Thema - Nächstes Thema

dan1180

Hallo zusammen,

ich schalte meine Pumpe für die Fußbodenheizung mit folgendem DOIF


([tmpsshkk:temperature] > 55 and [fbh_og:state] ne "off")
     (set owswitch output fbp on)
DOELSEIF
([tmpsshkk:temperature] < 50 or [fbh_og:state] eq "off")
     (set owswitch output fbp off)


fbh_og:state ist dabei eine ,,structure", die drei Schalter (on/off) für die Thermostate der Fußbodenheizungen enthält. Sie kann die die Zustände on, off und undefined einnehmen.

tmpsshkk:temperature ist die Heizwassertemperatur in meinem Schichtenspeicher.

owswitch ist ein 1wire 8fach-Relais über das ich meine Pumpen und meinen Fußbodenheizungs-Mischer steuer.

Sehr sporadisch (alle ein bis zwei Wochen) ,,erwische" ich meine Pumpe dabei, dass sie nicht abschält. Hat jemand eine Idee woran das liegen könnte?

Vielen Dank für jeden Hinweis.
Gruß
Dan
FHEM 6.2 auf RPi4B
Raspberrymatic 3.X auf RPI3B

1xDS2408 und 6xDS18B20 an GPIO über Modul RPI_1Wire
>50 Homematic-Geräte

Damian

Wenn die Pumpe nicht abschaltet, dann musst du in den Readings des DOIFs nachschauen, ob sich das Modul noch im Zustand cmd_1 befindet. Wenn der Ausschaltbefehl ausgeführt wurde (cmd_2), dann ist er wohl beim Schalter nicht angekommen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

dan1180

Du siehst also im DOIF keinen offensichtlichen Fehler? Dann werde ich bei nächster Gelegenheit mal schauen, ob es an einem ,,verlorenen" Befehl liegt.

Danke soweit.
FHEM 6.2 auf RPi4B
Raspberrymatic 3.X auf RPI3B

1xDS2408 und 6xDS18B20 an GPIO über Modul RPI_1Wire
>50 Homematic-Geräte

dan1180

Also gestern Abend war es wieder soweit. Nun weiß ich, dass mein DOIF ausgelöst hat, den es stand auf cmd_2. Es sieht also so aus, als ob der Befehl nicht angekommen ist. Nun habe ich mir überlegt, mit folgenden Attributen das Risiko zu minimieren, dass die Pumpe die ganze Zeit durchläuft:

attr difbhctr repeatcmd 0:60
attr difbhctr repeatsame 3

Habe ich das richtig verstanden, dass cmd_1 so gar nicht und cmd_2 3x, alle 60 Sekunden, wiederholt wird?

Gibt es vielleicht noch andere, bessere Lösungen?

Danke
Dan

FHEM 6.2 auf RPi4B
Raspberrymatic 3.X auf RPI3B

1xDS2408 und 6xDS18B20 an GPIO über Modul RPI_1Wire
>50 Homematic-Geräte

Damian

Wenn man dazu was sagen soll, dann musst du immer list von deinem Device vom Problemfall hier posten.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

dan1180

Alles klar.

List meines DOIF:

Internals:
   DEF        ([tmpsshkk:temperature] > 55 and [fbh_og:state] ne "off")
     (set owswitch output fbp on)
DOELSEIF
([tmpsshkk:temperature] < 50 or [fbh_og:state] eq "off")
     (set owswitch output fbp off)
   FUUID      5dbc446b-f33f-5d70-f79c-627849b5cc7b16c7
   MODEL      FHEM
   NAME       difbhctr
   NOTIFYDEV  fbh_og,global,tmpsshkk
   NR         295
   NTFY_ORDER 50-difbhctr
   STATE      cmd_2
   TYPE       DOIF
   VERSION    24905 2021-09-01 18:35:54
   READINGS:
     2021-12-17 11:53:27   Device          tmpsshkk
     2021-12-17 11:16:26   cmd             2
     2021-12-17 11:16:26   cmd_event       tmpsshkk
     2021-12-17 11:16:26   cmd_nr          2
     2021-12-17 04:41:05   e_fbh_og_state  undefined
     2021-12-17 11:53:27   e_tmpsshkk_temperature 49.25
     2021-12-13 15:56:10   mode            enabled
     2021-12-17 11:16:26   state           cmd_2
   Regex:
     accu:
     collect:
     cond:
       fbh_og:
         0:
           state      ^fbh_og$:^state:
         1:
           state      ^fbh_og$:^state:
       tmpsshkk:
         0:
           temperature ^tmpsshkk$:^temperature:
         1:
           temperature ^tmpsshkk$:^temperature:
   attr:
     cmdState:
     repeatcmd:
       0
       60
     repeatsame:
       3
     wait:
     waitdel:
   condition:
     0          ::ReadingValDoIf($hash,'tmpsshkk','temperature') > 55 and ::ReadingValDoIf($hash,'fbh_og','state') ne "off"
     1          ::ReadingValDoIf($hash,'tmpsshkk','temperature') < 50 or ::ReadingValDoIf($hash,'fbh_og','state') eq "off"
   do:
     0:
       0          set owswitch output fbp on
     1:
       0          set owswitch output fbp off
     2:
   helper:
     DEVFILTER  ^global$|^tmpsshkk$|^fbh_og$
     NOTIFYDEV  global|tmpsshkk|fbh_og
     event      T: 49.25,temperature: 49.25
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   tmpsshkk
     timerevent T: 49.25,temperature: 49.25
     triggerDev tmpsshkk
     timerevents:
       T: 49.25
       temperature: 49.25
     timereventsState:
       state: T: 49.25
       temperature: 49.25
     triggerEvents:
       T: 49.25
       temperature: 49.25
     triggerEventsState:
       state: T: 49.25
       temperature: 49.25
   internals:
   readings:
     all         tmpsshkk:temperature fbh_og:state
   trigger:
   uiState:
   uiTable:
Attributes:
   disable    0
   repeatcmd  0:60
   repeatsame 3
   room       Heizung


und hier mein Relais:

Internals:
   DEF        DS2408 721119000000
   ERRCOUNT   6
   FUUID      5df743f8-f33f-5d70-d827-5e0a93ade21e2f9a
   INTERVAL   300
   IODev      owbus
   NAME       owswitch
   NEXTSEND   1639738432.49828
   NOTIFYDEV  global
   NR         304
   NTFY_ORDER 50-owswitch
   OW_FAMILY  29
   OW_ID      721119000000
   PRESENT    1
   ROM_ID     29.721119000000.CF
   STATE      obk: off uwp: off C: off D: off fbp: off hkp: off G: off H: off
   TYPE       OWSWITCH
   READINGS:
     2021-12-17 11:53:52   C               off
     2021-12-17 11:53:52   D               off
     2021-12-17 11:53:52   G               off
     2021-12-17 11:53:52   H               off
     2021-12-03 21:03:12   IODev           owbus
     2021-12-17 11:53:52   fbp             off
     2021-12-17 11:53:52   gpio            255
     2021-12-17 11:53:52   hkp             off
     2021-12-17 11:53:52   obk             off
     2021-12-17 11:53:52   state           obk: off uwp: off C: off D: off fbp: off hkp: off G: off H: off
     2021-12-17 11:53:52   uwp             off
   owg_val:
     1
     1
     1
     1
     1
     1
     1
     1
   owg_vax:
     1
     1
     1
     1
     1
     1
     1
     1
Attributes:
   AName      obk
   AUnit      on|off
   BName      uwp
   BUnit      on|off
   CUnit      on|off
   DUnit      on|off
   EName      fbp
   EUnit      on|off
   FName      hkp
   FUnit      on|off
   GUnit      on|off
   HUnit      on|off
   IODev      owbus
   group      1wire
   model      DS2408
   room       Heizung
   verbose    1
FHEM 6.2 auf RPi4B
Raspberrymatic 3.X auf RPI3B

1xDS2408 und 6xDS18B20 an GPIO über Modul RPI_1Wire
>50 Homematic-Geräte

Damian

repeatsame ist hier nur für den ersten Fall (cmd_1) definiert, für cmd_2 ist keine repeatsame-Wiederholung definiert.

unabhängig davon, ohne do always-Attribut wird ein Zweig erneut ausgeführt nur wenn zwischendurch ein anderer Zweig dran war (Statuswechsel), d. h. cmd_2 wird nicht erneut ausgeführt, wenn z. B. 51 käme und danach 49, denn dann hat sich der Status nicht geändert.

Evtl. reicht schon ein DOELSE hinter drangehängt, damit für solche Fälle cmd_3 kommt, der nur dazu da ist, den Status zu wechseln.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

dan1180

Hallo und Sorry, ich bin jetztlänger nicht dazu gekommen hier weiter zu machen...

Zitatrepeatsame ist hier nur für den ersten Fall (cmd_1) definiert, für cmd_2 ist keine repeatsame-Wiederholung definiert.
Danke für den Hinweis, habe ich geändert. Müsste doch - wenigstens als Zwischenlösung - jetzt auch ohne ,,do always" den Ausschaltbefehl 3x senden?!

Deinen zweiten Abschnitt verstehe ich nicht ganz. Bei 51 soll doch cmd2 noch gar nicht ausgeführt werden. erst <50 soll die Pumpe ausschalten. Der Statuswechsel im DOIF scheint auch zu funktionieren. Nur ,,verpennt" mein 1-wire-relais wohl ab und zu den Ausschalt-Befehl. Damit wäre doch auch mit einem DOELSE für den reinen Statuswechsel nicht erforderlich?

Hier nochmal ein aktuelles List meines DOIF:


Internals:
   DEF        ([tmpsshkk:temperature] > 55 and [fbh_og:state] ne "off")
     (set owswitch output fbp on)
DOELSEIF
([tmpsshkk:temperature] < 50 or [fbh_og:state] eq "off")
     (set owswitch output fbp off)
   FUUID      5dbc446b-f33f-5d70-f79c-627849b5cc7b16c7
   MODEL      FHEM
   NAME       difbhctr
   NOTIFYDEV  global,tmpsshkk,fbh_og
   NR         295
   NTFY_ORDER 50-difbhctr
   STATE      cmd_2
   TYPE       DOIF
   VERSION    24905 2021-09-01 18:35:54
   READINGS:
     2022-01-20 08:15:32   Device          tmpsshkk
     2022-01-19 23:27:16   cmd             2
     2022-01-19 23:27:16   cmd_count       3
     2022-01-19 23:27:16   cmd_event       tmpsshkk
     2022-01-19 23:27:16   cmd_nr          2
     2022-01-19 07:30:31   e_fbh_og_state  undefined
     2022-01-20 08:15:32   e_tmpsshkk_temperature 49.812
     2021-12-13 15:56:10   mode            enabled
     2022-01-19 23:27:16   state           cmd_2
     2022-01-19 23:28:16   wait_timer      no timer
   Regex:
     accu:
     collect:
     cond:
       fbh_og:
         0:
           state      ^fbh_og$:^state:
         1:
           state      ^fbh_og$:^state:
       tmpsshkk:
         0:
           temperature ^tmpsshkk$:^temperature:
         1:
           temperature ^tmpsshkk$:^temperature:
   attr:
     cmdState:
     repeatcmd:
       0
       60
     repeatsame:
       0
       3
     wait:
     waitdel:
   condition:
     0          ::ReadingValDoIf($hash,'tmpsshkk','temperature') > 55 and ::ReadingValDoIf($hash,'fbh_og','state') ne "off"
     1          ::ReadingValDoIf($hash,'tmpsshkk','temperature') < 50 or ::ReadingValDoIf($hash,'fbh_og','state') eq "off"
   do:
     0:
       0          set owswitch output fbp on
     1:
       0          set owswitch output fbp off
     2:
   helper:
     DEVFILTER  ^global$|^tmpsshkk$|^fbh_og$
     NOTIFYDEV  global|tmpsshkk|fbh_og
     event      T: 49.812,temperature: 49.812
     globalinit 1
     last_timer 0
     sleepdevice tmpsshkk
     sleepsubtimer -1
     sleeptimer -1
     timerdev   tmpsshkk
     timerevent T: 49.812,temperature: 49.812
     triggerDev tmpsshkk
     timerevents:
       T: 49.812
       temperature: 49.812
     timereventsState:
       state: T: 49.812
       temperature: 49.812
     triggerEvents:
       T: 49.812
       temperature: 49.812
     triggerEventsState:
       state: T: 49.812
       temperature: 49.812
   internals:
   readings:
     all         tmpsshkk:temperature fbh_og:state
   trigger:
   uiState:
   uiTable:
Attributes:
   disable    0
   repeatcmd  0:60
   repeatsame 0:3
   room       Heizung
   verbose    0



FHEM 6.2 auf RPi4B
Raspberrymatic 3.X auf RPI3B

1xDS2408 und 6xDS18B20 an GPIO über Modul RPI_1Wire
>50 Homematic-Geräte

Damian

Zitat von: dan1180 am 20 Januar 2022, 08:18:23
Deinen zweiten Abschnitt verstehe ich nicht ganz. Bei 51 soll doch cmd2 noch gar nicht ausgeführt werden. erst <50 soll die Pumpe ausschalten. Der Statuswechsel im DOIF scheint auch zu funktionieren. Nur ,,verpennt" mein 1-wire-relais wohl ab und zu den Ausschalt-Befehl. Damit wäre doch auch mit einem DOELSE für den reinen Statuswechsel nicht erforderlich?


ja, deswegen hatte ich geschrieben, über 50 aber unter 55 also z. B.  von 49 auf 51 ändert sich der Status nicht, deswegen wird bei erneutem Fall auf z. B. 49 (< 50) cmd2 nicht erneut ausgeführt.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

dan1180

Das ist ja auch richtig so.

Wurde bei einem Fall unter 50 cmd2 ausgeführt, soll ja nichts mehr passieren, bis die Temperatur über 55 steigt. Dann wechselt der Status auf cmd1 und bleibt dort, bis wieder <50 gilt. Ein erneutes Ausführen ist ja nicht nötig, da die Pumper ja aus ist (wenn sie es mitbekommen hat).
Die 5°C Unterschied sollen verhindern, dass die Heizung ständig ein und aus geht.

Denk ich jetzt an dir vorbei?   ???
FHEM 6.2 auf RPi4B
Raspberrymatic 3.X auf RPI3B

1xDS2408 und 6xDS18B20 an GPIO über Modul RPI_1Wire
>50 Homematic-Geräte

Damian

Zitat von: dan1180 am 20 Januar 2022, 17:18:37
Das ist ja auch richtig so.

Wurde bei einem Fall unter 50 cmd2 ausgeführt, soll ja nichts mehr passieren, bis die Temperatur über 55 steigt. Dann wechselt der Status auf cmd1 und bleibt dort, bis wieder <50 gilt. Ein erneutes Ausführen ist ja nicht nötig, da die Pumper ja aus ist (wenn sie es mitbekommen hat).
Die 5°C Unterschied sollen verhindern, dass die Heizung ständig ein und aus geht.

Denk ich jetzt an dir vorbei?   ???

OK, irgendwie habe ich den Faden verloren. Dann ist 5 Grad deine Hysterese. Es sollte dann alles so funktionieren, wie gewünscht. Die Wiederholung der set-Befehle müsstest du im Log sehen, wenn sie denn überhaupt geloggt werden.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

dan1180

Jetzt musste ich zwar erst mal Hysterese googlen  ;D, aber ja, so ist es.

Super, dann vielen lieben Dank!
FHEM 6.2 auf RPi4B
Raspberrymatic 3.X auf RPI3B

1xDS2408 und 6xDS18B20 an GPIO über Modul RPI_1Wire
>50 Homematic-Geräte