Ankündigung

Einklappen
Keine Ankündigung bisher.

plot.period verbindet ersten und und letzen Punkt

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    #16
    Super. Lässt Du uns an der Lösung teilhaben?

    Gruß
    Wolfram

    Kommentar


      #17
      Zitat von wvhn Beitrag anzeigen
      Super. Lässt Du uns an der Lösung teilhaben?
      Sorry. Missverständnis. Ich war OT. Ich wollte gestern weiter testen aber ich hatte ein andres Problem, dass die Plots nicht mehr aktualisiert wurden. Lag an SmarthomeNG und ist entkoppelt von dem zerhackten Plot Problem.
      Ich guck, dass ich heute abend weiter teste und die anderen Daten noch beschaffe.
      Zapft ihr Narren der König hat Durst

      Kommentar


        #18
        Ich habe mal 3 Abfragen unten reinkopiert. Der erste und der letzte Zeitstempel scheinen unterschiedlich zu sein obwohl die gleichen Daten drin sind.
        Ob das was zu bedeuten hat weiß ich nicht.

        Code:
        {"cmd": "series", "series": [
        [1623790140264, 101.71],
        [1623801604217, 0.0],
        [1623814696854, 0.0],
        [1623814746802, 0.0],
        [1623814826942, 0.0],
        [1623814936764, 0.01],
        [1623815006870, 0.01],
        [1623815097116, 0.01],
        .....
        [1623870390193, 95.89],
        [1623870530024, 95.89],
        [1623870729917, 95.89],
        [1623874460018, 96.21],
        [1623874460018, 96.206],
        [1623876540264, 96.206]], "sid": "pv.gesamt.energie|avg|24h|now|1000"}
        
        
        
        {"cmd": "series", "series": [
        [1623790140264, 101.71],
        [1623801604217, 0.0],
        [1623814696854, 0.0],
        [1623814746802, 0.0],
        [1623814826942, 0.0],
        [1623814936764, 0.01],
        [1623815006870, 0.01],
        [1623815097116, 0.01],
        ....
        [1623870390193, 95.89],
        [1623870530024, 95.89],
        [1623870729917, 95.89],
        [1623874460018, 96.21],
        [1623874460018, 96.206],
        [1623876540264, 96.206]], "sid": "pv.gesamt.energie|avg|24h|now|1000"}
        
        
        {"cmd": "series", "series": [
        [1623790688521, 101.71],
        [1623801604217, 0.0],
        [1623814696854, 0.0],
        [1623814746802, 0.0],
        [1623814826942, 0.0],
        [1623814936764, 0.01],
        [1623815006870, 0.01],
        [1623815097116, 0.01],
        ....
        [1623870390193, 95.89],
        [1623870530024, 95.89],
        [1623870729917, 95.89],
        [1623874460018, 96.21],
        [1623874460018, 96.206],
        [1623877088521, 96.206]], "sid": "pv.gesamt.energie|avg|24h|now|1000"}
        Zapft ihr Narren der König hat Durst

        Kommentar


          #19
          Die ausgelesenen Daten sind alle in Ordnung - sowohl im log des Websocket, als auch in widget.buffer, als auch im Export aus dem Plot. Trotzdem erhält das Plotwidget diese Daten nicht in korrekter Form. Ich habe mir das in der update Methode übergebene „response“ Array auf die Konsole schreiben lassen und dann haben mich die grünen Markierungen in den in #11 geposteten Screenshots auf die richtige Spur gebracht.

          Aber der Reihe nach (zwecks Dokumentation der Zusammenhänge relativ ausführlich):
          • Highcharts erwartet die Datenreihen in nach Zeitstempeln aufsteigend sortierter Reihenfolge. Ist die Reihenfolge nicht sortiert, gehen Linien quer durch den Plot.
          • Der io-Treiber abonniert die Daten als „series“ beim Backend und bekommt den kompletten Datensatz aus dem database-Plugin in der richtigen Reihenfolge und im angeforderten Zeitraster. Anfangs- und Endzeiten werden dabei an den Zeitpunkt der Anforderung angepasst. Von da an sendet das Backend eigenständig im eingestellten Zeitraster Updates. Alle diese Daten leitet der Treiber direkt an die Methode widget.update (./lib/base/base.js) weiter.
          • widget.update prüft, ob die Serie schon im widget.buffer vorhanden ist und ob die Daten sich geändert haben. Wenn eine Aktualisierung der Daten erforderlich ist, wird erst widget.set und anschließend die Update-Methode für jedes jQuery mobile Widget, das diese Daten abonniert hat, aufgerufen.
          • widget.set schreibt die erhaltenen Daten in einer besonderen Form in den widget.buffer. Jeder Datenpunkt wird mit dem Zeitstempel als Schlüssel referenziert und als Array abgelegt:
            Code:
            Zeitstempel: Array [Zeitstempel,Wert]
            Das ist insofern ganz elegant, als die weiter laufenden Updates einfach mit dem jeweiligen Schlüssel in die vorhandenen Daten einsortiert werden und man bei Ausgabe von widget.buffer eine aufsteigende Reihenfolge zu sehen bekommt.
            Tatsächlich erhält jeder Datenpunkt aber zusätzlich zum Schlüssel auch einen Index.
          • widget.buffer wird beim Seitenwechsel nicht gelöscht, sondern auf jeder aufgerufenen Seite mit den dort benötigten Daten ergänzt. Das beschleunigt den Seitenaufbau. Wenn jetzt z.B. nach einem Seitenwechsel neue Daten in eine Serie einsortiert werden, dann wird deren Index fortlaufend hochgezählt. Sind Daten aus der Vergangenheit dabei, dann kommt die Sortierung nach dem Index durcheinander.
          • Die Update-Methode der jQm-Widget-Prototypen holt sich die benötigen Daten mit widget.get aus dem widget.buffer. Dies geschieht mit der JavaScript-Methode „Object.values“. Hier nimmt das Unheil seinen Lauf, denn die Reihenfolge der Datenpunkte wird dabei nach dem Index sortiert. Das Ergebnis wird den smartVISU-Widgets als „response“ übergeben.
          Für die Lösung des Problems muss ich jetzt noch testen, ob es schneller ist, die Daten umzusortieren oder komplett neu einzulesen. Das sollte aber in den nächsten Tagen erledigt sein.

          Gruß
          Wolfram

          Kommentar


            #20
            Hi Wolfram,
            klasse, ich bin gespannt. Ja und ich bin im Verzug mit den Tests. Werde ich aber nachliefern wenn ich abends mal eine ruhige halbe Stunde über habe. Ich habs nicht vergessen..
            Grüße Lars
            Zapft ihr Narren der König hat Durst

            Kommentar


              #21
              @Hochpass
              nochmal vielen Dank fürs Testen. Das hat echt weiter geholfen.

              An alle:
              Ein erster Test mit der neuen Sortierfunktion ist auch schon positiv verlaufen. Allerdings hatten ältere Browser noch Schwierigkeiten. Im develop branch ist jetzt eine Version mit Sortierfunktion, die bei mir auch auf einem alten iPad läuft. Ich brauche noch Tester mit alten Geräten, die die Funktion ebenfalls verifizieren können.

              Wer die develop Version nicht laden möchte, kann in der ./lib/base/base.js die Methode widget.get modifizieren, indem die sort-Funktionen eingebaut werden (im aktuellen Master ab Zeite 1450):
              Code:
              get: function (items) {
              var ret;
              
              // case: more items
              if (items instanceof Array) {
              ret = Array();
              
              for (var i = 0; i < items.length; i++) {
              if(widget.checkseries(items[i]) && widget.buffer[items[i]] != null)
              ret.push(Object.values(widget.buffer[items[i]]).sort(function(a,b){return b < a}));
              else
              ret.push(widget.buffer[items[i]]);
              }
              }
              // case: one item
              else {
              if(widget.checkseries(items) && widget.buffer[items] != null)
              ret = Object.values(widget.buffer[items]).sort(function(a,b){return b < a});
              else
              ret = widget.buffer[items];
              }
              
              return ret;
              },
              Bin gespannt auf Testergebnisse. Es würde mich freuen, wenn wir die "Sau" damit endgültig zur Strecke gebracht hätten (waidmännisch korrekt mit Büchse statt mit Flinte)

              Gruß
              Wolfram

              Kommentar


                #22
                Waidmannsheil!

                Danke für die Lösung. Bei mir funktioniert alles soweit auf den Androiden und der Windows Kiste.
                Alte Geräte habe ich leider nicht mehr auf denen ich testen könnte.

                Und mein Beitrag war wirklich nicht groß. Ich habe vom Projekt schon mehr profitiert als dass ich beitragen konnte!
                Zapft ihr Narren der König hat Durst

                Kommentar


                  #23
                  Bad News

                  Scheinbar gibt es unterschiede zwischen Firefox, Edge und Chrome

                  In Firefox scheint die Lösung zu funktionieren. Mit Edge und Chrome nicht.
                  Zapft ihr Narren der König hat Durst

                  Kommentar


                    #24
                    Mist. Ich weiß schon, warum mir beide nicht ins Haus kommen. Im Netz gibt es Hinweise, dass beide die sort Algorithmen nicht nach Standard implementiert haben.

                    Also: wer Firefox und Safari nutzt, kann die oben beschriebene Änderung nutzen. Andere müssen warten, bis ich den sort Algorithmus zu Fuß realisiert habe

                    Gruß
                    Wolfram

                    Kommentar


                      #25
                      Hi wvhn ,

                      folgendes habe ich auf die Schnelle gefunden. Das Problem ist wohl, dass a < b einen "bool"-Wert zurückgibt (0/1). Laut Standard wird wohl -1,0,1 erwartet.
                      Auf folgendem Link gibts eine Lösung dazu. Ich habe im Moment keine Daten um das zu Testen. Vielleicht erspart Dir dies ein wenig Arbeit.

                      Viele Grüsse

                      Andre

                      Kommentar


                        #26
                        Hi AndreK ,

                        Danke für den Tipp. Ich hatte das vorher schon probiert und hatte keinen Erfolg. a und b sind Objekte und lassen sich nicht subtrahieren. Auf Deinen Tipp hin habe ich mir aber nochmal ausgeben lassen, was a und b in der sort Funktion genau repräsentieren. Tatsächlich sind es die Arrays [Zeitstempel, Wert] aus dem widget.buffer.
                        Ersetzt man also bei beiden Stellen im oben gezeigten Code die sort Funktion durch
                        Code:
                        ... .sort(function(a,b){return a[0]-b[0]})
                        dann funzt es bei mir mit den Browsern Edge und Chrome auch. Ich pushe das gleich in den develop branch.

                        Hier nochmal die ganze get Methode:
                        Code:
                        	get: function (items) {
                        		var ret;
                        
                        		// case: more items
                        		if (items instanceof Array) {
                        			ret = Array();
                        
                        			for (var i = 0; i < items.length; i++) {
                        				if(widget.checkseries(items[i]) && widget.buffer[items[i]] != null)
                        					ret.push(Object.values(widget.buffer[items[i]]).sort(function(a,b){return a[0]-b[0]}));
                        				else
                        					ret.push(widget.buffer[items[i]]);
                        			}
                        		}
                        		// case: one item
                        		else {
                        			if(widget.checkseries(items) && widget.buffer[items] != null)
                        				ret = Object.values(widget.buffer[items]).sort(function(a,b){return a[0]- b[0]});
                        			else
                        				ret = widget.buffer[items];
                        		}
                        
                        		return ret;
                        	},
                        Gruß
                        Wolfram

                        Kommentar


                          #27
                          Sieht erstmal gut aus.
                          Zapft ihr Narren der König hat Durst

                          Kommentar

                          Lädt...
                          X