Script für HomeMatic Heizung

Hallo Forum und Mitleser,

zu meiner Person,

bin seit 2 Jahren im Besitz von IP-Symcon und lese ca 4-5 Jahre hier mit.
Beigestert hat mich die Weboberfläche (Webfront), diese gab dann den Ausschlag zum Kauf von IP-Symcon.

Bin gelernter Schwachströmer Fernmeldetechnik, zu meiner Zeit war der Lötkolben das Standard Verbindungsgerät
um Kupfer sicher zu verbinden. Heute sind wir bei Quetschverbindungen angekommen.
Quetschen das Schlagwort, ich habe mich auch durch die ersten PHP Verbindungen gequetscht und bin jetzt soweit
das ich mein „VHS“ vorstellen sollte. Warum? ist doch klar „geben und nehmen“…
Habe viel aus dem Forum genommen, besonders die Energie vieler Schreiber, um meine Installation hinzubekommen.

Was soll das, schon wieder eine Heizungssteuerung aber für mich etwas besonderes, denn es Funktioniert so wie ich es wollte.
VHS - "V"oss "H"eizung "S"cript - > Es soll einfach nur Warm werden und Fertig. Wenn ich nicht da bin alle Heizkörper
runter regeln.

Beschreibung

  1. Keine Wochenprogramme, Monatsprogramme, Raumprogramme oder was auch immer, für mich zu Komplex

  2. Ziel, wenn heizen - dann überall mit der gleichen Temperatur

  3. Wenn nicht heizen dann überall die gleiche Temperatur abgesenkt

  4. komm (bin) in das alter wo ich es warm haben muss - und dann überall

  5. Damit es Forumsteilnehmer auch nutzen können einfache Installation

glaube damit genug den Ankündigungen. wie einfach geht es denn?

In der Zip Datei im Anhang sind vier Files (Dateien) enthalten.

  1. eine PHP Datei „IP-Symcon - Voss Heizung V 1.12“ den Inhalt in ein Script in IP-Symcon einbinden.
    Einbinden > kopieren- einfügen > benennen „Installation Heizung“

  2. die weiteren 3 Dateien sind Icons und sind für das Webfrontend, diese 3 müssen in das Verzeichnis
    \IP-Symcon\webfront\user\icons

  3. das Script aus Punkt 1 in der IP-Symcon Console ausführen.

  4. es werden automatisch Kategorien, Instanzen, Variablen, Scripte erzeugt und zwar unter der Hauptkategorie
    mit dem Namen „Heizung“
    Drei weitere Kategorien werden angelegt Bad & WC, Schlafen, Wohnen sowie die Temperaturprofile,
    Einstellungen und vieles mehr.

Hoffe das bei euch alles klappt - meine PHP Kenntnisse sind, na ja mit meinen Worten, ich bin Perfekt im abschreiben.
Habe aber mit dem Abschreiben, Lesen, Probieren, Testen dieses für mich Wertvolle Objekt geschaffen.

