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. Entwicklung
  4. Widgetentwicklung und dynamische ObjectID

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    16
    1
    1.5k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    826

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.1k

Widgetentwicklung und dynamische ObjectID

Geplant Angeheftet Gesperrt Verschoben Entwicklung
7 Beiträge 3 Kommentatoren 653 Aufrufe 4 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.
  • OliverIOO Offline
    OliverIOO Offline
    OliverIO
    schrieb am zuletzt editiert von
    #1

    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.

    Meine Adapter und Widgets
    TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
    Links im Profil

    foxriver76F 1 Antwort Letzte Antwort
    0
    • OliverIOO OliverIO

      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.

      foxriver76F Offline
      foxriver76F Offline
      foxriver76
      Developer
      schrieb am zuletzt editiert von
      #2

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

      Videotutorials & mehr

      Hier könnt ihr mich unterstützen.

      OliverIOO 1 Antwort Letzte Antwort
      0
      • foxriver76F foxriver76

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

        OliverIOO Offline
        OliverIOO Offline
        OliverIO
        schrieb am zuletzt editiert von OliverIO
        #3

        @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

        Meine Adapter und Widgets
        TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
        Links im Profil

        BluefoxB 1 Antwort Letzte Antwort
        0
        • OliverIOO 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

          BluefoxB Offline
          BluefoxB Offline
          Bluefox
          schrieb am zuletzt editiert von
          #4

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

          BluefoxB 1 Antwort Letzte Antwort
          0
          • BluefoxB Bluefox

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

            BluefoxB Offline
            BluefoxB Offline
            Bluefox
            schrieb am zuletzt editiert von
            #5

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

            1 Antwort Letzte Antwort
            0
            • OliverIOO Offline
              OliverIOO Offline
              OliverIO
              schrieb am zuletzt editiert von OliverIO
              #6

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

              Meine Adapter und Widgets
              TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
              Links im Profil

              1 Antwort Letzte Antwort
              0
              • BluefoxB Offline
                BluefoxB Offline
                Bluefox
                schrieb am zuletzt editiert von
                #7

                Участник @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 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

                600

                Online

                32.6k

                Benutzer

                82.1k

                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