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

  • Hochpass
    antwortet
    Sieht erstmal gut aus.

    Einen Kommentar schreiben:


  • wvhn
    antwortet
    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

    Einen Kommentar schreiben:


  • AndreK
    antwortet
    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

    Einen Kommentar schreiben:


  • wvhn
    antwortet
    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

    Einen Kommentar schreiben:


  • Hochpass
    antwortet
    Bad News

    Scheinbar gibt es unterschiede zwischen Firefox, Edge und Chrome

    In Firefox scheint die Lösung zu funktionieren. Mit Edge und Chrome nicht.

    Einen Kommentar schreiben:


  • Hochpass
    antwortet
    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!

    Einen Kommentar schreiben:


  • wvhn
    antwortet
    @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

    Einen Kommentar schreiben:


  • Hochpass
    antwortet
    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

    Einen Kommentar schreiben:


  • wvhn
    antwortet
    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

    Einen Kommentar schreiben:


  • Hochpass
    antwortet
    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"}

    Einen Kommentar schreiben:


  • Hochpass
    antwortet
    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.

    Einen Kommentar schreiben:


  • wvhn
    antwortet
    Super. Lässt Du uns an der Lösung teilhaben?

    Gruß
    Wolfram

    Einen Kommentar schreiben:


  • Hochpass
    antwortet
    Problem gelöst
    Zuletzt geändert von Hochpass; 15.06.2021, 19:58.

    Einen Kommentar schreiben:


  • wvhn
    antwortet
    Die Websocket-Kommunikation siehst Du in der Konsole.
    Code:
    [io_smarthome.py] receiving data …
    (Bei fhem geht das auch, wenn Du im Treiber den loglevel auf „2“ einstellst).

    Hier siehst Du die Originaldaten, die vom Backend aus der Datenbank kommen. Die werden vom Treiber ggfls. modifiziert und in den widget.buffer geschrieben. Hier wäre ein direkter Vergleich sinnvoll.

    Gruß
    Wolfram

    Einen Kommentar schreiben:


  • Hochpass
    antwortet
    so cache ist aus.
    Das sieht aber reproduzierbar unterschiedlich aus. Im Anhang gut und schlecht. Oder muss ich nach anderen Daten schauen?


    Angehängte Dateien

    Einen Kommentar schreiben:

Lädt...
X