Algorithmus - Fußbodenheizung

Moin,

ich habe gerade meine Fußbodenheizung (230V Stellmotoren) mit Schaltaktoren versehen. Nun habe ich mir einige Gedanken über die Logik im Programm gemacht.

Hat jemand einen Tip, welchen Algorithmus man für die Steuerung nehmen kann? Ein einfaches „Wenn TEMP erreicht dann aus, sonst ein“ ist bei einer so trägen Heizung suboptimal.

Hoffe, jemand hat einen Tip für mich.

Viele Grüße
Sascha

Hi Sascha,

Ich selber habe eine Wandflächenheizung und will da auch jeden Heizkreis steuern, von daher beschäftige ich mich auch grad damit. Wobei Wandflächen nicht so träge sind wie der Fussboden.
Was du mal vielleicht als erstes Probieren kannst. Wenn der am Aufheizen ist, dann kannst ja schon die Stellventile früher abdrehen, da der Fussboden ja eh überschießt. Ergo z.B. Wenn (Temperatur > (Solltemperatur - 0,5)) dann Ventile zu. genauso umgekehrt wenn die Temperatur fällt. Ich denke da musst viel SPIELEN um das optimum raus zu bekommen!

Gruß

Kai

Hast du dein Problem in den Griff bekommen ?
Ich versuche gerade die Kombination von Bodenheizung und normalen Heizkörper !

EV. ist der Regler was für dich?

Wenn du ein modernes Haus mit guter Isolierung hast, brauchst du auch normalerweise keine Absenkung ö.ä. da reicht auch das einfache Schalten per Temperatur. Klappt bei mir prima. Temperaturunterschiede von 0,5° sind dabei dann aber doch schon zu groß bzw. eher das Maximum, würde ich jetzt mal einfach so sagen.

Gruß
Smudo

Gibt es hier inzwischen jemanden mit einem guten oder noch besser funktionierendem Ansatz :wink: ?

Mein Problem ist, dass ich meine Fussbodenheizung (zumindest soweit ich das verstehe) nur in den einzelnen Räumen per 230V entweder an oder aus machen kann. Der jetzige Raumregler scheint da mechanisch (besser: magnetisch) eine Art Bereich festzulegen um nicht eine an/aus/an/aus um die Solltemperatur zu veranstalten.

Klar ist, dass es keine Patentlösung gibt und die Timings sogar für jeden Raum angepasst werden müssen!

Alles was ich bisher gefunden habe arbeitete mit Stellantrieben, die dann auf z.B. 10% die Temperatur gehalten haben etc. das kann ich ja leider nicht machen. Oder ist es evtl sinnvoller neue Stellmotoren zu kaufen? Problem ist, die Homematicteile passen von der Breite nicht… :frowning:

Hi Kollege,
ich komm bei Dir nicht ganz mit.
Du hast doch 230V Stellmotoren auf deinem Heizkreisverteiler drauf, richtig?
Klar, die kannst nur voll auf und voll zu machen! Ist aber auch nicht das Thema, wenn dir ein Heizkreis massiv überschießt, dann solltest du einfach den Durchflussbegrenzer (sitzt meist im Rücklauf) einfach zudrehen (=>Stichwort Hydraulischer Abgleich). Kannst du noch in deinen Zimmern Sensoren legen um die Fussbodentemperatur festzustellen?

Gruß

Kai

Hallo!

Da kommt wieder die Pulsbreitenregelung ins Spiel.
Dabei wird die Stellgrösse 0-100% in Auf Zu-Zeiten umgerechnet.
0%=Ventil Zu

50% = 2 Min.Auf, 2 Min. Zu (beispiel)

100% immer offen.

Besser >70% immer offen
<5% immer zu

Sieht man in KNX-EIB Aktoren sehr oft.
Gibt es sehr gute Dokus dazu.

Habe ich seit Jahren so in Betrieb, Regelungsgüte 1a.

Schönen Gruß:)
Egon

