NEWS
Eigenes Vis widget: Daten werden im View-Mode nicht geladen -> Erklärung für vis.states[] gesucht
-
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…
-
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...
-
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:
-
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]]; }
-
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?
-
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.
In der android app wird das widget aber gar nicht angezeigt. Leider habe ich da überhaupt keine Möglichkeit,
zu debuggen, oder?
-
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.
-
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?