DOIF Kaskadieren für Heizung mit Solarunterstützung

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

Vorheriges Thema - Nächstes Thema

Dragon46

@ 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?

amenomade

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

Und Damian hat ja ein Beispiel hinterlegt...
...ist wohl DOIF-Perl oder heißt das Perl-DOIF!? ;)

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

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.

Damian

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

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

Dragon46

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.

MadMax-FHEM

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

#22
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.

Damian

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

Dragon46

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.