[Projekt] Heizung-Brenner-Steuerung

Hallo Zusammen,

ja ich weiss, es gibt hier schon viele verschiedene Lösungen. Möchte aber trotzdem einmal meinen Vorschlag vorstellen.

Welche Beweggründe habe ich:

  1. Blut geleckt, mal wieder was zu proggen :slight_smile:
  2. eine Steuerung unabhängig einer Raumregelung
  3. Modularer Aufbau

Welche Vorraussetzungen habe ich:

  1. 3 Raumregl. in den wichtigsten Räumen (2xKizi;1xWhz+Küch)
  2. eine Trimatic-MC mit Fern.bedienung (Tag;Nacht;Aus;Auto)

Anbei sende ich Euch einmal den ersten Entwurf des Ablaufdiagrammes zu, mit der folgenden Bitte an die, welche in Bezug auf Hzg.steuerung schon Erfahrungen gesammelt haben.

EDIT1: Habe das Flussdiagramm erweitert (10/3 Min. Regel fehlt noch)
EDIT2: elektr.Schaltung beigefügt; Flussdiagramm mit Trinkwassererwärm.klausel erweitert (10/3 Min. Regel fehlt noch)
EDIT3: 10/3 Regel eingefügt + kleine Anpassungen

.

Visio-Brenner-Hzg-steuerung.pdf (116 KB)

Hallo,

so jetzt ist alles im Ablaufdiagramm drin, nun beginnt die eigentliche Arbeit :eek:

Ich hoffe die Widerstandswerte sind richtig berechnet worden.
Vielleicht hat ja jemand so eine Steuerung und könnte es vielleicht mal auspiepsen.

PS: Ich hoffe noch auf einige Erfahrungsberichte, nicht dass ich in eine Sackgasse komme.

Hallo Zusammen,

die ersten Gehversuche in PHP habe ich jetzt hinter mir.
Anbei setzte ich Euch einmal die ersten Module rein.
Ich bitte nicht gleich von den Profis zerissen zu werden :smiley:
Aber nachdem ich auch durch die verschiedensten Beiträge hier mein Wissen angeeignet habe, möchte ich mein Wissen auch weitergeben.

Der Ablauf ist schön nach dem Ablaufdiagramm (ACHTUNG: wird bei Fehlererkennung angepasst)im ersten Beitrag nachvollziehbar.

Folgende Lektüren habe ich verwendet:

  1. Das Forum mit den Quellscripten
  2. IPS Variablen
  3. PHP Befehle
  4. PHP-Befehle und MySQL-Anbindung

<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : Trimatik-MC_Steuerung.ips.php
Trigger  : 
Interval : 
*/
//Constanten
define("TEMPDIFFMAX", 2);
define("TEMPSOLLTAG", 18);
define("TEMPFROST", -9);
define("TEMPWARM", 14);
define("UHRTAGMIN", "05:00");
define("UHRTAGMAX", "23:00");
define("WARTEMIN", 3);
define("WARTEMAX", 10);
define("BRENNER_SM4_HZG_1", 22705);
define("BRENNER_SM4_HZG_2", 40269);
define("BRENNER_TIME", 900);

//Variablen
$WHZIstTemp =0;
$AlexIstTemp = 0;
$VaneIstTemp = 0;
$WHZSollTemp =0;
$AlexSollTemp = 0;
$VaneSollTemp = 0;
$WHZIstPos =0;
$AlexIstPos = 0;
$VaneIstPos = 0;
$AussIstTemp = 0;
$Uhrzeit = date("H:i");
$TempDiff = 0;
$TempSOLL = 0;
$TempAussen = 0;
$UhrModus = 0;
$Heizung = 0;
$G_Heizung = 0;
$Heizung_refresh = 0;
$HzgSteuerung = 0;

// Einlesen der einzelnen Werte
$WHZIstTemp = getvaluefloat("Wohnzimmer_FHT_IST_Temp.");
$AlexIstTemp = getvaluefloat("Alexandra_FHT_IST_Temp.");
$VaneIstTemp = getvaluefloat("Vanessa_FHT_IST_Temp.");
$WHZSollTemp = getvaluefloat("Wohnzimmer_FHT_Target_Temp.");
$AlexSollTemp = getvaluefloat("Alexandra_FHT_Target_Temp.");
$VaneSollTemp = getvaluefloat("Vanessa_FHT_Target_Temp.");
$WHZIstPos = getvaluefloat("Wohnzimmer_FHT_IST_Pos.");
$AlexIstPos = getvaluefloat("Alexandra_FHT_IST_Pos.");
$VaneIstPos = getvaluefloat("Vanessa_FHT_IST_Pos.");
$AussIstTemp = getvaluefloat("HMS_Aussen_IST_Temp.");

