Das Skript sieht so aus und wird alle 10 Minuten getriggert:
<?
include_once "IPSLogger.ips.php";
$heizperiode = GetValueBoolean(33680 /*[Program\Heizung\Data\Heizperiode]*/);
$automatik = GetValueBoolean(13922 /*[Program\Heizung\Data\Zustand\Modus]*/);
$manuelTemp = GetValueFloat(29883 /*[Program\Heizung\Data\Zustand\Manuell\Temperatur]*/);
$rooms = array();
/*
Array für die Steuerung:
Name = Name des Raumes
Sollwert = Variable die den Sollwert des Raumes enthält
Istwert = Variable die den Istwert des Raumes enthält
Aktor = Der Schaltaktor der den Heizkreis steuert
Parralele = Variable die die Parallelverschiebung der Heizkurven für den Raum Regelt
Korrektur = Variable die den Korrekturwert für die Heizkurve des Raumes hält
Zusatz = Boolsche Variable, die wenn TRUE dafür sorgt, dass die Temperatur in der Variablen "ZusatzTemp" statt der Solltemperatur des Reglers verwendet wird
ZusatzTemp = Solltemp. die angefahren werden soll, wenn die Solltemp des Reglers überschrieben wird
*/
//Wohnzimmer
$rooms[] = array("Name" => 'Wohnzimmer', "Sollwert" => 47561, "Istwert" => 12997, "Aktor" => 31710, "Parallele" => GetValue(50653), "Korrektur" => Getvalue(18084), "Zusatz" => 0 , "ZusatzTemp" => 0 );
foreach ($rooms as $num => $room)
{
If ($heizperiode)
{
//Sollwert holen je nach Einstellung
$sollwert = GetSollwert($room, $automatik, $manuelTemp);
$room['Sollwert'] = $sollwert;
//Istwert ermitteln aus Regler
$istwert = getValueFloat($room['Istwert']);
$room['Istwert'] = $istwert;
//Stellwert ermitteln
$pwm = SetPWM($room);
//Heizung schalten
if($pwm == 0)
{
//Aktor aus schalten
HM_WriteValueBoolean($room['Aktor'], "STATE", false);
IPSLogger_Dbg (__file__, "Raum '".$room['Name']."' => Soll: ".$sollwert."°C, Ist: ".$istwert."°C, Aktor: ".($pwm / 60 * 10)."%");
}
else
{
//Aktor für die berechnete Zeit einschalten
HM_WriteValueFloat($room['Aktor'], "ON_TIME", $pwm); //für berechnete Zeit ein
HM_WriteValueBoolean($room['Aktor'], "STATE", true);
//Anzeigekorrektur wieder raus nehmen für den Logger
if (($pwm / 60 * 10) > 100)
{
$pwm = 100 * 60 / 10;
}
IPSLogger_Dbg (__file__, "Raum '".$room['Name']."' => Soll: ".$sollwert."°C, Ist: ".$istwert."°C, Aktor: ".($pwm / 60 * 10)."%");
}
}
else
{
//Aktor sicherheitshalber aus schalten
HM_WriteValueBoolean($room['Aktor'], "STATE", false);
IPSLogger_Dbg (__file__, "Raum '".$room['Name']."' => Aktor aus.");
}
}
function GetSollWert($raum, $auto, $manTemp)
{
if ($auto == 1)
{
//Sollwert vom Regler holen
$soll = getValueFloat($raum['Sollwert']);
}
else
{
//manuellen Sollwert holen
$soll = $manTemp;
}
//Ist Zusatzbedingung vorhanden?
If (IPS_VariableExists($raum['Zusatz']))
{
//Wenn Zusatzbedingung erfüllt Sollwert setzen
if (getValueBoolean($raum['Zusatz']) == 0)
{
$soll = getValueFloat($raum['ZusatzTemp']);
}
}
return $soll;
}
function SetPWM($raum)
{
$delta = $raum['Sollwert'] - $raum['Istwert'];
$parallel = $raum['Parallele'];
$korrektur = $raum['Korrektur'];
//Berechnet
if ($delta >= 0)
{
$pwm = round((log10($delta + $parallel * 0.001) + $korrektur * 0.01)*100, 0);
if ($pwm > 100){ $pwm = 100; }
}
else
{
$pwm = 0;
//echo "test
";
}
/*
switch($delta)
{
//alt
case ($delta < 0): $pwm = 0; break;
case ($delta > 0.8): $pwm = 100; break;
case ($delta > 0.6): $pwm = 90; break;
case ($delta > 0.4): $pwm = 75; break;
case ($delta > 0.2): $pwm = 40; break;
case ($delta >= 0): $pwm = 20; break;
//neu
case ($delta < 0): $pwm = 0; break;
case ($delta > 0.9): $pwm = 100; break;
case ($delta > 0.8): $pwm = 100; break;
case ($delta > 0.7): $pwm = 100; break;
case ($delta > 0.6): $pwm = 95; break;
case ($delta > 0.5): $pwm = 90; break;
case ($delta > 0.4): $pwm = 80; break;
case ($delta > 0.3): $pwm = 70; break;
case ($delta > 0.2): $pwm = 60; break;
case ($delta > 0.1): $pwm = 45; break;
case ($delta >= 0): $pwm = 25; break;
}
*/
//Einschaltzeit in Sekunden berechnen
$dauer = (10 * 60) * $pwm / 100;
if ($pwm == 100)
{
$dauer = $dauer + 10; //10 Sekunden dazu wegen dem Anzeigeproblem in Multichard
}
return $dauer;
}
?>
Erklärung:
Zusatz
ist eine Boolsche Variable die im Webfront eingestellt werden kann und mit der ich festlegen kann, dass die Automatik für einen Raum nicht verwendet werden soll. Das benutze ich für die Absenkung der Temperatur in den Kinderzimmern, solange die nicht da sind. Die kommen nur noch ab und an am Wochenende.
ZusatzTemp
ist die zugehörige Temperatur.
$heizperiode
Eine Boolsche Variable die festlegt ob überhaupt geheizt werden soll
$automatik
Eine Boolsche Variable die festlegt ob Automatik oder manueller Betrieb der gesamten Anlage gewünscht ist
$manuelTemp
Eine Variable die die Temperatur hält für den Fall das die Anlage im manuellen Modus läuft.
Die Funktion SetPWM ist das was die Zeiten berechnet. Hier habe ich zunächst mit diskreten Werten experimentiert wie man an dem drin gelassenen Kommentaren noch sehen kann und später eine Formel entwickelt.
Im Moment stehen sowohl für Korrektur als auch für Parrallele auf 110.
Ach ja, den Logger benutze ich um die ganze Regelung mit zu schreiben. Den findest Du im Wiki.
Ich hoffe damit kannst Du was anfangen.