FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: Dragon46 am 06 Juli 2020, 14:37:29

Titel: DOIF Kaskadieren für Heizung mit Solarunterstützung
Beitrag von: Dragon46 am 06 Juli 2020, 14:37:29
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
Titel: Antw:DOIF Kaskadieren für Heizung mit Solarunterstützung
Beitrag von: MadMax-FHEM am 06 Juli 2020, 15:05:12
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
Titel: Antw:DOIF Kaskadieren für Heizung mit Solarunterstützung
Beitrag von: amenomade am 06 Juli 2020, 18:50:31
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 "<="
Titel: Antw:DOIF Kaskadieren für Heizung mit Solarunterstützung
Beitrag von: MadMax-FHEM am 06 Juli 2020, 19:01:09
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
Titel: Antw:DOIF Kaskadieren für Heizung mit Solarunterstützung
Beitrag von: Dragon46 am 06 Juli 2020, 21:16:04
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
Titel: Antw:DOIF Kaskadieren für Heizung mit Solarunterstützung
Beitrag von: MadMax-FHEM am 06 Juli 2020, 21:25:59
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
Titel: Antw:DOIF Kaskadieren für Heizung mit Solarunterstützung
Beitrag von: amenomade am 06 Juli 2020, 21:50:09
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
Titel: Antw:DOIF Kaskadieren für Heizung mit Solarunterstützung
Beitrag von: Dragon46 am 06 Juli 2020, 23:15:20
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?

Titel: Antw:DOIF Kaskadieren für Heizung mit Solarunterstützung
Beitrag von: MadMax-FHEM am 07 Juli 2020, 00:33:48
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
Titel: Antw:DOIF Kaskadieren für Heizung mit Solarunterstützung
Beitrag 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.

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"
;)
Titel: Antw:DOIF Kaskadieren für Heizung mit Solarunterstützung
Beitrag von: MadMax-FHEM am 07 Juli 2020, 08:35:50
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
Titel: Antw:DOIF Kaskadieren für Heizung mit Solarunterstützung
Beitrag von: Dragon46 am 07 Juli 2020, 09:22:01
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.
Titel: Antw:DOIF Kaskadieren für Heizung mit Solarunterstützung
Beitrag von: MadMax-FHEM am 07 Juli 2020, 09:26:11
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
Titel: Antw:DOIF Kaskadieren für Heizung mit Solarunterstützung
Beitrag 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?
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
Titel: Antw:DOIF Kaskadieren für Heizung mit Solarunterstützung
Beitrag von: Damian am 07 Juli 2020, 09:54:16
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
}
...



Titel: Antw:DOIF Kaskadieren für Heizung mit Solarunterstützung
Beitrag von: Dragon46 am 07 Juli 2020, 10:14:16
@ Damian
Vielen Dank für die Hinweise auf die kleinen Details der Programierung.
Wenn ich das Richtig verstanden habe sollte das auch mit einfachen If else oder elseif Konstrukten gehen.

Von Perl selber lasse ich die Finger, das ist mir zu hoch. Ich bin froh das ich die Grundlagen der Programierung verstehe. 

Wenn IF Funktionen ausreichen würde ich das etwa so schreiben.
Bitte korrigiert mich falls die erste Zeile falsch ist.

IF([Pufferspeicher:temperature]<= 75) (set Umschalt off,set UWP_HZ off,set UWP_WW off)
ELSEIF ([Pufferspeicher:temperature]>= 90)(set Umschalt on)
ELSEIF ([Pufferspeicher:temperature]>= 90 and [Ruecklauf_WW:temperature]< 55)(set UWP_WW on)
ELSEIF ([Pufferspeicher:temperature]>= 90 and [Ruecklauf_WW:temperature] ==55)(sleep 120,set UWP_WW off)
ELSEIF ([Pufferspeicher:temperature]>= 90 and [vor_hz:temperature]< 60)(set UWP_HZ on)
ELSEIF ([Pufferspeicher:temperature]>= 90 and [vor_hz:temperature]ge 60)(sleep 120;{fhem_set"mischer_auf on-for-timer 10"})
ELSEIF ([Pufferspeicher:temperature]>= 90 and ([vor_hz:temperature]ge 60 &&[ruek_hz:temperature]ge 60 ))(sleep 120;{fhem_set"mischer_auf on-for-timer 300"}, set Hz_K_alle 100 )
ELSEIF ([Pufferspeicher:temperature]<= 85 and [Pufferspeicher:temperature] > 75)(set Umschalt on,{fhem_set"mischer_zu on-for-timer 10"})


