Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Script funktioniert nur bedingt

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Script funktioniert nur bedingt

    This topic has been deleted. Only users with topic management privileges can see it.
    • Codierknecht
      Codierknecht Developer Most Active @Manolo last edited by

      @manolo
      Eine Schleifenvaraiable (i) darfst Du nicht innerhalb wiederverwenden.
      Nenne die in der inneren Schleife z.B. j.

      M 1 Reply Last reply Reply Quote 0
      • M
        Manolo @Codierknecht last edited by Manolo

        @codierknecht
        Die innere Schleife war ausgeklammert, brauche ich für die Funktion auch eigentlich nicht.
        Sorry, dass ich das Script nicht aufgeräumt habe.
        Habe es nun aber korrigiert, Ergebnis bleibt das Selbe.

        Es geht um die zweite If-Bedingung in Zeile 9.
        das Programm "run" wird nur ausgeführt, wenn in der Zeile vorher etwas drin steht.

        Homoran Codierknecht haus-automatisierung 3 Replies Last reply Reply Quote 0
        • Homoran
          Homoran Global Moderator Administrators @Manolo last edited by

          @manolo sagte in Script funktioniert nur bedingt:

          Ergebnis bleibt das Selbe.

          welches?
          was steht im log?

          M 1 Reply Last reply Reply Quote 0
          • M
            Manolo @Homoran last edited by Manolo

            @homoran
            Mit Ergebnis meinte ich, dass das Programm nur ausgeführt wird, wenn die zusätzliche Zeile aktiv ist.
            Ohne die Zeile wird das nachfolgende Programm nicht ausgeführt.
            Im Log steht leider nichts, also kein Fehler.

            Was ich auch seltsam finde, ist, dass der Kommentar der hinter dem log steht ('Sprungchance') nicht als Info im Log auftaucht.

            Homoran 1 Reply Last reply Reply Quote 0
            • Homoran
              Homoran Global Moderator Administrators @Manolo last edited by Homoran

              @manolo Bitte alles zeigen

              EDIT: Keine nachträglichen Änderungen ohne Kennzeichnung!!!

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

                Hier nun das ganze Script:

                // +++++++++++++++++++++++++++++++++  USER ANGABEN  ++++++++++++++++++++++++++++++++
                var pathUser = "0_userdata.0.Anwesenheit.";
                var pathRadar = "radar2."
                
                var arrDatenpunkt = [
                // Beispiel: 'Name'
                	'Peter',
                    'Manuel',
                	'Annett',
                	'Test'
                ];
                
                // +++++++++++++++++++++++++++++  ENDE USER ANGABEN  +++++++++++++++++++++++++++++++
                // ######## FUNKTIONEN ########
                
                // Eigene Datenpunkte
                function pruefeEigeneDatenpunkte() {
                    if (arrDatenpunkt.length > 0) {
                        for(var i = 0; i < arrDatenpunkt.length; i++) {
                			var present1 = (pathRadar + '0.' + arrDatenpunkt[i]);
                			var present2 = (pathRadar + '1.' + arrDatenpunkt[i]);
                
                			on([present1, present2], function(obj) {
                //				for(var j = 0; i < arrDatenpunkt.length; j++) {
                					if((present1 === obj.id) || (present2 === obj.id))
                                        log('Sprungchance');
                                        run(obj, obj.name);
                //                }
                            });
                        }
                    }
                }
                
                pruefeEigeneDatenpunkte();
                
                //----------------------------------------------------------------------------//
                // Programm starten
                function run(obj, name) {
                 //   if ( !existsState(pathUser + name)) { erstelleStates(name);}
                	
                log('Im Programm kommen wir an');
                log(name);
                	if (getState(pathRadar + '0.' + name).val == true || getState(pathRadar + '1.' + name).val == true) {
                        log('User ' + name + ' wurde aktiviert');
                		setState(pathUser + name, true, true);
                	} else {
                        log('User ' + name + ' wurde deaktiviert')
                		setState(pathUser + name, false, true);
                	}
                }
                
                //----------------------------------------------------------------------------//
                // Datenpunkte erstellen
                function erstelleStates (namen) {
                    createState(pathUser + namen, false, {name: namen + 'Anwesend', type: 'boolean' });
                }
                //----------------------------------------------------------------------------//
                
                Homoran 1 Reply Last reply Reply Quote 0
                • Codierknecht
                  Codierknecht Developer Most Active @Manolo last edited by Codierknecht

                  @manolo
                  Dass Du da in einer Schleife Trigger erzeugst ist Dir klar?
                  Das "run()" wird nur ausgeführt, wenn der Trigger feuert.

                  Ich würde den ganzen Kram mal vernünftig einrücken, damit man auch sieht was da wie zusammengehört.
                  Ohne jegliche Berücksichtigung der Funktionalität - die erschließt sich mir nicht.

                  // Eigene Datenpunkte
                  function pruefeEigeneDatenpunkte() {
                      if (arrDatenpunkt.length > 0) {
                          for (var i = 0; i < arrDatenpunkt.length; i++) {
                              var present1 = (pathRadar + '0.' + arrDatenpunkt[i]);
                              var present2 = (pathRadar + '1.' + arrDatenpunkt[i]);
                  
                              on([present1, present2], function(obj) {
                        	        if ((present1 === obj.id) || (present2 === obj.id)) {
                                      log('Sprungchance');
                                  }
                                  run(obj, obj.name);
                              });
                          }
                      }
                  }
                   
                  pruefeEigeneDatenpunkte();
                  
                  1 Reply Last reply Reply Quote 1
                  • haus-automatisierung
                    haus-automatisierung Developer Most Active @Manolo last edited by haus-automatisierung

                    @manolo sagte in Script funktioniert nur bedingt:

                    Es geht um die zweite If-Bedingung in Zeile 9.

                    Dank var statt const sind die Variablen praktisch global. Das funktioniert so nicht. Google:

                    • JavaScript Scope: https://www.w3schools.com/js/js_scope.asp
                    • Block Scope
                    1 Reply Last reply Reply Quote 0
                    • Homoran
                      Homoran Global Moderator Administrators @Manolo last edited by

                      @manolo und das log?
                      ... auf der Seite Protokolle und unter dem Editorfenster

                      1 Reply Last reply Reply Quote 0
                      • haus-automatisierung
                        haus-automatisierung Developer Most Active last edited by

                        Einfach nie var verwenden. Dann hat man auch keine Probleme 🙂

                        // Eigene Datenpunkte
                        function pruefeEigeneDatenpunkte() {
                            if (arrDatenpunkt.length > 0) {
                                for(let i = 0; i < arrDatenpunkt.length; i++) {
                                    const present1 = `${pathRadar}0.${arrDatenpunkt[i]}`;
                                    const present2 = `${pathRadar}1.${arrDatenpunkt[i]}`;
                        
                                    on([present1, present2], (obj) => {
                                        if (present1 === obj.id || present2 === obj.id) {
                                            log('Sprungchance');
                                            run(obj, obj.name);
                                        }
                                    });
                                }
                            }
                        }
                        
                        pruefeEigeneDatenpunkte();
                        
                        1 Reply Last reply Reply Quote 1
                        • M
                          Manolo last edited by Manolo

                          Das war tatsächlich die Lösung!

                          Vielen Dank für die schnelle Hilfe! 👍

                          Seltsamerweise funktioniert das var bei allen anderen Scripten die ich mir zusammengebaut habe.
                          Werde diese vorsorglich nun abändern.

                          Thema kann geschlossen werden.

                          haus-automatisierung Codierknecht 2 Replies Last reply Reply Quote 0
                          • haus-automatisierung
                            haus-automatisierung Developer Most Active @Manolo last edited by

                            @manolo sagte in Script funktioniert nur bedingt:

                            Seltsamerweise funktioniert das var bei allen anderen Scripten die ich mir zusammengebaut habe.

                            Das Problem ist ja hier, dass Du in der Callback-Funktion auf die Werte außerhalb der Funktion zugreifen möchtest. Und die sind dann halt global (wegen var) und nicht nur im Block-Scope der Schleife gültig.

                            Einfach var vermeiden.

                            1 Reply Last reply Reply Quote 0
                            • Codierknecht
                              Codierknecht Developer Most Active @Manolo last edited by

                              @manolo sagte in Script funktioniert nur bedingt:

                              Thema kann geschlossen werden.

                              Das kannst nur Du, indem Du den Eingangspost bearbeitest und ein "[gelöst] - " vor den Titel setzt.

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

                              Support us

                              ioBroker
                              Community Adapters
                              Donate

                              1.0k
                              Online

                              31.7k
                              Users

                              79.7k
                              Topics

                              1.3m
                              Posts

                              4
                              14
                              459
                              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