// Auswertung der temp.Differenz in den Rumen
if  ($WHZSollTemp - $WHZIstTemp > TEMPDIFFMAX) {$TempDiff = "gross";}
elseif  ($AlexSollTemp - $AlexIstTemp > TEMPDIFFMAX) {$TempDiff = "gross";}
elseif  ($VaneSollTemp - $VaneIstTemp > TEMPDIFFMAX) {$TempDiff = "gross";}
else  {$TempDiff = "klein";}

// Auswertung der Soll.Temp. fr Absenkung
if  (($WHZSollTemp == TEMPSOLLTAG) or ($WHZSollTemp > TEMPSOLLTAG)) {$TempSOLL = "Normal";}
elseif  (($AlexSollTemp == TEMPSOLLTAG) or ($AlexSollTemp > TEMPSOLLTAG)) {$TempSOLL = "Normal";}
elseif  (($VaneSollTemp == TEMPSOLLTAG) or ($VaneSollTemp > TEMPSOLLTAG)) {$TempSOLL = "Normal";}
else  {$TempSOLL = "Absenk";}

// Auswertung der Aussentemp. fr Kesselabschaltung
if  (($AussIstTemp == TEMPFROST) or ($AussIstTemp < TEMPFROST)) {$TempAussen = "Frost";}
elseif  (($AussIstTemp == TEMPWARM) or ($AussIstTemp > TEMPWARM)) {$TempAussen = "Warm";}
else  {$TempAussen = "Normal";}

// Auswertung der Ventil-Positionen
if  ($WHZIstPos <> 0) {$VentilPos = "auf";}
elseif   ($AlexIstPos <> 0) {$VentilPos = "auf";}
elseif  ($VaneIstPos <> 0) {$VentilPos = "auf";}
else  {$VentilPos = "zu";}

// Auswertung des Tagesmodus
If (($Uhrzeit > UHRTAGMIN) and ($Uhrzeit < UHRTAGMAX)) {$UhrModus = "Tag";}
Else {$UhrModus = "Nacht";}

//Heizungssteuerungsroutinen
//Ventil ZU Modus
if ($VentilPos == "zu"){
	if ($TempAussen == "Frost"){
		$Heizung = "NACHT";}
	elseif ($TempSOLL == "Normal") {
		$Heizung = "NACHT";}
	else {
		$Heizung = "AUS";}
;}
//Ventil AUF und Absenktemperatur Modus
if ($VentilPos == "auf"){
	if ($TempSOLL == "Absenk"){
		$Heizung = "NACHT";}
;}
//Ventil AUF und Normaltemeratur Modus
if ($VentilPos == "auf"){
	if ($TempSOLL == "Normal"){
		if ($TempAussen == "Frost"){
			$Heizung = "TAG";}
		elseif ($TempDiff == "klein") {
			$Heizung = "NACHT";}
		elseif ($TempAussen == "Warm"){
			$Heizung = "NACHT";}
		else {
			$Heizung = "TAG";}
	;}
;}
//Warteschleife fr die zwei Timer
$G_Heizung = getvaluestring("G_Brenner_Status");
$Heizung_refresh = (time() - IPS_GetUpdatetime("G_Brenner_Status"))/60;
if ($Heizung <> $G_Heizung){
	if ($TempDiff == "gross"){
		if (($Heizung_refresh == WARTEMIN) or ($Heizung_refresh > WARTEMIN)) {
			$HzgSteuerung = "AN";
         SetValueString("G_Brenner_Status", $Heizung);}
		else {
			$HzgSteuerung = "AUS";}
    ;}
;}
elseif (($Heizung == $G_Heizung) or ($TempDiff == "klein")) {
	if (($Heizung_refresh == WARTEMAX) or ($Heizung_refresh > WARTEMAX)) {
		$HzgSteuerung = "AN";
      SetValueString("G_Brenner_Status", $Heizung);}
   else {
      $HzgSteuerung = "AUS";}
;}
//Ansteuerung des Brenners (Doppeltes Senden)
if ($HzgSteuerung == "AN"){
   if ($Heizung == "TAG"){
     FS20_SwitchDuration(BRENNER_SM4_HZG_1, True, BRENNER_TIME);
     FS20_SwitchDuration(BRENNER_SM4_HZG_2, FALSE, BRENNER_TIME);
     FS20_SwitchDuration(BRENNER_SM4_HZG_1, True, BRENNER_TIME);
     FS20_SwitchDuration(BRENNER_SM4_HZG_2, FALSE, BRENNER_TIME);}
   elseif ($Heizung == "NACHT"){
     FS20_SwitchDuration(BRENNER_SM4_HZG_1, FALSE, BRENNER_TIME);
     FS20_SwitchDuration(BRENNER_SM4_HZG_2, TRUE, BRENNER_TIME);
     FS20_SwitchDuration(BRENNER_SM4_HZG_1, FALSE, BRENNER_TIME);
     FS20_SwitchDuration(BRENNER_SM4_HZG_2, TRUE, BRENNER_TIME);}
   elseif ($Heizung == "AUS"){
     FS20_SwitchDuration(BRENNER_SM4_HZG_1, TRUE, BRENNER_TIME);
     FS20_SwitchDuration(BRENNER_SM4_HZG_2, TRUE, BRENNER_TIME);
     FS20_SwitchDuration(BRENNER_SM4_HZG_1, TRUE, BRENNER_TIME);
     FS20_SwitchDuration(BRENNER_SM4_HZG_2, TRUE, BRENNER_TIME);}
   elseif ($Heizung == "AUTO"){
     FS20_SwitchDuration(BRENNER_SM4_HZG_1, FALSE, BRENNER_TIME);
     FS20_SwitchDuration(BRENNER_SM4_HZG_2, FALSE, BRENNER_TIME);
     FS20_SwitchDuration(BRENNER_SM4_HZG_1, FALSE, BRENNER_TIME);
     FS20_SwitchDuration(BRENNER_SM4_HZG_2, FALSE, BRENNER_TIME);}
//;}

// Testausgabe ob alles passt :-)
$TXT_Inhalt =  (date("d.m.y").
      " ".
      date("H:i:s").
      ";".
$TempDiff.";".
$TempSOLL.";".
$TempAussen.";".
$VentilPos.";".
$UhrModus.";".
$Heizung.";".
$G_Heizung.";".
$HzgSteuerung.";".
$Heizung_refresh.
"
");
$handle = fopen("D:/Trimatik-MC.txt","a");
fwrite($handle, $TXT_Inhalt);
fclose($handle);
;}
?>

PS: Die Constanten möchte ich noch über eine INI-datei abfahren, weiss bloss noch nicht wie das genau geht :slight_smile:

.

Hallo,

zum Problem der INI Dateien, schau Dir einfach mal WIIPS genauer an, da siehst Du, wie man sowas ganz komfortabel loesen kann.

Hallo,

habe es gefunden :slight_smile:
INI-Dateien können auch „einfacher“ als mit WIIPS ausgelesen werden,
mit dem Befehl parse_ini_file.

Das beiliegende Beispiel fkt. aber nur bei assoziativen Array, sprich die einzelnen Werte werden, ohne dem Gruppennamen einfach eingelesen.
Aber für meine Verwendung reicht das vollkommen aus.


[erste_gruppe]
eins = 1
fuenf = 5
animal = BIRD


*******************************
 IP-SYMCON Event Scripting
*******************************
File     : Test.ips.php
Trigger  : 
Interval : 
*/
$ini_File = parse_ini_file("test.ini");
extract ($ini_File);
echo "$eins, $fuenf, $animal";

Hallo Heiko,

das was Du in Deinem Skript als „Constanten“ bezeichnest, sind gar keine Konstanten sondern ganz normale Variablen. Man erkennt Variablen am $-Zeichen.

In PHP definiert man Konstanten so:

define("TEMPDIFFMAX", 2);

Die Verwendung erfolgt so:

if  ($WHZSollTemp - $WHZIstTemp > TEMPDIFFMAX) {$TempDiff = "gross";}

Konstanten haben den Vorteil, dass sie auch innerhalb von Funktionen bekannt sind und nicht explizit übergeben werden müssen.

Einer weit verbreiteten Konvention zufolge schreibt man Konstanten in Großbuchstaben. Zwingend ist das aber nicht. Du kannst sie schreiben wie Du willst. Allerdings kann man Konstanten in Großbuchstaben besser im Skript erkennen.

Gruß
HJH

Hallo HJH,

danke für den Hinweis, werde ich morgen gleich Korrigieren und richtig setzten. :slight_smile:

Habe jetzt übrigens auch den IPS_GetUpdatetime Befehl kappiert :rolleyes:,
denke das ich ihn verwende um den letzten Regelzeitpunkt zu ermitteln, dann brauche ich nur eine Global Variable (G_Brennerstatus).

Am Freitag war ich noch am Verzweifeln, jetzt macht es richtig Spass !!!

So jetzt ist das Hauptscript erst einmal fertig.
Einbindung einer INI-Datei folgt noch.