DOIF Kaskadieren für Heizung mit Solarunterstützung

Begonnen von Dragon46, 06 Juli 2020, 14:37:29

Vorheriges Thema - Nächstes Thema

Dragon46

Hallo,
ich möchte über die Temperatur des Solarpuffers die einzelnen Pumpen der Heizung steuern.
Das Basissetup funktioniert schon mal ganz gut.
Nur ich habe das Problem das ein cmd manchesmal korrekt ausgefürt werden maches mal wird einfach eines ignoriert.

Das erste DOELSEIF soll immer an sein auch wenn weitere zutreffen.
Muss ich hier mit einem DOELSE und dann doeslseif arbeiten ?

DOIF([Pufferspeicher:temperature]le 75) (set Umschalt off,set UWP_HZ off,set UWP_WW off)
DOELSEIF ([Pufferspeicher:temperature]ge 90)(set Umschalt on)
DOELSEIF ([Pufferspeicher:temperature]ge 90 and [Ruecklauf_WW:temperature]< 55)(set UWP_WW on)
DOELSEIF ([Pufferspeicher:temperature]ge 90 and [Ruecklauf_WW:temperature] ==55)(wait 00:02:00,set UWP_WW off)
DOELSEIF ([Pufferspeicher:temperature]ge 90 and [vor_hz:temperature]< 60)(set UWP_HZ on)
.
.
.


Wenn ich das erste DOELSEIF in die anderen einfüge dann geht alles wie gewünscht.
Das Umschalt schaltet mir die Pumpen- / Mischersteuerung auf eine Relaisplatine oder lässt es bei der Heizungssteuerung.
Die Steuerung der Heizung kommt mit der Solarunterstützung nicht klar.
Daher dieses Konstruckt

MadMax-FHEM

Ich mache ja wenig/nichts mit DOIF...

ABER (ich denke): wenn ein Zweig erfüllt ist, dann wird dieser ausgeführt und gut.

Daher: die Reihenfolge so gestalten, dass eben alles was du willst "abgearbeitet" wird (für bestimmte Zustände) bis das zutrifft, was du in diesem Zustand "erwartest"...

Evtl. mal das erste DOELSIF "weiter nach hinten"...
...dann wird erst geschaut, ob eines der anderen passt und wenn davon NICHTS passt -> voila! :)

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

amenomade

Zitat von: MadMax-FHEM am 06 Juli 2020, 15:05:12
ABER (ich denke): wenn ein Zweig erfüllt ist, dann wird dieser ausgeführt und gut.


So ist es. Steht sogar (fast) als erstes in CommandRef:
ZitatDie Angaben werden immer von links nach rechts abgearbeitet. Logische Abfragen werden in DOIF/DOELSEIF-Bedingungen vornehmlich mit Hilfe von and/or-Operatoren erstellt. Zu beachten ist, dass nur die Bedingungen überprüft werden, die zum ausgelösten Event das dazughörige Device bzw. die dazugehörige Triggerzeit beinhalten. Kommt ein Device in mehreren Bedingungen vor, so wird immer nur ein Kommando ausgeführt, und zwar das erste, für das die dazugehörige Bedingung in der abgearbeiteten Reihenfolge wahr ist.

Ausserdem würde ich numerische Werte nicht mit le und ge vergleichen, sondern mit ">=" oder "<="
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

MadMax-FHEM

Zitat von: amenomade am 06 Juli 2020, 18:50:31
Ausserdem würde ich numerische Werte nicht mit le und ge vergleichen, sondern mit ">=" oder "<="

Da hast du völlig recht!
Soweit hab ich gar nicht mehr weiter "analysiert"... ;)

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Dragon46

Danke für die aufklärenden Antworten.

Dann werde ich doch das erste Kommando überall einfügen müssen.
Wollte eigentlich mit einem Kommando umschalten und dann die anderen Bedingungen abarbeiten.