Sorry, ich muss selbst meine Gedanken noch sortieren…

Das mit dem Überschiessen sehe ich momentan gar nicht als Problem sondern nur die intelligente Steuerung des Auf und Zu macht mir Gedanklich zu schaffen. Funktioniert ja jetzt auch und die jetztige Steuerung ist ja sehr einfach. (unter Solltemp an, über Solltemp aus)
Vielleicht schiesse ich auch mit Kanonen auf Spatzen.

Was ich gesucht hätte wäre ein fertiges Skript gewesen das abhängig nach der Soll und Ist Temperatur das (so intelligent wie möglich/nötig) Ventil schaltet. Klar ist das simpel zu schreiben aber sonst merkt man immer erst was man vergessen hat, wenn man sich die Arbeit gemacht hat… (wenn z.B. schon einer der Skriptkönige hier ein „Master“-Skript geschrieben hat, in dem alle Temperaturen und Ventile in einem Array abgelegt sind und 15 minütig abgearbeitet werden…)

Vielleicht hat ja nochjemand was!

Ich werde sobald die Homematic-Teile da sind einfach für jeden Raum ein Skript schreiben und mit den Temperaturdifferenzen spielen.

PS: Temperatursensoren sind nur ein Problem der Lieferzeit :wink:

@egonkernien:
Super, danke! Dann weiß ich jetzt was ich heute googlen darf… oder darf man das tatsächlich so einfach machen, dass ich

über 80%: immer auf
70% 7min. auf, 3min. zu
50% 5min. auf 5min. zu
unter 20% ganz zu.
.
.
.

dann wäre es ja in der Tat recht einfach vorhande Skripte hier aus dem Forum zu nutzen!

Hallo!
Die Zeiten ergeben sich automatisch aus der Stellgrösse.
man legt nur einmal die „Zykluszeit“ fest.
10 Min. bei Heizkörper ist ein guter Wert.
Bei Fußboden 15 Min.

Kleinere Zykluszeiten machen keinen Sinn weil die thermischen Stellantriebe eine Totzeit von 3 Min. haben.

Die % -Grenzen der Stellgrössen dienen nur dazu damit das Ventil bei z.b. 3 % unnötig Auf-Zu macht.
Und bei > 70 % will ich ja Eh „viel“ Heizen.

Guck mal Seite 15 Gira Doku Heizungsaktor:

Ist zwar EIB-KNX erklärt aber prima die Zusammenhänge-Stellgrösse-Zyklus-Totzeit.

Schönen Gruß
Egon

Ich habe jetzt schon sehr lange mein eigenes geschriebenes Script im Einsatz… Funktioniert sehr gut auf folgender Basis:

  • Wenn TEMP < SOLL = HEIZEN
  • WENN TEMP >= SOLL -> ZYKLUS HEIZEN in einer einstellbaren länge mit einstellbaren Pausen

Hier das Script ohne weitere Comments… Muss man sich selber die entsprechenden Parts heraussuchen:


<?
require_once "MyIPSFunctions.inc.php";

$DEBUG = 0;

// Wert, der die Zieltemperatur vorzieht (Nachlauf der Fußbodenheizung)
$PREOFF = 0;

$fbh_regler_arr = explode("|", $fbh_regler);
$fbh_values_arr = explode("|", $fbh_values);
$fbh_thermo_arr = explode("|", $fbh_thermo);

// Falls die MANUAL Variable der Regler verändert wird
if ( $IPS_SENDER == "WebFront" || $IPS_SENDER == "Variable" )
{
	if ( IPS_GetName($IPS_VARIABLE) == "MANUAL" )
	{
      $obj = IPS_GetObject($IPS_VARIABLE);
      $parent_id = $obj['ParentID'];

		// Manual Control is being set to OFF
		if ( $IPS_VALUE == false )
		{
			SetValue($IPS_VARIABLE, false);
			MY_SetObjectVariable($parent_id, "PULSE_RUN", false);
         HM_WriteValueBoolean($parent_id, "STATE", false);
		} else
		{
			SetValue($IPS_VARIABLE, true);
			MY_SetObjectVariable($parent_id, "PULSE_RUN", false);
         HM_WriteValueBoolean($parent_id, "STATE", false);
		}
	}
}

