Beregnungssteuerung über GoogleCalender

Zum Ende der Beregnungssaison habe ich nun meine Beregnung im wesentlichen auf Grundlage der „FHT-Steuerung über Google Calender“ an einen Google-Calender angepasst.:rolleyes:
Ich habe die Steuerung mit 2 Skripten realisiert.
Das erste Skript liest den GoogleCalender aus und speichert die Daten in einer Datei:

<?
/*
*************************************************************
*     Beregnungssteuerung auf Google Calendar Basis         *
*        Download der Daten durch dieses Skript             *
*************************************************************


************** BEGIN Settings *******************************

Google calendar settings

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 = "***********";
$userid = '************************@group.calendar.google.com';
$magicCookie = '*********************************';


//********************* END Settings ************************

//*********************** BEGIN Script **********************

//************* read Google Calendar ************************

$time=date("H:i");
//echo "Time ".$time."
";
$feedURL = "http://www.google.com/calendar/feeds/$userid/private-$magicCookie/full";
//echo "feedURL ".$feedURL."
";
$feedParams = "?singleevents=true&max-results=20&orderby=starttime&start-min=".urlencode(date("c"))."&sortorder=a";
$sxml = simplexml_load_file($feedURL.$feedParams);
$date = "";//String variable for $beregnung.txt

foreach ($sxml->entry as $entry)
{
   $title = stripslashes(utf8_decode($entry->title));
   //echo "Title ".$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 );
    //echo $startTime."
";
   $endTime = '';  // read EndTime
   if ( $gd->when )
    {
      $endTime = $gd->when->attributes()->endTime;
   }
    elseif ( $gd->recurrence )
    {
      $endTime = $gd->recurrence->when->attributes()->endTime;
   }
   $endTime = strtotime( $endTime );
    //echo $endTime."
";

    //    ********Format für Datei vorgeben****************************
   $date .= date("d.m.y", $startTime).";".date("H:i",$startTime).";Start;".$title."
".date("d.m.y", $endTime).";".date("H:i",$endTime).";Ende_;".$title."
";

    //    ******** write profile-timetable ****************************
   $fh = fopen(IPS_GetKernelDir().$calendar.".txt", 'w') or die("can't open file");
   fwrite($fh, $date);
   fclose($fh);
}
$fh = fopen(IPS_GetKernelDir().$calendar.".txt", 'a+') or die("can't open file");
fclose($fh);
?>

Die Datei, die so entsteht hat in etwa folgenden Aufbau:

11.09.10;06:01;Start;Versenkregner Rasen hinten
11.09.10;06:16;Ende_;Versenkregner Rasen hinten
11.09.10;06:16;Start;Versenkregner Rasen vorne
11.09.10;06:30;Ende_;Versenkregner Rasen vorne

Das zweite Skript öffnet die Datei in kurzen Abständen, geht die einzelnen Termine der Reihe nach durch, und führt am Ende die notwendigen Aktionen aus. Die Steuerung findet anhand des Eintrages in „Was“ im Kalender statt:

<?
/*Dieses Skript überprüft zyklisch die Parameterdatei und schaltet einzelne Aktoren*/

/*Definition der einzelnen Aktoren*/
$aktor_ID[0] = 59059 /*[Beregnung\Aktoren/Sensoren\Aktoren\Versenkregner Rasen hinten]*/ ;
$aktor_name[0] = "Versenkregner Rasen hinten
";
$aktor_ID[1] = 57790 /*[Beregnung\Aktoren/Sensoren\Aktoren\Versenkregner Rasenfläche vorne]*/ ;
$aktor_name[1] = "Versenkregner Rasen vorne
";
$aktor_ID[2] = 32434 /*[Beregnung\Aktoren/Sensoren\Aktoren\Regner Beet Konrad]*/ ;
$aktor_name[2] = "Regner Beet Konrad
";
$aktor_ID[3] = 51609 /*[Beregnung\Aktoren/Sensoren\Aktoren\Regner Beet Klatt]*/ ;
$aktor_name[3] = "Regner Beet Klatt
";
$aktor_ID[4] = 57295 /*[Beregnung\Aktoren/Sensoren\Aktoren\Regner Hecke]*/ ;
$aktor_name[4] = "Regner Beet Hecke
";
$aktor_ID[5] = 20375 /*[Beregnung\Aktoren/Sensoren\Aktoren\Regner Beet Teilkamp]*/ ;
$aktor_name[5] = "Regner Beet Teilkamp
";

/*Definition einer Aktor-Aktions-Variable*/
for($i = 0; $i <= 5; $i++)
{
    $aktor_action[$i] = false;
}

/*Öffnen der Parameterdatei*/
$filename = IPS_GetKernelDir()."Beregnung.txt";
$handle = fopen($filename,"r");
$time=date("H:i");
$date=date("d.m.y");

