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

      @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

                        890
                        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