Wenn man das besser schreiben kann dann bitte einen Vorschlag.
Ich muss nur noch weitere 8 Bedingungen dann anfügen können.

Das mit den nummerischen werten wusste ich nicht. kam auch nicht so richtig raus im Wiki. das kann ich ja schnell abändern

MadMax-FHEM

Einen (evtl.) besseren Vorschlag kann man nur machen, wenn man weiß was genau du bezweckst/bezwecken willst und wie genau die Logik/Ablauf sein soll...

So wird es schwierig (zumindest für mich)...
...noch dazu wo es die weiteren 8 Bedingungen ja noch nicht gibt... ;)

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

amenomade

Mit Joachim völlig einverstanden

Aber noch ein Ding rein von der Definition des DOIFs aus:
(wait 00:02:00,set UWP_WW off)
Wenn die Idee ist, set UWP_WW off erst nach 2 Minuten zu machen, funktioniert es so nicht. Das wird sofort geschaltet.

Sowas macht man im wait Attribut des DOIFs, oder evtl so:
(sleep 120; set UWP_WW off)mit Semikolon
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Dragon46

#7
Ich habe nun mal alle Bedingungen in ein Bildchen gezeichnet und als pdf angehängt.
Bilder sagen ja mehr als Worte.

Hier die Bedingungen noch mal als Text
Es sollen folgende Bedingungen realisiert werden.
1)   Einschalten der Steuerung bei einer Puffertemperatur größer 75°C sonst aus. Pumpen Umwältzung Warmwasser und Heizung Umwälzung auf aus setzen. Definierter default zustand!
2)   Einschalten der Warmwasser Umwälzung bei einer Temperatur von unter 55°C und einer Puffertemperatur von 90 Grad oder mehr.
3)   Einschalten der Heizungsumwälzung bei einer Temperatur von unter 60°C im Vorlauf und einer Puffertemperatur von 90 Grad oder mehr. Vorher muss das Warmwasser im Rücklauf 55°C erreicht haben. Die Umwälzpumpe Warmwasser soll nach einer Wartezeit von 2 min abgeschaltet werden wenn die 55°C erreicht sind.
4)   Bei erreichen von 60°C im Vorlauf soll der Mischer 10 Sekunden auf gesteuert werden.
5)   Bei gleicher Temperatur im Vorlauf und Rücklauf ( 60°C) der Heizung soll nach 2 min Wartezeit der Mischer maximal auf gesteuert werden. Abschaltung des Mischers erfolgt automatisch bei Erreichen des Endanschlages. Dies passiert auch wenn weiterhin Spannung anliegt. Maximale laufdauer ende ende 3 min. Daher 180 sec mischer auf auf 1.
Gleichzeitig sollen alle Heizkörper im Keller die Stellventile auf 100% stellen. Dies geschieht per Funkkommando. HZ_K_alle für Befehl
6)   Bei einer Puffertemperatur unter 85°C aber über 75°C soll der Mischer langsam zu gesteuert werden. 10 sec intervalle mit 2 min warten

Wenn ich das jetzt richtig aussortiert habe komme ich auf 7 oder 8 Bedingungen.
Geht das optimierter?


MadMax-FHEM

#8
Ich hab's jetzt nicht (im Detail) durch...
...aber...

PDF:

sind die Bedingungen mit Entscheidungen und Pfeilen so, dass die nächste Bedingung erst "geprüft" wird, wenn die zuvor (Pfeil) wahr wurde!?

oder sind alle Bedingungen unabhängig!? Also sobald irgendeine zutrifft soll das Ereignis ausgelöst werden!?

Bei mindestens einer Entscheidung hast du gleich ein Ereignis "integriert", so lese ich das zumindest...


Das Geschriebene, naja...

Es sind sehr viel beteiligte zu prüfende Komponenten...
...unklar: was wird durch was beeinflusst!?