/*Einzelne Zeilen analysieren*/
while ($line = fgets($handle, 1000))
{
   $value = explode(";", $line);    //[0]-date, [1]-time, [2]-action, [3]-aktor
   $day=$value[0];
   $switchtime=$value[1];
   //echo "Date      :".$date."
";
   //echo "Day       :".$day."
";
   if ($date == $day)
   {
       //echo "Time      : ".$time."
";
          //echo "Switchtime: ".$switchtime."
";
        if($time > $switchtime)
        {
           //echo $value[2];
            if ($value[2] == "Start")
            {
              for($i = 0; $i <= 5; $i++)
                {
                    //echo "Value[3]  :".$value[3];
                   //echo "Aktor_name:".$aktor_name[$i];
                    if($value[3] == $aktor_name[$i])
                    {
                        $aktor_action[$i] = true;
                    }
                }
            }
           elseif ($value[2] == "Ende_")
            {
              for($i = 0; $i <= 5; $i++)
                {
                    if($value[3] == $aktor_name[$i])
                    {
                        $aktor_action[$i] = false;
                    }
                }
            }
        }
   
    }
}
for($i = 0; $i <= 5; $i++)
{
    //echo "Aktor ".$i." = ".$aktor_action[$i]."
";
    if ($aktor_action[$i] == true)
    {
         IPS_RunScript(IPS_GetScriptIDByName("Einschalten", $aktor_ID[$i]));
         echo "Einschalten: ".$i;
    }
    elseif ($aktor_action[$i] == false)
    {
         IPS_RunScript(IPS_GetScriptIDByName("Ausschalten", $aktor_ID[$i]));
    }

}
?>

Im Webfront sieht das dann so aus wie im Anhang…:slight_smile:
Die Skripte „Einschalten“ und „Ausschalten“ berücksichtigen die Sensoren und sorgen dafür, dass jeweils nur 1 Aktor in Betrieb ist, da ich leider für mehrere nicht genug Druck habe…:frowning:

Anhang wo?

:rolleyes:

Da ich mich ungern mit fremdem Federn schmücken möchte poste ich meine Anpassung mal hier. B71 hat an dieser Stelle danach gefragt.

ich hab mir einen Dummy angelegt mit 4 Integer Variablen je Abfallvariante.
Die Kalender Einträge hole ich wie oben und schreibe sie mir mit dem Script holen in die tonnen.txt
Das zweite Script ( machen ) setzt mir die Integer werte in den variablen. Da gibt es per Kalender nur vors haus und zurück, also 1 und 3.
Und mit dem „hab ich doch gemacht“ Script setze ich nur von 1 auf 2 wenn ich den Müll vorgemöllert (lassen) habe und von 3 wieder auf 0 wenn die Tonnen abgeholt sind.

Wie bereits erwähnt, den Hirnschmalz hat Matthias da rein gesteckt, die Ehre gebührt also ihm.

Loerdy

2.jpg

3.jpg

7.jpg

hab ich doch gemacht.txt (1.14 KB)

machen.txt (2.27 KB)

Danke Euch beiden.

Das werde ich gleich mal bei mir umsetzen…und habe auch schon einen weiteren Abnehmer gescoutet :slight_smile:

gruss
B71

@ loerdy,

die Logik mit dem setzen der Stati wenn Du den Müll rausgestellt hat muss man dann für jeden der 4 abgefragten Fälle in dem 2. Script (hab ich doch gemacht) anlegen, oder habe ich die Logik dahinter nicht verstanden ?

Gruss
B71

Ja.
Da bei mir alles an einem Tag statt findet erspare ich mir an dieser Stelle das Abfragen der einzelnen Variablen. Papier wird zwar nur alle 4 Wochen abgeholt und der Rest 14 tägig aber dann ändert sich der Status ja nicht auf 1. Deshalb orientiere ich mich am Status Gelb und setze dann alle 4 Variablen. Ich hab eigentlich auch nur 4 Variablen genommen weil ich dann auch 4 Grafiken nutzen kann.

Ahhhhhhhhhhhhh ja…das erklärt einiges.

Ich habe jetzt mal meine Version für einen 2-wöchigen Wechsel mit grüner und schwarzer Tonne gebaut. Glas und Papier ist in einem 4-Wochen Turnus bei uns. Basis sind natürlich die Google Daten die man selber einpflegt.

Kann man bestimmt schicker machen…aber es lüppt :slight_smile:

<?

$GELB = GetValueInteger(56535 /*Grüne Tonne*/);
$BRAUN = GetValueInteger(17356 /*Schwarze Tonne*/ );
$BLAU = GetValueInteger(38624 /*Papier*/ );
$GRAU = GetValueInteger(51744 /*Glas*/ );

if ($GELB == '1')
{
SetValueInteger(56535 /*Grüne Tonne*/   , 2);
}

if ($GELB == '3')
{
SetValueInteger(56535 /*Grüne Tonne*/   , 0);
}
if ($BRAUN == '1')
{
SetValueInteger(17356 /*Schwarze Tonne*/  ,2);
}
if ($BRAUN == '3')
{
SetValueInteger(17356 /*Schwarze Tonne*/  ,0);
}
if ($BLAU == '1')
{
SetValueInteger(38624 /*Papier*/  ,2);
}
if ($BLAU == '3')
{
SetValueInteger(38624 /*Papier*/  ,0);
}
if ($GRAU == '1')
{
SetValueInteger(51744 /*Glas*/  ,2);
}
if ($GRAU == '3')
{
SetValueInteger(51744 /*Glas*/  ,0);
}
?>