Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Entwicklung
    4. Eigenes Vis widget: Daten werden im View-Mode nicht geladen -> Erklärung für vis.states[] gesucht

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Eigenes Vis widget: Daten werden im View-Mode nicht geladen -> Erklärung für vis.states[] gesucht

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

      Ich versuche mich gerade an meinem ersten eigenen widget. Soweit bisher alles gut bis auf das wichtigste:

      Im Edit-Mode werden alle Daten geladen und das widget (basierend auf flot) zeigt alles wie gewünscht an.

      Im View-Mode dagegen bekomme ich den log "TypeError: xyz is undefined".

      Der folgende der code snippet zeigt das Problem:

      //get date
      var dateoid = data.instance + ".NextDaysDetailed.0d.date";
      
      //test only
      var val_temp_id = vis.states.attr(dateoid + '.val');
      if (val_temp_id === undefined || val_temp_id === null || val_temp_id === '') {
      	val_temp_id = '';
      	console.log("test failed " + val_temp_id);
      } else {
      	val_temp_id = val_temp_id.toString();
      	console.log("test " + val_temp_id);
      }
      
      

      Im edit-Mode komme ich immer in den else-Zweig, und die Daten aus dem Wetter-Adapter werden angezeigt.

      Im view-Mode komme ich nicht dorthin, sondern val_temp_id ist undefined.

      Ich habe diesen Code-Schnipsel in vielen anderen widgets so oder so ähnlich gesehen, dort scheint er zu funktionieren. Warum nicht bei mir?

      edit:

      Jetzt habe ich den browser einfach mal im view-Mode stehen gelassen. Und nach einer Weile werden die Diagramme auch hier angezeigt.

      Vielleicht kann mir jemand erklären, wie vis.states[] gefüllt wird? Im debugger sieht man, dass beim ersten Start nur sehr wenige Datenpunkte von den Adaptern enthalten sind. Nach einer Weile werden es immer mehr. Ich war erst der Meinung, dass die registrierten Datenpunkte nach vis.states.bind() enthalten sein müssten. Das stimmt nicht, da Datenpunkte enthalten sind, die mein widget nicht registriert…

      1 Reply Last reply Reply Quote 0
      • Rene_HM
        Rene_HM Developer last edited by

        Da bisher keine Ideen oder Lösungsvorschläge vorliegen, versuche ich die Frage anders zu stellen:

        Ich möchte ein widget erstellen, welches ganz bestimmte Datenpunkte von einem Adapter liest und darstellt. Da ich die Namen der Datenpunkte kenne (ist ja auch mein eigener Adapter 🙂 ) und die Anzahl der nowtendigen datenpunkte hoch ist, möchte ich in der Konfiguration des widgets nur die Instanz des Adapters konfigurieren. Ich binde die Datenpunkte im widget, so dass ich das widget updaten kann, sobald sich der/die Datenpunkt(e) ändert/ändern. Ich möchte aber beim Start schon die aktuellen Daten ausgeben. Zu diesem Zeitpunkt scheint aber vis.states noch nicht gefüllt zu sein, wie oben schon geschrieben…

        Was wäre hier best practice um den aktuellen kompletten Datensatz bei einem Adapter abzuholen? Ein GetState oder ähnliches würde wahrscheinlich helfen...

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

          Man sollte es anders machen.

          Da im View Modus wird Trafik optimiert und es werden nur die States geladen die in "oid*" gefunden werden.

          Du solltest für jeden Zustand, was du verwendest doch ein Input Feld machen.

          Nur die füllen solltest du automatisch. So ist in hq-widgets, starline, mediaplayer gemacht.

          Schaue hier an:

          https://github.com/instalator/ioBroker. … s.html#L13

          Du kannst für onChange eine Funktion definieren (onPlayWinampChanged)

          Die du dann so implementieren kannst:

          https://github.com/instalator/ioBroker. ... rs.js#L651

          1 Reply Last reply Reply Quote 0
          • Rene_HM
            Rene_HM Developer last edited by

            Danke Bluefox, so geht es…

            Ich habe für alle (160!) Datenpunkte ein Input-Feld angelegt und fülle diese automatisch. Das funktioniert und auch im live-Mode werden meine Daten nun angezeigt.

            Kann man die Input-Felder im Editor unsichtbar machen? Aus meiner Sicht macht es keinen Sinn, dem user die Möglichkeit

            zu geben, diese Datenpunkte zu ändern...

            oder alternativ:

            Wenn ich sie weiterhin änderbar lasse, muss ich die Änderungen auch im Programm verwenden. In dem Fall wäre es hilfreich, wenn

            man die OID's in arrays halten könnte.

            Im Moment würde der code (symbolisch) so aussehen:

            var data = $div.data('options');
            
            var sDate1 = vis.states[data.oid_Date1];
            var sDate2 = vis.states[data.oid_Date2];
            
            ...
            
            var sDate40 = vis.states[data.oid_Date40];
            
            

            lieber wäre mir

            var data = $div.data('options');
            
            for (var i=0; i<40) {
            	var sDate = vis.states[data.oid_Date[i]];
            }
            
            
            1 Reply Last reply Reply Quote 0
            • Bluefox
              Bluefox last edited by

              @Rene_HM:

              Danke Bluefox, so geht es…

              Ich habe für alle (160!) Datenpunkte ein Input-Feld angelegt und fülle diese automatisch. Das funktioniert und auch im live-Mode werden meine Daten nun angezeigt.

              Kann man die Input-Felder im Editor unsichtbar machen? Aus meiner Sicht macht es keinen Sinn, dem user die Möglichkeit

              zu geben, diese Datenpunkte zu ändern...

              oder alternativ:

              Wenn ich sie weiterhin änderbar lasse, muss ich die Änderungen auch im Programm verwenden. In dem Fall wäre es hilfreich, wenn

              man die OID's in arrays halten könnte.

              Im Moment würde der code (symbolisch) so aussehen:

              var data = $div.data('options');
              
              var sDate1 = vis.states[data.oid_Date1];
              var sDate2 = vis.states[data.oid_Date2];
              
              ...
              
              var sDate40 = vis.states[data.oid_Date40];
              
              

              lieber wäre mir

              var data = $div.data('options');
              
              for (var i=0; i<40) {
              	var sDate = vis.states[data.oid_Date[i]];
              }
              
              ```` `  
              

              Du kannst versuchen die OIDs so zu definieren:

              oid(1-160)/hidden;
              
              

              https://github.com/ioBroker/ioBroker.vi … .html#L123

              Dann werden deine OIDs so adressiert werden können:

              for (var i=0; i<160) {
              	var sDate = vis.states[data.['oid' + i]];
              }
              
              

              Was bastelst du da? 😉

              1 Reply Last reply Reply Quote 0
              • Rene_HM
                Rene_HM Developer last edited by

                @Bluefox:

                Was bastelst du da? 😉 `

                siehe http://forum.iobroker.net/viewtopic.php … 2&start=40

                Mein Ziel ist eigentlich, mein Heimautomatisierungs-UI basierend auf Qt in C++ durch ioBroker zu ersetzen. Dafür benötige

                ich noch diese Wetterdatenanzeige…

                Das widget liegt unter https://github.com/rg-engineering/ioBroker.vis-weather

                Im browser sieht mein widget jetzt bis auf ein paar Kleinigkeiten nicht so schlecht aus.

                1391_wether-widget.png

                In der android app wird das widget aber gar nicht angezeigt. Leider habe ich da überhaupt keine Möglichkeit,

                zu debuggen, oder?

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

                  @Rene_HM:

                  @Bluefox:

                  Was bastelst du da? 😉 `

                  siehe http://forum.iobroker.net/viewtopic.php … 2&start=40

                  Mein Ziel ist eigentlich, mein Heimautomatisierungs-UI basierend auf Qt in C++ durch ioBroker zu ersetzen. Dafür benötige

                  ich noch diese Wetterdatenanzeige…

                  Das widget liegt unter https://github.com/rg-engineering/ioBroker.vis-weather

                  Im browser sieht mein widget jetzt bis auf ein paar Kleinigkeiten nicht so schlecht aus.

                  wether-widget.PNG

                  In der android app wird das widget aber gar nicht angezeigt. Leider habe ich da überhaupt keine Möglichkeit,

                  zu debuggen, oder? `
                  Es gibt die Möglichkeit zu debuggen. Ich habe neulich im Forum die links auf debug Apk gepostet.

                  Und es gibt Anleitung wie man Android über Chrome debuggen kann.

                  Aber…...

                  Es werden keine fremde Widgets in der App angezeigt.

                  Mache einen offiziellen Widget Set und der taucht dann in der neue App Version auf.

                  Deine Widgets sehen gut aus. 😄

                  1 Reply Last reply Reply Quote 0
                  • Rene_HM
                    Rene_HM Developer last edited by

                    @Bluefox:

                    Mache einen offiziellen Widget Set und der taucht dann in der neue App Version auf. `

                    Ich habe die beiden Adapter "DasWetter" und "vis-weather" auf NPM hochgeladen. Das war es, was du mit "mach ein offizielles widget set" gemeint hattest, oder?

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

                    Support us

                    ioBroker
                    Community Adapters
                    Donate

                    806
                    Online

                    31.7k
                    Users

                    79.8k
                    Topics

                    1.3m
                    Posts

                    2
                    8
                    2601
                    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