Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. [Gelöst] On() in schleife

    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] On() in schleife

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

      Hallo!

      Ja, ich bin noch am Anfang 🙂

      Wenn ich ich eine Subcription definiere:

      on ('sonoff.0.Aqua1.POWER1', function(obj) {ActorStateChange(obj,  'Aqua.Aqua1.POWER1.State'  );});
      on ('sonoff.0.Aqua2.POWER2', function(obj) {ActorStateChange(obj,  'Aqua.Aqua1.POWER2.State'  );});
      
      

      klappt das super, doch habe ich das gern dynamisch ( Schon jetzt sind 30 Ports) und möchte das in einer Schleife definieren:

         for a 1 to 10......
        	var tSrc = "";
        	var tTrg = "";
      
        	tSrc = "sonoff.0.Aqua" + a + ".POWER" + b ;
        	tTrg = "'Aqua.Aqua" + a + ".POWER" + b ".State' 
      
        	on (tSrc, function(obj) {ActorStateChange(obj,  tTrg   );});
         }
      
      

      wird meine function ActorStateChange immer mit dem letzten Wert von tTrg aufgerufen. Das verstehe ich im Prinzip auch da es ein Zeiger ist.

      Nur wie kann ich den Funktionswert dynamisch übergeben?

      Malc

      1 Reply Last reply Reply Quote 0
      • foxriver76
        foxriver76 Developer last edited by

        Du kannst als Trigger ein Array übergeben. Ob das mit der For-Schleife so funktioniert ist fraglich, mindestens unübersichtlich.

        beste Grüße

        Fox

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

          Hilft nicht.

          Das ganze ist in der asynchronität von Javascriptz begründet. Die schleife läuft durch und am Ende steht nun mal in der variable die im Trigger genutzt wird der letze Wert.

          Du kannst versuchen die beiden "var" durch "let" auszutauschen (nodejs 6+ vorausgesetzt).

          1 Reply Last reply Reply Quote 0
          • D
            dwm last edited by

            Servus,

            Du musst im Handler die obj.id abfragen und daraus das tTrg bauen…

            
               for a 1 to 10......
              	var tSrc = "";	
              	tSrc = "sonoff.0.Aqua" + a + ".POWER" + b ;
            
              	on (tSrc, function(obj) {ActorStateChange(obj, 'Aqua.'+obj.id.replace(/sonoff.0.(\w+)/,'$1')+'.State'   );});
               }
            
            

            Im Grunde würd ich den tTrg Parameter glaub ich rauswerfen und aus obj.id bauen, weil redundant … das regex kriegt man auch sicher eleganter hin.

            CU

            1 Reply Last reply Reply Quote 0
            • M
              malc last edited by

              @dwm:

              Servus,

              Du musst im Handler die obj.id abfragen und daraus das tTrg bauen…

              
                 for a 1 to 10......
                	var tSrc = "";	
                	tSrc = "sonoff.0.Aqua" + a + ".POWER" + b ;
              
                	on (tSrc, function(obj) {ActorStateChange(obj, 'Aqua.'+obj.id.replace(/sonoff.0.(\w+)/,'$1')+'.State'   );});
                 }
              
              

              Im Grunde würd ich den tTrg Parameter glaub ich rauswerfen und aus obj.id bauen, weil redundant … das regex kriegt man auch sicher eleganter hin.

              CU `
              Ne, sind nicht gleich. Sieht aber fast so aus 🙂

              Das eine ist die SrcID vom Gerät auf das ich reagiere, tScc ist an ganz anderer stelle in dem ich den Wert spiegel bzw. weiter bearbeite. Über das Objekt komme ich da nicht ran, ganz anderer Zweig.

              1 Reply Last reply Reply Quote 0
              • D
                dwm last edited by

                Deswegen steht ja auch

                'Aqua.'+obj.id.replace(/sonoff.0.(\w+)/,'$1')+'.State'
                

                drin, der das eine in das andere umschnurgelt 🙂

                Testcode:

                var id = 'sonoff.0.Aqua1.POWER1';
                
                console.log ('Aqua.'+id.replace(/sonoff.0.(\w+)/,'$1')+'.State');
                
                
                1 Reply Last reply Reply Quote 0
                • M
                  malc last edited by

                  @dwm:

                  Deswegen steht ja auch

                  'Aqua.'+obj.id.replace(/sonoff.0.(\w+)/,'$1')+'.State'
                  

                  drin, der das eine in das andere umschnurgelt 🙂

                  Testcode:

                  var id = 'sonoff.0.Aqua1.POWER1';
                  
                  console.log ('Aqua.'+id.replace(/sonoff.0.(\w+)/,'$1')+'.State');
                  
                  ```` `  
                  

                  Ja, das passt für dieses Beispiel. Da hast du recht. Aber es war nur ein Beispiel. ich hätte das mit einem völlig anderen Ziel schreiben sollen. Das Ziel ist absolut variabel und nicht aus der Quelle ableitbar. Aber dein Ansatz ist für den ableitbaren Fall sehr gut. Nur löst es mein Problem nicht. Ich werde mir das mal mit dem "let" ansehen.

                  1 Reply Last reply Reply Quote 0
                  • D
                    dwm last edited by

                    let bringt Dich da nicht weiter;)

                    Bei absolut variablem Ziel könnte entweder wirklich ein array helfen, mit dem Du die Zuweisung obj.id => target.id definierst, oder

                    Du benutzt bind … das dann zwar grundsätzlich für jeden Schleifendurchlauf einen "Klon" der Funktion für die jeweiligen Parameter definiert aber

                    halt die Parameter festtackert...

                       for a 1 to 10......
                      	var tSrc = "";
                      	var tTrg = "";
                    
                      	tSrc = "sonoff.0.Aqua" + a + ".POWER" + b ;
                      	tTrg = "'Aqua.Aqua" + a + ".POWER" + b ".State' 
                    
                      	on (tSrc, function(obj) {ActorStateChange.bind(obj,  tTrg   );});
                       }
                    
                    
                    1 Reply Last reply Reply Quote 0
                    • AlCalzone
                      AlCalzone Developer last edited by

                      @dwm:

                      let bringt Dich da nicht weiter;) `
                      Wenn ich das beim Lesen richtig gesehen habe, bringt let dich hier weiter. var ist nicht blockbezogen, d.h. es macht keinen Unterschied ob du die Variablen vor oder nach der Schleife definierst. Zum Zeitpunkt des callback-Aufrufs haben sie den letzten zugewiesenen Wert (a = 10).

                      let bzw const (da keine Änderung in der Schleife stattfindet) ist blockbezogen (und bei Schleifen sogar Loop-bezogen). Du hast sozusagen eine eigene Kopie der Variable pro Schleifendurchlauf. So müsste es funktionieren:

                      for (let a = 1; a <= 10; a++) {
                        	const tSrc =  "sonoff.0.Aqua" + a + ".POWER" + b;
                        	const tTrg = "Aqua.Aqua" + a + ".POWER" + b ".State" ;
                      
                        	on(tSrc, (obj) => ActorStateChange(obj, tTrg) );
                      }
                      
                      
                      1 Reply Last reply Reply Quote 0
                      • paul53
                        paul53 last edited by

                        Es sollen 10 Subscriptions on() erzeugt werden. Versuche es mal so:

                        const ons = [];
                        
                        for (let a = 1; a <= 10; a++) {
                          	const tSrc = "sonoff.0.Aqua" + a + ".POWER" + b;
                          	const tTrg = "Aqua.Aqua" + a + ".POWER" + b + ".State" ;
                        
                          	ons.push(on(tSrc, (obj) => ActorStateChange(obj, tTrg)));
                        }
                        
                        1 Reply Last reply Reply Quote 0
                        • AlCalzone
                          AlCalzone Developer last edited by

                          @paul53:

                          Es sollen 10 Subscriptions on() erzeugt werden. Versuche es mal so: `
                          oder ganz fancy (kann sein dass Node6 benötigt wird:

                          const subscriptions = Array(10).fill().map((_, i) => i + 1).map(a => {
                          	const tSrc = `sonoff.0.Aqua${a}.POWER${b}`;
                          	const tTrg = `Aqua.Aqua${a}.POWER${b}.State`;
                          	return on(tSrc, (obj) => ActorStateChange(obj, tTrg));
                          });
                          
                          1 Reply Last reply Reply Quote 0
                          • paul53
                            paul53 last edited by

                            @AlCalzone:

                            oder ganz fancy `
                            Das Ergebnis sollte das gleiche sein, nur versteht das kein Einsteiger (wie ich).

                            1 Reply Last reply Reply Quote 0
                            • AlCalzone
                              AlCalzone Developer last edited by

                              @paul53:

                              Das Ergebnis sollte das gleiche sein, nur versteht das kein Einsteiger (wie ich). `

                              Zugegeben, bis "map(a =>" musste ich selbst nachschauen :oops: Habe mir nur gedacht, anstatt in einer Schleife in ein Array zu pushen, müsste es auch per map() gehen.

                              1 Reply Last reply Reply Quote 0
                              • M
                                malc last edited by

                                @AlCalzone:

                                Wenn ich das beim Lesen richtig gesehen habe, bringt let dich hier weiter. var ist nicht blockbezogen, d.h. es macht keinen Unterschied

                                const tSrc = "sonoff.0.Aqua" + a + ".POWER" + b;

                                const tTrg = "Aqua.Aqua" + a + ".POWER" + b ".State" ; `

                                Das funktioniert einwandfrei! Letztendlich aus var -> const.

                                Vielen Dank!

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

                                Support us

                                ioBroker
                                Community Adapters
                                Donate

                                874
                                Online

                                31.9k
                                Users

                                80.2k
                                Topics

                                1.3m
                                Posts

                                6
                                14
                                892
                                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