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.
    • 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

                          887
                          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