Huch, fast vergessen > HomeMatic

  1. Mein Mehrwert ist das HomeMatic „Funk-Heizkörper-Thermostat und -Stellantriebe Set“
  2. Damit werden die Heizkörper in meinen Räumen geregelt -
    Das sollte unabhängig von diesem Script laufen und auch Funktionieren.
  3. Dieses Script hat eine Tag und eine Nacht Temperatur die per Zeiten an das Funk-Thermostat
    gemeldet wird. Hierzu muss die Instanz in den erstellten Scripten angepasst werden.
  4. Wenn das Install-Script ausgeführt wurde werden 3 Scripte erstellt mit dem Namen
    Bad & WC, Schlafen, Wohnen diese sind als „hidden“ gesetzt man sieht sie im Webfront nicht.
  5. In der Zeile 9 muss die Instanz mit „eurer“ Instanz Nummer ersetzt werden
    Ersetzen mit eurer „55294 /[Objekt #55294 existiert nicht]/“
    und die beiden „//“ am Anfang der Zeile 9 müssen auch entfernt werden

das war es > wenn es gefällt nutzt es - wenn nicht - Danke das Ihr bis hierhin gelesen habt

Gruß D.Voss

<?
/*=============================================================

Was muss ich (nicht ich, Du) noch tun damit es so Funktioniert wie es soll
--------------------------------------------------------------------------
1. Install-Script ausführen > Das ist dieses
	Es sollte ohne Fehler einen Baum von Kategorien, Instanzen, Variablen
	und Scripten erzeugen. Unter der Haupt Kategorie wird eine Kategorie Heizung erzeugt
	Alles wird nun im Webfront angezeigt (bis auf siehe Punkt 2)

2. Die Icons in der Anlage bitte in das Icon Verzeichnis im Webfront legen

3. In den Scripten die durch das Array $Orte erzeugt werden wie "Bad & WC", "Wohnen" usw.
	Bitte den Inhalt zum schalten der Temperatur eintragen bzw so anpassen das die Temperatur
	an die Stellventile gesendet wird.
	Ich nutze das Homematic Funkheizkörperset, Thermostat und Stellantrieb ca 80,-€
	Beispiel für den Eintrag ist im Script enthalten

4. Freuen wenn alles so klappt wie es sein soll

5. Die Schaltzeiten sind dann im Webfront zu sehen, immer im Abstand von 4 Stunden
	pro Raum zu schalten. (siehe auch $Zeiten und $SZK in diesem Script)
	Bei Änderungen ist der Event zu ändern, siehe Zeile so bei Zeile 180 und folgende
	"IPS_SetEventCyclic($eid, 0, 0, 0, 0, 2, 15);		//Jeden Täglich alle 15 Minuten"
	Die nächste Zeile gibt dann die Zeit von 3:59 "Stunden:Minuten" an, die dem Ereignis
	der Schaltvariablen zugewiesen wird

6. Ach ja, dieses Script darf bzw. sollte nur einmal ausgeführt werden und zwar zur
	Installation des ganzen, dann kann es gelöscht werden.

====================================================================================
Bitte die Scripte "Bad & WC" und "Wohnen" öffnen und so ändern das die Schaltbefehle
richtig ausgeführt werden > siehe im Script selbst.
Es ist nötig die Temperatur an den Thermostat zu senden sonst keine Heizungssteuerung.
====================================================================================

Änderungen:
====================================================================================
Version 0.70 bis 1.10 vom Februar 2011 bis 15. April 2011
Test der Funktionen im Bad, wenn es nicht Warm wurde habe ich es morgens gemerkt ;-(

Version 1.11 Schönheitsfehler behoben neue Icons erstellt, letzte Test. (ein Tag)
Vielleicht zu Kurz...

Datum 17. April 2011 Version 1.12
Script läuft seit gut 3 Wochen bei mir, wobei die Heizperiode wohl vorbei ist.
War auch besser so, einige kleine Schaltzeitfehler wurden noch behoben.
Die Vorgänger Versionen hatten Installationsprobleme oder Schaltzeiten wurden
nicht nach meinen Wünschen getriggert/ ausgeführt... So soll es sein, für mich Perfekt.

Für alle die es nutzen möchten habe ich viel Beschreibung hinein gebracht,
hoffe das es genug ist. Viel Spass damit.. D.Voss

Ich werde mich jetzt um den Garten kümmern, Rasen wird vor dem Haus neu eingesäht.


====================================================================================*/
// Variablen  --------------------------------------------------
//==================================================================================

$Home = "HS-Heizen";             // Heizungs Kategorie
$OrteIcon = "HS-Heizung";        // Icon für Orte Kategorie
$TagIcon = "HS-Uhr";     	 // Icon für Tag Instancen
$ZeitIcon = "Temperature";   	 // Icon für Zeiten Variablen

// Orte können hinzugefügt werden, sind dann im Objekte Baum als Kategorie eingefügt
// In meiner Testumgebung waren es drei Bereiche
$Orte = array("Bad & WC", "Wohnen", "Schlafen");   	//	Bereiche mit Heizungsventilen

// Nichts mehr ändern >>>> wenn doch >> dann Fragt einen der sich damit auskennt nur nicht mich ;-)
$Zeiten = array("00:00-04:00", "04:00-08:00", "08:00-12:00", "12:00-16:00", "16:00-20:00", "20:00-24:00"); // An und Abwesend Zeiten
$SZK = array("0", "4", "8", "12", "16", "20");  // Schaltpunkte für die Ereignisse in den "$Zeiten" Variablen

$Tage = array("Täglich");              	// Schaltbereich >> Programmierung lässt nur einen Eintrag zu
// Variablen Profil für die Temperaturen im Raum anlegen
if (IPS_VariableProfileExists("Temperature.Raum")) {
		}
		else {
		IPS_CreateVariableProfile("Temperature.Raum", 2);
				}
// Dies ist das $Orte Script z.B. Bad & WC oder Wohnen
$ScriptInhalt1 = '<?
	$CatID = IPS_GetParent($IPS_SELF);
	$SollTemp = IPS_GetVariableIDByName("Soll Temperatur", $CatID);
	$Wert = GetValueFloat($SollTemp);
//	==========================================
// >> Anfang der Eingaben
// >> hier der Schaltwert einzutragen, wobei $Wert die Temperatur ist
// ====================================================================================
// HM_WriteValueFloat(55294 /*[Bad\Temperaturregelung]*/ , "SETPOINT", $Wert);
//	====================================================================================
// >> Ende der Eingaben
// ==========================================

	if($IPS_SENDER == "WebFront") {
	@SetValueFloat($SollTemp, $IPS_VALUE);
	$Wert = GetValueFloat($SollTemp);
   SetValue($IPS_VARIABLE, $IPS_VALUE); // Variable in Webfront umschalten
//   WFC_SendNotification(48827 /*[Objekt #48827 existiert nicht]*/, "INFORMATION",$Wert, "Temperature", 5);
	}
?>';
// Diese Script wird jeder ZeitenVariablen zugeordnet 00:00-04:00, usw
$ScriptInhalt2 = '<?
	$Parent1ID = IPS_GetParent($IPS_SELF);    // Die ParentID ermittel
	$Parent2ID = IPS_GetParent($Parent1ID);   // Die ParentID ermittel
	$Parent3ID = IPS_GetParent($Parent2ID);   // Die ParentID ermittel
	$Parent4ID = IPS_GetParent($Parent3ID);   // Die ParentID ermittel
	$IPS_VALUE = GetValueBoolean($Parent1ID);        // Meine Variable true / false
// Nacht Temperatur ermitteln
	$SollTempNID = IPS_GetVariableIDByName("Nacht", $Parent4ID);
		$SollTempN = GetValueFloat($SollTempNID);
// Tag Temperatur ermitteln
	$SollTempTID = IPS_GetVariableIDByName("Tag", $Parent4ID);
		$SollTempT = GetValueFloat($SollTempTID);
// Wenn meine Variable true/false ist dann entsprechend Temp Tag/Nacht setzen
		if($IPS_VALUE == false) 	{
		$Wert = SetValueFloat(IPS_GetVariableIDByName("Soll Temperatur", $Parent3ID), $SollTempN);
		}
			else {
			$Wert = SetValueFloat(IPS_GetVariableIDByName("Soll Temperatur", $Parent3ID), $SollTempT);
			}
?>';
// Diese Script wird den Variablen Tag Nacht zugeordnet
$ScriptInhalt3 = '<?
// Warum auch immer das hier steht > gebraucht wird es nicht D.Voss
if($IPS_SENDER == "WebFront") // wenn Sender ist Webfornt
{
   SetValue($IPS_VARIABLE, $IPS_VALUE); // Variable in Webfront umschalten
 if($IPS_VALUE) 	{ 	// wenn TRUE
							// Einschalten
						}
 else // wenn nicht oder false
 {
	//Ausschalten
 }
}
?>';
//---------------------------- Main -----------------------------
$CatHeizID = IPS_CreateCategory();    							// Haupt Kategorie "Heizung" anlegen
IPS_SetName($CatHeizID, "Heizung"); 							// Kategorie benennen
IPS_SetPosition($CatHeizID, 20);         						// Position im Navigationsbaum
IPS_SetIcon($CatHeizID, $Home);

for($z = 0; $z < count($Orte); $z++) {							// die Schleife läuft solang, wie x kleiner ist als count($Orte);
$CatorteID = IPS_CreateCategory();    							// Kategorie Orte anlegen > siehe array "$Orte" Wohnen, Bad usw.
IPS_SetName($CatorteID, $Orte[$z]); 							// Kategorie benennen
IPS_SetPosition($CatorteID, $z*10);       					// Position im Navigationsbaum
IPS_SetIcon($CatorteID, $OrteIcon);       					// Icon festlegen
IPS_SetParent($CatorteID, $CatHeizID);    					// Die Orte Wohnen Bad usw sollen eingereiht unter der Heizung sein
		$SollTempID = IPS_CreateVariable(2);      			// Soll Temp Float Var setzen für jeden Ort Wohnen, Bad usw.
		IPS_SetParent($SollTempID, $CatorteID);   			// Position im Navigationsbaum setzen
		IPS_SetPosition($SollTempID, 5);          			// Position im Navigationsbaum
		IPS_SetIcon($SollTempID, "Temperature");  			// Icon zuordnen
		IPS_SetName($SollTempID, "Soll Temperatur");			// Namen vergeben
		IPS_SetVariableCustomProfile($SollTempID, "Temperature.Raum");  // Profil festlegen damit °C angezeigt wird
		SetValueFloat($SollTempID, 12);
		$LinkID = IPS_CreateLink();    		  					//Link anlegen
		$LinkName = "$Orte[$z] - Soll Temperatur";   		//Linknamen Eindeutig machen
		IPS_SetName($LinkID, $LinkName);			 				//Link benennen
		IPS_SetLinkChildID($LinkID, $SollTempID); 			//Link verknüpfen
		IPS_SetPosition($LinkID, $z+20);          			// Position im Navigationsbaum
		IPS_SetParent($LinkID, $CatHeizID);   					// Position im Navigationsbaum setzen

	for($y = 0; $y < count($Tage); $y++) {						// die Schleife läuft solang, wie x kleiner ist als count($Tage)
   $CatID =  IPS_CreateInstance("{485D0419-BE97-4548-AA9C-C083EB82E61E}");  // Dummy Module {485D0419-BE97-4548-AA9C-C083EB82E61E} anlegen
   IPS_SetParent($CatID, $CatorteID);     					// Kategorie anlegen siehe array $Tage Montag, Dienstag usw
	IPS_SetName($CatID, $Tage[$y]); 								// Kategorie Tage benennen
   IPS_SetPosition($CatID, $y*10+10);     					// Position im Navigationsbaum
	IPS_SetIcon($CatID, $TagIcon);         					// Icon zuordnen

		CreateScriptByName($Orte[$z], $CatorteID, $ScriptInhalt1);	// Das Script Script der $Orte[$z] Kategorie erstellen

		$VarScriptID = IPS_GetScriptID($Orte[$z]);                  // ID ermitteln vom Script $Orte Wohnen, Bad usw
		IPS_SetVariableCustomAction($SollTempID, $VarScriptID);
      IPS_SetHidden($VarScriptID, true);									// Script Hidden setzen

		$eid = IPS_CreateEvent(0);        						//Ausgelöstes Ereignis
		IPS_SetEventTrigger($eid, 1, $SollTempID); 			//Bei Änderung von Variable mit ID $SollTemp
		IPS_SetParent($eid, $VarScriptID); 						//Ereignis zuordnen Dem Script Wohnen oder Bad&Wc usw.
		IPS_SetEventActive($eid, true);    						//Ereignis aktivieren

		for($x = 0; $x < count($Zeiten); $x++) {							// die Schleife läuft solang, wie x kleiner ist als count($Zeiten)
		$id_ReceiveMessageText = IPS_CreateVariable(0);    			// Variable der Schaltzeiten anlegen siehe array $Zeiten
		IPS_SetName($id_ReceiveMessageText, $Zeiten[$x]);     		// Namen setzen 00:00-04:00 usw siehe array $Zeiten
		IPS_SetParent($id_ReceiveMessageText, $CatID);        		// Die Zeiten im Navigationsbaum setzen zuordnen
		IPS_SetPosition($id_ReceiveMessageText, ($x*10));     		// Die Position im Navigationsbaum setzen
		IPS_SetIcon($id_ReceiveMessageText, $ZeitIcon);       		// Das Icon zuordnen
		IPS_SetVariableCustomProfile($id_ReceiveMessageText, "~Switch");  	// Ein Profil zuordnen Ein Aus schalten
		IPS_SetVariableCustomAction($id_ReceiveMessageText, $VarScriptID);   // bei Variablenänderung ein Script ausführen
// Ereignis 1 pro $Zeiten setzen und Variablen übergeben
         CreateScriptByName("Handler", $id_ReceiveMessageText, $ScriptInhalt2);	// Das Script Script der $Orte[$z] Kategorie erstellen

			$eid = IPS_CreateEvent(1);        					//Zyklisches Ereignis "1"
			IPS_SetEventCyclic($eid, 0, 0, 0, 0, 2, 15);		//Täglich alle 15 Minuten
			IPS_SetEventCyclicTimeBounds($eid, mktime($SZK[$x], 0 , 0), mktime($SZK[$x]+3, 59 , 0)); //Cyclictime von 4 Stunden, wie Schalter im Webfront
         $HandlerScriptID = IPS_GetScriptIDByName("Handler",$id_ReceiveMessageText);
			IPS_SetParent($eid, $HandlerScriptID); 			//Ereignis zuordnen
			IPS_SetEventActive($eid, true);						//Ereignis aktivieren
			IPS_SetName($eid, $Zeiten[$x]);
	  	}
	}
}
// Profile für Temperatur Tag und Nacht über alle Orte bzw Räume festlegen unter der
// Kategorie Heizung

		$RaumTag = IPS_CreateVariable(2);
		IPS_SetPosition($RaumTag, 10);
		IPS_SetIcon($RaumTag, "Temperature");
		IPS_SetName($RaumTag, "Tag");
		IPS_SetParent($RaumTag, $CatHeizID);
		SetValueFloat($RaumTag, 21);
      $VarID = CreateScriptByName("Handler", $RaumTag, $ScriptInhalt3);	// Das Script Script erstellen
		IPS_SetVariableCustomAction($RaumTag, $VarID);

		$RaumNacht = IPS_CreateVariable(2);
		IPS_SetPosition($RaumNacht, 15);
		IPS_SetIcon($RaumNacht, "Temperature");
		IPS_SetName($RaumNacht, "Nacht");
		IPS_SetParent($RaumNacht, $CatHeizID);
		SetValueFloat($RaumNacht, 16);
      $VarID = CreateScriptByName("Handler", $RaumNacht, $ScriptInhalt3);	// Das Script Script erstellen
		IPS_SetVariableCustomAction($RaumNacht, $VarID);
		IPS_SetVariableCustomProfile($RaumTag, "Temperature.Raum");
		IPS_SetVariableCustomProfile($RaumNacht, "Temperature.Raum");
		IPS_SetVariableProfileValues("Temperature.Raum", 10, 25, 1);
			for($T = 10; $T < 26; $T++) {
			IPS_SetVariableProfileAssociation("Temperature.Raum", $T, "$T °C", "Temperature");
			}

//---------------------------- Main Ende-------------------------

		//ermitteln der IP-Adresse des Clients
		$ip = gethostbyname ("");
		echo $ip;
		echo " Installation gestartet, Bitte warten Sie bis die Installation abgeschlossen ist. Dieses Script kann gelöscht werden";

/*
    //Das Installationsscript löschen
    IPS_DeleteScript($IPS_SELF, true); // Skript inklusive Datei löschen
*/


//-------------------------------------------------------------------------
// Danke an WGreipl, diesen "Schnipsel" irgend wo in den (un)tiefen des Forums gefunden
// Funktionierte ohne Probleme > An alle im Forum Danke für die vielen Beiträge
// ohne die ich und alle anderen nicht so weit gekommen wären
function CreateScriptByName($ScriptNAME, $ParentID, $ScriptTEXT)
 {
 global $IPS_SELF;
 $ScriptID = @IPS_GetScriptIDByName($ScriptNAME, $ParentID);
 if ($ScriptID == 0){
  $ScriptID = IPS_CreateScript(0);
  IPS_SetName($ScriptID, $ScriptNAME);
  IPS_SetParent($ScriptID, $ParentID);
  IPS_SetInfo($ScriptID, "Das Script wurde erzeugt von: #$IPS_SELF# Detlef Voß");
  $fh = fopen(IPS_GetKernelDir()."scripts\\".$ScriptID.".ips.php", 'w') or die("kann Datei nicht öffnen");
  fwrite($fh, $ScriptTEXT);
  fclose($fh);
  $ScriptPath = $ScriptID.".ips.php";     //Skriptdatei
  IPS_SetScriptFile($ScriptID, $ScriptPath);
  IPS_SetHidden($ScriptID, true);
  IPS_SetPosition($ScriptID, 111);
 }
IPS_Sleep(500);
// echo "Script erstellt --";
return $ScriptID;
}
?>

Script-und-Icons.zip (6.25 KB)

Bild5.jpg