// Wenn das Script durch ein TimerEvent aufgerufen wird. Das ist immer dann
// der Fall, wenn der Heizbetrieb auf EIN steht
if ( $IPS_SENDER == "TimerEvent" )
{
	if ( $DEBUG == 1 ) echo "
";
	$i = 0;
	foreach ( $fbh_thermo_arr as $item )
	{
	   // Prepare some important variables
		$thermostat = (int)$item;
		$temp_value = round(MY_GetObjectVariable($thermostat, "TEMPERATURE"),2);
		$temp_soll = MY_GetObjectVariable((int)$fbh_values_arr[$i], "Aktuell");
		$temp_day = MY_GetObjectVariable((int)$fbh_values_arr[$i], "Tag");
		$temp_night = MY_GetObjectVariable((int)$fbh_values_arr[$i], "Nacht");
		$time = time();
	   $regler_arr_temp = explode(",", $fbh_regler_arr[$i]);

		// If the heating is turned on or the ECO-Mode is turned off
		if ( GetValue($fbh_switch) == true || GetValue($fbh_switch_eco) == false )
		{
			if ( $DEBUG == 1 ) echo "Heizen EIN oder ECO AUS => ". IPS_GetName($thermostat) ."
";

			// If the heating and ECO-Mode is turned off but we've got an ECO mode locally
			if ( MY_GetObjectVariable((int)$fbh_values_arr[$i], "ECO") == true && GetValue($fbh_switch) == false )
			{
			   if ( $DEBUG == 1 ) echo "ECO Mode für Raum: ". IPS_GetName($thermostat) ." während der Rest auf ECO AUS eingestellt ist und die Heizung auf AUS steht!
";
			   
 				foreach ( $regler_arr_temp as $regler_item )
				{
					$regler_temp = (int)$regler_item;
					if ( MY_GetObjectVariable($regler_temp, "STATE") == true )
					   HM_WriteValueBoolean($regler_temp, "STATE", false);
		         if ( $DEBUG == 1 ) echo "TURN OFF: ". IPS_GetName($regler_temp) ."
";
				}

				if ( $DEBUG == 1 ) echo "   
";
			   $i++;
			   continue;
			}

			// The current temperature is lower than the setting
			if ( $temp_value < $temp_soll-$PREOFF )
			{
			   if ( $DEBUG == 1 ) echo "Temperaturbedarf!!!
";
				// There's a need for temperature.
				// HEATING: ON
				foreach ( $regler_arr_temp as $regler_item )
				{
					$regler_temp = (int)$regler_item;
					if ( $DEBUG == 1 ) echo "CONTROL: ". IPS_GetName($regler_temp) ."
";

					// Only make automatic controls if the MANUAL-Flag is set to FALSE
					if ( MY_GetObjectVariable($regler_temp, "MANUAL") == false )
					{
						if ( $DEBUG == 1 ) echo "Manuelle Steuerung ist aus
";
						if ( MY_GetObjectVariable($regler_temp, "STATE") == false )
						   HM_WriteValueBoolean($regler_temp, "STATE", true);
						if ( MY_GetObjectVariable($regler_temp, "PULSE_RUN") == true )
							MY_SetObjectVariable($regler_temp, "PULSE_RUN", false);
						if ( $DEBUG == 1 ) echo "TURN ON: ". IPS_GetName($regler_temp) ."
";
					} else
					{
						if ( $DEBUG == 1 ) echo "Manuelle Steuerung EIN!
";
					}
				}
			} else
			{
			   if ( $DEBUG == 1 ) echo "Kein Temperaturbedarf oder ECO Mode!
";
				// There's no need for temperature.
				// HEATING: OFF
				// The only thing we have to do now is cyclic heating (pulse mode)
				foreach ( $regler_arr_temp as $regler_item )
				{
					$regler_temp = (int)$regler_item;
					if ( $DEBUG == 1 ) echo "CONTROL: ". IPS_GetName($regler_temp) ."
";

	            if ( MY_GetObjectVariable($regler_temp, "MANUAL") == false &&
						MY_GetObjectVariable($regler_temp, "ECO") == false )
	            {
	               if ( $DEBUG == 1 ) echo "Manuelle Steuerung ist aus
";
						$last_run = (int)MY_GetObjectVariable($regler_temp, "LAST_RUN");
						$pulse_run = false;

						// Check if we have to start the PULSE_RUN
						if ( $DEBUG == 1 ) echo "LOCKTIME: ".
							MY_GetObjectVariable((int)$regler_item, "PULSE_LOCKTIME") ."
";
						if ( ($last_run + (MY_GetObjectVariable((int)$regler_item, "PULSE_LOCKTIME")*60)) < $time &&
							MY_GetObjectVariable($regler_temp, "PULSE_RUN") == false &&
							MY_GetObjectVariable($regler_temp, "STATE") == false )
						{
							MY_SetObjectVariable($regler_temp, "PULSE_RUN", true);
							MY_SetObjectVariable($regler_temp, "PULSE_START", $time);
							$pulse_run = true;
							if ( $DEBUG == 1 ) echo "START PULSE: ". IPS_GetName($regler_temp) ."
";
						} else
						{
							if ( MY_GetObjectVariable($regler_temp, "STATE") == true &&
								MY_GetObjectVariable($regler_temp, "PULSE_RUN") == false )
							{
								if ( $DEBUG == 1 ) echo "Ausschalten nach Heizperiode!
";
							   HM_WriteValueBoolean($regler_temp, "STATE", false);
							   MY_SetObjectVariable($regler_temp, "LAST_RUN", $time);
							}
						}

						// Check if we have to keep the PULSE running
						if ( MY_GetObjectVariable($regler_temp, "PULSE_RUN") == true )
						{
                     if ( $DEBUG == 1 ) echo "PULSE RunTime: ".
                        MY_GetObjectVariable((int)$regler_item, "PULSE_RUNTIME") ."
";
							$pulse_start = MY_GetObjectVariable($regler_temp, "PULSE_START");
						   if ( $pulse_start + (MY_GetObjectVariable((int)$regler_item, "PULSE_RUNTIME")*60) >= $time )
						   {
								// Yes, keep the PULSE running
								if ( $DEBUG == 1 ) echo "PULSE läuft... Weiterlaufen lassen!
";
						      $pulse_run = true;
						   } else
						   {
								// No, turn it off
								MY_SetObjectVariable($regler_temp, "PULSE_RUN", false);
								MY_SetObjectVariable($regler_temp, "LAST_RUN", $time);
								if ( $DEBUG == 1 ) echo "STOP PULSE: ". IPS_GetName($regler_temp) ."
";
						   }
						}

						if ( $pulse_run == true )
						{
							if ( MY_GetObjectVariable($regler_temp, "STATE") == false )
							   HM_WriteValueBoolean($regler_temp, "STATE", true);
		               if ( $DEBUG == 1 ) echo "TURN ON: ". IPS_GetName($regler_temp) ."
";
						} else
						{
							if ( MY_GetObjectVariable($regler_temp, "STATE") == true )
							   HM_WriteValueBoolean($regler_temp, "STATE", false);
		               if ( $DEBUG == 1 ) echo "TURN OFF: ". IPS_GetName($regler_temp) ."
";
						}
					} else
					   if ( $DEBUG == 1 ) echo "Manuelle Steuerung oder ECO-Mode EIN!
";
				}
			}
		}
		$i++;
		if ( $DEBUG == 1 ) echo "   
";
	}
}
?>