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 / .each warum unterschiedliches obj als Antwort

    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 / .each warum unterschiedliches obj als Antwort

    This topic has been deleted. Only users with topic management privileges can see it.
    • hanss
      hanss last edited by hanss

      Bitte um Hilfe:
      Wieso erhalte ich mit .each und let obj = getObject (id) ein anderes Objekt(obj)
      als mit .on??
      Vielen Dank

      const idsWerDA = $('state(functions=werdaog)');         // tr-064.0.devices.Galaxy-J5.active
      
      idsWerDA.each(function(id, i) {                      // Programm Start: alle Anwesenden im OG ermitteln
             log("Programm Start: "+id)
             let obj = getObject (id)
             log ("Objekt: "+JSON.stringify(obj)  )
      Ergebnis:
      Objekt: {"type":"state","common":{"name":"active","type":"boolean","role":"state"},"native":{},"_id":"tr-064.0.devices.Galaxy-S7-edge.active","from":"system.adapter.tr-064.0","user":"system.user.admin","ts":1603115401274,"acl":{"object":1636,"state":1636,"owner":"system.user.admin","ownerGroup":"system.group.administrator"}}
      
      
      idsWerDA.on(function(obj) {                              // alle Objekte mit Änderung werdaog
          log ("Objekt .on: "+JSON.stringify(obj)  )
      Ergebnis:
      Objekt .on: {"id":"tr-064.0.devices.Galaxy-S7-edge.active","newState":{"val":true,"ts":1603961239462,"ack":false,"lc":1603961239462,"from":"system.adapter.admin.0","q":0},"oldState":{"val":false,"ts":1603961228233,"ack":false,"lc":1603955047061,"from":"system.adapter.javascript.0","q":0},"state":{"val":true,"ts":1603961239462,"ack":false,"lc":1603961239462,"from":"system.adapter.admin.0","q":0}}
      
      
      Asgothian 1 Reply Last reply Reply Quote 0
      • Asgothian
        Asgothian Developer @hanss last edited by Asgothian

        @hanss
        Wenn ich das richtig sehe bekommst du bei .on das "state" Objekt, sprich das Ergebnis von getState(id), nicht von getObject(id)

        OK.. jetzt hab ich es wieder.. dumm die falsche Erinnerung.

        getObject(id) gibt Dir die Objektbeschreibung.
        getState(id) gibt Dir den aktuellen Status des Objektes

        bei .on bekommst du ein eigenes Objekt, welches

        • den letzten State beinhaltet
        • den neuen State beinhaltet
        • den state beinhaltet.

        Das gleiche Objekt bekommst du immer wenn Du einen Trigger nutzt (on (id, function (obj) {})

        Zum Warum: Im Fall einer Änderung (was bei .on ja die Funktion auslöst) benötigst Du mehr / andere Daten als wenn du nur die aktuelle Objektbeschreibung oder den aktuellen Objektstatus abfragen willst.

        Den Unterschied kann man auch so beschreiben:

        Über das .each bekommst definierst du eine Funktion die direkt für jedes Objekt aufgerufen wird.
        Über das .on definierst du für jedes Objekt einen Trigger, sprich das .on entspricht :

        idsWerDa.on(function(obj) { do something } )
        
        idsWerDa.each(funktion(id, i) {
          on(id, function(obj) { do something })
        })
        

        A.

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

          @Asgothian
          Vielen Dank.
          ...bei .on bekommst du ein eigenes Objekt - Das ist die Erklärung aber auch sehr verwirrend.
          Wie kann ich dieses Objekt abfragen, wenn ich die ID habe?
          getEigenesObject(id)

          Asgothian paul53 2 Replies Last reply Reply Quote 0
          • Asgothian
            Asgothian Developer @hanss last edited by Asgothian

            @hanss Ich hab da an der Erklärung nochmal was angepasst. Das Objekt ist nur ein kleiner Teil des Unterschiedes.

            @hanss sagte in .on / .each warum unterschiedliches obj als Antwort:

            Wie kann ich dieses Objekt abfragen, wenn ich die ID habe?
            getEigenesObject(id)

            Die frage verstehe ich nicht. Vielleicht beschreibst du das gesamte Problem mal 🙂

            hanss 1 Reply Last reply Reply Quote 0
            • paul53
              paul53 @hanss last edited by paul53

              @hanss sagte:

              Wie kann ich dieses Objekt abfragen, wenn ich die ID habe?

              Die Eigenschaften des Datenpunkt-Objektes werden im Funktionsparameter übergeben. Da es es sich sowohl um das statische Objekt handelt als auch um den Zustand, bezeichne ich die Variable mit dp.

              Selector.on(function(dp) {
                 log(dp.state.val); // Wert aus Zustand
                 log(dp.common.name); // Name aus statischem Objekt
                 log(dp.id); // ID des Triggers
              });
              

              .each liefert lediglich die ID der Datenpunkte. Auf das statische Objekt muss man mit getObject(id) zugreifen, auf den Zustand mit getState(id).

              hanss 1 Reply Last reply Reply Quote 0
              • hanss
                hanss @paul53 last edited by

                @paul53
                Vielen Dank.
                Wie geht es dann, wenn ich auch noch Aufzählungen benötige?
                Welches Objekt ist dann das Richtige?
                Für mich ist das alles sehr verwirrend, weil nicht Objekt gleich Objekt ist.

                let raum = getObject(obj.id, "rooms");
                let raumname = String(raum.enumNames);   
                
                paul53 1 Reply Last reply Reply Quote 0
                • hanss
                  hanss @Asgothian last edited by

                  @Asgothian
                  Es gibt eine Funktion, der das Objekt übergeben wird.
                  Diese wird einmal über eine .each Schleife und einmal mit .on aufgerufen.
                  Ich glaube ich stelle die Funktion um und übergebe die ID.

                  function OGset(obj){
                      Anwesend = obj.state.val;                            // true = da; false = abwesend
                      let raum = getObject(obj.id, "rooms");
                      let raumname = String(raum.enumNames);   
                  
                  Asgothian 1 Reply Last reply Reply Quote 0
                  • paul53
                    paul53 @hanss last edited by paul53

                    @hanss sagte:

                    Welches Objekt ist dann das Richtige?

                    Das Array mit Raumnamen wird zusätzlich im Objekt in der Eigenschaft enumNames übergeben.

                    let obj = getObject(dp.id, "rooms");
                    let raumname = obj.enumNames[0];   
                    

                    Bei on() werden auch enumNames als Array übergeben:

                       let enums = dp.enumNames; // Array mit Aufzählungen
                    
                    1 Reply Last reply Reply Quote 0
                    • Asgothian
                      Asgothian Developer @hanss last edited by

                      @hanss

                      Das ist doch einfach:

                      idsWerDa.on(OGset)
                      
                      idsWerDa.each(function(id, i) { 
                      let tempobj = {}
                      tempobj.state = getState(id) 
                      OGset(tempobj)
                      }
                      

                      Die Lösung nur die ID zu übergeben und immer mit getState zu arbeiten ist beim .on unpraktisch.

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

                        @Asgothian @paul53
                        ich bekomme es einfach nicht hin.
                        Bitte hier einmal die erforderlichen Änderungen vornehmen.
                        Vielen Dank schon mal.

                        const idsWerDA = $('state(functions=werdaog)');         // tr-064.0.devices.Galaxy-J5.active
                        
                        idsWerDA.each(function(id, i) {                      // Programm Start: alle Anwesenden im OG ermitteln
                            // hier id in obj umwandeln    
                            OGset(obj)
                        
                        idsWerDA.on(function(obj) {                              // alle Objekte mit Änderung werdaog
                             OGset(obj)
                        //-----------------------------------------------------
                        
                        function OGset(obj){
                            Anwesend = obj.state.val;                            // true = da; false = abwesend
                            let raum = getObject(obj.id, "rooms");
                            let raumname = String(raum.enumNames);               // Raumname der Änderung
                        
                        
                        paul53 1 Reply Last reply Reply Quote 0
                        • paul53
                          paul53 @hanss last edited by paul53

                          @hanss sagte:

                          Bitte hier einmal die erforderlichen Änderungen vornehmen.

                          Du möchtest das (annähernd) gleiche Objekt an eine Funktion sowohl aus .on() und auch aus .each() übergeben ?

                          idsWerDA.each(function(id, i) {                      // Programm Start: alle Anwesenden im OG ermitteln
                              let obj = getObject(id);
                              obj.id = id;
                              obj.state = getState(id);    
                              OGset(obj)
                          });
                          
                          hanss 1 Reply Last reply Reply Quote 0
                          • hanss
                            hanss @paul53 last edited by

                            @paul53
                            Das habe ich schon versucht, funktioniert nicht.
                            Lt. @Asgothian im 2.Beitrag :
                            "bei .on bekommst du ein eigenes Objekt, welches
                            den letzten State beinhaltet
                            den neuen State beinhaltet
                            den state beinhaltet."

                            Ich habe jetzt die Funktion OGset(id) so abgeändert, dass ich die ID übergeben kann.

                            idsWerDA.on(function(obj) { 
                               OGset(obj.id)
                            
                            idsWerDA.each(function(id, i) {
                               OGset(id)
                            
                            function OGset(id){
                              let raum = getObject(id, "rooms");
                            

                            Das funktioniert und sieht übersichtlich aus.
                            Mein Fazit:
                            Niemals ein Objekt an eine Funktion übergeben.
                            Vielen Dank.

                            paul53 1 Reply Last reply Reply Quote 0
                            • paul53
                              paul53 @hanss last edited by

                              @hanss sagte:

                              Ich habe jetzt die Funktion OGset(id) so abgeändert, dass ich die ID übergeben kann.

                              Das ist die bessere Lösung, wobei mein Vorschlag auch funktionieren muss.

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

                              Support us

                              ioBroker
                              Community Adapters
                              Donate

                              693
                              Online

                              31.8k
                              Users

                              80.0k
                              Topics

                              1.3m
                              Posts

                              javascript
                              3
                              13
                              434
                              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