Ankündigung

Einklappen
Keine Ankündigung bisher.

Logiken mit Crontab-Steuerung korrekt initialisieren

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

    [Featurewunsch] Logiken mit Crontab-Steuerung korrekt initialisieren

    Hi!

    Ich habe trotz einiger Erfahrung mit den smarthome.py-Innereien leider immer noch keine schöne Methodik gefunden, wie ich eine Logik die - unter Anderem - vom Crontab-Einträgen in der logic.conf gesteuert wird, richtig bei einem sh.py Neustart initialisiere:

    Code:
    [tralala]
        name = 'tralala'
        filename = tralala.py
        crontab = init | 30 6 * 0,1,2,3,4 = day | 30 7 * 5,6 = day | 00 19 * * = night
    Code:
    if (trigger['by'] == 'Scheduler'):
      if (trigger['value'] == 'day'):
        logic.state_time = 'day'
      elif (trigger['value'] == 'night'):
        logic.state_time = 'night'
    
    if (not hasattr(logic,'state_time')):
      now = sh.now()
      if (((now.weekday() in range(0,5)) and (now.time() > datetime.time(6,30)) and (now.time() < datetime.time(19,30)))
       or ((now.weekday() in range(5,7)) and (now.time() > datetime.time(7,30)) and (now.time() < datetime.time(19,30)))):
        logic.state_time = 'day'
      else:
        logic.state_time = 'night'
    Problem: Das wird schnell unübersichtlich, zudem ist die Gefahr von Inkonsistenzen sehr groß.

    Möglichkeit 1:
    Am Besten wäre es, wenn man (anstelle des "init") evtl. "last_match" parametrieren könnte, und die Logik dann initial mit dem letzten passenden Crontab-Eintrag aufgerufen würde!? Hier müsste der scheduler einmal alle Zeitspannen zwischen den Crontab-Einträgen und der aktuellen Zeit abprüfen. Gerade der scheduler ist ein wenig Voodoo - daher: aufwandstechnisch machbar?

    Möglichkeit 2:
    Ein Plugin wird nur mit "init" gestartet und trägt seine Crontrab-Einträge selber in den Scheduler ein. Damit könnte man Inkonsistenzen ausschließen, jedoch müsste das Plugin dann trotzdem mühevoll abfragen welcher der "letzte gültige Crontab" war.

    Grüße
    Robert

    #2
    Hallo Robert,

    ich hab da eine recht pragmatische Lösung.

    Um bei Deinem beispiel zu bleiben:
    Code:
    [tralala]
        name = 'tralala'
        filename = tralala.py
        crontab = 30,31,32 6 * 0,1,2,3,4 = day | 30,31,32 7 * 5,6 = day | 00,01,02 19 * * = night
    Den Status speichere ich in einem Item, nicht in der logic, beim Item hab ich cache = true (oder, fall sqlite benutzt wird, sqlite = init).

    Naja, und da bei mir sh.py immer läuft und nur bei Änderungen neu gestartet wird, gibt es nur kurze Pausen, in denen es nicht läuft. In den meisten Fällen greift die Initialisierung über den cache (also der alte Wert). Und wenn der Neustart zu einer crontab-Schaltzeit passiert, dann werden die ja noch 1-2 mal wiederholt und dann regelt sich das von selbst.

    Ist sicherlich nicht für alle Fälle möglich, aber es hat mir bisher über alle möglichen Hürden geholfen...

    Solltest Du mal eine allgemein gültige Lösung haben, wäre ich ach daran interessiert...

    Gruß, Waldemar
    OpenKNX www.openknx.de

    Kommentar

    Lädt...
    X