Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Entwicklung
    4. Widgetentwicklung und dynamische ObjectID

    NEWS

    • Monatsrückblick - April 2025

    • Minor js-controller 7.0.7 Update in latest repo

    • Save The Date: ioBroker@Smart Living Forum Solingen, 14.06.

    Widgetentwicklung und dynamische ObjectID

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

      Ich entwickle gerade ein Widget in dem ich die StateIDs dynamisch ermittle.
      Für diese StateIDs möchte ich dann die Änderungen mitbekommen.
      Leider funktioniert in diesem Fall das folgende nicht, da die states nicht in der Auflistung vis.states enthalten sind, und wenn sie enthalten sind, dann enthält der .val Wert immer null.

      vis.states.bind(stateid + '.val', this.onChange
      

      Beim debuggen habe ich festgestellt, dass vis in einem aufwändigen Verfahren (getUsedObjectIDs) versucht alle notwendigen States einzusammeln, die sich dann auch aktualisieren. Da diese StateIDs aber dynamisch erzeugt werden, bekommt das dieser Mechanismus so nicht mit.

      Eine weitere Alternative ist, die StateIDs in die data-Auflistung in der Binding-Notation {xx.0.yy.zz} zu schreiben. Dann funktioniert zwar das aktualisieren, aber vis löscht automatisch bei jeder Aktualisierung das widget und lässt es dann neu aufbauen. Dies erzeugt hässliche Flackereffekte,

      Ein 3. Weg wäre noch selbst die Ids über socket.emit(subscribe,ID) über den Server zu abonnieren.
      Wenn ich mich dann an das StateChange-Ereignis des SDervers hänge, bekomme ich leider alle Änderungen mit.

      Hat jemand noch eine elegantere Methode oder kann mir einen Hinweis geben, evtl. habe ich die 3 Methoden ja nicht richtig eingesetzt.

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

        @OliverIO Ich habe letztens beim debuggen gesehen, dass das vis Objekt eine Funktion subscribeStates besitzt, evtl. kann man so States abonnieren, die dann auch im States Array aktualisiert werden, habe es allerdings bislang noch nicht gebraucht.

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

          @foxriver76 Danke für den Hinweis. Diese Funktion habe ich gesehen. Diese nimmt aber als Parameter nur den Namen einer view an und ist der Ausgangspunkt für Szenario 1

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

            @OliverIO man muss die Platzhalter definieren. Z.b oid1, oid2 als Attribute und die Felder bei der Konfiguration automatisch setzen.

            So funktionieren viele hqWidgets.

            D.h Dynamik bei der Konfiguration und nicht bei Run-Modus implementieren.

            Bluefox 1 Reply Last reply Reply Quote 0
            • Bluefox
              Bluefox @Bluefox last edited by

              @Bluefox https://forum.iobroker.net/post/251839

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

                Ich habe eine Lösung gefunden, nachdem ich noch tiefer in den code von vis abgetaucht bin.
                Ich muss sagen, da läuft ziemlich viel magic ab, was die Lesbarkeit und Nachvollziehbarkeit
                mancher Verhaltensweisen nicht gerade einfach macht.

                Fragestellung war, wie abonniere ich Datenpunkte und bekomm Änderungen mit, obwohl die Datenpunkte in vis noch niergend bekannt gemacht worden sind.
                Die Lösung von Bluefox, diese über oid# (#gleich eine beliebige Nummer -> das ist so eine Magie die leider nicht dokumentiert ist) umzusetzen, hat mir nicht so gut gefallen, da ich den Anwender von der (möglichen) Eingabe von Datenpunkten, die nicht notwendig sind fern halten möchte.

                Hier mal exemplarisch meine Lösung:

                // wie gesagt, bei mir wird diese Auflistung dynamisch auf Basis anderer Angaben generiert. 
                //Hier der einfachhalber einfach als fix definiertes Array
                var dps= ['adapter.0.dp1','adapter.0.dp2','adapter.0.dp3'];
                //Dann erst einmal die Daten beim Server abfragen
                vis.conn.getStates(dps, function (error, states) {
                   //dann die Daten in der Verwaltung von vis aktualisieren
                   //dadurch landen die Daten dann in vis.states
                   vis.updateStates(states);
                   //Dann vis veranlassen, das er die Daten selbst beim server abonniert und aktuell hält
                   vis.conn.subscribe(dps);
                   for (var i=0;i<dps.length;i++) {
                      //dann alle die Datenpunke in deinem code von vis abonnieren
                      //this.onChange wird dann aufgerufen, wenn eine Wertänderung erfolgt
                     //in der Auflistung vis.states sind alle Datenpunkte mit ihren Unterwerten notiert (also .val,.ack,.ts,etc.
                     //daher muss hier noch ein .val angefügt werden.
                      dps[i]=dps[i]+'.val';
                      vis.states.bind(dps[i] , this.onChange);            
                   }
                   //bind verbraucht ressourcen/speicherplatz im browser und wird nicht automatisch aufgehoben, wenn
                   //das widget zerstört/geändert wird, so kann es sein, das bei vielfachem neu erzeugen hier ein Speicherleck
                   //entsteht. 
                   //Da vis in manchen Situationen das widget zerstört/löscht und dann wieder aufbaut, muss noch folgendes
                   //notiert werden. $div ist das äußerste div um dein widget. dadurch kann vis sich um das unbind selber    kümmern
                   var $div = $('#' + widgetID);
                   $div.data('bound', dps);
                   $div.data('bindHandler', this.onChange);
                } 
                
                1 Reply Last reply Reply Quote 0
                • Bluefox
                  Bluefox last edited by

                  Участник @OliverIO написал в Widgetentwicklung und dynamische ObjectID:

                  obwohl die Datenpunkte in vis noch niergend bekannt gemacht worden sind.
                  Die Lösung von Bluefox, diese über oid# (#gleich eine beliebige Nummer -> das ist so eine Magie die leider nicht dokumentiert ist) umzusetzen, hat mir nicht so gut gefallen, da ich den Anwender von der (möglichen) Eingabe von Datenpunkten, die nicht notwendig sind fern halten möchte.
                  Hier mal exemplarisch meine Lösung:

                  Na ja... Das wird natürlich funktionieren.

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

                  Support us

                  ioBroker
                  Community Adapters
                  Donate

                  1.0k
                  Online

                  31.6k
                  Users

                  79.4k
                  Topics

                  1.3m
                  Posts

                  3
                  7
                  573
                  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