Auch sind die einzelnen Temperaturen (gefühlt) nicht genau benannt. Du sprichst oft von "Temperatur" -> welche!?

Weil (aber das hast du bestimmt durchdacht): ein immer wieder "ein-/ausschalten" ja vermieden werden soll. Also Temp geht hoch -> aus / Temp geht runter ein. Ohne "Hysterese" kann das dann ganz schnell "schwingen"...

Übersteuern wäre ein weiteres Thema...

Will damit sagen: es ist schwer zu durchschauen...

Aber wie geschrieben: du wirst das schon durchdacht haben...

Evtl. ist es auch nie der Fall, dass "zufällig" Vor-/Rücklauf exakt gleich 60Grad haben...

Und wieso 7 oder 8 Bedingungen!?

Es sind doch laut textueller Beschreibung GENAU 6!?

Wer fährt wann die HKs wieder zu!?

Bist du sicher, dass du selbst genau "durchsteigst" was da wann wie wodurch wozu und wie lange oder auch nicht geschalten werden soll!?

Aber da ich DOIF eh nicht wirklich kenne/nutze: bin ich zumindest was DOIF angeht raus...

Aber auch ohne DOIF bin ich mir nicht sicher (genannte Gründe siehe oben) wie das (genau) umzusetzen wäre und v.a. ob das tatsächlich "lückenlos" so passt...

Außerdem: wenn da mal was "schräg" schaltet bin ich nicht sicher, ob du noch "durchsteigst" was wo wie warum oder eben nicht ;)

ABER: kann nat. sein, dass wenn man das (die ganzen) Systeme kennt/hat es gar nicht so kompliziert ist wie es (mir) scheint... ;)

BZW.: zeichne mal eine saubere Ablaufstruktur OHNE "implizite Ausführungen in Bedingungen" (so ich das richtig "gelesen" habe) und OHNE "offene Enden", also sind die Zustände am Ende von Bedingungen "Endzustände"? Und auch klar zeichnen/stellen, ob nun Vorbedingungen erfüllt sein müssen (Pfeile folgen) ODER ob die Bedingungen alle "unabhängig voneinander" sind (so liest sich eher der Text) WOZU dann die Pfeile!?

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

amenomade

Ich würde das zuerst in mehrere DOIFs teilen, und erst wenn alles wie gewünscht funktioniert, oder wenn es unlösbare Abhängigkeiten gibt, evtl gucken, ob man das zusammenfassen kann.

Umschalt ist z.B. nur von [Pufferspeicher:temperature] abhängig, also:
([Pufferspeicher:temperature] <= 75) (set Umschalt on)
DOELSEIF ([Pufferspeicher:temperature] >= 90) (set Umschalt off)


UWP_WW scheint nur von [Ruecklauf_WW:temperature] abhängig zu sein, also:
([Ruecklauf_WW:temperature] < 55) (set UWP_WW on)
DOELSEIF ([Ruecklauf_WW:temperature] >= 55) (set UWP_WW off)

Da fehlt evtl eine Hysterese. Wenn es zusätzlich vom Zustand von Umschalt sein soll, dann einfach noch ein "and [Umschalt] eq "on"" hinzufügen.

usw...

Die "wait" lassen sich dann einfach mit attr... wait 0:120 o.ä lösen.

Wichtig ist: erstmal pro DOIF nur ein Gerät schalten, und dieses Gerät nur in diesem DOIF schalten. Dann wird dir (und uns) klar,
Zitat"was da wann wie wodurch wozu und wie lange oder auch nicht geschalten werden soll"
;)
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

MadMax-FHEM

Zitat von: amenomade am 07 Juli 2020, 02:18:01
Ich würde das zuerst in mehrere DOIFs teilen, und erst wenn alles wie gewünscht funktioniert, oder wenn es unlösbare Abhängigkeiten gibt, evtl gucken, ob man das zusammenfassen kann.

...

