[Gelöst] Gefüllte Charts werden nicht richtig angezeigt

Begonnen von stefanru, 18 Februar 2021, 13:39:15

Vorheriges Thema - Nächstes Thema

stefanru

Hi,

ich habe ein seltsames Problem mit meinem TabletUI und dem Charts Widget.
Bei mehreren Charts kann ich das Phänomen beobacht.
Der Chart wird geladen und korrekt dagestellt. Sieht Strom_ok und dann ändert er sich und zeigt nur noch Striche. Siehe Strom_kaputt.
Das passiert nicht immer. Manchmal ca nach 2 Sekunden, manchmal nach dem Wechsel von Seiten.
Ich habe das Verhalten bei mehreren Charts.
Regenwasser, Heizöl, Strohm ...

Meine Datenquelle ist logdb.

Hab schon an allen möglichen Parametern des Charts gedreht. Ist aber leider nicht besser geworden.
Im Developer Trace des Browsers sehe ich leider keine Auffälligkeit.

Ich hoffe jemand hat so etwas schonmal gesehen und hat eine Idee.

Hier mal der FTUI ausschnitt für die 2 Graphen im Bild:

<li data-row="2" data-col="1" data-sizex="11" data-sizey="4" class="semitransparent">
  <header>Stromzähler Tageschart</header>
<div data-type="chart"
    data-device="stefan.stromzaehler"
data-get="state"
data-logdevice="logdb"
data-logfile="history"
data-scrollgroup="1"
data-cursorgroup="1"
data-columnspec='["stefan.stromzaehler:power","walter.stromzaehler:power"]'
data-style='["ftui l2fill","ftui l5fill"]'
data-ptype='["lines","lines"]'
data-uaxis='["primary","primary"]'
data-legend='["Stefan Watt","Walter Watt"]'
data-yunit=" Watt"
data-minvalue="0"
data-maxvalue="auto"
data-height="99%"
data-width="99%"
data-yticks="auto"
data-nofulldays="true"
data-xticks="auto"
data-crosshair="true"
data-showlegend ="true"
class = "big"
style = "font-size:900; font-weight:900;" >
</div>

<li data-row="6" data-col="1" data-sizex="11" data-sizey="3" class="semitransparent">
  <header>Stromzähler Tagesverbrauch pro Monat</header>
<div data-type="chart"
    data-device="stefan.stromzaehler"
data-get="state"
data-logdevice="logdb"
data-logfile="history"
data-scrollgroup="2"
data-cursorgroup="2"
data-columnspec='["stefan.stromzaehler:total_consumption::delta-d:$val=($val/1000)", "walter.stromzaehler:total_consumption::delta-d:$val=($val/1000)"]'
data-style='["ftui l2fill","ftui l5fill"]'
data-ptype='["bars"]'
data-uaxis='["primary"]'
data-legend='["Stefan kWh", "Walter kWh"]'
data-daysago_start="30"
data-yunit=" kWh"
data-yticks_format="#.#"
data-minvalue="0"
data-maxvalue="auto"
data-height="99%"
data-width="99%"
data-yticks="auto"
data-minvalue_sec="auto"
data-maxvalue_sec="auto"
data-nofulldays="true"
data-xticks="auto"
data-crosshair="true"
data-showlegend ="true"
class = "big"
style = "font-size:900; font-weight:900;" >
</div>
</li>



P.S. In der Entwickler Console sehe ich dass die Charts sehr oft aktualisiert werden wegen:
Function: widget_chart.update > Update triggered with: walter.stromzaehler:power
Ich habe aber power gar nicht in data-get als Aktualisierung trigger gesetzt.
Habe extra state genommen da der nicht aktualisiert wird.

Gruß und Danke,
Stefan

eki

Kannst Du noch sagen, mit welchem Browser das auftritt?

stefanru

Hi Eki,

klar ich verwende verschiedene Chrome Browser auf dem Computer und SmartPhone und Fully auf dem Tablet.
Überall ist der Effekt zu sehen.

Hab jetzt auch mal Internet Explorer und Edge probiert. Überall das selbe Verhalten.

Gruß,
Stefan

eki

Kleiner Zwischenstand:

P.S. In der Entwickler Console sehe ich dass die Charts sehr oft aktualisiert werden wegen:
Function: widget_chart.update > Update triggered with: walter.stromzaehler:power
Ich habe aber power gar nicht in data-get als Aktualisierung trigger gesetzt.
Habe extra state genommen da der nicht aktualisiert wird.


