Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. persist timer

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    persist timer

    This topic has been deleted. Only users with topic management privileges can see it.
    • M
      Marty56 last edited by

      Hallo,

      mit setStateDelayed(id,value,delay) kann man ja eine verzögerte Veränderung eines Datenpunkts relativ zur Ist Zeit programmieren.
      Wenn man jetzt aber iobroker neu startet, wird dieser Timer vergessen.

      Hat jemand schon eine Lösung, wie man diesen Timer wiederherstellen kann?
      Es sollte so sein, dass dieser wiederhergestellte Timer genau am selben Zeitpunkt triggert, wie vorher. Also nicht relativ zum aktuellen Zeitpunkt. Und wenn dieser Zeitpunkt abgelaufen ist, dann sollte kein Trigger mehr aufgerufen werden.

      Der derzeitige Workaround, den ich benutze, ist, dass ich mir aus der Verzögerungen den Zeitpunkt des Triggers berechne und dann mit der neuen Funktion "scheduleById" einen Trigger auslöse. Das erscheint mir aber ziemlich umständlich. Am Liebsten hätte ich eine Funktion, die
      setStateDelay_pers(id,value,delay),
      clearStateDelayed_pers(id) und eine Funktion
      setStateDelayed_restore(id) die ich aufrufe, wenn das Script neu gestartet wird.

      T Rene55 2 Replies Last reply Reply Quote 0
      • T
        ticaki Developer @Marty56 last edited by

        @marty56

        Ich brauche das zwar nicht, weil ich selbst die delays berechne, selbst schalte und beim Neustart einen funktionierenden Default habe. Jedoch wenn ich das machen würde, würde ich mir ein Json in einen State schreiben mit id und endzeitpunkt und beim Start des Skripts das einlesen und ausführen. Natürlich im laufenden Betrieb immer wieder aktualisieren.

        1 Reply Last reply Reply Quote 0
        • Rene55
          Rene55 @Marty56 last edited by

          @marty56 sagte in persist timer:

          setStateDelayed(

          Ich denke, dass mit diesem Kommando etwas anderes bezweckt wird, nämlich das spätere Schreiben eines Datenpunktes und nicht das zeitlich gesteuerte. Oder liege ich da falsch?

          M 1 Reply Last reply Reply Quote 0
          • M
            Marty56 @Rene55 last edited by Marty56

            Ich habe mir jetzt folgendes gebastelt.
            Damit übersteht das verzögerte Schalten auch nach Neutstart von ioBroker

            function clearStateDelayed_persist(id) {
                clearStateDelayed(id)
                setState(id+"_timer",JSON.stringify([]))
            }
            
            function setStateDelayed_persist(id,val,delay,clearRunning) {
                setStateDelayed(id,val,delay,clearRunning)
                var timer = getStateDelayed(id)
                var persist = []
                for (var i = 0;i < timer.length;i++) {
                    var timestamp = new Date(new Date().getTime() + timer[i].delay)
                    var date = timestamp.toISOString()
                    persist.push({"date":date,"val":val,"clearRunning":clearRunning})
                }
                setState(id+"_timer",JSON.stringify(persist))   
            }
            
            function restore_setStateDelayed(id) {
                clearStateDelayed(id)
                var timer = JSON.parse(get(id + "_timer"))
                for (var i = 0;i < timer.length;i++) {
                    var persist = timer[i]
                    var delay = new Date(persist.date).getTime() - new Date().getTime()
                    if (delay > 0) setStateDelayed(id,persist.val,delay,persist.clearRunning)
                }
            }
            
            /*
            Damit das Bespiel läuft muss
            der Datenpunkt 
            1. '0_userdata.0.Test.test_boolean' und 
            2. '0_userdata.0.Test.test_boolean_timer' 
            
            vorhanden sein.
            
            */
            var id = '0_userdata.0.Test.test_boolean'
            setStateDelayed_persist(id,false,2000)
            setStateDelayed_persist(id,false,3000,false)
            //clearStateDelayed_persist(id)
            setTimeout(function(){restore_setStateDelayed(id)},1000)
            
            on({ id:  id, change: "any"}, function (obj) { 
                log("getriggert")
            })
            
            1 Reply Last reply Reply Quote 0
            • First post
              Last post

            Support us

            ioBroker
            Community Adapters
            Donate

            951
            Online

            31.8k
            Users

            80.0k
            Topics

            1.3m
            Posts

            javascript
            3
            4
            177
            Loading More Posts
            • Oldest to Newest
            • Newest to Oldest
            • Most Votes
            Reply
            • Reply as topic
            Log in to reply
            Community
            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
            The ioBroker Community 2014-2023
            logo