NEWS
Tabellen-Adapter analog FLOT?
-
@homoran Ich habe mir ein Script erstellt das mit für mein go-e Charger ein Ladelog erstellt. Das schreibt am Ladeende (genauer: Wenn das Kabel abgezogen wird) die geladenen kWh und die RFID-Karte mit der freigeschaltet wurde in einen Datenpunkt. Diese beiden Datenpunkte möchte ich als Tabelle darstellen. Ggf. später noch mehr Datenpunkte.
Schön wäre jetzt ein Adapter wo ich (beliebig viele) Datenpunkte auswählen kann. Dann möchte ich noch ein oder mehrere der Datenpunkte als Trigger wählen und dann werden für jeden Trigger der Zeitstempel und die Werte der ausgewählten Datenpunkte zu diesem Zeitpunkt als Tabellenzeile in ein JSON-Objekt geschrieben bzw. in einen Ausgabepunkt als JSON-Objekt. Maximale Anzahl muss man natürlich auch noch angeben können.
Wenn man seltene Ereignisse hat ist ein Diagramm nicht immer hilfreich. Mit so einem Adapter könnte man sich leicht Tabellen beliebiger Datenpunkte zusammenklicken.
eventlist schaut nur auf einen Datenpunkt wie mir scheint. Und wenn ich dann für die Anpassung wieder mit Scripten hantieren muss, kann ich das auch gleich selbst machen. Wenn ich rausfinde wie man die History-Datenpunkte ausliest....
-
@silbaer sagte in Tabellen-Adapter analog FLOT?:
Ich habe mir ein Script erstellt das mit für mein go-e Charger ein Ladelog erstellt. Das schreibt am Ladeende (genauer: Wenn das Kabel abgezogen wird) die geladenen kWh und die RFID-Karte mit der freigeschaltet wurde in einen Datenpunkt. Diese beiden Datenpunkte möchte ich als Tabelle darstellen. Ggf. später noch mehr Datenpunkte.
das riecht genau nach dem vermuteten eventlist Widget
so mache ich es mit der Poolsteuerung
-
@homoran Äh, nein, nicht wirklich. Erstens hast du hier einen Datenpunkt für die Eventlist. D.h. mit schon vorhandenen Daten kann ich nicht (so einfach) arbeiten. Zweitens: Du hast zwei Spalten: Timestamp und EventData. Den Inhalt von EventData muss ich mir per Script zusammenbauen. Dann kann ich aber auch gleich ein "richtiges" Tabellen-JSON bauen. Was ich möchte ist für jeden Datenpunkt eine Spalte. Nicht ohne Grund erwähnte ich im Ursprungspost CSV...
Also egal wie, ich brauche offensichtlich ein Script dass mir die Daten so aufbereitet wie ich das gerne hätte. Mit einem JSON Table Objekt bin ich wohl am flexibelsten.
-
@silbaer sagte in Tabellen-Adapter analog FLOT?:
Was ich möchte ist für jeden Datenpunkt eine Spalte. Nicht ohne Grund erwähnte ich im Ursprungspost CSV...
diese Verknüpfung war nicht ersichtlich!
-
@homoran Naja, die Beschreibung des Workflows und der Anforderungen in meinem zweiten Post ist meilenweit vom eventlist Widget entfernt. Wenn ich das mit flot vergleiche will ich eben nicht scripten. Aber egal, geht ja offensichtlich nicht ohne. Am Ende nicht so wild, aber halt nicht so einfach wie gedacht.
-
@silbaer ich habe immer noch nicht verstanden wie es ohne jedes Skript gehen soll.
bei mir schreibt ein x-beliebiges Skript das sowieso läuft statt debug oututs diese in einen Datenpunkt.
in diesen Datenpunkt könnten auch weitere Skripte schreiben.Deine "Anforderung"
@silbaer sagte in Tabellen-Adapter analog FLOT?:
Also einen Adapter in dem ich mir Datenpunkte raussuchen kann und diese bekomme ich dann als csv, JSON-Tabellenobjekt, HTML,...
verstehe ich auch beim wiederholten Lesen nicht als Wunsch einer vielspaltigen Tabelle.
Im Prinzip kann man daraus alles oder nichts ableiten, was mich zu der Nachfrage veranlasste.Selbst wenn du mehrere Spalten (je [historisiertem??] Datenpunkt) erzeugen könntest, wäre es eben nicht analog Flot, wenn da eine sinnvolle mehrspaltige Tabelle bei herauskommt.
Bei einer Flot Chart mit mehreren Datenreihen werden die jeweiligen Linien anhand der Timestamps und des dazugehörigen Wertes gezeichnet.
Diese Timestamps sind aber in den Linien unterschiedlich, auch wenn es nur Millisekunden sein sollten.
Das würde bei "analog Flot" in einer Tabelle zu jeweils einer neuen Zeile führen.Was also willst du als Ergebnis haben?
in deinem zweiten Post
Ich habe mir ein Script erstellt das mit für mein go-e Charger ein Ladelog erstellt. Das schreibt am Ladeende (genauer: Wenn das Kabel abgezogen wird) die geladenen kWh und die RFID-Karte mit der freigeschaltet wurde in einen Datenpunkt.
beschreibst du genau das von mir (beim Pumpenlog) verwendete Szenario: Ein Skript erzeugt ein Log. Das willst du darstellen.
-
@homoran
Hm ich denke das ich aus dem ersten Post schon verstanden habe was er wollte.
Er will eine Tabelle ausgeben
Er will die reihenfolge der Spalten aus den datenpunkten selbst bestimmen
Ggfs. will er je Spalte auch eine Transformation, also eine Formel wie bspw eine Multiplikation zur einheitenumrechnung
Er will je Spalte die Formatierung und ggfs. irgendwelche einheitennamen anhängen
Er will Spaltenüberschriften vorgeben können
Er will eine maximale Anzahl von anzuzeigenden Zeilen angeben können.Mehr oder weniger das gleiche wie flot
Nur das die Daten nicht grafisch sondern als
Tabelle ausgegeben wird -
gelöscht
-
@oliverio sagte in Tabellen-Adapter analog FLOT?:
Hm ich denke das ich aus dem ersten Post schon verstanden habe was er wollte.
Wow, dann muss deine Glaskugel um Längen besser sein als meine
@oliverio sagte in Tabellen-Adapter analog FLOT?:
Er will eine Tabelle ausgeben
Das ist das einzige was ich daraus lesen kann. Den Rest den du aufzählst sehe ich auch jetzt beim besten Willen nicht in dem Post.
Deshalb bat ich ja um zusätzliche Infos.Aber wenn wir deine Annahmen als Basis nehmen habe ich keine Ahnung wie ein noch zu entwickelnder Adapter diese Anforderungen mit historisierten Daten diverser Datenpunkte halbwegs sinnvoll synchronisiert bekommt.
Lasse mich aber gerne eines besseren belehren.
-
@homoran Eigentlich dachte ich spätestens im zweiten Post hätte ich alles klar genug erklärt, aber nochmal anders/ausführlicher:
Fangen wir mal mit FLOT an: Dort suche ich mir per Dialog einen History Datenpunkt (DP1) aus und einen Zeitraum der Dargestellt werden soll. Jetzt habe ich eine Reiche von Werten und Flot stellt die in einem Diagramm dar. Statt eines Diagramms hätte ich jetzt aber gerne eine Tabelle: 1. Spalte "Timestamp", 2. Spalte"DP1" (wobei die Tabellenheader natürlich angepasst werden müssen aber erstmal irrelevant)
Jetzt wähle ich einen zweiten Datenpunkt (DP2) aus. Wie du schon richtig erkannt hast, werden die Datenpunkte nicht den selben Timestamp haben. Deswegen soll ja ein DP als "Trigger" fungieren, so dass für jeden Wert dieses Datenpunktes eine Zeile in der Tabelle erzeugt wird. Die Werte von DP2 (und allen weiteren DPs) sollen für den Zeitpunkt des Trigger-DPs errechnet werden. Das mach Flot ja auch je nach Chart Type unterschiedlich (wobei in meine Fall der einfachste Fall "Schritte" der richtige wäre).
Beispiel:
Datenpunkt 1Timestamp | Value 10:00 Uhr | V1 10:10 Uhr | V2 10:20 Uhr | V3 10:30 Uhr | V4
Datenpunkt 2
Timestamp | Value 9:00 Uhr | W1 10:15 Uhr | W2 10:18 Uhr | W3 10:22 Uhr | W4
Daraus soll folgende Tabelle werden
Timestamp | DP2 | DP1 10:00 Uhr | W1 | V1 10:10 Uhr | W1 | V2 10:20 Uhr | W3 | V3 10:30 Uhr | W4 | V4
Das dazugehörige JSON müsste dann so aussehen
[ { Timestamp: "10:00 Uhr", DP2: "W1", DP1: "V1" }, { Timestamp: "10:10 Uhr", DP2: "W1", DP1: "V2" }, { Timestamp: "10:20 Uhr", DP2: "W3", DP1: "V3" }, { Timestamp: "10:30 Uhr", DP2: "W4", DP1: "V4" } ]
Das ganze kann man jetzt natürlich auch mit drei, vier,... Datenpunkten machen.Im Grunde ist in Flot alles schon da: Auswahl der Datenpunkte, Berechnung/Interpolieren der Werte zwischen den Werten eines Datenpunktes. Nur die Ausgabe müsste halt in einer anderen Form passieren.
-
@silbaer sagte in Tabellen-Adapter analog FLOT?:
Im Grunde ist in Flot alles schon da: Auswahl der Datenpunkte, Berechnung/Interpolieren der Werte zwischen den Werten eines Datenpunktes
Jein!
Mit Interpolation meinst du wahrscheinlich die Aggregation.
Ob das auch bei Tabellen einsetzbar ist weiß ich schlicht unf ergreifend nicht.aber ich sehe hier noch ein "Problem":
@silbaer sagte in Tabellen-Adapter analog FLOT?:
Wie du schon richtig erkannt hast, werden die Datenpunkte nicht den selben Timestamp haben. Deswegen soll ja ein DP als "Trigger" fungieren, so dass für jeden Wert dieses Datenpunktes eine Zeile in der Tabelle erzeugt wird.
klingt einfach, aber ob es das ist weiß ich auch nicht.
in Flot wird jede Kurve durch ihre Messpunkte gezogen, egal ob die Timestamps übereinpassen oder nicht. Ist ha auch egal, da die Punkte durch Linien (egal welcher Art) verbunden werden.gibt es jetzt Datenreihen bei denen die Daten wesentlich seltener aufgezeichnet werden muss in history eingestellt werden, wie oft der selbe Wert wiederholt gespeichert werden soll, damit die Linie noch sichtbar bleibt. Liegen nämlich im Bereich des Grafen nicht mindestens zwei historisierte Punkte ist es aus mit der Kurve.
Wie soll jetzt in einer Tabelle mit solchen seltenen Werten umgegangen werden?
extrapoliert hieße es wird in einer Zeile der Wert eingetragen. Die Vervielfältigung analog Flot für "alle" Zeilen müsste passend zum kürzesten Intervall in History geschehen. -
@homoran said in Tabellen-Adapter analog FLOT?:
@silbaer sagte in Tabellen-Adapter analog FLOT?:
Im Grunde ist in Flot alles schon da: Auswahl der Datenpunkte, Berechnung/Interpolieren der Werte zwischen den Werten eines Datenpunktes
Jein!
Mit Interpolation meinst du wahrscheinlich die Aggregation.Nein. Ich meine schlicht und ergreifend wie die einzelnen Messpunkte im Grafen verbunden werden. Das wird mit Chart Type eingestellt. Lies mal hier https://www.iobroker.net/docu/index-195.htm?page_id=198&lang=de#Datenpunktparameter
Linie: Die Daten werden als Linien dargestellt. Die einzelnen Punkte werden als Gerade miteinander verbunden.
Bar: Jeder einzelne Messpunkt der Daten wird als vertikaler Balken dargestellt. Diese Darstellung empfiehlt sich nur bei wenigen Messpunkten.
Scatter plot: Die Daten werden als isolierte Punkte dargestellt. Die einzelnen Punkte werden nicht miteinander verbunden.
Schritte: Die Daten werden als Linien dargestellt. Die einzelnen Punkte werden bis zur nächsten Änderung horizontal als Gerade miteinander verbunden. Zum Zeitpunkt der Änderung wird eine Stufe eingelegt.
Spline: Die Daten werden als Linien dargestellt. Die einzelnen Punkte werden als gebogene Kurve miteinander verbunden.@homoran said in Tabellen-Adapter analog FLOT?:
Ob das auch bei Tabellen einsetzbar ist weiß ich schlicht unf ergreifend nicht.
aber ich sehe hier noch ein "Problem":
@silbaer sagte in Tabellen-Adapter analog FLOT?:
Wie du schon richtig erkannt hast, werden die Datenpunkte nicht den selben Timestamp haben. Deswegen soll ja ein DP als "Trigger" fungieren, so dass für jeden Wert dieses Datenpunktes eine Zeile in der Tabelle erzeugt wird.
klingt einfach, aber ob es das ist weiß ich auch nicht.
Doch ist es. Du hast doch geschlossene Kurven in Flot, oder? Was meinst du wie die Punkte dazwischen gezeichnet werden?
in Flot wird jede Kurve durch ihre Messpunkte gezogen, egal ob die Timestamps übereinpassen oder nicht. Ist ha auch egal, da die Punkte durch Linien (egal welcher Art) verbunden werden.
Richtig. P1(x,y) und P2(x,y) repräsentieren zwei Punkte im Grafen. Für jeden diskreten Wert P'(x) zwischen P1(x) und P2(x) wird je nach Chart Type ein P'(y) berechnet. Ob x und y nun Pixel oder Timestamp/Wert Paare sind ist egal. Die Berechnung ist die selbe nur mit anderen Zahlenwerten. Und genau das mach Flot ja.
gibt es jetzt Datenreihen bei denen die Daten wesentlich seltener aufgezeichnet werden muss in history eingestellt werden, wie oft der selbe Wert wiederholt gespeichert werden soll, damit die Linie noch sichtbar bleibt. Liegen nämlich im Bereich des Grafen nicht mindestens zwei historisierte Punkte ist es aus mit der Kurve.
Wie soll jetzt in einer Tabelle mit solchen seltenen Werten umgegangen werden?
Richtig. Da gäbe es verschiedene Strategien. Von "Kein Wert" bis hin zu "gehe zeitlich so weit zurück (oder vor) bis du einen Wert findest". Beides geht ohne das in history irgendwelche Einstellungen geändert werden müssen, wobei die letzte Option die sinnvollere ist. Letzteres müsste in history auch eine billige Aktion sein wenn ich das richtig verstanden habe wie da die Datenhaltung funktioniert. In SQL auch (mit Index auf timestamp), und in InFlux sowieso.
extrapoliert hieße es wird in einer Zeile der Wert eingetragen. Die Vervielfältigung analog Flot für "alle" Zeilen müsste passend zum kürzesten Intervall in History geschehen.
Nein. Wenn du mit "Intervall" ein regelmäßiges zeitliches Intervall meinst: Das ist nicht nötig. Siehe oben. Für jede Zeile müsste für jeden zusätzlichen Datenpunkt genau ein Wert interpoliert werden. Nimmt man Chart Type "Schritte" aka "letzter Wert" ist das ein einfaches Nachschlagen in der Werteliste, nimmt man Chart Type "Linie" ist das ein einfacher Dreisatz: P'(y) = ( (P'(x)-P1(x)) / (P2(x)-P1(x)) * (P2(y)-P1(y)) + P1(y)
Aber wie gesagt: Die ganze Funktionalität ist schon in Flot enthalten.
-
@silbaer sagte in Tabellen-Adapter analog FLOT?:
Lies mal hier
das kenne ich. Hab ich ja vor 7 Jahren geschrieben.
@silbaer sagte in Tabellen-Adapter analog FLOT?:
Die ganze Funktionalität ist schon in Flot enthalten.
nur ist flot ein 3rd Party Programm. Der Adapter adaptiert dieses in ioBroker.
diese gesamten Berechnungen werden aus flot https://www.flotcharts.org/ übernommen.das gleiche gilt für eCharts. https://echarts.apache.org/en/index.html
Da bin ich mal gespannt ob ein Entwickler das mit Tabellen umsetzen kann (und will)
-
@homoran
Hm man könnte einfach den Adapter nehmen und anstatt malen die Werte in eine HTML Tabelle ausgeben. -
@oliverio sagte in Tabellen-Adapter analog FLOT?:
@homoran
Hm man könnte einfach den Adapter nehmen und anstatt malen die Werte in eine HTML Tabelle ausgeben.wie gesagt. ich bin gespannt.
finde die Idee interessant.Interpolation von bool oder string wird bestimmt lustig
-
@homoran said in Tabellen-Adapter analog FLOT?:
Interpolation von bool oder string wird bestimmt lustig
Kannst du dir in Flot ja jetzt schon anschauen
Davon abgesehen geht "Schritte" aka "letzter Wert" in einer Tabelle immer -
Also der beste Weg um überhaupt an die richtigen Daten zu kommen, wäre, das über eine DAtenbank wie bspw influxdb zu steuern. influx kann aggregation und sogar interpolation von daten.
diese daten können dann per sql abgerufen werden und per skript in ein beliebiges zielformat (html,csv,json) geschrieben werden -
@silbaer Erst mal vorweg: ich finde den Ansatz weiterhin "akademisch" interessant.
aber:
du bist der erste User der danach fragt. Und das bei 65.000 Usern und über 8+ Jahre.
da frage ich mich wie das denn bisher umgesetzt wurde.Das bringt mich -hartnäckig (oder doch starrsinnig weil ich es nicht verstehe?) wie ich bin- zu der bereits früher gestellten Frage:
wenn du doch sowieso über ein Skript die Daten in einen Datenpunkt schreibst, warum formatierst du sie dabei nicht direkt in ein dir genehmes Format (z.B. Text, JSON oder HTML), so dass du es ähnlich wie ich nach deinem Gusto darstellen kannst.Ich gebe zu, dass meine Anwendung viel Text enthält, bei dem es nichts zu extrapolieren gibt, allerdings auch Messwerte.
So wie ich dich verstanden habe wären das bei dir zum Ende des Ladevorgangs die entsprechenden Ladedaten, die dann per csv, JSON oder HTML als Tabellenzeile in den DP geschrieben würden.
-
@homoran said in Tabellen-Adapter analog FLOT?:
@silbaer Erst mal vorweg: ich finde den Ansatz weiterhin "akademisch" interessant.
aber:
du bist der erste User der danach fragt. Und das bei 65.000 Usern und über 8+ Jahre.
da frage ich mich wie das denn bisher umgesetzt wurde.Das frage ich mich auch. Bzw. das werden alle per Script gelöst haben. Das sind zumindest die Ansätze die ich so gefunden habe. Ist ja nicht so, dass ich nicht vorher gesucht hätte...
Brauchen tut man so was nicht, aber für rapid prototyping ist so eine zusammenklick-Lösung natürlich nett. Und vielleicht für Leute die keine Zeit/Lust haben sich näher mit Scripten zu befassen. Rein mit Blockly wird eine Lösung schwierig (wenn überhaupt möglich), also muss man wieder javascript können...
Das bringt mich -hartnäckig (oder doch starrsinnig weil ich es nicht verstehe?) wie ich bin- zu der bereits früher gestellten Frage:
wenn du doch sowieso über ein Skript die Daten in einen Datenpunkt schreibst, warum formatierst du sie dabei nicht direkt in ein dir genehmes Format (z.B. Text, JSON oder HTML), so dass du es ähnlich wie ich nach deinem Gusto darstellen kannst.Das werde ich jetzt auch so machen. Ein Script das die von mir gewünschte Tabelle als JSON-Objekt enthält. Das skinning kann ich dann in der Visu machen. So jedenfalls der Plan.
Ich gebe zu, dass meine Anwendung viel Text enthält, bei dem es nichts zu extrapolieren gibt, allerdings auch Messwerte.
So wie ich dich verstanden habe wären das bei dir zum Ende des Ladevorgangs die entsprechenden Ladedaten, die dann per csv, JSON oder HTML als Tabellenzeile in den DP geschrieben würden.
Genau. Für die Visu als JSON-Objekt. Vielleicht will ich später noch was mit den Daten machen, da muss ich mal schauen ob man da sowas wie ein Exportscript machen kann. Oder wie @OliverIO vorgeschlagen hat eine "richtige" Datenbank. Dafür ist allerdings mein aktuell eingesetzter Raspi 2B mit 1MB ein kleines bisschen schwach denke ich... Ich bin am überlegen über kurz oder lang auf einen richtigen Rechner um zu steigen, aber momentan fehlt mir dazu noch so ein bisschen der Elan und Hardwareempfehlungen...
-
Moin Zusammen.
Ich habe die Diskussion hier mit Interesse verfolgt, und würde gerne mal eine Frage dazu stellen, da die Thematik sich (zumindest in meinen Augen) gleicht:
Ich würde gerne meine im history adapter gesammelten Daten der Energiemessung in Excel am PC aufbereiten (als Pivot, mit Durchschnittswerten über wählbare Zeiträume, Max Werten etc). Jetzt speichert ja anscheinend history die Daten als json Datei? Kann ich die jetzt einfach regelmäßig am Raspi abgreifen und irgendwohin kopieren im laufenden Betrieb und dann am PC in Excel importieren, um so die Rohdatentabelle zu erzeugen?
Gruß