Wichtig ist: erstmal pro DOIF nur ein Gerät schalten, und dieses Gerät nur in diesem DOIF schalten. Dann wird dir (und uns) klar,  ;)

Über aufteilen hatte ich auch schon nachgedacht ;)

Hilft sicher es übersichtlicher zu haben...

Aber trotzdem: es bleiben sich (verm.) gegenseitig beeinflussende (und wie [stark] sie das jeweils tun: [ich] keine Ahnung) "Regelungen"...

Und bei Regelungen muss man eben schon aufpassen was da reinspielt:

Eingangsgrößen/Ausgangsgrößen, Stellgrößen, Parameter und in diesem Fall: gegenseitige Beeinflussung...


https://de.wikipedia.org/wiki/Regelkreis

Wie geschrieben: ich kenne die Zusammenhänge nicht, vermutlich (hoffentlich) werden die Einzelsysteme an sich bereits gut geregelt und es geht hier nur um Einflussnahme auf Stellgrößen (vermutlich) aber auch die wollen mit Bedacht gewählt sein ;)

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Dragon46

Guten Morgen,
ich habe mich vielleicht etwas zu ungenau ausgedrückt.

Alle Bedingungen sind vom Pufferspeicher abhängig. Der darf nicht über 90°C gehen.
Zuerst soll dann das Warme Brauchwasser umgewälzt werden um Temperatur aus dem Puffer abzuziehen.
Danach kommt die Heizung mit ihren Kreisen.
Als allerletzte Reserve um das Überhitzen zu verhindern werden alle Heizungen im Keller voll auf gemacht. Hier habe ich das Funkmodul von HM im einsatz. die erste Version mit der UART Schnittstelle und der kleinen Platine. Das funktioniert auch als einzelnes DOIF.
Der Mischer wird nur Auf gesteuert, das teilweise schließen dient der Temperatuerhaltung.
Sobald der Puffer unter oder gleich 75°C ist übernimmt wieder die Heizungssteuerung und regelt weiterhin den Mischer.

Die einzelnen DOIF funktionieren für sich allein alle schon.
Ich möchte die nur alle zusammen haben wegen der übersichtlichkeit.

Leider bin ich mit Programierung etwas auf Kriegsfuß. Bin eher die Hardware Seite.

MadMax-FHEM

Zitat von: Dragon46 am 07 Juli 2020, 09:22:01
Die einzelnen DOIF funktionieren für sich allein alle schon.
Ich möchte die nur alle zusammen haben wegen der übersichtlichkeit.

Wenn die schon gut tun -> warum ändern!?

Und gerade WEGEN ÜBERSICHTLICHKEIT -> lassen!
(weil du siehst ja, dass du und wir nach dem Zusammentragen in ein DOIF eher weniger denn mehr Überblick haben ;)  )

Wenn es nicht 20+ DOIFs sind ;) dann ist es, wenn man sie beispielsweise in einen Raum packt doch auch übersichtlich!!?

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Dragon46

#13
Hier nocheinmal der Code wie er funktioniert.
Ich muss zwingend die Umschaltung haben damit ich die Pumpen habe.
Würde das so in einer DEF funktioniern oder besser mehrere
DOIF ([Pufferspeicher:temperature]<= 75) (set Umschalt off,set UWP_HZ off,set UWP_WW off)
DOELSE ([Pufferspeicher:temperature]>= 90)(set Umschalt on)

DOIF ([Pufferspeicher:temperature]>= 90 and [Ruecklauf_WW:temperature]< 55)(set Umschalt on,set UWP_WW on)
DOELSE ([Pufferspeicher:temperature]>= 90 and [Ruecklauf_WW:temperature] ==55)(set Umschalt on,sleep 120;set UWP_WW off)

DOIF ([Pufferspeicher:temperature]>= 90 and [vor_hz:temperature]< 60)(set Umschalt on,set UWP_HZ on)
DOELSE ([Pufferspeicher:temperature]>= 90 and [vor_hz:temperature]ge 60)(set Umschalt on,sleep 120;{fhem_set"mischer_auf on-for-timer 10"})

