Ankündigung

Einklappen

Hinweis

Die Forenregeln wurden überarbeitet (Stand 7.11.22). Sie sind ab sofort verbindlich. Wir bitten um Beachtung.
Mehr anzeigen
Weniger anzeigen

Zeitschaltuhr mit Google Kalender steuern

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

    [Codebeispiel] Zeitschaltuhr mit Google Kalender steuern

    Hallo,
    ich möchte Euch vorstellen, wie man eine Zeitschaltuhr realisieren kann , die sich einfach mit Google Kalender administrieren lässt.

    Anwendungsbeispiele für minutengenaues Schalten: Weihnachtsbeleuchtung, Bewässerung, Sauna ...

    Anwendungsbeispiele für tagesgenaues Schalten:
    Aktivierung Anwesenheitssimulation, Anleuchten der zu leerenden Mülltonne, Feiertagsschaltungen ...

    Durch das setzen von Terminen lassen sich einzelne Werte auch ohne VPN , Mailboxscan etc. betätigen z.b. vom iPhone (wenn dort der Kalender eingetragen ist).

    Voraussetzungen:
    - einen oder mehrere dedizierte Kalender in Google Kalender ( oder anderen ICAL Diensten) zum Festlegen der Schaltzeiten

    -privaten ICAL Link (aus Google Kalender kopieren : Einstellungen- Kalender- Kalender wählen - Privater Link

    -Trigger in logic.conf auf sinnvolles Intervall einstellen

    Code:
     [zeitschaltuhr]
       filename = zeitschaltuhr.py
       cycle = 60
    - Logik zeitschaltuhr.py
    Code:
    #!/usr/bin/env python
    # * -----------------------------------------------------------------------------
    # *
    # *author      Stephan Schaade
    # *copyright   2013
    # *license     GPL <[URL="http://www.gnu.de"]GNU.de[/URL]>
    # * -----------------------------------------------------------------------------
    # Prerequisites:
    # 1. Use patched plugin ical to support Google Calendar ( V.0.9 patched)
    # 2. Define [zentral] [[googleswitch]] and [zentral] [[google_day_switch]]  in items
    # 3. Import private Google ICAL link from google.calendar
    # 4. Trigger logic 
    # Comments:
    # imported events need time correction even if timezone was given with time ( add 1hour as shown below) )  (possible bug in Ical )
    # left logger info in as comment for diagnostics
     
    active=0
    today = sh.now().date()
    #logger.info(today)
    tomorrow = today + datetime.timedelta(days=1)
    now =sh.now()
    #logger.info(now)
     
    # Switch by minute of day
    googleswitch = sh.ical('https://www.google.com/calendar/ical/hierstehtdergeheimecode.calendar.google.com/private-[U][COLOR=#0066cc]hierstehtdergeheimecode[/COLOR][/U]/basic.ics')
    for day in googleswitch:
        #logger.info("Date: {0}".format(day))
        for event in googleswitch[day]:
             estart = event['Start'] + datetime.timedelta(hours=+1)
             eend = event['End'] + datetime.timedelta(hours=+1)
             logger.info (estart)
             logger.info (eend)
             if now >= estart:
               if now <= eend:
                logger.info("Googleswitch EIN")
                active='1'
               else:
                logger.info("Googleswitch AUS")
             else:
              logger.info("Googleswitch AUS")
     
     
    if active == 1:
        sh.zentral.googleswitch (active)
    else:
        sh.zentral.googleswitch (active) 
    #logger.info (active)
     
    # Switch by day
    if today in googleswitch:
        sh.zentral.google_day_switch('1')
    else:
        sh.zentral.google_day_switch('0')
    - Beispiel HTML Seite zur Kalenderdarstellung - Framecode gibt es bei Google Kalendereinstellungen:

    Code:
    /**
    * -----------------------------------------------------------------------------
    * @package     smartVISU
    * @author     Stephan Schaade
    * @copyright   2013
    * @license     GPL [http://www.gnu.de]
    * -----------------------------------------------------------------------------
    */
     
    {% extends "rooms.html" %}
    {% block content %}
     <h1><img class="icon" src='{{ icon0 }}time_calendar.png' />GoogleSwitch</h1>
     
        <iframe src="[URL]https://www.google.com/calendar/embed?src=hierstehtdergeheimecode%40group.calendar.google.com&ctz=Europe/Berlin[/URL]" style="border: 0" width="800" height="600" frameborder="0" scrolling="no"></iframe>
     
     
                   <div class="block">
        <div class="set-2" data-role="collapsible-set" data-theme="c" data-content-theme="a" data-mini="true">
         <div data-role="collapsible" data-collapsed="false">
                <h3></h3>
            {{ basic.symbol('googleswitch1', 'zentral.googleswitch', 'Googleswitch ein', icon1~'time_clock.png') }}  
           {{ basic.symbol('googleswitch2', 'zentral.googleswitch', 'Googleswitch aus', icon0~'time_clock.png',0)  }} 
            {{ basic.symbol('googledswitch1', 'zentral.google_day_switch', 'Google Day switch ein', icon1~'time_calendar.png') }}  
           {{ basic.symbol('googledswitch2', 'zentral.google_day_switch', 'Google Day switch aus', icon0~'time_calendar.png',0)  }}   
     
     
     
            </div>
        </div>
        </div>

    Wünsche Euch viel Spass damit

    Gruß Stephan
    Angehängte Dateien

    #2
    Hallo Stephan,

    ich habe gerade einmal ausprobiert. Geht super, hatte 10 Minuten gebraucht um es zum laufen zu bringen.

    Danke !

    Michel

    Kommentar


      #3
      Zitat von Orion Beitrag anzeigen
      Hallo Stephan,
      hatte 10 Minuten gebraucht um es zum laufen zu bringen.
      freut mich, bei mir war es deutlich länger ;-)
      Gruß Stephan

      Kommentar


        #4
        klappt das ganze auch über smartvisu direkt?
        ich habe auf smartvisu.de (Beschreibung) zwar gelesen dass es funktionieren soll, aber leider keine Doku gefunden.

        edit:
        Nach nochmaligen durchlesen scheint es nur mit smarthome.py zu funktionieren (also ohne Oberfläche)?

        Kommentar


          #5
          Was möchtest Du denn machen?
          Für die Auswertung eigener Logiken und die
          Steuerung von GA brauchst du das Backend.
          Für die Darstellung der nächsten Schaltereignisse kannst du das Frontend nehmen oder den Google Kalender in ein Frame packen wie ich es gemacht habe. Dann kannst du auch bequem mit Drag und Drop schalten.
          Gruß Stephan

          Kommentar


            #6
            bei mir klappt das leider nicht so schnell.

            1) ich habe in deine zeitschaltuhr.py meinen privat link ....basic.ics eingefügt und im logic ordner gespeichert

            2) die beiden items erstellt
            Code:
            [zentral]
                [[googleswitch]]
                    type = bool
                    knx_dpt = 1
                    knx_send = 1/1/5
                    visu_acl = rw
            [zentral]
                [[google_day_switch]]
                    type = bool
                    knx_dpt = 1
                    knx_send = 1/1/5
                    visu_acl = rw
            3) Eine html mit dem iframe erstellt. Bekomme ich auch angezeigt.

            4) die logic.conf ergänzt
            5) plugins.conf mit [ical]... ergänzt
            6) im google calender einen testtermin von 11:00-14:00 eingetragen.

            nun sollte doch eigentlich die GA 1/1/5 lt. item eingeschaltet sein. leider ist das nicht der fall.
            woran liegt es?

            Ich bekomm aber auch nicht den Termin der in index.html via
            Code:
                {% import "calendar.html" as calendar %}
                {{ calendar.list('calendarlist', 'Kalender', 5) }}
            anspreche. auf der Config Seite hab ich auch den Google Kalender aktiviert und den ics link eingetragen. hat das eine mit dem anderen zu tun?

            Kommentar


              #7
              . hat das eine mit dem anderen zu tun?
              Nein ist unabhängig, aber wenn Du auf den gleichen Kalender referenzierst, solltest Du auch die gleichen Termine sehen.
              Beide unterscheiden sich aber für ICAl brauchst Du den ICAl Link endend mit .ics - für die Config den Google Eintrag beginnened mit : https://www.google.com/calendar/feeds/.....

              Du solltest Dich aber mit Deinem Logfile beschäftigen, und dieses hier mit dazufügen. Ich habe extra Logfileeinträge eingebaut, damit Du die Schaltaktion im Logfile siehst.

              Gruß Stephan

              Kommentar


                #8
                Danke für deine Antwort.
                Terminanzeige und Zeitschaltuhr funktioniert nun. Ich hatte einen Tippfehler in der logic.conf. Mein Fehler.

                Was für mich allerdings noch unklar ist, sind die tagesgenauen Schaltzeiten.
                Sind dafür ganztägie Kalendereinträge notwendig?
                Wird dann von 0-24Uhr geschalten?

                Kommentar


                  #9
                  Zitat von fuxl66 Beitrag anzeigen

                  Was für mich allerdings noch unklar ist, sind die tagesgenauen Schaltzeiten.
                  Sind dafür ganztägie Kalendereinträge notwendig?
                  Wird dann von 0-24Uhr geschalten?

                  Tagesgenaue Schaltzeiten erfordern mindestens einen beliebigen Kalendereintrag an diesem Tag - egal wann dieser eingetragen ist

                  Gruß Stephan

                  Kommentar


                    #10
                    Das check ich jetzt nicht.
                    Wenn tagesgenaue Schaltzeiten einen beliebigen Eintrag benötigen, woher weiss das Plugin dann nun ob es sich um einen minuten oder tagesgenauen Eintrag handelt? Die beiden arbeiten doch mit dem selben Kalender, oder?
                    Wird dann von 0-24uhr geschaltet?

                    Sorry wenn ich blöde fragen stelle.....

                    Kommentar


                      #11
                      Zitat von fuxl66 Beitrag anzeigen
                      Das check ich jetzt nicht.
                      Wenn tagesgenaue Schaltzeiten einen beliebigen Eintrag benötigen, woher weiss das Plugin dann nun ob es sich um einen minuten oder tagesgenauen Eintrag handelt? Die beiden arbeiten doch mit dem selben Kalender, oder?
                      Wird dann von 0-24uhr geschaltet?

                      Sorry wenn ich blöde fragen stelle.....
                      Naja , wenn du beide Items ( wie in deinem Beispiel) auf die gleiche GA schickst, dann macht das natürlich keinen Sinn denn Der dayswitch wird die GA immer auf 1 setzen.
                      Du wählst mit den items Googledayswitch oder Googleswitch aus welches Verhalten Du brauchst .
                      Beispiel
                      Item Googledayswitch stelle ich zum Beispiel in der Visu dar - "heute Mülltonne raus" - während der Kalendereintrag 6-8:00 auf Googleswitch geht, eine GA hat die den Schaltaktor aktiviert - Lampe über Mülltonne.


                      Das Plugin liefert de Daten für die Logik --schau Dir diesem am besten mal genauer an.

                      Gruss Stephan

                      Kommentar


                        #12
                        Soweit klar. Und wie sieht das item aus die du in der visu darstellst? Ein notify oder info rechts oben wär schon mal cool.

                        Wie mache ich es dann zb. Wenn zb jeden morgen von 5-6 die aussenbeleuchtung ein sein soll und ich NUR den minuten switch verwenden will und gleichzeitig am selben tag der müll raus soll und ich NUR den day switch brauche? Geht das mit einem kalender?

                        P.s. wenn ich im kalender einen serien eintrag für wochentage setzt klappt der switch nicht. Log dazu kann ich nachreichen bei bedarf. Komm grad nicht dazu.

                        Gesendet von meinem GT-I9505 mit Tapatalk 4

                        Kommentar


                          #13
                          Zitat von fuxl66 Beitrag anzeigen
                          Soweit klar. Und wie sieht das item aus die du in der visu darstellst? Ein notify oder info rechts oben wär schon mal cool.
                          Dann füge in deine html seite ein:
                          Code:
                          {% import "status.html" as status %}
                          sowie den Alert:
                          Code:
                            {{ status.notify('notigy_google_day', 'zentral.google_day_switch', 'zentral.google_day_switch.text', 'INFO', 'Information', 'Papiertonne raus', 'info') }}

                          Zitat von fuxl66 Beitrag anzeigen
                          Wie mache ich es dann zb. Wenn zb jeden morgen von 5-6 die aussenbeleuchtung ein sein soll und ich NUR den minuten switch verwenden will und gleichzeitig am selben tag der müll raus soll und ich NUR den day switch brauche? Geht das mit einem Kalender?
                          2 Wege - 2. Kalender oder mit der
                          Logik den Inhalt des Kalendereintrags auswerten
                          Dazu Deine Logik um dies erweitern - nur ausgeben, oder Deine Logik auf von Dir verwendete Schlüsselworte abprüfen ( if .... )
                          Code:
                            sh.zentral.google_day_switch.text(event['Description'])

                          Gruß Stephan
                          Angehängte Dateien

                          Kommentar


                            #14
                            Cool. Danke für deine Antwort. Werd mir das mal im Detail ansehen.
                            Könntest du mir noch das verwendete Text Item zentral.google_day_switch.text als Beispiel einstellen? Mir ist noch nicht klar wie ein Text Item aussehen muss.
                            DANKE

                            Kommentar


                              #15
                              Zitat von fuxl66 Beitrag anzeigen
                              zentral.google_day_switch.text als Beispiel einstellen? Mir ist noch nicht klar wie ein Text Item aussehen muss.
                              DANKE
                              Spendier doch mal etwas Zeit mit der smarthome.py Doku
                              Configuration ? SmartHome.py 1.0 documentation
                              Wird nicht schaden

                              Code:
                               
                               
                              [zentral]  
                                         [[googleswitch]]
                                        type = bool
                                        knx_dpt = 1
                                      
                                         [[google_day_switch]]
                                        type = bool
                                        knx_dpt = 1
                                        
                                            [[[text]]]
                                            type = str

                              Kommentar

                              Lädt...
                              X