Ankündigung

Einklappen
Keine Ankündigung bisher.

Google Schaltuhr

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    [WireGate-Plugin] Google Schaltuhr

    Hallo

    Hier mein Google Schaltuhr-Plugin.

    Unter Google Kalender muss ein neuer Kalender z.B. Schaltungen erstellt werden.
    In diesem Kalender werden die Schalttermine eingetragen.
    Es ist immer nur der Starttermin gültig, der Endtermin wird nicht gebraucht.
    Im Feld "Was:" wird eingetragen was geschaltet werden soll, mit einem ";" getrennt.
    Es muss diese Reihenfolge eingehalten werden.
    name;GA;DPT;Wert
    z.B. = Deckenlampe_Büro;2/1/1;1;1

    Das Plugin überprüft alle 20sec. ob eine Schaltung ansteht und führt sie dann aus.
    Es wird alle 10min ein PHP-Script augerufen, das holt 20 aktuelle Termine aus dem
    Google-Kalender und speichtert diese Termine in der Plugin.conf ab.

    Ich habe dieses PHP-Script auf meinem WG unter /var/www/myhouse/kalender/hole_kalender.php abgelegt.
    Dieser Speicherort muss im Plugin google_schaltuhr.pl angepasst werden.

    Im PHP-Script muss noch die Privatadresse des Kalenders unter "$feedURL" angepasst werden.
    Diese Adresse bekommt man wenn man im Google Kalender auf der linken Seite den Schaltkalender anklickt.
    Dann öffnet eine Drop Down Liste, wo man Kalender-Einstellungen auswählt.
    Dort kommt man zu den Kalender Details.
    Ganz unten unter Privatadresse den Button "XML" anklicken , dann öffnet sich ein Popup mit der Privatadresse.
    Diese Privatadresse kopiert man ins PHP-Script unter "$feedURL"
    https://www.google.com/calendar/feed...xxxxxxxx/basic
    Die Endung "basic" wird entfernt und durch "full" ersetzt.

    Das PHP-Script könnte auch durch Perl-Script ersetzt werden.
    Es könnte dann in das Plugin übernommen werden.
    Ich bin schon damit angefangen, habe aber die Lust verloren.

    google_schaltuhr.pl
    Code:
    # return();
    # schaltet anhand der Termine im Google-Kalender
    # by NetFritz 03/2013
    #
    
    #
    # muss ewtl angepasst werden
    my $hole_gkalender = "./var/www/myhouse/g_kalender/hole_gkalender.php";
    #
    $plugin_info{$plugname.'_cycle'} = 20;
    my $geschaltet = "";
    #
    # hole die Schaltzeiten aus der config
    my $conf=$plugname; $conf=~s/\.pl$/.conf/;
    $conf="/etc/wiregate/plugin/generic/conf.d/$conf";
    open (CONFIG, "<$conf") || return "no config found";
         my @Schaltzeiten = <CONFIG>;
    close CONFIG;
    #
    # in $iso steht Datum-Zeit = 'd.m.Y H:M'
    my @dta = localtime(time);
    my $iso=sprintf('%02d.',$dta[3]);
    $iso.=sprintf('%02d.',$dta[4]+1);
    $iso.=($dta[5]+1900)." ";
    $iso.=sprintf('%02d:',$dta[2]);
    $iso.=sprintf('%02d',$dta[1]);
    #
    my ($sek,$min,$std) = localtime(time);
          if ($min < 10 ){$min = "0".$min}
          if ($std < 10 ){$std = "0".$std}
    #
    # Schaltungen ausführen
    foreach my $element (@Schaltzeiten) {
       # $element=~s/ //g; # Leerzeichen entfernen
       my ($schaltzeit,$name,$ga,$dpt,$wert) = split(/;/,$element); 
       $ga=~s/ //g; # Leerzeichen entfernen
       $dpt=~s/ //g;
       $wert=~s/ //g; 
       if(($plugin_info{$plugname.'_time'}+60) <= $plugin_info{$plugname.'_last'}){
          if($iso eq $schaltzeit){
            $geschaltet = "zeit=" . $schaltzeit . " name=" . $name . " ga=" . $ga . " dpt=" . $dpt . " wert=" .$wert;
            knx_write($ga,$wert,$dpt);
            $plugin_info{$plugname.'_time'} = time();
          }  
       }
    }
    #
    # holt mit Hilfe des PHP-Scripts vom Google Kalender die Schaltzeiten
    # und speichert sie in der plugin.conf ab
    if(($plugin_info{$plugname.'_time'}+60) <= $plugin_info{$plugname.'_last'}){
       if($min == 00 or $min == 10 or $min == 20 or $min == 30 or $min == 40 or $min == 50){
          # Google-Kalender in config laden
          my $result = system($hole_gkalender);
         $plugin_info{$plugname.'_time'} = time();
       }
    }
    return($geschaltet);
    hole_gkalender.php
    Code:
    #!/usr/bin/php
    <?php
    # Holt aus den Google Kalender (Schaltkalender) 20 Termine
    # (es werden nur Termine aus der Zukunft geladen)
    # und speichert sie in die plugin.conf ab,
    # wird von google_schaltuhr Plugin alle 10min aufgerufen 
    # Die $feedURL muss an den eigenen Kalender angepasst werden
    # by NetFritz 03/2013
    #
    # $feedURL = "https://www.google.com/calendar/feeds/$userid/private-$magicCookie/full";
    # Privatadresse unter Kalender-Einstellungen , unten XML Private, basic muss gegen full getausch werden
    $feedURL = "[URL="https://www.google.com/calendar/feeds/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxgroup.calendar.google.com/private-xxxxxxxxxxxxxxxxxxxxxxxxxxxxx/basic"]https://www.google.com/calendar/feeds/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxgroup.calendar.google.com/private-xxxxxxxxxxxxxxxxxxxxxxxxxxxxx/full[/URL]";
    $feedParams = "?singleevents=true&max-results=20&orderby=starttime&start-min=".urlencode(date("c"))."&sortorder=a";
    $sxml = simplexml_load_file($feedURL.$feedParams);
    # echo $sxml;
    $today = 0;
    $date = "";
    foreach ($sxml->entry as $entry) {
        $title = stripslashes(utf8_decode($entry->title));
        $gd = $entry->children('http://schemas.google.com/g/2005');
    
        $startTime = '';
        if ( $gd->when ) {
            $startTime = $gd->when->attributes()->startTime;
        } elseif ( $gd->recurrence ) {
            $startTime = $gd->recurrence->when->attributes()->startTime;
        }
        $startTime = strtotime( $startTime );
        
        if(date("d.m.y") == date("d.m.y", $startTime))
        {
            $today++;
        } else {
           if($today > 0)
           {
              $today = 0;
              $date .= "\n";
           }
        }
    
        $where = utf8_decode($gd->where->attributes()->valueString);
        if(strlen($where) > 0) {
            $where = " (".$where.")";
        }
            
        $date .= date("d.m.Y H:i", $startTime ).";".$title.$where."\n";
    
    }
    
    # echo $date;
    # schreibt die Schalttermine in die plugin.conf
    $conf="/etc/wiregate/plugin/generic/conf.d/google_schaltuhr.conf";
    $datei = fopen($conf,"w");
      fwrite($datei, $date);
    fclose($datei);
    
    ?>
    und hier das angefangene Perl-Sript
    Code:
    #!/usr/bin/perl
    use URI::Escape;
    use LWP::Simple;
    use XML::Simple;
    use Data::Dumper;
    # in $iso steht Datum-Zeit = 'Y-m-d H:M:S'
    my @dta = localtime(time);
    my $iso=($dta[5]+1900)."-";
    $iso.=sprintf('%02d-',$dta[4]+1);
    $iso.=sprintf('%02d',$dta[3]);
    $iso.= "T"; # nach Datum wird ein T erwartet
    $iso.=sprintf('%02d:',$dta[2]);
    $iso.=sprintf('%02d:',$dta[1]);
    $iso.=sprintf('%02d',$dta[0]);
    my $encoded  = uri_escape($iso);
    #
    # $feedURL = Privatadresse unter Kalender-Einstellungen , unten XML Private
    my $feedURL = "[URL="https://www.google.com/calendar/feeds/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxgroup.calendar.google.com/private-xxxxxxxxxxxxxxxxxxxxxxxxxxxxx/basic"]https://www.google.com/calendar/feeds/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxgroup.calendar.google.com/private-xxxxxxxxxxxxxxxxxxxxxxxxxxxxx[/URL]/full";
    my $feedParams = "?singleevents=true&max-results=10&orderby=starttime&start-min=".$encoded."&sortorder=a";
    # Objekt erstellen
    $xml = new XML::Simple;
    my $xmlresult = get($feedURL.$feedParams)or die "Fehler";
    my $data = $xml->XMLin($xmlresult,ForceArray => ['title']);
    my $entry;
    
    foreach my $entry ($data->{entry}) {
       print Dumper($entry);
       # my $title = $entry->{title};
       # print $title . "\n";
    }
    Viel Spass
    Gruss NetFritz
    KNX & Wago 750-849 ,Wiregate u. Cometvisu, iPad 3G 64GB.
    WP Alpha-Innotec WWC130HX (RS232-Moxa-LAN),Solaranlage für Brauchwasser und Heizung.
    PV-Anlage = SMA Webbox2.0 , SunnyBoy 4000TL, Sharp 4kWP

    #2
    Danke, kann ich jetzt also von meiner Liste streichen .
    Freue mich auf das testen!
    Umgezogen? Ja! ... Fertig? Nein!
    Baustelle 2.0 !

    Kommentar


      #3
      Hallo
      Da das eintragen der Schaltzeiten im Google-Kalender Fehlerträchtig ist habe eine Eingabemaske für den lokalen Kalender erstellt.
      Die GAs werden aus der '/etc/wiregate/eibga.conf' ausgelesen.
      Das eintragen der Events in den Google-Kalender geht mit Zend-GData.
      Gruß NetFritz
      Angehängte Dateien
      KNX & Wago 750-849 ,Wiregate u. Cometvisu, iPad 3G 64GB.
      WP Alpha-Innotec WWC130HX (RS232-Moxa-LAN),Solaranlage für Brauchwasser und Heizung.
      PV-Anlage = SMA Webbox2.0 , SunnyBoy 4000TL, Sharp 4kWP

      Kommentar


        #4
        Kurze Frage, werden Serientermine auch berücksichtigt?
        Also einfach Termin eintragen der jeden Mittwoch o.ä. ausgeführt wird?
        Umgezogen? Ja! ... Fertig? Nein!
        Baustelle 2.0 !

        Kommentar


          #5
          Hallo
          Die Serientermine stehen ja für jeden Tag im Kalender.
          Ich habe es mal probiert, bei mir ging es.
          Gruß NetFritz
          KNX & Wago 750-849 ,Wiregate u. Cometvisu, iPad 3G 64GB.
          WP Alpha-Innotec WWC130HX (RS232-Moxa-LAN),Solaranlage für Brauchwasser und Heizung.
          PV-Anlage = SMA Webbox2.0 , SunnyBoy 4000TL, Sharp 4kWP

          Kommentar


            #6
            Danke, mir ging es eher um das anlegen der Termine und wie der Kalender eltztlich geparst wird ... da ist ein Serientermin schon praktisch.

            Werde das dann mal probieren.
            Umgezogen? Ja! ... Fertig? Nein!
            Baustelle 2.0 !

            Kommentar


              #7
              Hallo
              Wenn Du Termine im Google-Kalender einträgst, dauert es max 10min,
              das die G-Kalender abfrage in der config steht.
              Das php-Script "hole_gkalender.php" wird alle 10min vom Plugin aufgerufen.
              Gruß NetFritz
              KNX & Wago 750-849 ,Wiregate u. Cometvisu, iPad 3G 64GB.
              WP Alpha-Innotec WWC130HX (RS232-Moxa-LAN),Solaranlage für Brauchwasser und Heizung.
              PV-Anlage = SMA Webbox2.0 , SunnyBoy 4000TL, Sharp 4kWP

              Kommentar


                #8
                Passt auf anhieb.

                Ich sehe mir mal das Perl-Script an.

                Featurewünsche die auch selber erfüllen werde:
                - Ausschalten bzw. zweiten Schaltpunkt zum Terminende definieren
                - GA aus eibga.conf lesen
                - evtl. eine Trennung von "Betreff" und "Termindetails"
                - Abfrage mit ins Plugin integrieren oder gibt es da Laufzeitprobleme ?
                Umgezogen? Ja! ... Fertig? Nein!
                Baustelle 2.0 !

                Kommentar


                  #9
                  Hallo
                  - Abfrage mit ins Plugin integrieren oder gibt es da Laufzeitprobleme ?
                  Ich bin ja mal damit angefangen.
                  Das Perl-Script fragt so schon den G-Kalender ab.
                  Das XML nur nur noch geparst werden.
                  GA aus eibga.conf lesen
                  Habe ich schon fertig. Siehe meinen 2. Beitrag.
                  Gruß NetFritz
                  KNX & Wago 750-849 ,Wiregate u. Cometvisu, iPad 3G 64GB.
                  WP Alpha-Innotec WWC130HX (RS232-Moxa-LAN),Solaranlage für Brauchwasser und Heizung.
                  PV-Anlage = SMA Webbox2.0 , SunnyBoy 4000TL, Sharp 4kWP

                  Kommentar


                    #10
                    Hoi NetFritz

                    Gaaannz tolle Sache, was Du da gebaut hast.
                    Ich verwende meinen eignen Kalender http://www.k5n.us/webcalendar.php
                    Es kommt mir so vor, als wären die sich ähnlich, der und der von Google.
                    Ich halte die Sachen lieber unter eigener Kontrolle.
                    Muss mal schauen ob es eine API dafür gibt. Im prinzip ist es ja nur eine MySQL Datenbank...
                    http://www.k5n.us/article.php?id=0003
                    Grüsse Bodo
                    Fragen gehören ins Forum, und nicht in mein Postfach;
                    EibPC-Fan; Wiregate-Fan; Timberwolf-Fan mit 30x 1-Wire Sensoren;

                    Kommentar


                      #11
                      Mit diesem php-script wird ein optionaler Wert zum Terminende gesendet:
                      Also:

                      Termin-Name: Test
                      Start: 30.3.2013 12:05
                      Ende: 30.3.2013 12:06
                      Wo: 1/2/10;1;1;0

                      DPT = 1
                      Wert zum Anfang = 1
                      Wert zum Ende = 0

                      ergibt folgende Schaltzeiten:

                      30.03.2013 12:05;Test;1/2/10;1;1
                      30.03.2013 12:06;Test;1/2/10;1;0


                      Grüße

                      Code:
                      #!/usr/bin/php
                      <?php
                      # Holt aus den Google Kalender (Schaltkalender) 20 Termine
                      # (es werden nur Termine aus der Zukunft geladen)
                      # und speichert sie in die plugin.conf ab,
                      # wird von google_schaltuhr Plugin alle 10min aufgerufen 
                      # Die $feedURL muss an den eigenen Kalender angepasst werden
                      # by NetFritz 03/2013
                      #
                      # $feedURL = "https://www.google.com/calendar/feeds/$userid/private-$magicCookie/full";
                      # Privatadresse unter Kalender-Einstellungen , unten XML Private, basic muss gegen full getausch werden
                      $feedURL = "https://www.google.com/calendar/feeds/tts0dqtv5d0n50k2f7896qan48%40group.calendar.google.com/private-556e437e0755df794d4bf6c54e61fa9a/full";
                      $feedParams = "?singleevents=true&max-results=20&orderby=starttime&start-min=".urlencode(date("c"))."&sortorder=a";
                      $sxml = simplexml_load_file($feedURL.$feedParams);
                      # echo $sxml;
                      $today = 0;
                      $date = "";
                      foreach ($sxml->entry as $entry) {
                          $title = stripslashes(utf8_decode($entry->title));
                          $gd = $entry->children('http://schemas.google.com/g/2005');
                      
                          $startTime = '';
                          if ( $gd->when ) {
                              $startTime = $gd->when->attributes()->startTime;
                          } elseif ( $gd->recurrence ) {
                              $startTime = $gd->recurrence->when->attributes()->startTime;
                          }
                          $startTime = strtotime( $startTime );
                          
                          if(date("d.m.y") == date("d.m.y", $startTime))
                          {
                              $today++;
                          } else {
                             if($today > 0)
                             {
                                $today = 0;
                                $date .= "\n";
                             }
                          }
                          
                          ###try End
                          
                          $endTime = '';
                          if ( $gd->when ) {
                              $endTime = $gd->when->attributes()->endTime;
                          } elseif ( $gd->recurrence ) {
                              $startTime = $gd->recurrence->when->attributes()->endTime;
                          }
                          $endTime = strtotime( $endTime );
                          
                          if(date("d.m.y") == date("d.m.y", $endTime))
                          {
                              $today++;
                          } else {
                             if($today > 0)
                             {
                                $today = 0;
                                $date .= "\n";
                             }
                          }
                      
                      
                          $where = utf8_decode($gd->where->attributes()->valueString);
                          if(strlen($where) > 0) {
                              #$where = " (".$where.")";
                              $where = $where;
                          }
                          
                          list ($ga, $dpt, $on, $off, $extra) = split(";", $where);
                          #echo "Gruppenadresse $ga DPT $dpt AN $on AUS $off";
                          
                          $date .= date("d.m.Y H:i", $startTime ).";".$title.";".$ga.";".$dpt.";".$on."\n";
                          
                          if (isset($off)) {
                          $date .= date("d.m.Y H:i", $endTime ).";".$title.";".$ga.";".$dpt.";".$off."\n";
                          }
                      
                      }
                      
                      #echo $date;
                      # schreibt die Schalttermine in die plugin.conf
                      $conf="/etc/wiregate/plugin/generic/conf.d/google_cal.conf";
                      $datei = fopen($conf,"w");
                        fwrite($datei, $date);
                      fclose($datei);
                      
                      ?>
                      Umgezogen? Ja! ... Fertig? Nein!
                      Baustelle 2.0 !

                      Kommentar


                        #12
                        Hallo
                        @JuMi2006
                        Habe deine Erweiterung mal eingefügt.
                        Kann so bleiben.

                        Wenn man nur EIN oder AUS schalten will kann man ja
                        Wo: 1/2/10;1;1;1 oder Wo: 1/2/10;1;0;0 einfügen.

                        Auch das Schalten über eine Zeitraum wie z.B. am 01.04.2012 EIN und
                        am 20.04,2012 AUS wird gehen.

                        Auch das Schalten von Serienterminen wird gehen.
                        Die Termine stehen alle in der Schaltliste.

                        Gruß NetFritz



                        KNX & Wago 750-849 ,Wiregate u. Cometvisu, iPad 3G 64GB.
                        WP Alpha-Innotec WWC130HX (RS232-Moxa-LAN),Solaranlage für Brauchwasser und Heizung.
                        PV-Anlage = SMA Webbox2.0 , SunnyBoy 4000TL, Sharp 4kWP

                        Kommentar


                          #13
                          So kompliziert ist es nicht.

                          Der Ausschaltzeitpunkt ist optional, zumindest war das so gedacht (hab das ehrlich gesagt nicht getestet ).

                          Wenn man nur eine Schalthandlung haben will lässt man den Parameter einfach weg:

                          1/2/10;1;1;0 = Einschalten zum Terminanfang und Ausschalten zum Terminende
                          1/2/10;1;1 = Nur Einschalten zum Terminanfang
                          1/2/10;1;0 = Nur Ausschalten zum Terminanfang

                          Grüße
                          Umgezogen? Ja! ... Fertig? Nein!
                          Baustelle 2.0 !

                          Kommentar


                            #14
                            Hallo
                            Ja um so besser.
                            Gruß NetFritz
                            KNX & Wago 750-849 ,Wiregate u. Cometvisu, iPad 3G 64GB.
                            WP Alpha-Innotec WWC130HX (RS232-Moxa-LAN),Solaranlage für Brauchwasser und Heizung.
                            PV-Anlage = SMA Webbox2.0 , SunnyBoy 4000TL, Sharp 4kWP

                            Kommentar


                              #15
                              Hallo Netfritz,
                              tolles plugin. Danke!

                              Zitat von NetFritz Beitrag anzeigen
                              Hallo
                              Da das eintragen der Schaltzeiten im Google-Kalender Fehlerträchtig ist habe eine Eingabemaske für den lokalen Kalender erstellt.
                              Die GAs werden aus der '/etc/wiregate/eibga.conf' ausgelesen.
                              Das eintragen der Events in den Google-Kalender geht mit Zend-GData.
                              Gruß NetFritz
                              Kannst du hierzu nochwas sagen? wie nutzt man das?

                              Und: Hast du die Änderungen am Plugin im ersten Beitrag eingefügt, oder wo ist die aktuelle Version zu finden?

                              Gruß,
                              Hendrik

                              Kommentar

                              Lädt...
                              X