Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Gelöst: Verzögerungszeit bei der Ausführung von Anweisungen

    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

    Gelöst: Verzögerungszeit bei der Ausführung von Anweisungen

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

      Hallo und einen schönen Sonntag,

      ich bin neu hier und möchte mich zunächst einmal an all diejenigen bedanken, die ioBroker realisiert haben. Ich bin kein Programmierer, schon etwas älter und war schon etwas frustriert, als ich im Homematic-Forum die Abkündigung von CCU.IO und den diversen AddOns lesen musste – gerade, als ich eine funktionierende Lösung mit einem Raspi auf die Beine gestellt hatte.

      OK – dann also ioBoker 😉

      Mit Vis habe ich schon die Visualisierung meines Reihenhauses einigermaßen hinbekommen, nun soll es an die Scripte gehen. Und genau hier habe ich ein Problem, dass ich nicht lösen kann:

      Ich habe ein billiges Tablet für die Visualisierung, das dauerhaft mit dem Ladegerät verbunden ist.

      Da alle Tablets, die ich kenne, den Bildschirm aktivieren, wenn mindestens der Ladestrom eingeschaltet wird, verwende ich einen Schaltaktor, der den Ladestrom für eine Sekunde einschaltet, wenn ein bestimmter Bewegungmelder Bewegung erkennt.

      DAS habe ich auch schon hinbekommen:

      on("hm-rpc.0.KEQ1234567.1.MOTION", function(obj) {
          if (obj.newState.val === true) {
              setState('hm-rpc.0.MEQ1234567.1.ON_TIME', 2 );
              setState("hm-rpc.0.MEQ1234567.1.STATE",true);
          }
      });
      

      Das ist ja auch kein Hexenwerk und funktioniert soweit einwandfrei - jedenfalls solange der Schaltaktor vorher AUS war !

      Ich möchte nun diese Funktion aber auch in der Zeit nutzen, in der ich das Tablet zum tatsächlichen Laden mit Strom versorge, der Schaltaktor also den Zustand AN hat.

      Mit einem CCU-Programm hatte ich das gelöst, indem ich -wenn der Schaltaktor EIN ist- erst die Anweisung „Schaltaktor AUS“ und dann mit einer Verzögerungszeit von 2 Sekunden, diesen wieder eingeschaltet habe.

      Das würde ich nun gern in einem ioBroker-Script realisieren.

      Als Anfänger hat mich auch eine Suche nicht weitergebracht, da ich die Lösung wahrscheinlich nicht mal erkenne, wenn ich sie gefunden habe.

      Vielen Dank schon mal und Grüße aus dem Weserbergland - Ralf

      1 Reply Last reply Reply Quote 0
      • Bluefox
        Bluefox last edited by

        on("hm-rpc.0.KEQ1234567.1.MOTION", function(obj) {
            if (obj.newState.val === true) {
                // falls schon eingeschaltet
                if (getState("hm-rpc.0.MEQ1234567.1.STATE").val) {
                     // schalte aus
                     setState("hm-rpc.0.MEQ1234567.1.STATE",false);
                     // Timer für 2 sekunden
                     setTimeout(function (){
                         // schalte an
                         setState("hm-rpc.0.MEQ1234567.1.STATE",true);
                     }, 2000);
                } else { 
                    // schalte sofort an
                    setState('hm-rpc.0.MEQ1234567.1.ON_TIME', 2 );
                    setState("hm-rpc.0.MEQ1234567.1.STATE",true);
                }
            }
        });
        
        

        5076_20180203_122044.jpg

        1 Reply Last reply Reply Quote 0
        • R
          Ralf H. last edited by

          Hallo Bluefox,

          vielen Dank, das Script funktioniert nun prima.

          -> setTimeout war die Lösung, die ich nicht erkannt hatte!

          Damit nun der vorige Ladezustand wieder hergestellt wird, habe ich die erste Anweisung für die Einschaltdauer in Zeile 10 gelöscht.

          Hintergrund: Das Display soll auch innerhalb des Zeitraums aufgeweckt werden, in dem das Tablet ohnehin geladen wird.

          In der Zwischenzeit ist mir allerdings auch noch eine Alternative eingefallen, die ich aber auch noch nicht ganz umsetzen kann:

          Schritt 1: aktuellen Stand des Schaltaktors abfragen und in einer Variable speichern

          Schritt 2: Statur des Schaltaktors sofort = AUS

          Schritt 2: Status des Schaltaktors nach einer Sekunde = EIN

          Ergebnis: Das Display geht an.

          Schritt 3: den Status des Schaltaktors wieder mit dem Wert der Variable aus Schritt 1 setzen.

          Ergebnis: der alte Status quo ist wieder hergestellt.

          Wäre das möglicherweise eine elegantere Lösung?

          Kommt die CCU2 da auch mit, oder muss dem Schaltaktor Zeit gegeben werden, bis er die nächste Anweisung entgegen und ausführen kann?

          Ralf

          1 Reply Last reply Reply Quote 0
          • P
            pix last edited by

            Hallo Ralf H.
            @Ralf H.:

            In der Zwischenzeit ist mir allerdings auch noch eine Alternative eingefallen, die ich aber auch noch nicht ganz umsetzen kann: `
            dann nutze lieber das Skript von Bluefox. Das ist kurz und gut und funktioniert. Hatte vor Monaten selbst so ein Skript laufen (bevor ich auf iPad mit Magnetcover umgestiegen bin).

            Da es analog zu ONTIME keinen Datenpunkt OFFTIME gibt, der für eine bestimmte Zeit einen Aktor ausschaltet, muss man eben so vorgehen. Variablen machen das komplizierter und soviel Code spart das in diesem Fall auch nicht.

            geht aber auch so:

            on("hm-rpc.0.KEQ1234567.1.MOTION", function(obj) {
                if (obj.newState.val === true) {
                    // Aktorstatus in Variable schreiben
                    var ur_status_aktor = getState("hm-rpc.0.MEQ1234567.1.STATE").val;
                    // schalte sofort aus
                    setState("hm-rpc.0.MEQ1234567.1.STATE",false);
                    // Timer für 2 sekunden
                    setTimeout(function (){
                        // schalte an
                        setState("hm-rpc.0.MEQ1234567.1.STATE",true);
                    }, 2000);
                    setState("hm-rpc.0.MEQ1234567.1.STATE",ur_status_aktor);
                }
            });
            
            

            Gruß

            Pix

            1 Reply Last reply Reply Quote 0
            • R
              Ralf H. last edited by

              Hi Pix,

              danke für die Hinweise und den Alternativcode.

              Für mich ist dieses Austesten an einem eigentlich banalen Problem die beste Möglichkeit, die Möglichkeiten der Scripte zu verstehen.

              Grüße Ralf

              1 Reply Last reply Reply Quote 0
              • P
                pix last edited by

                @pix:

                Da es analog zu ONTIME keinen Datenpunkt OFFTIME gibt, der für eine bestimmte Zeit einen Aktor ausschaltet, … `
                Jetzt (seit 0.5.8) haben wir ja https://github.com/iobroker/ioBroker.javascript/blob/master/README.md#setstatedelayed

                Vielen Dank an Bluefox.

                Gruß,

                Pix

                1 Reply Last reply Reply Quote 0
                • Bluefox
                  Bluefox last edited by

                  Und das konnte man dann so umschreiben:

                  on("hm-rpc.0.KEQ1234567.1.MOTION", function(obj) {
                      if (obj.newState.val === true) {
                          // falls schon eingeschaltet
                          if (getState("hm-rpc.0.MEQ1234567.1.STATE").val) {
                               // schalte aus
                               setState("hm-rpc.0.MEQ1234567.1.STATE",false);
                               // Timer für 2 sekunden
                              setStateDelayed("hm-rpc.0.MEQ1234567.1.STATE",true, 2000);
                          } else { 
                              // schalte sofort an
                              setState("hm-rpc.0.MEQ1234567.1.STATE",true);
                              setStateDelayed("hm-rpc.0.MEQ1234567.1.STATE",false, 2000);
                          }
                      }
                  });
                  
                  1 Reply Last reply Reply Quote 0
                  • R
                    Ralf H. last edited by

                    @Bluefox:

                    Und das konnte man dann so umschreiben: `
                    … und hätte es dann (zumindest für mich) auch gleich noch lesbarer und verständlicher, soweit es die "Verwandschaft" zwischen setState und setStateDelayed betrifft.

                    Mann dankt - Ralf

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

                    Support us

                    ioBroker
                    Community Adapters
                    Donate

                    829
                    Online

                    31.9k
                    Users

                    80.2k
                    Topics

                    1.3m
                    Posts

                    3
                    8
                    2444
                    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