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
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.
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.
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
Wenn man dazu was sagen soll, dann musst du immer list von deinem Device vom Problemfall hier posten.
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
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.
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
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.
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? ???
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.
Jetzt musste ich zwar erst mal Hysterese googlen ;D, aber ja, so ist es.
Super, dann vielen lieben Dank!