Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. [Gelöst] On() in schleife

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    17
    1
    2.9k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    1.1k

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.4k

[Gelöst] On() in schleife

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
14 Beiträge 6 Kommentatoren 1.0k Aufrufe
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • M Offline
    M Offline
    malc
    schrieb am zuletzt editiert von
    #1

    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

    Fan von ioBroker!

    <size size="50">und falls ich eine Frage stelle die irgendwo schon mal beantwortet wurde: "Ja, Suchfunktion genutzt, aber keine Lösung gefunden / nicht die richtigen Suchbegriffe gewusst."

    …</size>

    1 Antwort Letzte Antwort
    0
    • foxriver76F Offline
      foxriver76F Offline
      foxriver76
      Developer
      schrieb am zuletzt editiert von
      #2

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

      beste Grüße

      Fox

      Videotutorials & mehr

      Hier könnt ihr mich unterstützen.

      1 Antwort Letzte Antwort
      0
      • apollon77A Offline
        apollon77A Offline
        apollon77
        schrieb am zuletzt editiert von
        #3

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

        Beitrag hat geholfen? Votet rechts unten im Beitrag :-) https://paypal.me/Apollon77 / https://github.com/sponsors/Apollon77

        • Debug-Log für Instanz einschalten? Admin -> Instanzen -> Expertenmodus -> Instanz aufklappen - Loglevel ändern
        • Logfiles auf Platte /opt/iobroker/log/… nutzen, Admin schneidet Zeilen ab
        1 Antwort Letzte Antwort
        0
        • D Offline
          D Offline
          dwm
          schrieb am zuletzt editiert von
          #4

          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 Antwort Letzte Antwort
          0
          • M Offline
            M Offline
            malc
            schrieb am zuletzt editiert von
            #5

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

            Fan von ioBroker!

            <size size="50">und falls ich eine Frage stelle die irgendwo schon mal beantwortet wurde: "Ja, Suchfunktion genutzt, aber keine Lösung gefunden / nicht die richtigen Suchbegriffe gewusst."

            …</size>

            1 Antwort Letzte Antwort
            0
            • D Offline
              D Offline
              dwm
              schrieb am zuletzt editiert von
              #6

              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 Antwort Letzte Antwort
              0
              • M Offline
                M Offline
                malc
                schrieb am zuletzt editiert von
                #7

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

                Fan von ioBroker!

                <size size="50">und falls ich eine Frage stelle die irgendwo schon mal beantwortet wurde: "Ja, Suchfunktion genutzt, aber keine Lösung gefunden / nicht die richtigen Suchbegriffe gewusst."

                …</size>

                1 Antwort Letzte Antwort
                0
                • D Offline
                  D Offline
                  dwm
                  schrieb am zuletzt editiert von
                  #8

                  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 Antwort Letzte Antwort
                  0
                  • AlCalzoneA Offline
                    AlCalzoneA Offline
                    AlCalzone
                    Developer
                    schrieb am zuletzt editiert von
                    #9

                    @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) );
                    }
                    
                    

                    Warum `sudo` böse ist: https://forum.iobroker.net/post/17109

                    1 Antwort Letzte Antwort
                    0
                    • paul53P Offline
                      paul53P Offline
                      paul53
                      schrieb am zuletzt editiert von
                      #10

                      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)));
                      }
                      

                      Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                      Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                      1 Antwort Letzte Antwort
                      0
                      • AlCalzoneA Offline
                        AlCalzoneA Offline
                        AlCalzone
                        Developer
                        schrieb am zuletzt editiert von
                        #11

                        @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));
                        });
                        

                        Warum `sudo` böse ist: https://forum.iobroker.net/post/17109

                        1 Antwort Letzte Antwort
                        0
                        • paul53P Offline
                          paul53P Offline
                          paul53
                          schrieb am zuletzt editiert von
                          #12

                          @AlCalzone:

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

                          Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                          Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                          1 Antwort Letzte Antwort
                          0
                          • AlCalzoneA Offline
                            AlCalzoneA Offline
                            AlCalzone
                            Developer
                            schrieb am zuletzt editiert von
                            #13

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

                            Warum `sudo` böse ist: https://forum.iobroker.net/post/17109

                            1 Antwort Letzte Antwort
                            0
                            • M Offline
                              M Offline
                              malc
                              schrieb am zuletzt editiert von
                              #14

                              @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!

                              Fan von ioBroker!

                              <size size="50">und falls ich eine Frage stelle die irgendwo schon mal beantwortet wurde: "Ja, Suchfunktion genutzt, aber keine Lösung gefunden / nicht die richtigen Suchbegriffe gewusst."

                              …</size>

                              1 Antwort Letzte Antwort
                              0
                              Antworten
                              • In einem neuen Thema antworten
                              Anmelden zum Antworten
                              • Älteste zuerst
                              • Neuste zuerst
                              • Meiste Stimmen


                              Support us

                              ioBroker
                              Community Adapters
                              Donate

                              648

                              Online

                              32.6k

                              Benutzer

                              82.3k

                              Themen

                              1.3m

                              Beiträge
                              Community
                              Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                              ioBroker Community 2014-2025
                              logo
                              • Anmelden

                              • Du hast noch kein Konto? Registrieren

                              • Anmelden oder registrieren, um zu suchen
                              • Erster Beitrag
                                Letzter Beitrag
                              0
                              • Home
                              • Aktuell
                              • Tags
                              • Ungelesen 0
                              • Kategorien
                              • Unreplied
                              • Beliebt
                              • GitHub
                              • Docu
                              • Hilfe