Die intelligente Warmwasser Zirkulationspumpe

Basierend auf einem Projekt, die ich direkt in der Homematic-CCU gelöst habe, stelle ich hiermit eine Lösung für IP-Symcon zur Verfügung.

Artikel: Sascha ‘Real-RIOT’ Schmidt – MyBLOG Blog Archive Die intelligente Warmwasser Zirkulationspumpe

Für die Lösung kann folgendes Script genutzt werden:


<?
//*****************
$pumpen_id = 42990;
//*****************

$runtime_id  = @IPS_GetObjectIDByName("RUN_TIME", $IPS_SELF);
$lastrun_id  = @IPS_GetObjectIDByName("LAST_RUN", $IPS_SELF);
$locktime_id = @IPS_GetObjectIDByName("LOCK_TIME", $IPS_SELF);

if ( $runtime_id == 0 )
{
	$runtime_id = IPS_CreateVariable(1);
	IPS_SetName($runtime_id, "RUN_TIME");
	IPS_SetParent($runtime_id, $IPS_SELF);
   SetValue($runtime_id, 5);
}
if ( $locktime_id == 0 )
{
	$locktime_id = IPS_CreateVariable(1);
	IPS_SetName($locktime_id, "LOCK_TIME");
	IPS_SetParent($locktime_id, $IPS_SELF);
	SetValue($locktime_id, 45);
}
if ( $lastrun_id == 0 )
{
	$lastrun_id = IPS_CreateVariable(1);
	IPS_SetName($lastrun_id, "LAST_RUN");
	IPS_SetParent($lastrun_id, $IPS_SELF);
}

$lock_time = GetValue($locktime_id);
$run_time  = GetValue($runtime_id);
$last_run  = GetValue($lastrun_id);

$lock_time = $lock_time*60;
$run_time  = $run_time*60;

if ( $IPS_SENDER != "TimerEvent" )
{
	if ( time() > $last_run + $lock_time )
	{
		IPS_SetScriptTimer($IPS_SELF, $run_time);
		HM_WriteValueBoolean($pumpen_id, "STATE", true);
      SetValue($lastrun_id, time());
	}
} else
{
  	HM_WriteValueBoolean($pumpen_id, "STATE", false);
      IPS_SetScriptTimer($IPS_SELF, 0);
}
?>

Es muß lediglich am Anfang des Scripts die ID der Zirkulationspumpe angegeben werden. Das ist bei mir ein ganz normaler Schaltaktor.

LOCK_TIME: Definiert die Zeit, die die Warmwasser Pumpe NICHT eingeschaltet werden soll (Minuten)
RUN_TIME: Definiert die Zeit, die die Warmwasser Pumpe laufen soll
LAST_RUN: Ist eine Variable, die vom Script genutzt wird und bedarf keiner Userinteraktion.

Getriggert wird das Script durch angegebene Ereignisse in IP-Symcom. Bei mir sind es beispielsweise die Bewegungsmelder in Küche, GästeWC und Bad.

Hoffe, ich konnte das verständlich darlegen.

Viele Grüße
Sascha

Hallo Sascha,

schönes Skript, ich setze es grade für mich um.

Aber ich hab mal eine Frage dazu.

In dem Skript setzt Du, wenn die Bedingungen erfüllt sind, den Aktor für die Pumpe auf die in „RUN_TIME“ eingestellte Zeit.

Wozu dann aber noch der Timer? Der Aktor schaltet doch automatisch nach der eingestellten Zeit aus?

Hallo,
Vielen Dank für das Skript. Ich habe mir zwei bewegungsmelder bestellt und möchte das für unser Haus auch umsetzten.
Eine Frage, da ich mit IP - Symcon noch keine Erfahrung habe:
Wie sieht das Skript aus, wenn mann eine generelle Sperrzeit z. B. nachts hinzufügen möchten?

Sent from my GT-I9100 using Tapatalk

Schau mal hier rein da ist das was Du suchst beschrieben.

Ich hab das Skript mal für mich umgeschrieben, da ich mir die Variablen selber an anderer Stelle angelegt habe und noch zusätzlich die von Wurlitzer vorgeschlagenen Sperrzeiten hinzugefügt habe:

