Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. on({id: ....mit timer kombiniert? Mehrfacher Aufruf??

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    on({id: ....mit timer kombiniert? Mehrfacher Aufruf??

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

      Liebe Leute,

      kurze Frage zur on-Funktion.

      Ich möchte bei einer Leistungsmessung unter einem gewissen Wert einen Aktor ausschalten. Nachdem es aber beim Einschalten erst ein paar Sekunden braucht, bis die Leistung über diesem Wert ist, kommt eine timer-Funktion dazu, die nach 30 Sekunden schaut, ob der Wert noch immer darunter liegt.

      Was passiert nun, wenn diese on-Funktion aber innerhalb dieser 30 Sekunden erneut ausgelöst wird? Rennt dann das Programm mehrmals parallel?
      Wenn ja, kann man das irgendwie abfangen, dass die on-Funktion für diese Dauer gesperrt wird?

      Liebe Grüße
      Tom

      Codierknecht arteck paul53 3 Replies Last reply Reply Quote 0
      • Codierknecht
        Codierknecht Developer Most Active @etv last edited by Codierknecht

        @etv
        Man stoppt bei Änderungen am DP zunächst den Timer, um ihn dann erneut zu starten.

        14c678b7-dc7f-4906-89ba-3b3d50d9f29e-image.png

        1 Reply Last reply Reply Quote 1
        • arteck
          arteck Developer Most Active @etv last edited by

          @etv das kannst du per se machen.. zuerst den laufenden stoppen dann neu starten

          etv 1 Reply Last reply Reply Quote 1
          • etv
            etv @arteck last edited by

            ...leider JEIN...

            Ich möchte eben den Timer NICHT stoppen, da ich ja das Gerät abdrehen will, wenn nach 30 Sekunden noch immer wenig Leistung gezogen wird.

            Wenn ich jedes mal den Timer lösche und neu starte wird das Gerät nie abgedreht, da es ja quasi fertig ist und "nie mehr" mehr Leistung ziehen wird....

            ABER, ich hab schon einen workaround gefunden

            on({id: id_Scooter_Power, valLt: 4}, function (obj) {
                watt = obj.state.val;
                if (debug_scooter) {log('- - - - - - - - - - Scooter Charger: Leistungsänderung unter 4 Watt, nämlich: '+ watt +' W')}
                on_off_time = obj.state.lc;
                jetzt = parseFloat(Date.now().toFixed());
                if (on_off_time < jetzt - 30000) {
                    if (debug_scooter) {log('- - - - - - - - - - Scooter Charger: UND - es ist länger als 30 Sekunden EIN, daher wird abgedreht')}
                    setState(id_Scooter_Switch, false)
                }
            });
            

            Ich löse es, indem ich die Zeit vom letzten State Change analysiere....

            Liebe Grüße
            Tom

            Codierknecht 1 Reply Last reply Reply Quote 0
            • Codierknecht
              Codierknecht Developer Most Active @etv last edited by Codierknecht

              @etv sagte in on({id: ....mit timer kombiniert? Mehrfacher Aufruf??:

              da ich ja das Gerät abdrehen will, wenn nach 30 Sekunden noch immer wenig Leistung gezogen wird.

              Du triggerst doch auf "ist kleiner als 4". Dann feuert der Trigger nur bei absteigender Flanke und das Einschalten spielt keine Rolle.

              Trotzdem arbeitet man bei timeouts üblicherweise immer so, dass ein ggf. noch laufender Timer zunächst gestoppt wird.
              Ich bin mir nicht sicher, aber ich denke dass sonst mehrere Instanzen parallel laufen.
              Das gibt früher oder später Ärger.

              etv 1 Reply Last reply Reply Quote 0
              • etv
                etv @Codierknecht last edited by

                @codierknecht, danke für den Timer-Tipp!

                Problem in diesem Fall ist, dass der Lader am Anfang unten herum dümpelt, bis er endlich mit dem Laden beginnt. Da grundelt er etwa 10-15 Sekunden eben unter 4 Watt herum (mal rauf, mal runter) und das hat mir den Scooter oft wieder abgedreht, bevor er noch zu laden begonnen hat....daher dieser nötige Hack.

                Liebe Grüße
                Tom

                Codierknecht 1 Reply Last reply Reply Quote 0
                • Codierknecht
                  Codierknecht Developer Most Active @etv last edited by

                  @etv sagte in on({id: ....mit timer kombiniert? Mehrfacher Aufruf??:

                  Da grundelt er etwa 10-15 Sekunden eben unter 4 Watt herum (mal rauf, mal runter)

                  OK, das klingt schwierig 😞

                  Codierknecht 1 Reply Last reply Reply Quote 0
                  • Codierknecht
                    Codierknecht Developer Most Active @Codierknecht last edited by

                    Alternative:

                    on({id: id_Scooter_Power, change: "ne"}, async function (obj) {
                      var watt = obj.state.val;
                      (function () {if (timeout) {clearTimeout(timeout); timeout = null;}})();
                      if (watt < 4) {
                      timeout = setTimeout(async function () {
                          setState(id_Scooter_Switch, false);
                        }, parseInt(30000));
                      }
                    });
                    

                    So reagiert der Trigger auf jede Änderung der Leistung.
                    Zuerst wird ein ggf. laufender Timer gelöscht.
                    Ist die Leistung < 4 W, starten die 30 Sekunden.
                    Ändert sich die Leistung innerhalb der 30 Sekunden, geht's von vorne los.
                    Ändert sich die Leistung beim Einschalten von z.B. 3 auf 100 W, wird ein ggf. laufender Timer gelöscht und nix passiert.

                    Einziges Problem hierbei: Wenn der Scooter nach dem Laden immer noch innerhalb von 30 Sekunden "rumdümpelt", wird er nie abgeschaltet 😉

                    1 Reply Last reply Reply Quote 0
                    • paul53
                      paul53 @etv last edited by

                      @etv sagte in: beim Einschalten erst ein paar Sekunden braucht, bis die Leistung über diesem Wert ist

                      on({id: id_Scooter_Power, valLt: 4, oldValGe: 4}, function (obj) {
                      
                      Codierknecht 1 Reply Last reply Reply Quote 0
                      • Codierknecht
                        Codierknecht Developer Most Active @paul53 last edited by

                        @paul53
                        Cool - das wandelnde Programmierhandbuch hat wieder zugeschlagen 😁

                        1 Reply Last reply Reply Quote 0
                        • First post
                          Last post

                        Support us

                        ioBroker
                        Community Adapters
                        Donate

                        610
                        Online

                        31.7k
                        Users

                        79.7k
                        Topics

                        1.3m
                        Posts

                        4
                        10
                        337
                        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