Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. ioBroker Allgemein
    4. Das volle Potential der Objekte nutzen!

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Das volle Potential der Objekte nutzen!

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

      Immer wieder bekomme ich Anfragen (auch von Entwicklern) ob es nicht möglich wäre Statische Daten, also Namen, IP Adressen oder ähnliches in einem State aus zu geben.
      Auch bei anderen Adaptern sehe ich öfter das Statische Daten in States aus gegeben werden, dabei ist das oft gar nicht Nötig. Damit verschwendet man unnötig Ressourcen und macht den Objektbaum unübersichtlich.
      Deswegen möchte ich an dieser Stelle mal auf "native" einen Bestandteil der Objekte eingehen.

      1. Basics
      2. Verwaltung im Admin
      3. Verwendung im JS Adapter
      4. Verwendung in VIS
      Mic 1 Reply Last reply Reply Quote 7
      • Jey Cee
        Jey Cee Developer last edited by

        1. Basics

        • Ein Objekt ist kein State => Objekte dienen der Verwaltung, States zur Datenhaltung.

        • Ein State Existiert nicht ohne Objekt => Bedeutet es wird für jeden State ein Objekt angelegt und sie sind miteinander Verknüpft.

        • Ein Objekt in ioBroker ist eine JSON Struktur, die wie folgt aussieht:

        {
          "type": "device",
          "common": {
            "name": "192.168.0.233"
          },
          "native": {
            "enabled": true,
            "ip": "192.168.0.233",
            "mac": "00:0e:58:35:e6:2a",
            "vendor": "Sonos Inc., 614 Chapala St., Santa Barbara CA 93101, United States"
          },
          "from": "system.adapter.net-tools.0",
          "user": "system.user.admin",
          "ts": 1599989452490,
          "_id": "net-tools.0.000e5835e62a",
          "acl": {
            "object": 1636,
            "owner": "system.user.admin",
            "ownerGroup": "system.group.administrator"
          }
        }
        

        Für unsere Betrachtung spielt nur der Key "native" eine Rolle.
        Wie man in dem Beispiel sieht sind hier verschiedene Daten enthalten. In den meisten Objekten ist dieser Teil leer, aber er ist immer vorhanden.
        Die Daten in native werden üblicherweise vom Adapter geschrieben und können für die Unterschiedlichsten Zwecke verwendet werden. Andere Adapter und der JS Controller ignorieren diesen Teil und verändern dort nichts.

        Am häufigsten werden dort Daten abgelegt die der Adapter für Funktionen benötigt.
        Es können jedoch auch Statische Daten in native abgelegt werden, die dann an verschiedenen Stellen angezeigt werden können, z.B. in der Adapter Konfiguration.

        paul53 1 Reply Last reply Reply Quote 1
        • Jey Cee
          Jey Cee Developer last edited by

          2. Verwaltung im Admin

          Die Objekte lassen sich im Tab Objekte verwalten. Bekannt dürfte vor allem die Möglichkeit sein Objekte an zu legen oder löschen. Für die erweiterte Verwaltung muss man auf das Stift-Symbol am Ende der Zeile neben dem Mülleimer Klicken.
          Anschließen sieht man so ein Fenster:

          745f461a-b34d-49c9-a55a-1877a7acafa3-image.png
          Je nach Objekt Typ sieht man sehr Unterschiedliche Informationen oder gar keine.

          55fabb4d-e738-4da5-8292-3ee96c835f30-image.png
          Wechselt man in den Tab Nativ werden die Informationen aus native angezeigt. Hier kann man sie auch bearbeiten, löschen oder neue Hinzufügen. Hierbei ist Vorsicht geboten, das verändern oder löschen kann unerwünschte Folgen haben. Neue Einträge Hinzufügen hingegen ist mit geringem Risiko verbunden, trotzdem sollte man das nur bei Selbst erstellten Objekten machen.

          1 Reply Last reply Reply Quote 1
          • Jey Cee
            Jey Cee Developer last edited by

            3. Verwendung im JS Adapter

            Im JS Adapter gibt es die Funktion getObject(), diese liefert das gesamte Object als JSON zurück.
            Dadurch kann man sehr einfach die Daten auslesen die man haben will.

            Beispiel:

            let obj = getObject('net-tools.0.000e5835e62a');
            console.log(obj.native.ip);  //erwatete Ausgabe: 192.168.0.233
            

            obj = ganzes Objekt
            native = Key "native"
            ip = Key "ip" ist ein Element von native

            1 Reply Last reply Reply Quote 2
            • Jey Cee
              Jey Cee Developer last edited by

              4. Verwendung in VIS

              Out-of-the-Box kann man nicht auf native eines Objekts zugreifen, dafür gibt es kein Widget, wäre aber wohl möglich.
              Um das dennoch zu bewerkstelligen habe ich ein Skript erstellt das man im VIS Editor einfügen kann. Anschließend kann das "basic - String" Widget zum Anzeigen der gewünschten Daten aus native verwendet werden.

              1. Skript einfügen (Code am Ende):
                29e0ea79-8e84-4a52-9405-290406de3e1e-image.png

              2. Dem Widget die CSS Klasse native-XXX zuweisen. XXX steht für den Key dessen Wert angezeigt werden soll.
                3d3f491a-aede-4470-bc87-7735e9576724-image.png

              3. Object Auswählen
                af924164-d435-42a1-876d-e2595946ecc6-image.png


              Anmerkung: "Voranstellen HTML" und "HTML anhängen" Funktioniert nicht.

              Skript:

              const timeout = 50;
              
              $(document).ready(function(){
                  setTimeout( () => {
                      getNativeData();   
                  }, timeout)
                  
              });
              
              function getNativeData(){
                  
                  const nativeElements = document.querySelectorAll('div[class*="native-"]');
                  
                  for (let i = 0; i <= nativeElements.length - 1; i++) {
                      const arr = [ ...nativeElements[i].classList ];
                      const propName = arr.find(checkForNative).replace('native-', '');
                      const id = nativeElements[i].lastElementChild.lastElementChild.dataset.oid;
                        
                        vis.conn.getObject(id, true, (err, obj) => {
                            if (!err){
                                nativeElements[i].lastElementChild.lastElementChild.outerText = obj.native[propName];
                            }
                              
                          })
                  }
              }
              
              function checkForNative(className) {
                  const regex = new RegExp('native-');
                  let finding = className.match(regex);
                  
                  return finding;
              }
              
              1 Reply Last reply Reply Quote 2
              • paul53
                paul53 @Jey Cee last edited by paul53

                @Jey-Cee sagte:

                Ein Objekt in ioBroker ist eine JSON Struktur

                Nur die Darstellung in der RAW-Ansicht des Admin-Adapters ist ein JSON, das beim Speichern in ein Objekt gewandelt wird.

                1 Reply Last reply Reply Quote 0
                • Mic
                  Mic Developer @Jey Cee last edited by

                  @Jey-Cee

                  Sehr coole, einfache Erklärung 👍 😎

                  Ich denke, "unser" Unverständnis bezüglich States (und dass dahinter ein Objekt ist) kommt sicherlich auch daher, weil viele, mich eingeschlossen, halt in ioBroker mit Blockly/JS des JS-Adapters einsteigen, und da wird dank dem Konzept von Bluefox und aller Core-Entwickler dem Anwender bereits sehr vieles abgenommen, d.h. etwa mit createState(), getState(), setState(), ohne dass man checkt und checken muss, was das so im Hintergrund bedeutet, es funktioniert halt einfach und logisch, etwa wenn man einen createState() losfeuert, etc... 😉
                  Eigentlich erst mit Start in der Adapter-Entwicklung habe ich bzw. musste ich mich damit näher beschäftigen und hab anfangs auch nicht gecheckt, warum einerseits adapter.setObjectNotExistsAsync() notwendig ist um einen neuen "State" (also Objekt!) zu erzeugen (im JS-Adapter reichte da ja ein createState()), anderseits ich mit adapter.setStateAsync() ich einen State setzen kann...

                  1 Reply Last reply Reply Quote 0
                  • Jey Cee
                    Jey Cee Developer last edited by

                    Nach Oben mit dir

                    1 Reply Last reply Reply Quote 0
                    • Jey Cee
                      Jey Cee Developer last edited by

                      @jey-cee sagte in Das volle Potential der Objekte nutzen!:

                      Nach Oben mit dir

                      Und wieder mal hoch mit dir

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

                      Support us

                      ioBroker
                      Community Adapters
                      Donate
                      FAQ Cloud / IOT
                      HowTo: Node.js-Update
                      HowTo: Backup/Restore
                      Downloads
                      BLOG

                      1.0k
                      Online

                      31.7k
                      Users

                      79.7k
                      Topics

                      1.3m
                      Posts

                      how-to
                      3
                      9
                      3791
                      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