Ankündigung

Einklappen
Keine Ankündigung bisher.

Triggern bei Datum und Uhrzeit: Makro dhtime()

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

    Triggern bei Datum und Uhrzeit: Makro dhtime()

    Hallo zusammen,

    Aufgabenstellung war, zu einem dedizierten Zeitpunkt, der im UI via Datums- und Uhrzeit-Eingabe angegeben wird, eine Aktion zu starten.

    Mein erster Versuch mit delay() war vollkommen unbrauchbar. delay() ist bereits nach einigen Minuten relativ ungenau und weicht nach einigen Stunden um Minuten vom Zielzeitpunkt ab. Das hatte nichts mehr mit dem eingegebenen Wunschtermin zu tun.

    Daher griff ich auf htime() zurück. Hier stellte ich mir vor, eine "Funktion" zu schreibn, die ähnlich wie htime() aussieht und arbeitet, das heißt, ein Ereignis zum besagten Zeitpunkt erzeugt (Änderung auf 1b01, dann zurück auf 0b01).
    Das Datum liegt aus dem UI kommend als YYYY-MM-DD, die Uhrzeit als HH:MI:SS vor.

    Das Ergebnis ist

    Code:
    :begin dhtime(DatumStr, UhrzeitStr)
    
    :var ereignis@
    ereignis@ = 0b01
    
    if htime(convert(split(UhrzeitStr, 0u16, 1u16), 0u08), convert(split(UhrzeitStr, 3u16, 4u16), 0u08), convert(split(UhrzeitStr, 6u16, 7u16), 0u08)) then {
        if DatumStr == split(localtimeconvert(utctime()), 0u16, 9u16) then ereignis@ = 1b01; endif;
    } endif;
    
    if delay(ereignis@ == 1b01, 10u64) then ereignis@ = 0b01; endif;
    
    :return ereignis@
    :end​
    Es wird an jedem Tag zur gegegeben Uhrzeit geprüft, ob es auch der richtige Tag ist, und falls ja, das Ereignis 1b01 via return geliefert, das nach einer Hunderstel (delay(..., 10u64)) wieder auf 0b01 zurückgesetzt wird.

    Das funktioniert.

    Mich interessiert, ob es bessere Lösungen gibt.

    Mich wurmt ein wenig, dass htime() sinnloserweise jeden Tag zuschlägt, obwohl das Datum bereits lange zurückliegen kann. Und das Erzeugen des Ereignisses mit delay() wirkt auf mich unelegant.

    Viele Grüße
    KNX, openHAB 4.3, EibPC²

    #2
    du kannst dir delay sparen, wenn du mit cstime die Dauer 1 sec begrenzt...
    Code:
    // Viertelstundentakt
    // FUNKTIONIERT, keine Fehlauslösung bei reboot
    zeit_viertelstundentakt=(mtime(00,00) or mtime(15,00) or mtime(30,00) or mtime(45,00)) and !cstime(1)
    ​

    EPIX
    ...und möge der Saft mit euch sein...
    Getippt von meinen Zeigefingern auf einer QWERTZ Tastatur

    Kommentar


      #3
      Wenn ich deinen Vorschlag richtig verstehe, wäre es sowas wie
      Code:
      if htime() ... then
          ereignis@ = DatumStr == split(localtimeconvert(utctime()), 0u16, 9u16) and !cstime(1);
      richtig?

      Dann müsste ich die Sekunden aus der Uhrzeit übernehmen, da die, anders als in deinem Code, ungleich 0 sein können. Und sollte jemand die 59. Sekunde angegeben haben, also etwa 11:59:59, geht das schief, da cstime(60) weder möglich ist noch Sinn ergäbe.

      KNX, openHAB 4.3, EibPC²

      Kommentar


        #4
        oder die utc-Zeit, die ist ja in 0,001 sec.
        Aber brauchst du das so genau?

        Eine andere Möglichkeit wäre die gewünschte Zeit auf utc-umzurechnen und dann mit der akteullen utc-Zeit vergleichen...

        Wenn es aber so funktioniert wie du es gepostet hat, dann ist es ja OK. NAchdem mein eibPC mit >80% ausgelastet war habe ich die Zeitglieder möglichst vermieden weil bei jedem delay, after,... ein Timer gestartet wird.
        EPIX
        ...und möge der Saft mit euch sein...
        Getippt von meinen Zeigefingern auf einer QWERTZ Tastatur

        Kommentar


          #5
          Üblicherweise ist eine Funktion wie utctime(), die die Milliseksunden seit 1970 liefert, billig, da dieser Wert mittels Hardware geliefert wird.

          Hier brauche ich keine Millisekunden, weil die angegebene Zeit nur Sekunden-genau ist. Allerdings ist localtimeconvert(utctime()) die einzige Funktion, die ich gefunden habe, die mir das Datum von "jetzt" als String liefert.

          Deine Lösung mit mtime() und cstime() braucht bzw. erzeugt bereits 5 Timer. Das ist, wenn Timer ein Flaschenhals sind, nicht ideal.

          Leider kämpfe ich mit ähnlichen Schwierigkeiten. Da werden tolle Funktionen geliefert, sie sich gut verkaufen lassen, Grafiken, FTP, weiß der Kuckuck. Aber an der Basis muss man kämpfen, wie in deinem Fall, dass man keinen Zyklustimer mit einem Startzeitpunkt kombinieren kann, oder bei mir, dass ein Stringvergleich < oder > nicht möglich ist.
          So viele wenig intuitive Designentscheidungen ("warum zum Henker...?") , so oft ein wenig zu kurz gesprungen ("hätten sie nicht noch...").
          KNX, openHAB 4.3, EibPC²

          Kommentar


            #6
            Für den Anwendungsfall haben wir auf der LuB die neue timeswitch-Funktion + Visu-Element gezeigt. Das ist eine über die Visu (+ per Programm vorbelegbar) konfigurierbare Schaltuhr, die auch an ganz bestimmten Tagen zu bestimmten Uhrzeiten schalten kann.

            Wird in Kürze verfügbar sein.

            Kommentar


              #7
              Tokamak ein Leidgenosse....
              EPIX
              ...und möge der Saft mit euch sein...
              Getippt von meinen Zeigefingern auf einer QWERTZ Tastatur

              Kommentar

              Lädt...
              X