<?
   include_once "IPSLogger.ips.php";
   
	$pumpen_id = 11633 /*[Geräte\Erdgeschoss\Wirtschaftsraum\Heizungsaktor I\Aktor 4]*/;

	$runtime_id  = 56901 /*[Program\Heizung\Data\Zirkulationspumpe\RUN_TIME]*/;
	$lastrun_id  = 20738 /*[Program\Heizung\Data\Zirkulationspumpe\LAST_RUN]*/;
	$locktime_id = 50905 /*[Program\Heizung\Data\Zirkulationspumpe\LOCK_TIME]*/;
	$offtime_id = 33473 /*[Program\Heizung\Data\Zirkulationspumpe\Pumpe aus ab]*/;
	$ontime_id = 22483 /*[Program\Heizung\Data\Zirkulationspumpe\Pumpe an ab]*/;
	
	$lock_time = GetValue($locktime_id);
	$run_time  = GetValue($runtime_id);
	$last_run  = GetValue($lastrun_id);
	$offtime = GetValue($offtime_id);
	$ontime = GetValue($ontime_id);
	
	$lock_time = $lock_time*60;
	$run_time  = $run_time*60;

	$time = date("H:i");
	
	if ( $IPS_SENDER != "TimerEvent" )
	{

	    if (GetUnixTime($time) > $last_run + $lock_time && $time >= $ontime && $time <= $offtime)
	    {
	        IPS_SetScriptTimer($IPS_SELF, $run_time);
	        HM_WriteValueBoolean($pumpen_id, "STATE", true);
	        SetValue($lastrun_id, GetUnixTime($time));
	        IPSLogger_Dbg (__file__,"Zirkulationspumpe ein für ".($run_time / 60)." Minuten!");
	    }
	}
	else
	{
	      HM_WriteValueBoolean($pumpen_id, "STATE", false);
	      IPS_SetScriptTimer($IPS_SELF, 0);
	      IPSLogger_Dbg (__file__,"Zirkulationspumpe aus!");
	}
	
	function GetUnixTime($time)
	{
		$time_array = explode (":", $time );

		$Hour =  $time_array[0];
		$Minute =  $time_array[1];

		return mktime($Hour, $Minute, 0);
	 }
?>

Die UnixTime Umrechung ist drin, weil es damit einfach ist zu prüfen wann die Pumpe zuletzt gelaufen ist. Da ich die Sperrzeiten im Webfront einstellbar gemacht habe wollte ich da aber Uhrzeiten haben.

Die Prüfung mit dem Timer ha ich auch drin gelassen, damit ich das Ausschalten mitloggen kann.

Die Variablen sind bei mir so angelegt:

Hallo,

vielen Dank für Deine Beiträge.
Ich werde es am Wochenende testen.

Ich habe Dein Skript implementiert. Vielen Dank dafür.
Allerdings erschließt sich mir als Anfänger noch nicht ganz, wie ich nun die Variablen in der Web-Oberfläche ändern kann. Angezeigt werden sie mir. Ist das erst ein Fueature der Professional Version?
Danke schon im Voraus!

Du musst noch das ChangeSettings Skript mit folgender Zeile füllen:

SetValue($IPS_VARIABLE, $IPS_VALUE);

damit die Variablen über die Webseite geändert werden können.

Übrigens hab ich das Skript noch mal geändert weil ich diesen Timer zum Ausschalten raus geworfen habe, das können die HM Aktoren selber und ich schalte noch 2 Mal zusätzlich via Timer wenn meine Frau bzw. ich aufstehe. Dann wollen wir im Bad auch warmes Wasser haben, aber da ist zur Zeit kein Bewegungsmelder.

Das neue Skript sieht jetzt so aus:

<?
   include_once "IPSLogger.ips.php";
   
	$pumpen_id = 11874 /*[Geräte\Erdgeschoss\Wirtschaftsraum\Heizungsaktor I\Aktor 2 / Zirkulationspumpe]*/;

	$runtime_id  = 56901 /*[Program\Heizung\Data\Zirkulationspumpe\RUN_TIME]*/;
	$lastrun_id  = 20738 /*[Program\Heizung\Data\Zirkulationspumpe\LAST_RUN]*/;
	$locktime_id = 50905 /*[Program\Heizung\Data\Zirkulationspumpe\LOCK_TIME]*/;
	$offtime_id = 33473 /*[Program\Heizung\Data\Zirkulationspumpe\Sperrzeit_Von]*/;
	$ontime_id = 22483 /*[Program\Heizung\Data\Zirkulationspumpe\Sperrzeit_Bis]*/;
	
	$lock_time = GetValue($locktime_id);
	$run_time  = GetValue($runtime_id);
	$last_run  = GetValue($lastrun_id);
	$offtime = GetValue($offtime_id);
	$ontime = GetValue($ontime_id);
	
	$lock_time = $lock_time*60;
	$run_time  = $run_time*60;

	$time = date("H:i");
	
   if (GetUnixTime($time) > $last_run + $lock_time && $time >= $ontime && $time <= $offtime)
   {
        HM_WriteValueFloat($pumpen_id, "ON_TIME", $run_time);
        HM_WriteValueBoolean($pumpen_id, "STATE", true);
        SetValue($lastrun_id, GetUnixTime($time));
        IPSLogger_Inf (__file__,"Zirkulationspumpe ein für ".($run_time / 60)." Minuten!");
   }
	
	function GetUnixTime($time)
	{
		$time_array = explode (":", $time );

		$Hour =  $time_array[0];
		$Minute =  $time_array[1];

		return mktime($Hour, $Minute, 0);
	 }
?>

PS: Natürlich musst Du dann noch dieses Skript bei jeder Variablen, die Du im WebFront ändern möchtest als Actionskript zuweisen.