Würde das so gehen oder besser den Umschalt Befehl in alle Bedingungen integrieren?
Titel: Antw:DOIF Kaskadieren für Heizung mit Solarunterstützung
Beitrag von: amenomade am 07 Juli 2020, 11:36:32
Nein, es würde m.A. nicht gehen, da:
- beim Fhem IF gibt es kein ELSEIF oder ELSIF, sondern nur ELSE. Da müsste man verschachteln
- die Bedingungen in IF triggern nicht
Titel: Antw:DOIF Kaskadieren für Heizung mit Solarunterstützung
Beitrag von: MadMax-FHEM am 07 Juli 2020, 11:44:45
Und Damian hat ja ein Beispiel hinterlegt...
...ist wohl DOIF-Perl oder heißt das Perl-DOIF!? ;)

Gruß, Joachim
Titel: Antw:DOIF Kaskadieren für Heizung mit Solarunterstützung
Beitrag von: Dragon46 am 07 Juli 2020, 12:33:16
Nun habe ich mir anhabd des Beispieles mal den Code gebaut.
Ich hoffe das es alles richtig zusammen gebaut ist


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;
  }
}

{if ([Pufferspeicher:temperature]>= 90 and[Ruecklauf_WW:temperature]< 55 and !$VAR{1}and !$VAR{2}) {   ## zweites DOIF
    fhem_set"UWP_WW on";
    $VAR{2}=1;
  } elsif ([Pufferspeicher:temperature]>= 90 and [Ruecklauf_WW:temperature] ==55) {
      sleep 120, fhem_set"UWP_WW off";
      $VAR{2}=0;
  }
}

{if ([Pufferspeicher:temperature]>= 90 and[vor_hz:temperature]< 60 and !$VAR{1}and !$VAR{3}) {   ## drittes DOIF
    fhem_set"UWP_HZ on";
    $VAR{3}=1;
  } elsif ([Pufferspeicher:temperature]>= 90 and [vor_hz:temperature] >=60) {
      sleep 120, fhem_set"mischer_auf on-for-timer 10";
      $VAR{3}=0;
  }
}

{if ([Pufferspeicher:temperature]>= 90 and[vor_hz:temperature]>= 60 and [ruek_hz:temperature]>= 60 and !$VAR{1}and !$VAR{4}) {   ## viertes DOIF
    sleep 120,fhem_set"mischer_auf on-for-timer 300",fhem_set"HZ_K_all 100";
    $VAR{4}=1;
  } elsif {
      $VAR{4}=0;
  }
}
{if ([Pufferspeicher:temperature]<= 85 and [Pufferspeicher:temperature] > 75) and !$VAR{1}and !$VAR{5}) {   ## fünftes DOIF
    fhem_set"mischer_zu on-for-timer 10";
    $VAR{5}=1;
  } elsif  {
      $VAR{5}=0;
  }
}


Ich schaue in den Bedingungen ab dem zweiten DOIF nach ob beim ersten die Umschaltung auf on ist und dann kommt der Rest wie im Beispiel.

Hoffentlich ist es verständlich was ich da zusammen gebaut habe und es sind nicht zu viele Fehler drin.
Titel: Antw:DOIF Kaskadieren für Heizung mit Solarunterstützung
Beitrag von: Damian am 07 Juli 2020, 12:42:50
Ist an sich nicht komplizierter als im FHEM-Modus, wenn man die Syntax einmal kennt.

perl-sleep solltest du nicht verwenden, sonst blockierst du dein FHEM.

statt

sleep 120, fhem_set"UWP_WW off";

solltest du einen Ausführungstimer nehmen:

set_Exec("timer_UWP",120,'fhem_set"UWP_WW off"');

siehe https://fhem.de/commandref_DE.html#DOIF_Ausf%C3%BChrungstimer

Titel: Antw:DOIF Kaskadieren für Heizung mit Solarunterstützung
Beitrag von: Dragon46 am 07 Juli 2020, 13:45:51
Vielen Dank für die Aufklärung mit dem Timer.
Ich hatte mir die Comand Ref zwar durchgelesen bin aber nicht darauf gekommen das der Timer ein Problem werden könnte.
Das habe ich nun geändert.

