Ankündigung

Einklappen
Keine Ankündigung bisher.

Nächste berechnete Zeitpunkte von Cron und Cycle bereitstellen

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

    [Featurewunsch] Nächste berechnete Zeitpunkte von Cron und Cycle bereitstellen

    Hallo,

    ich steuere meine Weihnachtsbeleuchtung über crontab. Zusätzlich würde die nächsten Schaltzeitpunkte gerne in meiner Visu anzeigen. Dies funktioniert aber nur mit einem Zeitpunkt, da sh.py nur den nächsten Zeitpunkt in einer Variable vorhält.
    Siehe
    Code:
    sh.scheduler._scheduler['Logi_Weihnachtsbeleuchtung']['next']
    Ich habe die scheduler.py erweitert so dass für alle cron und cycle Elemente jeweils der nächste Zeitpunkt ermittelt wird und dieser mit dem entsprechenden Value in einem Dict vorgehalten wird.
    Das Dict muss vor der Ausgabe sortiert werden. Alternativ kann ein OrderedDict aus collections verwendet werden wovon ich hier aber abgesehen habe.

    Das Diff sieht wie folgt aus:
    Code:
    diff --git a/lib/scheduler.py b/lib/scheduler.py
    index b48f829..d025a32 100755
    --- a/lib/scheduler.py
    +++ b/lib/scheduler.py
    @@ -80,6 +80,7 @@ class Scheduler(threading.Thread):
         _scheduler = {}
         _runq = PriorityQueue()
         _triggerq = PriorityQueue()
    +    knowntriggertime = {}
    
         def __init__(self, smarthome):
             threading.Thread.__init__(self, name='Scheduler')
    @@ -271,6 +272,7 @@ class Scheduler(threading.Thread):
                 logger.warning("Could not change {0}. No logic/method with this name found.".format(name))
    
         def _next_time(self, name, offset=None):
    +        self.knowntriggertime[name] = {}
             job = self._scheduler[name]
             if None == job['cron'] == job['cycle']:
                 self._scheduler[name]['next'] = None
    @@ -285,9 +287,11 @@ class Scheduler(threading.Thread):
                 if offset is None:
                     offset = cycle
                 next_time = now + datetime.timedelta(seconds=offset)
    +            self.knowntriggertime[name][next_time] = value
             if job['cron'] is not None:
                 for entry in job['cron']:
                     ct = self._crontab(entry)
    +                self.knowntriggertime[name][ct] = job['cron'][entry]
                     if next_time is not None:
                         if ct < next_time:
                             next_time = ct
    Genutzt werden kann es wie folgt:
    Code:
    >>> for a in sorted(sh.scheduler.knowntriggertime['Logi_Weihnachtsbeleuchtung']):
    ...  a
    ...  sh.scheduler.knowntriggertime['Logi_Weihnachtsbeleuchtung'][a]
    ...
    datetime.datetime(2013, 12, 14, 15, 25, 41, 473853, tzinfo=tzutc())
    'on'
    datetime.datetime(2013, 12, 15, 0, 30, tzinfo=tzfile('/usr/share/zoneinfo/Europe/Berlin'))
    'off'
    datetime.datetime(2013, 12, 15, 6, 0, tzinfo=tzfile('/usr/share/zoneinfo/Europe/Berlin'))
    'on'
    datetime.datetime(2013, 12, 15, 8, 47, 19, 139512, tzinfo=tzutc())
    'off'
    datetime.datetime(2013, 12, 15, 23, 0, tzinfo=tzfile('/usr/share/zoneinfo/Europe/Berlin'))
    'off'
    Es würde mich freuen wenn dies oder eine ähnliche Funktionalität in ihren Weg in den Dev Branch finden würde. Direkt einchecken wollte ich es nicht, da Änderungen an der lib ja nicht ganz unkritisch sind.

    LG

    Mode

    #2
    Konkretes Beispiel:

    items.conf
    Code:
    [weihnachtsbeleuchtung]
        type = bool
        cache = true
        [[automatik]] 
            type = bool
            cache = true
        [[an_morgens]]
            type = str
            cache = true
        [[aus_morgens]]
            type = str
            cache = true
        [[an_abends]]
            type = str
            cache = true
        [[aus_abends]]
            type = str
            cache = true
    logic.conf
    Code:
    [Logi_Weihnachtsbeleuchtung]
        filename = logi_weihnachtsbeleuchtung.py
        watch_item = weihnachtsbeleuchtung
         crontab = 0 6 * * = an_morgens | sunrise+8 = aus_morgens | sunset+0 =  an_abends | 0 23 * 0,1,2,3,6 = aus_abends | 30 0 * 5,6 = aus_abends
    logi_weihnachtsbeleuchtung.py
    Code:
    if 'Logi_Weihnachtsbeleuchtung' in sh.scheduler.knowntriggertime:
        for triggers in sorted(sh.scheduler.knowntriggertime['Logi_Weihnachtsbeleuchtung'], reverse=True):
            item = None
            item = sh.return_item('weihnachtsbeleuchtung.' + sh.scheduler.knowntriggertime['Logi_Weihnachtsbeleuchtung'][triggers])
            if item is not None:
                item(triggers.astimezone(sh.now().tzinfo).strftime("%A %H:%M"))
    Ergebnis
    Code:
    >>> sh.weihnachtsbeleuchtung.an_morgens()
    'Sonntag 06:00'
    >>> sh.weihnachtsbeleuchtung.aus_morgens()
    'Sonntag 09:47'
    >>> sh.weihnachtsbeleuchtung.an_abends()
    'Sonntag 16:25'
    >>> sh.weihnachtsbeleuchtung.aus_abends()
    'Sonntag 00:30'
    Zeitpunkte wurden automatisch aus Cron Daten ermittelt und können in Visu oä verwendet werden.

    Kommentar


      #3
      Hallo Daniel,

      danke für das schöne Beispiel wie Du SH.py nutzt.
      Ich sehe momentan allerdings nicht den generellen Nutzen.

      Daher werde ich den Code nicht in lib übernehmen, sorry.

      btw.

      Code:
      0 23 * 0,1,2,3,6 = aus_abends | 30 0 * 5,6 = aus_abends
      Am Donnerstag geht das Licht nicht aus.

      Bis bald

      Marcus

      Kommentar


        #4
        Hallo Marcus,

        schade, dass du die (wirklich kleinen) Änderungen nicht übernehmen möchtest. Hätte ich ehrlich gesagt nicht erwartet.
        Stehen da noch andere Gründe dahinter (Performace, Speicherverbrauch etc)? Wenn nicht, würde ich dich bitten deine Entscheidung noch mal zu überdenken. Einen (von vielen) Verwendungszweck hatte ich ja schon präsentiert.

        Oder bin ich der einzige mit so verrückten Ideen? ;-)

        Der Hauptvorteil liegt für mich in der Verhinderung von Redundanz. Ich pflege alle Zeitpunkte in der Logic.conf und diese werden auch für jeden nicht ITler einfach lesbar in der Visu dargestellt. Alternativ müsste ich die Werte hart in die Visu schreiben und bei jeder Änderung der cron Tabelle manuell nachziehen - inkonsistenzen garantiert :-(


        PS: Donnerstags Abends geht das Licht nicht aus, dafür aber Freitag morgens um 0.30h :-)

        Kommentar


          #5
          Hi Daniel,

          Performance und Speicherverbrauch sind an der Stelle zu vernachlässigen.

          Nutzen und Nutzung sind sehr speziell. Was dagegen spricht sind Komplexität (der Nutzung), Wartung des Codes und Dokumentation.

          Bis bald

          Marcus

          Kommentar


            #6
            ich denke, das passt alles zum Thema Universelle Zeitschaltuhr, was wir ja schon extra haben
            Derzeit zwischen Kistenauspacken und Garten anlegen.
            Baublog im Profil.

            Kommentar

            Lädt...
            X