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. JavaScript
  5. [gelöst] .on / .each warum unterschiedliches obj als Antwort

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.8k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    2.2k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    16
    1
    3.4k

[gelöst] .on / .each warum unterschiedliches obj als Antwort

Geplant Angeheftet Gesperrt Verschoben JavaScript
javascript
13 Beiträge 3 Kommentatoren 714 Aufrufe 2 Watching
  • Ä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.
  • hanssH Offline
    hanssH Offline
    hanss
    schrieb am zuletzt editiert von hanss
    #1

    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}}
    
    
    AsgothianA 1 Antwort Letzte Antwort
    0
    • hanssH 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}}
      
      
      AsgothianA Offline
      AsgothianA Offline
      Asgothian
      Developer
      schrieb am zuletzt editiert von Asgothian
      #2

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

      ioBroker auf RPi4 - Hardware soweit wie möglich via Zigbee.
      "Shit don't work" ist keine Fehlermeldung, sondern ein Fluch.

      hanssH 1 Antwort Letzte Antwort
      0
      • AsgothianA 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.

        hanssH Offline
        hanssH Offline
        hanss
        schrieb am zuletzt editiert von
        #3

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

        AsgothianA paul53P 2 Antworten Letzte Antwort
        0
        • hanssH hanss

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

          AsgothianA Offline
          AsgothianA Offline
          Asgothian
          Developer
          schrieb am zuletzt editiert von Asgothian
          #4

          @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 :)

          ioBroker auf RPi4 - Hardware soweit wie möglich via Zigbee.
          "Shit don't work" ist keine Fehlermeldung, sondern ein Fluch.

          hanssH 1 Antwort Letzte Antwort
          0
          • hanssH hanss

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

            paul53P Offline
            paul53P Offline
            paul53
            schrieb am zuletzt editiert von paul53
            #5

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

            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

            hanssH 1 Antwort Letzte Antwort
            0
            • paul53P 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).

              hanssH Offline
              hanssH Offline
              hanss
              schrieb am zuletzt editiert von
              #6

              @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);   
              
              paul53P 1 Antwort Letzte Antwort
              0
              • AsgothianA 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 :)

                hanssH Offline
                hanssH Offline
                hanss
                schrieb am zuletzt editiert von
                #7

                @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);   
                
                AsgothianA 1 Antwort Letzte Antwort
                0
                • hanssH hanss

                  @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);   
                  
                  paul53P Offline
                  paul53P Offline
                  paul53
                  schrieb am zuletzt editiert von paul53
                  #8

                  @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
                  

                  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
                  • hanssH hanss

                    @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);   
                    
                    AsgothianA Offline
                    AsgothianA Offline
                    Asgothian
                    Developer
                    schrieb am zuletzt editiert von
                    #9

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

                    ioBroker auf RPi4 - Hardware soweit wie möglich via Zigbee.
                    "Shit don't work" ist keine Fehlermeldung, sondern ein Fluch.

                    hanssH 1 Antwort Letzte Antwort
                    0
                    • AsgothianA Asgothian

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

                      hanssH Offline
                      hanssH Offline
                      hanss
                      schrieb am zuletzt editiert von
                      #10

                      @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
                      
                      
                      paul53P 1 Antwort Letzte Antwort
                      0
                      • hanssH hanss

                        @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
                        
                        
                        paul53P Offline
                        paul53P Offline
                        paul53
                        schrieb am zuletzt editiert von paul53
                        #11

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

                        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

                        hanssH 1 Antwort Letzte Antwort
                        0
                        • paul53P 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)
                          });
                          
                          hanssH Offline
                          hanssH Offline
                          hanss
                          schrieb am zuletzt editiert von
                          #12

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

                          paul53P 1 Antwort Letzte Antwort
                          0
                          • hanssH hanss

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

                            paul53P Offline
                            paul53P Offline
                            paul53
                            schrieb am zuletzt editiert von
                            #13

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

                            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
                            Antworten
                            • In einem neuen Thema antworten
                            Anmelden zum Antworten
                            • Älteste zuerst
                            • Neuste zuerst
                            • Meiste Stimmen


                            Support us

                            ioBroker
                            Community Adapters
                            Donate

                            579

                            Online

                            32.4k

                            Benutzer

                            81.5k

                            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