Sind sonst noch irgendwelche Fehler im Code oder sollte der nun hoffentlich Funktionieren.
Ist die vorgehensweise mit den letzten beiden ifelse korrekt oder dort ein else einfügen.

Ich bin nach dem lesend er Command Ref nicht wirklich schlauer da ja scheits beides geht.

Ich arbeite mich gerade in desen Teil von FHEM ein. Der Rest mit der Homematik und Homematik IP war schon gut verständlich und die Heizkörpersteuerung funktioniert schon wie gewünscht. Auch funktionieren die Markiese und die Rolläden.
Titel: Antw:DOIF Kaskadieren für Heizung mit Solarunterstützung
Beitrag von: MadMax-FHEM am 07 Juli 2020, 13:54:43
elsif(BEDINGUNG){bedingte AUSFÜHRUNG}

else{unbedingte Ausführung}

Also das was du stehen hast kann nicht gehen, sollte eigentlich einen Syntaxfehler bringen!?

Zitat
  } elsif {
      $VAR{4}=0;
  }

Gruß, Joachim
Titel: Antw:DOIF Kaskadieren für Heizung mit Solarunterstützung
Beitrag von: Dragon46 am 07 Juli 2020, 14:39:38
Ich hatte keine Fehlermeldung.
Habe aber nun die beiden letzten auf else geändert.

Beim Test der blöcke bekomme ich bei
Block1 executed
block 2 bis 5 folgenden Fehler unter readings
condition c02: syntax error at (eval 227) line 1, near "90 and::ReadingValDoIf"
syntax error at (eval 227) line 3, near ";
  }"
syntax error at (eval 227) line 6, near ";
  }"

Was ist hier falsch?
Anbei der finale Code auf dem Testsystem


{ 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;
  }
}

{if ([Pufferspeicher:temperature]>= 90 and[Ruecklauf_WW:temperature]< 55 and !$VAR{1}and !$VAR{2}) {   ## zweites DOIF
    fhem_set"UWP_WW on";
    $VAR{2}=1;
  } elsif ([Pufferspeicher:temperature]>= 90 and [Ruecklauf_WW:temperature] ==55) {
      set_Exec("timer_UWP",120,'fhem_set"UWP_WW off"');
      $VAR{2}=0;
  }
}

{if ([Pufferspeicher:temperature]>= 90 and[vor_hz:temperature]< 60 and !$VAR{1}and !$VAR{3}) {   ## drittes DOIF
    fhem_set"UWP_HZ on";
    $VAR{3}=1;
  } elsif ([Pufferspeicher:temperature]>= 90 and [vor_hz:temperature] >=60) {
       set_Exec("timer_UWP",120,'fhem_set"mischer_auf on-for-timer 10"');
      $VAR{3}=0;
  }
}

{if ([Pufferspeicher:temperature]>= 90 and[vor_hz:temperature]>= 60 and [ruek_hz:temperature]>= 60 and !$VAR{1}and !$VAR{4}) {   ## viertes DOIF
     set_Exec("timer_UWP",120,'fhem_set"mischer_auf on-for-timer 300",fhem_set"HZ_K_all 100"');
    $VAR{4}=1;
  } else {
      $VAR{4}=0;
  }
}
{if ([Pufferspeicher:temperature]<= 85 and [Pufferspeicher:temperature] > 75) and !$VAR{1}and !$VAR{5}) {   ## fünftes DOIF
     set_Exec("timer_UWP",120,'fhem_set"mischer_zu on-for-timer 10"');
    $VAR{5}=1;
  } else  {
      $VAR{5}=0;
  }
}


Was habe ich falsch gemacht?
Die Temperaturdaten kommen am Testsystem an nur es wird nichts geschaltet im System. Falls die entsprechenden Ausgänge auf on gesetzt werden kann ich dann am Oszilloskop sehen.
Titel: Antw:DOIF Kaskadieren für Heizung mit Solarunterstützung
Beitrag von: Damian am 07 Juli 2020, 15:30:03
vor und hinter and muss ein Leerzeichen
Titel: Antw:DOIF Kaskadieren für Heizung mit Solarunterstützung
Beitrag von: Dragon46 am 07 Juli 2020, 18:22:42
Danke an alle.
Es läuft alles wie es soll.

Alle Blöcke sind auf executed und das doif_all ist auf initialized.

Momentan sind die Temperaturen unter den Schaltschwellen.
Ich warte morgen mal ab was kommt.
Sollte alles passen geht es vom Testsystem auf das Produktive.