Vielen Dank für den Tip!
Hier bin ich fündig geworden:
https://knx-user-forum.de/forum/%C3%...en-datenarchiv
Ankündigung
Einklappen
Keine Ankündigung bisher.
Diagramm-Plugin
Einklappen
X
-
Das geht so nicht. Du musst per WireGate Plugin die Daten in ein RRD schreiben und dieses RRD kann dann per Diagram angezeigt werden.
Das RRD steht für round robin database, das ist eine spezialisierte Datenbank die in hoch komprimierten Format den ganzen zeitlichen Verlauf der Daten speichern kann.
So ein Plugin ist ziemlich einfach, da gibt's hier im Forum Beispiele dafür.
Einen Kommentar schreiben:
-
Kann mir jemand erklären, wie man KNX Größen in einem rrd Diagramm darstellt? Mein bisheriger Ansatz ist folgender (siehe insbesondere Temperatur3); die KNX-Adresse 4/3/0 habe ich im Wiregate Server bei "KNX Gruppenadressen bearbeiten" angelegt und auf der KNX-Adresse landen definitiv Daten:
Code:<diagram_info colspan="1" rowspan="1" format="%.1f °C" series="day" refresh="300" gridcolor="#707070"> <label>Kollektortemperatur</label> <address transform="DPT:9.001">4/0/1</address> <axis position="left" min="10" max="30" unit="°C">Temperaturachse1</axis> <axis position="right" min="0" max="100" unit="%">Temperaturachse2</axis> <rrd yaxis="Temperaturachse1" color="#FF00FF" label="Temperatur1">28.FF2963731501_temp</rrd> <rrd yaxis="Temperaturachse1" color="#00FFFF" label="Temperatur2">28.FF9DE2001603_temp</rrd> <rrd yaxis="Temperaturachse1" color="#00FFFF" label="Temperatur3">4/3/0</rrd> <rrd yaxis="Temperaturachse2" color="#FFFF00" label="Temperatur">28.FF2963731501_temp</rrd> </diagram_info>
Einen Kommentar schreiben:
-
Dann das auch löschen ;-)
Die Legende zeigt nicht die Beschriftung der Achsen, sondern der RRDs, was auch Sinn macht. Bei den RRDs hast du zwei Mal inbound stehen.
Einen Kommentar schreiben:
-
Alles klar, Problem gelöst. Mit der aktuellen SVN Version geht's jetzt bei mir auch.
Einen Kommentar schreiben:
-
Genau dort vermute ich es auch. Ich verstehe aber nicht, warum es dann bei Micha mit genau der Syntax funktioniert.Zitat von JuMi2006 Beitrag anzeigenBeim Busmaster gibt es mehrere Datensätze, ich vermute da das Problem.
Debug und rrdfetch werde ich mal checken.
Ich glaube ich habe lange kein update gemacht. Ich werde mir erstmal die aktuelle Version aus dem svn ziehen. Vielleicht hilft das ja bereits.
Einen Kommentar schreiben:
-
Was sagt denn die Debug Konsole des Browsers?
Was gibt rrdtool fetch aus?
Beim Busmaster gibt es mehrere Datensätze, ich vermute da das Problem.
Einen Kommentar schreiben:
-
Seltsam. Das haut bei mir nicht hin. In den über das Webmin erzeugten Diagrammen sehe ich folgende Datenquellen:
Busmaster:
Temperatursensor:Code:;DEF:ds0=81.27A82F000000_errors.rrd:errors:MAX;
Über rrdtool rrdinfo komme ich an folgendes für den TemperatursensorCode:;DEF:ds0=28.97901B030000_temp.rrd:value:AVERAGE;
Beim Busmaster ist bereits das Archiv etwas anders strukturiert:Code:filename = "28.9F51F0020000_temp.rrd" rrd_version = "0003" step = 300 last_update = 1386372968 ds[value].type = "GAUGE" ds[value].minimal_heartbeat = 900 ds[value].min = -5,5000000000e+01 ds[value].max = 2,5500000000e+05 ds[value].last_ds = "69.5" ds[value].value = 4,7685049490e+03 ds[value].unknown_sec = 0 rra[0].cf = "AVERAGE" rra[0].rows = 2160 rra[0].cur_row = 1985 rra[0].pdp_per_row = 1 rra[0].xff = 5,0000000000e-01 rra[0].cdp_prep[0].value = NaN rra[0].cdp_prep[0].unknown_datapoints = 0 rra[1].cf = "AVERAGE" rra[1].rows = 2016 rra[1].cur_row = 242 rra[1].pdp_per_row = 5 rra[1].xff = 5,0000000000e-01 rra[1].cdp_prep[0].value = 2,0748047421e+02 rra[1].cdp_prep[0].unknown_datapoints = 0 rra[2].cf = "AVERAGE" rra[2].rows = 2880 rra[2].cur_row = 1573 rra[2].pdp_per_row = 15 rra[2].xff = 5,0000000000e-01 rra[2].cdp_prep[0].value = 9,0248047421e+02 rra[2].cdp_prep[0].unknown_datapoints = 0 rra[3].cf = "AVERAGE" rra[3].rows = 8760 rra[3].cur_row = 3114 rra[3].pdp_per_row = 180 rra[3].xff = 5,0000000000e-01 rra[3].cdp_prep[0].value = 7,3040770274e+03 rra[3].cdp_prep[0].unknown_datapoints = 0 rra[4].cf = "MIN" rra[4].rows = 2160 rra[4].cur_row = 1747 rra[4].pdp_per_row = 1 rra[4].xff = 5,0000000000e-01 rra[4].cdp_prep[0].value = NaN rra[4].cdp_prep[0].unknown_datapoints = 0 rra[5].cf = "MIN" rra[5].rows = 2016 rra[5].cur_row = 2 rra[5].pdp_per_row = 5 rra[5].xff = 5,0000000000e-01 rra[5].cdp_prep[0].value = 6,9000000000e+01 rra[5].cdp_prep[0].unknown_datapoints = 0 rra[6].cf = "MIN" rra[6].rows = 2880 rra[6].cur_row = 2378 rra[6].pdp_per_row = 15 rra[6].xff = 5,0000000000e-01 rra[6].cdp_prep[0].value = 6,9000000000e+01 rra[6].cdp_prep[0].unknown_datapoints = 0 rra[7].cf = "MIN" rra[7].rows = 8760 rra[7].cur_row = 6252 rra[7].pdp_per_row = 180 rra[7].xff = 5,0000000000e-01 rra[7].cdp_prep[0].value = 6,9000000000e+01 rra[7].cdp_prep[0].unknown_datapoints = 0 rra[8].cf = "MAX" rra[8].rows = 2160 rra[8].cur_row = 972 rra[8].pdp_per_row = 1 rra[8].xff = 5,0000000000e-01 rra[8].cdp_prep[0].value = NaN rra[8].cdp_prep[0].unknown_datapoints = 0 rra[9].cf = "MAX" rra[9].rows = 2016 rra[9].cur_row = 993 rra[9].pdp_per_row = 5 rra[9].xff = 5,0000000000e-01 rra[9].cdp_prep[0].value = 6,9500000000e+01 rra[9].cdp_prep[0].unknown_datapoints = 0 rra[10].cf = "MAX" rra[10].rows = 2880 rra[10].cur_row = 1009 rra[10].pdp_per_row = 15 rra[10].xff = 5,0000000000e-01 rra[10].cdp_prep[0].value = 6,9500000000e+01 rra[10].cdp_prep[0].unknown_datapoints = 0 rra[11].cf = "MAX" rra[11].rows = 8760 rra[11].cur_row = 918 rra[11].pdp_per_row = 180 rra[11].xff = 5,0000000000e-01 rra[11].cdp_prep[0].value = 7,2500000000e+01 rra[11].cdp_prep[0].unknown_datapoints = 0
Wenn es bei dir funktioniert, müsste dein RRD anders strukturiert sein. Kannst du das mal checken?Code:filename = "81.05AD31000000_errors.rrd" rrd_version = "0003" step = 300 last_update = 1386372671 ds[errors].type = "DERIVE" ds[errors].minimal_heartbeat = 900 ds[errors].min = 0,0000000000e+00 ds[errors].max = 5,0000000000e+01 ds[errors].last_ds = "2" ds[errors].value = 0,0000000000e+00 ds[errors].unknown_sec = 0 ds[read_errors].type = "DERIVE" ds[read_errors].minimal_heartbeat = 900 ds[read_errors].min = 0,0000000000e+00 ds[read_errors].max = 5,0000000000e+01 ds[read_errors].last_ds = "1" ds[read_errors].value = 0,0000000000e+00 ds[read_errors].unknown_sec = 0 ds[reconnects].type = "DERIVE" ds[reconnects].minimal_heartbeat = 900 ds[reconnects].min = 0,0000000000e+00 ds[reconnects].max = 5,0000000000e+01 ds[reconnects].last_ds = "0" ds[reconnects].value = 0,0000000000e+00 ds[reconnects].unknown_sec = 0 ds[reset_errors].type = "DERIVE" ds[reset_errors].minimal_heartbeat = 900 ds[reset_errors].min = 0,0000000000e+00 ds[reset_errors].max = 5,0000000000e+01 ds[reset_errors].last_ds = "0" ds[reset_errors].value = 0,0000000000e+00 ds[reset_errors].unknown_sec = 0 ds[search_errors].type = "DERIVE" ds[search_errors].minimal_heartbeat = 900 ds[search_errors].min = 0,0000000000e+00 ds[search_errors].max = 5,0000000000e+01 ds[search_errors].last_ds = "3" ds[search_errors].value = 0,0000000000e+00 ds[search_errors].unknown_sec = 0 ds[select_errors].type = "DERIVE" ds[select_errors].minimal_heartbeat = 900 ds[select_errors].min = 0,0000000000e+00 ds[select_errors].max = 5,0000000000e+01 ds[select_errors].last_ds = "0" ds[select_errors].value = 0,0000000000e+00 ds[select_errors].unknown_sec = 0 ds[shorts].type = "DERIVE" ds[shorts].minimal_heartbeat = 900 ds[shorts].min = 0,0000000000e+00 ds[shorts].max = 5,0000000000e+01 ds[shorts].last_ds = "4" ds[shorts].value = 0,0000000000e+00 ds[shorts].unknown_sec = 0 ds[status_errors].type = "DERIVE" ds[status_errors].minimal_heartbeat = 900 ds[status_errors].min = 0,0000000000e+00 ds[status_errors].max = 5,0000000000e+01 ds[status_errors].last_ds = "0" ds[status_errors].value = 0,0000000000e+00 ds[status_errors].unknown_sec = 0 rra[0].cf = "MAX" rra[0].rows = 2160 rra[0].cur_row = 478 rra[0].pdp_per_row = 1 rra[0].xff = 5,0000000000e-01 rra[0].cdp_prep[0].value = NaN rra[0].cdp_prep[0].unknown_datapoints = 0 rra[0].cdp_prep[1].value = NaN rra[0].cdp_prep[1].unknown_datapoints = 0 rra[0].cdp_prep[2].value = NaN rra[0].cdp_prep[2].unknown_datapoints = 0 rra[0].cdp_prep[3].value = NaN rra[0].cdp_prep[3].unknown_datapoints = 0 rra[0].cdp_prep[4].value = NaN rra[0].cdp_prep[4].unknown_datapoints = 0 rra[0].cdp_prep[5].value = NaN rra[0].cdp_prep[5].unknown_datapoints = 0 rra[0].cdp_prep[6].value = NaN rra[0].cdp_prep[6].unknown_datapoints = 0 rra[0].cdp_prep[7].value = NaN rra[0].cdp_prep[7].unknown_datapoints = 0 rra[1].cf = "MAX" rra[1].rows = 2016 rra[1].cur_row = 1381 rra[1].pdp_per_row = 5 rra[1].xff = 5,0000000000e-01 rra[1].cdp_prep[0].value = 0,0000000000e+00 rra[1].cdp_prep[0].unknown_datapoints = 0 rra[1].cdp_prep[1].value = 0,0000000000e+00 rra[1].cdp_prep[1].unknown_datapoints = 0 rra[1].cdp_prep[2].value = 0,0000000000e+00 rra[1].cdp_prep[2].unknown_datapoints = 0 rra[1].cdp_prep[3].value = 0,0000000000e+00 rra[1].cdp_prep[3].unknown_datapoints = 0 rra[1].cdp_prep[4].value = 0,0000000000e+00 rra[1].cdp_prep[4].unknown_datapoints = 0 rra[1].cdp_prep[5].value = 0,0000000000e+00 rra[1].cdp_prep[5].unknown_datapoints = 0 rra[1].cdp_prep[6].value = 0,0000000000e+00 rra[1].cdp_prep[6].unknown_datapoints = 0 rra[1].cdp_prep[7].value = 0,0000000000e+00 rra[1].cdp_prep[7].unknown_datapoints = 0 rra[2].cf = "MAX" rra[2].rows = 2880 rra[2].cur_row = 27 rra[2].pdp_per_row = 15 rra[2].xff = 5,0000000000e-01 rra[2].cdp_prep[0].value = 0,0000000000e+00 rra[2].cdp_prep[0].unknown_datapoints = 0 rra[2].cdp_prep[1].value = 0,0000000000e+00 rra[2].cdp_prep[1].unknown_datapoints = 0 rra[2].cdp_prep[2].value = 0,0000000000e+00 rra[2].cdp_prep[2].unknown_datapoints = 0 rra[2].cdp_prep[3].value = 0,0000000000e+00 rra[2].cdp_prep[3].unknown_datapoints = 0 rra[2].cdp_prep[4].value = 0,0000000000e+00 rra[2].cdp_prep[4].unknown_datapoints = 0 rra[2].cdp_prep[5].value = 0,0000000000e+00 rra[2].cdp_prep[5].unknown_datapoints = 0 rra[2].cdp_prep[6].value = 0,0000000000e+00 rra[2].cdp_prep[6].unknown_datapoints = 0 rra[2].cdp_prep[7].value = 0,0000000000e+00 rra[2].cdp_prep[7].unknown_datapoints = 0 rra[3].cf = "MAX" rra[3].rows = 8760 rra[3].cur_row = 1948 rra[3].pdp_per_row = 180 rra[3].xff = 5,0000000000e-01 rra[3].cdp_prep[0].value = 0,0000000000e+00 rra[3].cdp_prep[0].unknown_datapoints = 0 rra[3].cdp_prep[1].value = 0,0000000000e+00 rra[3].cdp_prep[1].unknown_datapoints = 0 rra[3].cdp_prep[2].value = 0,0000000000e+00 rra[3].cdp_prep[2].unknown_datapoints = 0 rra[3].cdp_prep[3].value = 0,0000000000e+00 rra[3].cdp_prep[3].unknown_datapoints = 0 rra[3].cdp_prep[4].value = 0,0000000000e+00 rra[3].cdp_prep[4].unknown_datapoints = 0 rra[3].cdp_prep[5].value = 0,0000000000e+00 rra[3].cdp_prep[5].unknown_datapoints = 0 rra[3].cdp_prep[6].value = 0,0000000000e+00 rra[3].cdp_prep[6].unknown_datapoints = 0 rra[3].cdp_prep[7].value = 0,0000000000e+00 rra[3].cdp_prep[7].unknown_datapoints = 0
Einen Kommentar schreiben:
-
Habe es gerade ausprobiert. Offenbar ist das RRD für die Busfehler so angelegt, dass nur MAX funktioniert. So geht es bei mir:Zitat von Hauke Beitrag anzeigenIch hatte vor einiger Zeit mal versucht, die Fehlerrate der Busmaster im Diagramm darzustellen. Das klappt auch mit dem Diagrammgenerator aus dem WG, nicht aber in der Cometvisu.
Code:<rrd yaxis="Y1" color="#11BB33" label="Errors" datasource="MAX">81.079A2F000000_errors</rrd>
Einen Kommentar schreiben:
-
Genau das hab ich gebraucht! Werde ich heute abend gleich mal ausprobieren.
Dann mal gleich zur nächsten Frage
Ich hatte vor einiger Zeit mal versucht, die Fehlerrate der Busmaster im Diagramm darzustellen. Das klappt auch mit dem Diagrammgenerator aus dem WG, nicht aber in der Cometvisu. Ich erinnere mich dunkel, dass in dem Code aus dem Diagrammgenerator anstatt "value" "errors" oder sowas gestanden hat. Gibt's dafür in der CometVisu auch bereits eine Lösung?
Einen Kommentar schreiben:
-
Das Plugin kann damit auch umgehen:
Code:<rrd datasource="MIN | MAX | AVERAGE">28.2747F0020000_temp</rrd>
Einen Kommentar schreiben:
-
Hier mal als Beispiel: Graph vom demo.wiregate.de
Code:[URL]http://demo.wiregate.de/graph.pl?--start=now-7days;--end=now;-X=0;-W=WireGate;--slope-mode[/URL]; -h=400;-w=650;--full-size-mode;--vertical-label=° Celsius;--title=Temperaturen; -c=BACK%23000000;-c=CANVAS%23000000;-c=SHADEA%23000000;-c=SHADEB%23000000; -c=GRID%23960000;-c=MGRID%236B4F42;-c=FONT%23FFFFFF;-c=AXIS%23000000;-c=FRAME%23000000;-c=ARROW%23000080; DEF:ds0=26.D19883000000_temp.rrd:value:[COLOR=red]MAX[/COLOR];LINE1:ds0%23FF0000:AMSv1 (temp); DEF:ds1=26.D19883000000_temp.rrd:value:[COLOR=red]MIN[/COLOR];LINE1:ds1%230000FF:AMSv1 (temp); DEF:ds2=26.D19883000000_temp.rrd:value:[COLOR=red]AVERAGE[/COLOR];LINE1:ds2%2300FF00:AMSv1 (temp);
Einen Kommentar schreiben:
-
Kommt darauf an, wie das RRD angelegt ist. Die Standardeinstellung im WireGate sieht vor, das auch MIN- und MAX-Werte mit abgelegt werden. Die kann ich über rrdgraph bzw. den Diagrammgenerator vom WG auch abrufen. Das geschieht also (sofern bei Erstellung des RRD angelegt) vollautomatisch. Ebenso die Mittelung der eingehenden Werte für den standardmäßig anzeigten AVG.
Das "Gezappel" deiner Windgeschwindigkeiten solltest du also über die steps und die Aktualisierungsrate der Werte in den Griff bekommen können. Standard für den step sind 300s. Je nachdem wie oft du einen Wert in das RRD schreibst, bekommst du dadurch bereits eine geglättete Kurve (natürlich nur, wenn du innerhalb der 300s bzw. dem in deinem RRD definierten step mehrmals den Wert ins RRD schreibst). Also Update-Intervall runter oder step hoch.
RRDtool - rrdcreate ist dazu grundsätzlich hilfreich, aber sehr knapp formuliert und mit wenig Beispielen versehen. Ich habe zu hause auch noch einige Dokumente, die ein wenig leichter verständlich sind, die man mit google aber auch recht schnell findet. Kann ich dir bei Bedarf auch zuschicken.
Einen Kommentar schreiben:
-
Prinzipiell müsste man ja irgendwie die Werte erstmal normieren. Du schreibst ja nur die aktuellen Temperaturen in das RRD und hast damit keine Min/Max Werte zur Verfügung.Zitat von Hauke Beitrag anzeigenBesteht grundsätzlich eigentlich auch die Möglichkeit, die in den RRD's enthaltenen Min/Max-Werte im Diagramm darzustellen?
Musste leider auch erstmal schmerzlich erfahren, dass die RRDs eigentlich total doof sind und nix selber machen :-)
Leider hatte ich bis jetzt noch keine Zeit, mich um die Berechnung zu kümmern.
Mein Problem ist z.B. auch bei der Darstellung von Windgeschwindigkeiten, dass der Graph eigentlich viel zu sehr hin- und herzappelt. Hier müssten die Werte vorher normiert werden, so dass sie einfach als Kurve angezeigt werden und nicht ein wilder Haufen von "Spitzen" sind.
Ähnliches müsste man sicherlich auch für die Min/Max Werte machen.
Irgendwelche Statistiker anwesend hier?! :-)
Netsrac
Einen Kommentar schreiben:

Einen Kommentar schreiben: