Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. [gelöst] on-funktionen generieren aus einem object

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    [gelöst] on-funktionen generieren aus einem object

    This topic has been deleted. Only users with topic management privileges can see it.
    • B
      benni27 @Codierknecht last edited by

      @codierknecht
      zeile 8 hab ich auch mal geloggt. es werden alle trigger sauber angelegt.
      aber auffällig ist, dass der letzte angelegte aussen_heckenlicht_state ist.

      ich probier mal weiter. evtl. hab ich einen Ansatz.

      Danke schonmal!

      und danke für den Tipp mit Timer. Werd ich noch nachziehen, macht Sinn 😉

      1 Reply Last reply Reply Quote 0
      • OliverIO
        OliverIO @benni27 last edited by

        @benni27 sagte in on-funktionen generieren aus einem object:

        Wenn ich mir den homeKitaliasObject[key].orig per console ausgeben lasse, steht auch immer nur aussen_Heckenlicht_STATE drin

        und das ist wahrscheinlich der letzte in der Liste?
        Das hat etwas mit Scope zu tun.
        In Zeile 48 bis 50 holst du dir immer den aktuellen Wert.
        Der reicht auch für das definieren von ON aus.
        Wenn dann der trigger aktiviert wird, dann steht bspw in aliasID
        immer noch der Wert drin, den aliasID als letztes in der Schleife abgespeichert wurde.

        Das beste ist, du erzeugst dir eine Datenstruktur (Array of Objects), welche du diese ganzen Informationen speicherst und dann bei Aufruf des Triggers dir dann aus dem Array wieder holst. Der eindeutige ID des Arrays wäre dann etwas, was du aus obj holst (bspw der getriggerte Datenpunkt)

        B 2 Replies Last reply Reply Quote 0
        • B
          benni27 @OliverIO last edited by

          @oliverio
          richtig, das ist der letzte in der Liste.

          vielen Dank für die Hinweise. Ich werde mich morgen nochmal dransetzen.
          hab jetzt spätschicht..

          1 Reply Last reply Reply Quote 0
          • B
            benni27 @OliverIO last edited by

            @oliverio
            so ich hab jetzt mal nochmal bisschen rumprobiert.
            ich komme nicht ganz drauf wie du das meinst, kannst du mir evtl ein Beispiel geben?

            ich habe so viel verschiedenes jetzt probiert..
            ich habe dann auch versucht, das nicht über eine for schleife zu lösen, sondern eine einzige On-Funktion, die als trigger das gesamte objekt homeKitobjectAlias. also ungefähr in dem stil:

            on(homeKitobjectAlias, function(obj){
              var origID = obj.id
            ...
            }
            

            hat aber auch nicht funktioniert. je nachdem wie ich meine variablen in der funktion deklariere, kommt entweder ein schwall an undefined meldungen im Log, oder es kommen alle states die ich in der gesamten objectliste stehen hab. Unabhängig von dem Object homeKitobjectAlias. Und dementsprechend auch ein ordentlicher Überlauf im Log..

            hab aber auch viel anderes probiert. Könntest du mir ein kurzes Beispiel geben, dass ich verstehe wie du das meinst konkret?

            Danke schonmal

            Asgothian 1 Reply Last reply Reply Quote 0
            • Asgothian
              Asgothian Developer @benni27 last edited by

              @benni27 sagte in on-funktionen generieren aus einem object:

              @oliverio
              so ich hab jetzt mal nochmal bisschen rumprobiert.
              ich komme nicht ganz drauf wie du das meinst, kannst du mir evtl ein Beispiel geben?

              wenn ich das richtig erinnere solltest du in deiner For-Schleife die lokalen Variablen nicht via "var" sondern via "const" definieren. Dann müsste es gehen.

              Genau erklären kann ich es heute Abend aber nicht mehr.

              for (var key in homeKitobjectAlias) {
               
                const origID = eval(homeKitobjectAlias[key].orig);
                const aliasID = homeKitobjectAlias[key].alias;
                const flagID = homeKitobjectAlias[key].flag;
               
                on({id: aliasID, change: "ne"}, function (obj) {
              
              B 1 Reply Last reply Reply Quote 0
              • B
                benni27 @Asgothian last edited by

                @asgothian
                Woow! es funktioniert!
                Super danke!

                hab jetzt den Code genau so wie anfangs gepostet, nur mit const anstatt var. jetzt geht alles.

                an was für kleinigkeiten das immer hängen kann ey.. danke!

                liebe grüße, Benni

                Asgothian 1 Reply Last reply Reply Quote 0
                • Asgothian
                  Asgothian Developer @benni27 last edited by

                  @benni27 sagte in on-funktionen generieren aus einem object:

                  jetzt geht alles.

                  Fein. Inzwischen habe ich auch meine Notizen wieder gefunden warum das so ist:

                  • die mit "var" deklarierten Variablen sind auch ausserhalb des Scope (der For Schleife) bekannt, und damit global. In das "on" wird anscheinend ein Verweis auf diese Variable eingetragen. Am Ende der Schleife steht da genau die ID des letzten Laufs drin - alle Trigger gehen also auf die ID.
                  • durch die Definition mit "const" (sollte auch bei "let" funktionieren) ist der Scope begrenzt auf die for-schleife, weswegen anscheinend der Wert und nicht die Referenzen weiter gegeben werden.
                  OliverIO 1 Reply Last reply Reply Quote 0
                  • OliverIO
                    OliverIO @Asgothian last edited by

                    @asgothian

                    ja ist richtig, global ist allerdings das falsche Wort.
                    Die geschweiften Klammern sind immer so ein Indikator dafür,
                    das ein neue Scope für javascript eröffnet wird.
                    Variablen die ausserhalb (scope1) des aktuellen Scopes (scope2) deklariert worden sind, sind auch innerhalb des scopes sichtbar.
                    bei const, kann man das nur einmal zuweisen und passt hier für das Beispiel. Wenn man noch Berechnungen für diese Variable durchführen möchte, könnte man auch noch let verwenden.

                    Der Unterschied zu var ist hier beschrieben var ist function-scoped und const/let ist block-scoped.
                    bei var kommt dann noch das sogenannte hoisting zum tragen.
                    egal wo es innerhalb einer funktion deklariert wird, intern wird die deklaration immer am Anfang der Funktion gemacht. Daher am besten es auch dort notieren

                    const
                    var
                    let
                    hoisting

                    for (var key in homeKitobjectAlias) {
                      //scope 1
                      const origID = eval(homeKitobjectAlias[key].orig);
                      const aliasID = homeKitobjectAlias[key].alias;
                      const flagID = homeKitobjectAlias[key].flag;
                     
                      on({id: aliasID, change: "ne"}, function (obj) {
                      //scope 2
                      }
                    
                    A B 2 Replies Last reply Reply Quote 0
                    • A
                      Ahnungsbefreit @OliverIO last edited by

                      @oliverio bzw. am besten "var" ganz vermeiden, das führt nur zur Unklarheiten.

                      1 Reply Last reply Reply Quote 0
                      • B
                        benni27 @OliverIO last edited by

                        Vielen Dank für eure Hilfe. Hat mir sehr weitergeholfen. Danke auch für die Erklärungen! Werde in Zukunft primär let/const verwenden! 🙂

                        Ich weiss leider nicht wo ich die Frage als gelöst markieren kann? Ist mein erster Forenbeitrag..

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

                          @benni27 sagte in on-funktionen generieren aus einem object:

                          Ich weiss leider nicht wo ich die Frage als gelöst markieren kann? Ist mein erster Forenbeitrag..

                          Bearbeite Deinen Eingangspost und setze ein "[gelöst] - " vor den Titel.

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

                          Support us

                          ioBroker
                          Community Adapters
                          Donate

                          671
                          Online

                          31.6k
                          Users

                          79.6k
                          Topics

                          1.3m
                          Posts

                          5
                          15
                          596
                          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