Aktuell ist das folgendermaßen: Wenn entweder ein Event kommt, der auf data-device und data-get passt, oder wenn ein Event kommt, der auf data-logdevice und data-get passt, dann wird ein refresh gemacht.

Was das komische Verhalten betrifft, so kann ich das aktuell unter verschiedenen Browsern unter Windows bei mir nicht nachstellen (tritt nicht auf). Unter iOS habe ich so etwas auch schon mal beobachtet, ist aber schwieriger zu debuggen (ich habe keinen MAC, und müsste daher erst mal Safari installieren), Android Devices sind für mich eher noch schwieriger, da ich mir so was erst mal besorgen müsste. Ich versuche das weiter nachzustellen, kann aber etwas dauern.

eki

#4
Könntest Du mir einfach mal, wenn es auftritt, den kompletten generierten HTML Code aus der entwickler Console (per PM) schicken und als Vergleich auch mal den "Gutfall".

stefanru

Hi Eki,

erstmal vielen, vielen Dank das du bereit bist dir mein Problem anzuschauen.

Ich habe aus den Entwicklertools im Chrome die HTML Seite gezogen.

Meistens tritt der Fehler kurz nach einem Seitenwechsel auf.
Somit habe ich bei dem defekten einmal auf die Ölstandsanzeige und wieder zurück zur Stromanzeige gewechselt.

Ich habe die beiden Files auch mal verglichen. Was mir auffällt ist das der Graph für stefan.stromzaehler im Fall das es Defekt ist doppelt so viele Daten anzeigt.
Das ist schon wirklich sehr sehr viel.

Im ok Fall ist die Zeile für den Graph schon
167815 Zeichen lang
Im defekt Fall sind es dann
321881.

Das ist seltsam. Die schiere Menge erstaunt mich auch.
Wenn der Fehler auftritt bleiben alle Graphen ungefüllt.

Im Anhang eine ZIP Datei mit 2 Files:
Graph_ok und Graph_defekt.

Für PM ist das einfach zu groß.
Wahrscheinlich warst du darauf bedacht wegen persönlicher Daten.
Ich habe das ZIP File verschlüsselt und schicke dir per PM das Passwort.

Gruß und vielen Dank,
Stefan

eki

Kannst Du mal mit der angehängten Version testen.

stefanru

Hi Eki,

wow, der Hammer!
Keine Probleme mehr, es geht wunderbar.
Was war denn das Problem?

Ich danke die 1000 mal!

Gruß,
Stefan

eki

#8
Das Problem war, Folgendes: Wenn zu viele Events von FHEM kamen, die jedesmal ein Neuzeichnen angestoßen haben, dann kam das Widget beim Zeichnen durcheinander. Es wurde gerade noch gezeichnet (sprich im HTML rumgebaut) und währenddessen kam der nächste Anlauf, der dann auch im HTML rumbaut, das erzeugt eine Race Condition und kann nicht gut gehen. Dass es nicht immer auftrat, lag eben daran, wie lange das System zum Zeichnen brauchte und wie häufig die Events von FHEM kamen.
Ich habe das jetzt so abgefangen, dass, wenn ein neuer Event kommt, während noch gezeichnet wird, dieser einfach ignoriert wird (ist vielleicht nicht optimal, aber das Beste was mir eingefallen ist). Erst wenn er mit dem aktuellen Neuzeichnen fertig ist, werden wieder Events angenommen.

stefanru

Hi Eki,

perfekt.
Ja das erklärt es.
Meine Stromzähler senden 2 sekündlich ihren Status. In die DB wird alle 30 Sekunden gelogged. Das ist mein log device.
Deshalb wollte ich mit data-get eigentlich auf ein anderes reading. Mir würde ein Update alle 5 Minuten locker langen.
Lieder hat das data-get nicht geholfen.
Du hattest ja schon erklärt dass data-logdevice hier auch eine Rolle spielt.

Ich finde deine Lösung gut.
Eventuell könnte man die Last weiter Senken wenn man ein Attribute min-update-time oder so hätte.
Ich weiß  aber nicht ob so etwas im TabletUI abbildbar ist...

Danke dir,
Stefan

eki

Falls es wirklich stabil läuft, setzt Du den Thread dann noch auf [solved] und ich werde dann die nächsten Tage die neue Version entsprechend freigben.

stefanru

Klar gerne, Funktioniert nach wie vor 1A :-)

Dir nochmals vielen Dank!

stefanru

Hi,

habe heute ein Update gemacht und der fix ist wieder weg.
Hast du ihn noch nicht bereitgestellt?

Gruß und Danke,
Stefan

eki

Nein, bin noch an einer anderen Sache dran. Anfang nächster Woche.

stefanru