Der folgende Skript soll dafür sorgen, dass die Pumpe für den Heizkörperkreis stoppt, wenn alle Ventile geschlossen sind, d.h. keine Wärme benötigt wird. Da die Kesselsteuerung nichts über die Ventilstellungen wissen kann, läuft die Pumpe meist den ganzen Winter durch. Dadurch wird nicht nur Strom verschwendet sondern auch zusätzliches Gas, weil das zirkulierende Wasser schneller abkühlt und der Kessel dadurch öfter wieder einschaltet.
Die Funktionsweise ist simpel: Jede Änderung (nicht Update) triggert den Skript, sind alle Stellungen null wird die Pumpe für eine bestimmte Zeit abgeschaltet. Der Skripttimer ruft den Skript spätestens nach dieser Zeit auf, und überprüft wieder, ob noch alle Ventile zu sind.
Sollte in der Zwischenzeit z.B. ein einziges Ventil öffnen, d.h. der *.Position Wert ändert sich, dann wird der Skript sofort ausgeführt und die Pumpe ohne Verzögerung wieder frei gegeben.
Dadurch, dass die Pumpe immer nur für eine bestimmte Zeit abgeschaltet wird, kann die Pumpe auch dann wieder anlaufen, wenn zwischenzeitlich der PC abgestürzt ist. Ohne diese Maßnahme wäre die Heizung ohne PC nicht mehr funktionsfähig. Ich sach nur WAF
<?
/*
*******************************
IP-SYMCON Event Scripting
*******************************
File : Check_Position.ips.php
Trigger : OnChange *.position
Interval : 15 min
*/
/*
Control of radiatior heating circuit pump. If all valves are closed,
no warm water is required so the pump can be turned of in order to safe
electrical and heating energy.
Triggered by any change of valve *.postion values.
If ALL *.position values are zero, disable pump for given $interval.
Watchdog timer rechecks valve *.position values after $interval seconds
for higher reliabilty.
Negative logic together with "pulsed" turn-off ensures pump is running
in case of computer crash or after a power failure.
*/
$scriptname = "Check_Position";
$debug = TRUE;
$interval = 60 * 15; // watchdog time 15 minutes
$location = array ( "WC","Roland","Daniela",
"Schlafen","Bad","Florian");
// sum up all positon values
$sum_positions = 0;
foreach ($location as $Location) {
if (IPS_VariableExists("$Location.Position"))
$sum_positions += GetValueFloat("$Location.Position");
echo "$Location: ".GetValueFloat("$Location.Position")."
";
}
if ($sum_positions == 0) {
$message = "Position sum: $sum_positions => Disable radiator pump! ($IPS_SENDER)";
// negative logic: turn switch on to disable the pump for $interval seconds.
FS20_SwitchDuration(39663,TRUE,$interval);
}
else {
$message = "Position sum: $sum_positions => Enable radiator pump! ($IPS_SENDER)";
// negative logic: turn switch off to enable the pump.
FS20_SwitchMode(39663,FALSE);
}
echo "$message
";
IPS_LogMessage($scriptname,$message);
// check again in $interval seconds
IPS_SetScriptTimer($scriptname,$interval);
?>