Heizen mit Google Kalender

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 :slight_smile:

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;
  }
}

?>

Ist das absicht das Du deinen MagicCookie und UserId hier treinstellst? oder ist das nur ein Beispiel.

Danke dir war ein versehen :slight_smile:

Ist natürlich immer ein Problem, wenn man das Gleiche mehrfach einstellt :confused:

Vielleicht willst Du es hier auch noch ändern :rolleyes:

Gruß
Bruno

Hab`s mal kopiert falls es noch jemand mal braucht. :eek:

Ps.: War ein WITZ :smiley:

Dachte schon Du willst die Preise kaputtmachen :smiley: