Ich habe eine Variable hinzugefügt weil bei HM ja alles anders ist als bei FHT !
Ich habe es sehr einfach geändert, habe die Abfragen ob neue Temp = die alte ist entfernt…
Über Verbesserungen würde ich mich sehr freuen
So hier das geänderte Script zum Heizen mit Google Kalender:
<?
/*
*************************************************************
* FHT-Steuerung auf Google Calendar Basis *
*************************************************************
Das Skript bietet die Möglichkeit zwischen Tag- und Nacht-Betrieb,
Anwesen- und Abwesenheit sowie Urlaub zu unterscheiden.
Über Variablen können Komfort- und Nacht-Temperaturen für jeden Raum festgelegt werden, diese können im Betrieb über das WebFront verändert werden.
Durch mehrere Google Kalender können verschiedene Temperaturprofile für
verschiedene FHT-Instanzen realisiert werden.
FHT freundlich: Temperaturen werden nur gesendet, wenn es auch notwendig ist.
Wird die Temperatur am Stellrad verändert, bleibt diese im Automatikbetrieb bis zum nächsten Kalender-Eintrag erhalten.
*****************
* Betriebsmodi: *
*****************
I. Anwesend:
Timer aus dem Kalender werden ignoriert, stattdessen wird die Komforttemperatur (aus Variable) gesetzt.
Die Komforttemperatur lässt sich einfach über das WebFront ändern.
Wird die Temperatur am Rad der FHT verstellt, so wird diese Temperatur beibehalten.
Modus ist aktiv, wenn:
* $Anwesenheit = true und $TagNacht = true (Tag)
II. Automatikbetrieb:
Temperaturen werden nach Kalendereinträgen gesetzt. Gibt es keinen Eintrag, wird die NachtTemp gesetzt.
Veränderungen am Rad der FHT bleiben solange erhalten, bis ein neuer Schaltzeitpunkt aus dem Kalender sie überschreibt.
Modus ist aktiv, wenn:
* $Anwesenheit = true und $TagNacht = false (Nacht)
oder
* $Anwesenheit = false
III. Urlaubsbetrieb:
Im Urlaubsbetrieb werden die regulären Schaltzeitpunkte aus dem Kalender ignoriert.
Vorhandene Schaltzeiten müssen also nicht gelöscht werden.
Der Betrieb wird aktiviert, indem man im Standard-Kalender (s. Installation) einen Termin mit dem Text "Urlaub" im Feld "Wo" einträgt.
Die Urlaubs-Temperatur im Termin-Feld "Was" eintragen.
Alle FHTs werden dann, solange der Urlaubs-Termin aktuell ist, auf diese Temperatur gesetzt.
****************
* Installation *
****************
1. Zunächt müssen im Google calendar entsprechend der Anzahlt gewünschter Temperaturprofile neue Kalender angelegt werden.
Aus dem persönlichen XML-Link die Kalender-ID und den MagicCookie herauskopieren und im Skript eintragen.
2. FHT-IDs eintragen.
3. Den einzelnen FHTs ein Temperatur-Profil zuweisen.
4. Festlegung eines Standard-Profils, in dem auch der Urlaub eingetragen wird.
5. Anwesenheits- und TagNacht-Variablen-IDs eintragen. Werden die Anwesenheits- und TagNacht-Variablen nicht benötigt, können die Werte auch einfach per true oder false
im Skript festgelegt werden, so dass einer der gewünschten Betriebsmodi (s.o.) ausgewählt wird.
6. Nach der ersten Ausführung des Skripts, die Temperaturen in den Variablen NachtTemp und KomfortTemp (unter jeder FHT-Instanz) anpassen.
**************************
* Timer-Programmmierung: *
**************************
Im Kalender muss ein neuer Eintrag mit der Temperatur (in der Form: 21.0) im Termin-Feld "Was" angelegt werden.
Für Zeiträume, in denen kein Eintrag vorliegt, wird automatisch die NachtTemperatur gesetzt.
Bei Überschneidung von Terminen gilt die Temperatur des ersten Termins, solange dieser aktuell ist.
************************
* Skript-Informationen *
************************
Das Skript legt im IP-Symcon-Verzeichnis Textdateien, die die Schaltzeitpunkte enthalten, an.
Dateien: * Heizung_parameter.txt (Hier stehen Urlaubsdaten drin)
* Heizung_"Profilname".txt (Je Profil eine Datei mit Schaltzeiten)
Das Skript legt automatisch unter jeder FHT-Instanz folgende Variablen an:
* KomfortTemp, typ: float, profile: ~Temperature.FHT, Aktionsskript: "WebFrontKomfortTemp"
* NachtTemp, typ: float, profile: ~Temperature.FHT
* lastTemp, typ: float
und ein Skript, um die KomfortTemp im WebFront zu setzten:
* WebFrontKomfortTemp
Unter dem Skript selbst wird folgende Variable angelegt:
* Urlaub, typ: booelan
und ein Timer:
* Heizung Timer, Trigger: zyklisch, 30 minütig, Beginn 00:00:30
*/
/*
************** BEGIN Settings *******************************************
1. Google calendar settings
Kalender-Namen in den Variablen $calendar müssen NICHT mit den Google calendar Namen übereinstimmen!
BEISPIEL für Private XML-Adresse eines zusätzlichen Kalenders:
http://www.google.com/calendar/feeds/sssssddddddddd7777ffffff@group.calendar.google.com/private-aaaaaaaabbbbbbcccc000000111111/basic
|------------- user id --------------------------| |-------- magicCookie -------|
*/
$calendar[1] = "Büro";
$userid[1] = 'blabla@group.calendar.google.com';
$magicCookie[1] = 'hier der MagicCookie';
// 2. FHT-IDs
$FHT_id[1]= 46415 /*[Räume\Büro\Heizung Büro]*/; // ID vom HM Raumregler
$HMV_id[1]=36256 /*[Räume\Büro\Heizung Büro\Büro Heizung Soll-Temp]*/; // ID vom
//3. Den FHTs Temperaturprofile zuordnen (Namen der Profile wie in den $calendar Variablen)
// zu $FHT_id[1] gehört $profile[1] usw.
$profile[1]="Büro";
// 4. Standard-Kalender festlegen
$standard_calendar = $calendar[1];
// 5. Anwesenheits- und TagNacht-Variablen-IDs eintragen
$Anwesenheit =false; //GetValueBoolean(40478 /*[Objekt #40478 existiert nicht]*/);
$TagNacht = true; //GetValueBoolean(30850 /*[Objekt #30850 existiert nicht]*/);
//********************* END Settings ****************************************************
//*********************** BEGIN Script **************************************************
$debug = false; // write debug messages
$FHT_debug = false; // true: no temperatures are send to FHT
$TimerNAME = "Heizung Timer"; // timer-name
CreateTimerByName($IPS_SELF ,$TimerNAME, 10); // create timer: 10 minutes
$UrlaubID = CreateVariableByName($IPS_SELF, "Urlaub", 0, "","", "");
$Betriebsmodus = CreateVariableByName($IPS_SELF, "Betriebsmodus", 1, "FHT.Betriebsmodus","", "");
if ($debug) {echo "debug:
";}
//************* read Google Calendar ****************************************************
$time=date("H:i");
$parameter = ""; //String variable for Heizung_parameter.txt
for($i = 1; $i <= count($calendar); $i++)
{
$feedURL = "http://www.google.com/calendar/feeds/$userid[$i]/private-$magicCookie[$i]/full";
$feedParams = "?singleevents=true&max-results=10&orderby=starttime&start-min=".urlencode(date("c"))."&sortorder=a";
$sxml = simplexml_load_file($feedURL.$feedParams);
$date = ""; //String variable for Heizung_[$profile].txt
foreach ($sxml->entry as $entry) {
$title = stripslashes(utf8_decode($entry->title));
$gd = $entry->children('http://schemas.google.com/g/2005');
$startTime = ''; // read StartTime
if ( $gd->when ) {
$startTime = $gd->when->attributes()->startTime;
} elseif ( $gd->recurrence ) {
$startTime = $gd->recurrence->when->attributes()->startTime;
}
$startTime = strtotime( $startTime );
$endTime = ''; // read EndTime
if ( $gd->when ) {
$endTime = $gd->when->attributes()->endTime;
} elseif ( $gd->recurrence ) {
$endTime = $gd->recurrence->when->attributes()->endTime;
}
$endTime = strtotime( $endTime );
$where = utf8_decode($gd->where->attributes()->valueString); // read Location => parameter, e.g. Urlaub
if ($where!="Urlaub") {
$date .= date("d.m.y", $startTime).";".date("H:i",$startTime).";".$title."
".date("d.m.y", $endTime).";".date("H:i",$endTime).";NachtTemp;
";
} elseif ($calendar[$i] == $standard_calendar) {
$parameter .= date("d.m.y", $startTime).";".date("H:i",$startTime).";".$title.";".$where."_start
".date("d.m.y", $endTime).";".date("H:i",$endTime).";NachtTemp;".$where."_end
";
}
/* if($IPS_SENDER == "Execute")
{
echo $date;
echo "
";
}*/
// ******** write profile-timetable ****************************
$fh = fopen(IPS_GetKernelDir()."Heizung_".$calendar[$i].".txt", 'w') or die("can't open file");
fwrite($fh, $date);
fclose($fh);
}
// ******** write parameter-file ****************************
if ($parameter != "") {
$fh = fopen(IPS_GetKernelDir()."Heizung_parameter.txt", 'w') or die("can't open file");
fwrite($fh, $parameter);
fclose($fh);
}
$fh = fopen(IPS_GetKernelDir()."Heizung_".$calendar[$i].".txt", 'a+') or die("can't open file");
fclose($fh);
}
$fh = fopen(IPS_GetKernelDir()."Heizung_parameter.txt", 'a+') or die("can't open file");
fclose($fh);
//********* read parameter-file *********************************************
$filename = IPS_GetKernelDir()."Heizung_parameter.txt";
//echo $filename;
$handle= fopen($filename,"r");
SetValue($UrlaubID, false);
// $handle = fopen($filename,"r");
while ($line = fgets($handle, 1000)) {
$value = explode(";", $line); //[0]-Tag, [1]-(Ab)Zeit, [2]-Temperatur
$day=$value[0];
$switchtime=$value[1];
$temp=$value[2];
$parameter=$value[3];
if (date("d.m.y") == $day && $time > $switchtime) {
switch ($parameter){
case "Urlaub_start
":
SetValue($UrlaubID, true); // set $Urlaub = true
$urlaubtemp=$temp;
break;
case "Urlaub_end
":
SetValue($UrlaubID, false); // set $Urlaub == false
break;
}
}
}
fclose($handle);
//**********END read parameter-file ****************************************
//********* create variables and set temperature for each FHT ******************
for($i = 1; $i <= count($FHT_id); $i++)
{
if ($debug) {echo $profile[$i].": ";}
CreateScriptByName("WebFrontKomfortTemp", $FHT_id[$i], "<?php
\$parentID = IPS_GetObject(\$IPS_SELF);
\$parentID = \$parentID['ParentID'];
SetValueFloat(\$IPS_VARIABLE, \$IPS_VALUE);
?>");
$TargetTemperature = @IPS_GetVariableIDByName("Target Temperature", $FHT_id[$i]); // get variable ID
$TargetTemperaturePending = @IPS_GetVariableIDByName("Target Temperature (Pending)", $FHT_id[$i]); // get variable ID
$KomfortTemp = GetValueFloat(CreateVariableByName($FHT_id[$i], "KomfortTemp", 2, "~Temperature.FHT", @IPS_GetScriptIDByName("WebFrontKomfortTemp", $FHT_id[$i]), 1));
$NachtTemp = GetValueFloat(CreateVariableByName($FHT_id[$i], "NachtTemp", 2, "~Temperature.FHT", "", ""));
$lastTemp = GetValueFloat(CreateVariableByName($FHT_id[$i], "lastTemp", 2, "", "", ""));
$parameter_Urlaub =GetValueBoolean($UrlaubID);
$force = false;
// $manual = false;
//******manual ***********************************
/* if (GetValueFloat($TargetTemperature) != GetValueFloat($TargetTemperaturePending)) {
if ($debug) {echo "manual ";}
$manual == true;
}
*/
//**** DEFAULT value: NachtTemp ****************************************************
$newtemp = $NachtTemp; // set to NachtTemp by default
//***URLAUB, set temperature from parameter-file**********************************
if ($parameter_Urlaub == true && $Anwesenheit == false) {
$newtemp = $urlaubtemp;
$force = true; //force SetTemperature
if ($debug) {echo "URLAUB ";}
SetValueInteger($Betriebsmodus, 0);
SetTemperature($profile[$i],$TargetTemperature, $newtemp, $lastTemp, $FHT_id[$i], $force);;
}
//*** AT HOME, set KomfortTemp ********************************************************
if ($Anwesenheit == true /*&& $manual == false*/) { if ($debug) {echo "Anwesend ";}
if ($TagNacht == true) {
$newtemp = $KomfortTemp;
if ($debug) {echo "Tag ";}
SetValueInteger($Betriebsmodus, 2);
SetTemperature($profile[$i],$TargetTemperature, $newtemp, $lastTemp, $FHT_id[$i], $force);} // set KomfortTemp when at Home
//if ($TagNacht == false) {$newtemp = $NachtTemp; if ($debug) {echo "Nacht ";}} // set NachtTemp at night
}
//**** AUTOMATIC, set temperature from Google calendar ********************************************
if ($parameter_Urlaub == false && ($Anwesenheit == false || ($Anwesenheit == true && $TagNacht == false))) { // set temperature from profile-file
if ($debug) {echo "Automatic ";}
$filename = IPS_GetKernelDir()."Heizung_".$profile[$i].".txt";
$handle = fopen($filename,"r");
while ($line = fgets($handle, 1000))
{
$value = explode(";", $line); //[0]-date, [1]-time, [2]-temperature, [3]-parameter
$day=$value[0];
$switchtime=$value[1];
if ($value[2] == "NachtTemp") {
$temp = $NachtTemp; }
else {$temp=$value[2];}
if (date("d.m.y") == $day)
{
if($time > $switchtime)
$newtemp = $temp;
}
}
fclose($handle);
SetValueInteger($Betriebsmodus, 1);
SetTemperature($profile[$i], $newtemp, $lastTemp, $FHT_id[$i], $HMV_id[$i], $force);
}
if ($debug){echo "
";}
}
//*******************************************************************
//****** FUNCTION: Set Temperature **********************************
function SetTemperature($profile, $newtemp, $lastTemp, $FHT_id, $HMV_id, $force)
{
global $debug;
global $FHT_debug;
if ($debug) {echo "Sollwert Temperatur ".$profile." [°C]: ".$newtemp;}
SetValueFloat(CreateVariableByName($FHT_id, "lastTemp", 2, "", "", ""), (float)$newtemp);
HM_WriteValueFloat($HMV_id , "SETPOINT", (float)$newtemp);
}
//******FUNCTION: CreateVariableByName *******************************
function CreateVariableByName($id, $name, $type, $profile, $ScriptID, $position)
{
global $IPS_SELF;
$vid = @IPS_GetVariableIDByName($name, $id);
if($vid === false)
{
$vid = IPS_CreateVariable($type);
IPS_SetParent($vid, $id);
IPS_SetName($vid, $name);
IPS_SetInfo($vid, "this variable was created by script #$IPS_SELF");
if($profile == "FHT.Betriebsmodus" && IPS_VariableProfileExists("FHT.Betriebsmodus")== false) {
IPS_CreateVariableProfile($profile, 1);
IPS_SetVariableProfileAssociation($profile, 0, "Urlaub", "Information");
IPS_SetVariableProfileAssociation($profile, 1, "Automatik", "Information");
IPS_SetVariableProfileAssociation($profile, 2, "Komfort", "Information");
IPS_SetVariableCustomProfile($vid, $profile);
}
if($profile != "") {IPS_SetVariableCustomProfile($vid, $profile); }
if($ScriptID !== "") {IPS_SetVariableCustomAction($vid, $ScriptID);}
if($ScriptID !== "") {IPS_SetPosition($vid, $position);}
}
return $vid;
}
//******FUNCTION: CreateScriptByName *******************************
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, "This script was created by: #$IPS_SELF#");
$fh = fopen(IPS_GetKernelDir()."scripts\\".$ScriptID.".ips.php", 'w') or die("can't open file");
fwrite($fh, $ScriptTEXT);
fclose($fh);
$ScriptPath = $ScriptID.".ips.php"; //Skriptdatei
IPS_SetScriptFile($ScriptID, $ScriptPath);
IPS_SetHidden($ScriptID, true);
// echo "Die Skript-ID lautet: ". $ScriptID;
}
}
//******FUNCTION: CreateTimerByName *******************************
function CreateTimerByName($ParentID,$TimerNAME, $Minutes)
{
global $IPS_SELF;
$EreignisID = @IPS_GetEventIDByName($TimerNAME, $ParentID);
if ($EreignisID == 0){
$eid = IPS_CreateEvent(1); //zyklisches Ereignis
IPS_SetEventCyclic($eid, 2, 1, 0, 0, 2, $Minutes); //Jeden Tag alle $Minutes
IPS_SetParent($eid, $ParentID); //Eregnis zuordnen
IPS_SetEventActive($eid, true);
IPS_SetEventCyclicTimeBounds($eid, mktime(0, 0, 30),0); // Start: 00:00:30
IPS_SetName($eid, $TimerNAME);
IPS_SetInfo($eid, "This script was created by: #$IPS_SELF#");
}
else {
//echo "Die Ereignis-ID lautet: ". $EreignisID;
}
}
?>