Ankündigung

Einklappen
Keine Ankündigung bisher.

Urlaubsschaltung / Anwesenheitssimulation

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

    Urlaubsschaltung / Anwesenheitssimulation

    Good night,

    ich habe leider in der Suche nichts ensprechendes gefunden.

    Konkret möchte ich eine Urlaubsschaltung machen, die in etwas so aussieht:

    Sonnenaufgang: Raffstore rauf
    12:00h +/- random(0-30min) Raffstore Süd runter

    18:00h +- random (0-60min) Licht 1 für random (0-10min) ein
    :
    :

    Sonnenuntergang Raffstore runter

    Bis jetzt habe ich lediglich teilweise (ohne random) geschafft das über viele einzelne Logiken zu realisieren, die alle einen eigenen crontab Eintrag in der logic.yaml haben.

    Problem ist jetzt das wieder ausschalten, denn dass sollte ja als Trigger die zugehörige Einschaltlogik haben, plus den Random Wert. Den kann ich aber nicht in der logic.yaml sonder nur innerhalb .py verwenden.

    Auch finde ich die Lösung mit 20 verschiedenen Logiken unschön. Hat hier jemand dazu eine gute Idee, sicher haben einige schon so eine Urlaubsschaltung/Anwesenheitssimulation umgesetzt.

    Danke
    Johannes

    #2
    Wie kommst Du auf 20 Logiken?
    Viele Grüße
    Martin

    There is no cloud. It's only someone else's computer.

    Kommentar


      #3
      10x ein, 10x aus,weil ich jedes Licht, das ich zu einem unterschiedlichen Zeitpunkt schalten möchte in eine eigene Logik gegeben hätte

      Idealerweise, hätte ich eine logik.py, die lauter nachfolgende Cronjobs triggert. Dann wäre da Akivieren/Deaktivieren des Urlaubsmodus auch viel effizienter

      Kommentar


        #4
        Das klingt nach einer Anwesenheitssimulation. Da solltest Du Dir das Plugin simulation anschauen. Dort gibst Du allerdings die Zeiten nicht explizit vor. Es wird über einen Zeitraum das normale Schaltverhalten aufgezeichnet. Das kannst Du dann während des Urlaubs abspielen.
        Viele Grüße
        Martin

        There is no cloud. It's only someone else's computer.

        Kommentar


          #5
          Danke für den Hinweis zum Plugin Simulation, das wäre meine letze Wahl gewesen, falls alles andere nicht geht. Denn das Aufzeichnen empfinde ich als zu umständlich und starr.

          Niemand, der das schlank und einfach gelöst hat?

          Kommentar


            #6
            Doch, nur da Deine Beschreibung was Du erreichen willst eher spärlich ist, bin ich auch nicht bereit da viel Zeit zu investieren um die schlanke Lösung zu beschreiben, die Dir dann nicht gefällt oder hilft. Ich z.B. finde es erheblich umständlicher und starrer die Schaltzeiten für diverse Lampen festzulegen und fest in z.B. eine Logik einzutragen, als sie aufzuzeichnen (was auch noch den Vorteil hat, dass die Anwesenheitssimulation den wirklichen Zeiten entspricht und nicht während der Simulation andere Schaltzeiten existieren als während der Anwesenheit.)
            Viele Grüße
            Martin

            There is no cloud. It's only someone else's computer.

            Kommentar


              #7
              away_simul.py:

              Code:
              logics.scheduler_add(logic.sim_raffstore_rauf.py, logic, 'random()*20 8 * *')
              Mit dem Ziel die Raffstore zwischen 8h und 8:20h hochzufahren

              aber es funktioniert weder mit
              Code:
              sh.logics
              noch mit :
              HTML-Code:
              #logics = Logics.get_instance()
              Fehler: kein Objekt mit dem namen "get_instace()

              Kommentar


                #8
                Ev. auch scheduler.add statt logics.scheduler_add verwenden?
                Worin liegt der Unterschied?

                Code:
                 
                 from lib.scheduler import Scheduler scheduler = Scheduler.get_instance()  # to access a method (eg. to trigger a logic): scheduler.trigger(...)

                Kommentar


                  #9
                  Das kann nicht funktioneren. ramdom() gibt es im Syntax des crontab Strings nicht. Siehe https://www.smarthomeng.de/user/konf...e_crontab.html
                  Viele Grüße
                  Martin

                  There is no cloud. It's only someone else's computer.

                  Kommentar


                    #10
                    Du kannst Dir doch eine Simulation musterhaft aufzeichnen und sie handisch anpassen (editieren); ist plain txt.
                    das geht ratzfatz

                    Kommentar


                      #11
                      Hab mir vor einiger zeit einen Zufallstimer für Funksteckdosen gebaut, evtl. hilft dir das ja:
                      das ganze lässt sich über die timer funktion steuern.

                      Hab eine Zeitschaltuhr angelegt, die mir nur einen Bytewert setzt zu einer bestimmten zeit.

                      item.yaml
                      Code:
                      funk:
                          logik:
                              type: num
                              enforce_updates: 'yes'
                              cache: 'true'
                      
                              uzsu:
                                  type: dict
                                  uzsu_item: funk.logik
                                  cache: 'true'
                      Diesen Bytewert werte ich dann mit einer Logik aus:

                      logik.yaml
                      (watch_item: funk.logik)
                      Code:
                      #!/usr/bin/env python
                      from random import randint
                      
                      # Funksteckdose 2 einschalten
                      if sh.funk.logik() == 1:
                        logger.info("Steckdose 2 einschalten")
                        sh.funk.steckd2(1)
                      # Funksteckdose 2 über Zufallstimer ausschalten (zw. 5 sec. und 15 Min.)  
                      elif sh.funk.logik() == 2:
                        logger.info("Steckdose 2 verzögert aus")
                        sh.funk.steckd2.timer(randint(5,900),0)
                      # Funksteckdose 4 einschalten
                      elif sh.funk.logik() == 3:
                        logger.info("Steckdose 4 einschalten")
                        sh.funk.steckd4(1)
                      # Funksteckdose 4 über Zufallstimer ausschalten (zw. 5 sec. und 15 Min.)  
                      elif sh.funk.logik() == 4:
                        logger.info("Steckdose 4 verzögert aus")
                        sh.funk.steckd4.timer(randint(5,900),0)
                      
                      else:
                        logger.info("Steckdosen sofort ausschalten")
                        sh.funk.steckd2(0)
                        sh.funk.steckd4(0)
                        sh.funk.steckd2.timer(1,0)  
                        sh.funk.steckd4.timer(1,0)
                      Gruß, Mike

                      Kommentar


                        #12
                        Guten Abend,

                        ich habe es nun wie folgt gelöst - vielleicht ist jemand ja einmal in einer ähnlichen Situation und kann es brauchen.

                        Jede Ausführung (Raff bewegen, Licht an oder aus) ist eine eigene Logik, aber in einer einzigen Datei (awaysimulation.py)
                        Diese wertet den Übergabeparameter aus und steuert definierte Items.

                        Der awaycontroller läuft täglich um Mitternacht und setzt die nächte Ausführungszeit der einzelnen Logiken, wobei ich mir hier ein wenig gespielt habe um unterschiedliches auszuprobieren:


                        logic.conf
                        Code:
                        [away_controller]
                            filename = awaycontroller.py
                             crontab = '0 0 * *'
                        [sim_raffstore_gesamt_rauf]
                            filename= awaysimulation.py
                            exec_param = raff_gesamt_rauf
                        [sim_raffstore_gesamt_runter]
                            filename= awaysimulation.py
                            exec_param = raff_gesamt_runter
                        [sim_raffstore_sz_runter]
                            filename= awaysimulation.py
                            exec_param = raff_sz_runter
                        [sim_raffstore_sw_oeffnen]
                            filename= awaysimulation.py
                            exec_param = raff_sw_oeffnen
                        [sim_raffstore_sw_runter]
                            filename= awaysimulation.py
                            exec_param = raff_sw_runter
                        [sim_raffstore_s_runter]
                            filename= awaysimulation.py
                            exec_param = raff_s_runter
                        [sim_szene_gn8]
                            filename= awaysimulation.py
                            exec_param = gn8
                        [sim_licht_essen_ein]
                            filename= awaysimulation.py
                            exec_param = licht_essen_ein
                        [sim_licht_essen_aus]
                            filename= awaysimulation.py
                            exec_param = licht_essen_aus
                        [sim_licht_kue_ein]
                            filename= awaysimulation.py
                            exec_param = licht_kue_ein
                        [sim_licht_kue_aus]
                            filename= awaysimulation.py
                            exec_param = licht_kue_aus
                        [sim_licht_az_ein]
                            filename= awaysimulation.py
                            exec_param = licht_az_ein
                        [sim_licht_az_aus]
                            filename= awaysimulation.py
                            exec_param = licht_az_aus
                        [sim_licht_eb_ein]
                            filename= awaysimulation.py
                            exec_param = licht_eb_ein
                        [sim_licht_eb_aus]
                            filename= awaysimulation.py
                            exec_param = licht_eb_aus
                        [sim_licht_fassade_ein]
                            filename= awaysimulation.py
                            exec_param = licht_fassade_ein
                        [sim_licht_fassade_aus]
                            filename= awaysimulation.py
                            exec_param = licht_fassade_aus
                        [sim_licht_ankl_ein]
                            filename= awaysimulation.py
                            exec_param = licht_ankl_ein
                        [sim_licht_ankl_aus]
                            filename= awaysimulation.py
                            exec_param = licht_ankl_aus
                        [sim_licht_gesamt_aus]
                            filename= awaysimulation.py
                            exec_param = licht_gesamt_aus
                        /logics/awaycontroller.py
                        Code:
                        #!/usr/bin/env python3
                        # logics/awaycontroller.py
                        from random import randint
                        
                        minute = randint(0,59)
                        sh.scheduler.change('sim_raffstore_gesamt_rauf',cron=str(minute) + ' '+str(7 if minute > 30 else 8)+' * *') #zwischen 7:31h und 8:30h
                        
                        sh.scheduler.change('sim_raffstore_s_runter',cron=str(randint(1,59)) + ' 12 * *')
                        
                        sh.scheduler.change('sim_raffstore_sz_runter',cron=str(randint(1,59)) + ' 11 * *')
                        
                        sh.scheduler.change('sim_raffstore_sw_runter',cron=str(randint(1,59)) + ' 15 * *')
                        
                        sh.scheduler.change('sim_raffstore_sw_oeffnen',cron=str(30+randint(-10,10)) + ' 18 * *') # zwischen 18:20h und 18:40h
                        
                        minute = randint(-10,10)
                        sh.scheduler.change('sim_szene_gn8',cron=str(60+minute if minute < 0 else minute) + ' '+str(18 if minute < 0 else 19)+' * *') #zwischen 18:50h und 19:10h
                        #sh.scheduler.change('sim_raffstore_runter',cron='17:00<sunset'+str(randint(-60,10))+'m<19:'+str(randint(0,15))) # frühestens 17:00h, sunset +10/-60 Minuten; spätestens zwischen 19:00h und 19:15h
                        
                        
                        stunde= randint(19,22)
                        minute = randint(0,59)
                        dauer = randint (1,120)
                        #logger.info(str(stunde)+':'+str(minute)+'h -> Dauer'+str(dauer))
                        sh.scheduler.change('sim_licht_az_ein',cron=str(minute)+' '+str(stunde)+' * *')
                        sh.scheduler.change('sim_licht_az_aus',cron=str((minute+dauer) if (minute+dauer) < 60 else (minute+dauer) % 60)+' '+str(stunde+int((minute+dauer)/60))+' * *')
                        
                        
                        
                        stunde= randint(19,22)
                        minute = randint(0,59)
                        dauer = randint (1,120)
                        #logger.info(str(stunde)+':'+str(minute)+'h -> Dauer'+str(dauer))
                        sh.scheduler.change('sim_licht_fassade_ein',cron=str(minute)+' '+str(stunde)+' * *')
                        sh.scheduler.change('sim_licht_fassade_aus',cron=str((minute+dauer) if (minute+dauer) < 60 else (minute+dauer) % 60)+' '+str(stunde+int((minute+dauer)/60))+' * *')
                        
                        stunde= randint(21,22)
                        minute = randint(0,59)
                        dauer = randint (1,20)
                        sh.scheduler.change('sim_licht_ankl_ein',cron=str(minute)+' '+str(stunde)+' * *')
                        sh.scheduler.change('sim_licht_ankl_aus',cron=str((minute+dauer) if (minute+dauer) < 60 else (minute+dauer) % 60)+' '+str(stunde+int((minute+dauer)/60))+' * *')
                        
                        stunde= randint(21,22)
                        minute = randint(0,59)
                        dauer = randint (1,4)
                        sh.scheduler.change('sim_licht_eb_ein',cron=str(minute)+' '+str(stunde)+' * *')
                        sh.scheduler.change('sim_licht_eb_aus',cron=str((minute+dauer) if (minute+dauer) < 60 else (minute+dauer) % 60)+' '+str(stunde+int((minute+dauer)/60))+' * *')
                        
                        stunde= randint(18,20)
                        minute = randint(0,59)
                        dauer = randint (10,40)
                        sh.scheduler.change('sim_licht_essen_ein',cron=str(minute)+' '+str(stunde)+' * *')
                        sh.scheduler.change('sim_licht_essen_aus',cron=str((minute+dauer) if (minute+dauer) < 60 else (minute+dauer) % 60)+' '+str(stunde+int((minute+dauer)/60))+' * *')
                        
                        stunde= randint(18,21)
                        minute = randint(0,59)
                        dauer = randint (45,120)
                        sh.scheduler.change('sim_licht_kue_ein',cron=str(minute)+' '+str(stunde)+' * *')
                        sh.scheduler.change('sim_licht_kue_aus',cron=str((minute+dauer) if (minute+dauer) < 60 else (minute+dauer) % 60)+' '+str(stunde+int((minute+dauer)/60))+' * *')
                        
                        
                        
                        sh.scheduler.change('sim_licht_gesamt_aus',cron='59 23 * *')
                        sh.scheduler.change('sim_raffstore_gesamt_runter',cron='59 23 * *')

                        /logics/awaysimulation.py
                        Code:
                        #!/usr/bin/env python3
                        # logics/awaysimulation.py
                        import time
                        if str(logic.exec_param) == 'raff_gesamt_rauf':
                            logger.info('##Sim: Raffstore gesamt rauf')
                            sh.Zentral.JalousieGesamt.Bewegen('0')
                        elif str(logic.exec_param) == 'raff_gesamt_runter':
                            logger.info('##Sim: Raffstore gesamt runter')
                            sh.Zentral.JalousieGesamt.Bewegen('1')
                        
                        elif str(logic.exec_param) == 'raff_sz_runter':
                            logger.info('##Sim: Raffstore SZ runter')
                            sh.OG.Schlafzimmer.Raffstore.Bewegen('1')
                        
                        elif str(logic.exec_param) == 'raff_sw_oeffnen':
                            logger.info('##Sim: Raffstore Sued/West oeffnen')
                            sh.EG.Wohnen.RaffstoreEsstisch.Bewegen('0')
                            sh.EG.Wohnen.RaffstoreHST.Bewegen('0')
                            sh.EG.Wohnen.RaffstoreNurglaseckNord.Bewegen('0')
                            sh.EG.Wohnen.RaffstoreNurglaseckSued.Bewegen('0')
                            sh.EG.Wohnen.RaffstoreSuedfenster.Bewegen('0')
                            sh.EG.Flur.JalousieTuer.Bewegen('0')
                            time.sleep(2)
                            sh.EG.Wohnen.RaffstoreEsstisch.SchrittStopp('1')
                            sh.EG.Wohnen.RaffstoreHST.SchrittStopp('1')
                            sh.EG.Wohnen.RaffstoreNurglaseckNord.SchrittStopp('1')
                            sh.EG.Wohnen.RaffstoreNurglaseckSued.SchrittStopp('1')
                            sh.EG.Wohnen.RaffstoreSuedfenster.SchrittStopp('1')
                            sh.EG.Flur.JalousieTuer.SchrittStopp('1')
                        
                        elif str(logic.exec_param) == 'raff_sw_runter':
                            logger.info('##Sim: Raffstore Sued/West runter')
                            sh.EG.Wohnen.RaffstoreEsstisch.Bewegen('1')
                            sh.EG.Wohnen.RaffstoreHST.Bewegen('1')
                            sh.EG.Wohnen.RaffstoreNurglaseckNord.Bewegen('1')
                            sh.EG.Wohnen.RaffstoreNurglaseckSued.Bewegen('1')
                            sh.EG.Wohnen.RaffstoreSuedfenster.Bewegen('1')
                            sh.EG.Flur.JalousieTuer.Bewegen('1')
                        
                        elif str(logic.exec_param) == 'raff_s_runter':
                            logger.info('##Sim: Raffstore Sued runter')
                            sh.EG.Wohnen.RaffstoreNurglaseckSued.Bewegen('1')
                            sh.EG.Wohnen.RaffstoreSuedfenster.Bewegen('1')
                        
                        elif str(logic.exec_param) == 'gn8':
                            logger.info('##Sim: gn8 Szene')
                            sh.Zentral.Szenen('0')
                            sh.OG.Flur.Deckenspot.EinAus('1')
                        
                        elif str(logic.exec_param) == 'licht_essen_ein':
                            logger.info('##Sim: Licht Essen ein')
                            sh.EG.Essen.LampeMitte.EinAus('1')
                            sh.EG.Essen.LampenAussen.EinAus('1')
                        elif str(logic.exec_param) == 'licht_essen_aus':
                            logger.info('##Sim: Licht Essen aus')
                            sh.EG.Essen.LampeMitte.EinAus('0')
                            sh.EG.Essen.LampenAussen.EinAus('0')
                        
                        elif str(logic.exec_param) == 'licht_kue_ein':
                            logger.info('##Sim: Licht Kueche ein')
                            sh.EG.Kueche.DeckenspotsSchraenke.EinAus('1')
                            sh.EG.Kueche.DeckenspotsInsel.EinAus('1')
                        elif str(logic.exec_param) == 'licht_kue_aus':
                            logger.info('##Sim: Licht Kueche aus')
                            sh.EG.Kueche.DeckenspotsSchraenke.EinAus('0')
                            sh.EG.Kueche.DeckenspotsInsel.EinAus('0')
                        
                        elif str(logic.exec_param) == 'licht_az_ein':
                            logger.info('##Sim: Licht AZ ein')
                            sh.EG.Arbeitszimmer.DeckenspotsNord.EinAus('1')
                            sh.EG.Arbeitszimmer.DeckenspotsSued.EinAus('1')
                        elif str(logic.exec_param) == 'licht_az_aus':
                            logger.info('##Sim: Licht AZ aus')
                            sh.EG.Arbeitszimmer.DeckenspotsNord.EinAus('0')
                            sh.EG.Arbeitszimmer.DeckenspotsSued.EinAus('0')
                        
                        elif str(logic.exec_param) == 'licht_eb_ein':
                            logger.info('##Sim: Licht ElternBad ein')
                            sh.OG.Elternbad.Deckenspot.EinAus('1')
                            sh.OG.Elternbad.Spiegellicht.EinAus('1')
                        elif str(logic.exec_param) == 'licht_eb_aus':
                            logger.info('##Sim: Licht Elternbad aus')
                            sh.OG.Elternbad.Deckenspot.EinAus('0')
                            sh.OG.Elternbad.Spiegellicht.EinAus('0')
                        
                        elif str(logic.exec_param) == 'licht_fassade_ein':
                            logger.info('##Sim: Licht Fassade ein')
                            sh.EG.Terrasse.FassadenspotsSued.EinAus('1')
                            sh.EG.Terrasse.FassadenspotsMorgenterrasse.EinAus('1')
                        elif str(logic.exec_param) == 'licht_fassade_aus':
                            logger.info('##Sim: Licht Fassade aus')
                            sh.EG.Terrasse.FassadenspotsSued.EinAus('0')
                            sh.EG.Terrasse.FassadenspotsMorgenterrasse.EinAus('0')
                        
                        elif str(logic.exec_param) == 'licht_ankl_ein':
                            logger.info('##Sim: Licht Ankleide ein')
                            sh.OG.Ankleide.Deckenlicht.EinAus('1')
                        elif str(logic.exec_param) == 'licht_ankl_aus':
                            logger.info('##Sim: Licht Ankleide aus')
                            sh.OG.Ankleide.Deckenlicht.EinAus('0')
                        
                        elif str(logic.exec_param) == 'licht_gesamt_aus':
                            logger.info('##Sim: Licht Gesamt aus')
                            sh.Zentral.Licht.Aus('0')

                        Kommentar

                        Lädt...
                        X