DOIF ([Pufferspeicher:temperature]>= 90 and ([vor_hz:temperature]ge 60 &&[ruek_hz:temperature]ge 60 ))(set Umschalt on,sleep 120;{fhem_set"mischer_auf on-for-timer 300"}, set HZ_K_all 100 )
DOIF ([Pufferspeicher:temperature]<= 85 and [Pufferspeicher:temperature] > 75)(set Umschalt on,{fhem_set"mischer_zu on-for-timer 10"})


Das hat bis jetzt funktioniert. Jedes einzelne DOIF als eigene DEF.
Muss ich bei den unteren beiden Bedingungen noch ein DOELSE anfügen?
Kann man die unteren beiden DOIF kobinieren oder besser nicht`?

Gibt es da noch möglichkeiten der optimierung oder einfach damit leben und alle in einen Raum packen

Damian

#14
Zitat von: Dragon46 am 07 Juli 2020, 09:44:37
Hier nocheinmal der Code wie er funktioniert.
Ich muss zwingend die Umschaltung haben damit ich die Pumpen habe.
Würde das so in einer DEF funktioniern oder besser mehrere
DOIF ([Pufferspeicher:temperature]<= 75) (set Umschalt off,set UWP_HZ off,set UWP_WW off)
DOELSE ([Pufferspeicher:temperature]>= 90)(set Umschalt on)

DOIF ([Pufferspeicher:temperature]>= 90 and [Ruecklauf_WW:temperature]< 55)(set Umschalt on,set UWP_WW on)
DOELSE ([Pufferspeicher:temperature]>= 90 and [Ruecklauf_WW:temperature] ==55)(set Umschalt on,sleep 120;set UWP_WW off)

DOIF ([Pufferspeicher:temperature]>= 90 and [vor_hz:temperature]< 60)(set Umschalt on,set UWP_HZ on)
DOELSE ([Pufferspeicher:temperature]>= 90 and [vor_hz:temperature]ge 60)(set Umschalt on,sleep 120;{fhem_set"mischer_auf on-for-timer 10"})

DOIF ([Pufferspeicher:temperature]>= 90 and ([vor_hz:temperature]ge 60 &&[ruek_hz:temperature]ge 60 ))(set Umschalt on,sleep 120;{fhem_set"mischer_auf on-for-timer 300"}, set HZ_K_all 100 )
DOIF ([Pufferspeicher:temperature]<= 85 and [Pufferspeicher:temperature] > 75)(set Umschalt on,{fhem_set"mischer_zu on-for-timer 10"})


Das hat bis jetzt funktioniert. Jedes einzelne DOIF als eigene DEF.
Muss ich bei den unteren beiden Bedingungen noch ein DOELSE anfügen?

Gibt es da noch möglichkeiten der optimierung oder einfach damit leben und alle in einen Raum packen

Wenn du den Abhängigkeiten aus dem Weg gehen willst und dennoch alles in einem DOIF zu haben, dann kannst du es mit DOIF-Perl versuchen. Jedes DOIF ist dort ein eigener Block. Dabei musst du darauf achten, dass du nicht bei jedem Trigger schaltest, daher musst du dir den Schaltvorgang merken, das macht DOIF im FHEM-Modus ohne das Attribut do always automatisch.

Beispiel:

define doif_all DOIF
{ if ([Pufferspeicher:temperature]<= 75 and !$VAR{1}) {   ## erstes DOIF
    fhem_set"Umschalt,UWP_HZ,UWP_WW off";
    $VAR{1}=1;
  } elsif ([Pufferspeicher:temperature]>= 90) {
      fhem_set"Umschalt on";
      $VAR{1}=0;
  }
}
{.... ## zweites DOIF
}
...



Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF