Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. setstate aus Funktion rufen [Gelöst]

    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

    setstate aus Funktion rufen [Gelöst]

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

      Ich sende an ein RFlink Objekt den Befehl setstate.
      Direkt gehts, verpackt in einer Funktion nicht.

      var ventilator = "rflink.0.channels.Kaku_1.SWITCH_1"

      function ventilatorEin() {
      setState(ventilator,true);
      }

      function ventilatorAus(){
      setState(ventilator,false);
      }

      function vein(){
      setTimeout(ventilatorEin,20);
      }

      //setState(ventilator,true); // ok
      //ventilatorEin() //geht nicht
      setTimeout(ventilatorEin,20); //ok
      //vein; //geht auch nicht !!!

      var t = setTimeout(ventilatorAus,2000); // ok.

      arteck OliverIO 2 Replies Last reply Reply Quote 0
      • arteck
        arteck Developer Most Active @WolfgangD last edited by

        @wolfgangd erstens LOG und CODE immer in Code Tag

        cecca142-89a4-4f05-8a04-e44ec9a194d0-grafik.png

        so ist es besser lesbar

        eine Script Sprache zu lernen heisst nicht alles austuprobieren.. obs geht ode rnicht.. soder sich mit der Syntax zu befassen und dessen Semantik

        setTimeout(function() {
                ventilatorAus();
            },  1000 * 20); // 20 sek
        
        WolfgangD 1 Reply Last reply Reply Quote 0
        • WolfgangD
          WolfgangD @arteck last edited by

          @arteck
          Danke für den Codeformathinweis.
          Mein Problem ist sehr einfach dazustellen:

          var ventilator = "rflink.0.channels.Kaku_1.SWITCH_1"
          
          setState(ventilator,true); // direkt im Programm aufgerufen geht.
          
          // aber, verpackt in ein function und diese dann aufrufen, geht nicht.
          function ventilatorEin() {
             setState(ventilator,true);
          }
          ventilatorEin();
          
          // Das war schon alles. .......................................
          
          // das Ausschalten geht immer,  in function verpackt. Direkt verzögert aufgerufen.
          var t = setTimeout(ventilatorAus,2000);
          
          
          // nun könnte man ja denken, verzögert gehts. (Ich hab mal unnötigerweise auch Deine Variante eingebaut!)
          
          function vein(){
            setTimeout(function(){
                ventilatorEin;
            },20);
          }
          vein();   // geht leider so in der function verpackt auch nicht.
          
          // direkt gerufen gehts wie erwartet. 
          setTimeout(ventilatorEin, 20);
          
          
          // async geht übrigens auch nicht. 
          
          
          bahnuhr paul53 3 Replies Last reply Reply Quote 0
          • bahnuhr
            bahnuhr Forum Testing Most Active @WolfgangD last edited by

            @wolfgangd

            @arteck hat doch geschrieben.

            Die Syntax von timeout ist falsch.
            Schreibe das richtig und es geht.

            1 Reply Last reply Reply Quote 0
            • bahnuhr
              bahnuhr Forum Testing Most Active last edited by

              Nachtrag:

              du schreibst:

              setState(ventilator,true); // direkt im Programm aufgerufen geht.
              

              aber dies müsste doch auch gehen:

              function ventilatorEin() {
                 setState(ventilator,true);
              }
              ventilatorEin();
              

              müsste gehen, verstehe nicht so ganz warum dies nicht gehen soll.
              Habs auch gerade nachgestellt, klappt einwandfrei !

              1 Reply Last reply Reply Quote 0
              • bahnuhr
                bahnuhr Forum Testing Most Active @WolfgangD last edited by

                @wolfgangd

                function vein(){
                  setTimeout(function(){
                      ventilatorEin();
                  },2000);
                }
                
                vein();
                

                Und dies klappt natürlich auch.
                Beachte: () hinter ventilatorEin
                und 20 sind 20 Millisekunden !

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

                  @wolfgangd
                  Fehler in Zeile 21: Es fehlen die Klammern des Funktionsaufrufs.

                  WolfgangD 1 Reply Last reply Reply Quote 0
                  • WolfgangD
                    WolfgangD @bahnuhr last edited by

                    @bahnuhr
                    Ja, rein theoretisch sollte das gehen.
                    Geht aber nicht. Du hast sicher keinen rflink Adapter?
                    Auch nicht mit ventilatorEin() geklammert. (ich hatte schon Hoffnung)
                    Und ja, 20 ms war gewollt.

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

                      @paul53
                      Danke. Leider auch nicht mit ventilatorEin() geklammert. (ich hatte schon Hoffnung)
                      Ich vermute irgendwas ist an dem Adapter rflink die Ursache.

                      bahnuhr T 2 Replies Last reply Reply Quote 0
                      • bahnuhr
                        bahnuhr Forum Testing Most Active @WolfgangD last edited by

                        @wolfgangd sagte in setstate aus Funktion rufen:

                        Du hast sicher keinen rflink Adapter?

                        Haste recht, hab ich nicht.

                        Dann liegt deine Lösung in dem DP oder dem Adapter.

                        Das Script funktioniert einwandfrei.

                        1 Reply Last reply Reply Quote 0
                        • T
                          ticaki Developer @WolfgangD last edited by

                          @wolfgangd sagte in setstate aus Funktion rufen:

                          @paul53
                          Danke. Leider auch nicht mit ventilatorEin() geklammert. (ich hatte schon Hoffnung)
                          Ich vermute irgendwas ist an dem Adapter rflink die Ursache.

                          Du schreibst oben und im Script das setState(dp, true) geht. Dann geht es. Da ist noch ein Fehler im Skript. Wenn ich all die Hilfen mit deinem Skript kombiniere komme ich dazu das du nach 2000 ms den Ventilator ein und ausschaltest.

                          const ventilator = "rflink.0.channels.Kaku_1.SWITCH_1"
                          
                          function ventilatorEin() {
                             setState(ventilator,true);
                          }
                          setTimeout(ventilatorEin,5000);
                          setTimeout(setState,15000, ventilator, false);
                          
                          // und natürlich geht auch async ;)
                          

                          Versuch mal damit - 5 Sekunden passiert nichts, dann ist der Ventilator für 10 Sekunden an. Das Skript muß laufen und darf in der Zeit nicht pausiert werden.

                          1 Reply Last reply Reply Quote 0
                          • OliverIO
                            OliverIO @WolfgangD last edited by OliverIO

                            @wolfgangd

                            also jemand hat hier geschrieben, das der syntax falsch ist.
                            das sehe ich nicht so. setTimeout nimmt als ersten Parameter einen Functionpointer oder Objektreferenz auf eine Funktion.
                            Diese kann man per anonyme Funktion adhoc erzeugen oder man definiert die Funktion separat und übergibt diese an die Funktion (das was du machst).
                            Wenn man eine anonyme Funktion adhoc erzeugt, dann bekommt diese Funktion den aktuellen Scope mit welcher notwendig ist um an die variable ventilator heranzu kommen.
                            wenn du die Funktionsreferenz mit übergibst, dann ist die variable ventialtor zum zeitpunkt der ausführung von setState nicht verfügbar, daher schlägt das fehl.

                            die Version von @ticaki funktioniert, weil über die weiteren parameter der ventilator parameter mitgegeben wird (das false dürfte überflüssig sein)

                            setTimeout(setState,15000, ventilator, false);
                            

                            das verhalten ist hier genauer beschrieben
                            https://developer.mozilla.org/en-US/docs/Web/API/setTimeout#the_this_problem

                            var ventilator = "rflink.0.channels.Kaku_1.SWITCH_1"
                             
                            setState(ventilator,true); // direkt im Programm aufgerufen geht.
                             
                            // aber, verpackt in ein function und diese dann aufrufen, geht nicht.
                            function ventilatorEin() {
                               setState(ventilator,true);
                            }
                            ventilatorEin();
                             
                            // Das war schon alles. .......................................
                             
                            // das Ausschalten geht immer,  in function verpackt. Direkt verzögert aufgerufen.
                            var t = setTimeout(ventilatorAus,2000);
                             
                             
                            // nun könnte man ja denken, verzögert gehts. (Ich hab mal unnötigerweise auch Deine Variante eingebaut!)
                             
                            function vein(){
                              setTimeout(function(){
                                  ventilatorEin;
                              },20);
                            }
                            vein();   // geht leider so in der function verpackt auch nicht.
                             
                            // direkt gerufen gehts wie erwartet. 
                            setTimeout(ventilatorEin, 20);
                             
                             
                            // async geht übrigens auch nicht. 
                             
                            
                            
                            T 1 Reply Last reply Reply Quote 0
                            • T
                              ticaki Developer @OliverIO last edited by

                              @oliverio sagte in setstate aus Funktion rufen:

                              Wenn ich deinen Beitrag richtig verstehe funktioniert das also nicht:

                              setTimeout(ventilatorEin,5000);
                              

                              Wohingegen sowas funktionieren würde

                              setTimeout(() => {ventilatorEin()},5000);
                              
                              OliverIO 1 Reply Last reply Reply Quote 0
                              • OliverIO
                                OliverIO @ticaki last edited by

                                @ticaki

                                beispiel 1 bedingt. wenn man an die funktion den aktuellen scope bindet, dann geht das auch

                                var ventilator = "rflink.0.channels.Kaku_1.SWITCH_1"
                                
                                var ventilatorEin = function() {
                                   setState(ventilator,true);
                                }.bind(this);
                                
                                setTimeout(ventilatorEin,5000);
                                
                                

                                ich persönlich finde die verwendung von bind allerdings sehr hässlich.
                                da finde ich die notation mit arrow viel besser, da sie auch keinen neuen scope erzeugt (also der unterschied zwischen verwendung mit function oder verwendung mit arrow.
                                siehe
                                https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions?retiredLocale=de
                                gleich am anfang
                                .

                                WolfgangD 1 Reply Last reply Reply Quote 0
                                • WolfgangD
                                  WolfgangD @OliverIO last edited by WolfgangD

                                  @oliverio sagte in setstate aus Funktion rufen:

                                  var ventilatorEin = function() {

                                  Diese Variante geht! Sehr schön. Die Möglichkeit kannte ich noch nicht.

                                  Ich habe von Euch viel über setTimeout() gelernt.
                                  Nur war das ja nur ein Versuch, weil VentilEin nicht wollte!

                                  Asche auf mein Haupt!
                                  Heute geht es mit der Klammer, s.u.

                                  ventilatorEin;  // geht nicht
                                  ventilatorEin(); // geht. 
                                  
                                  

                                  [Gelöst]

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

                                  Support us

                                  ioBroker
                                  Community Adapters
                                  Donate

                                  399
                                  Online

                                  31.8k
                                  Users

                                  80.0k
                                  Topics

                                  1.3m
                                  Posts

                                  6
                                  15
                                  812
                                  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