Ankündigung

Einklappen
Keine Ankündigung bisher.

Diagramm-Plugin

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

  • DJens
    antwortet
    Vielen Dank für den Tip!
    Hier bin ich fündig geworden:
    https://knx-user-forum.de/forum/%C3%...en-datenarchiv

    Einen Kommentar schreiben:


  • Chris M.
    antwortet
    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:


  • DJens
    antwortet
    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:


  • MicHau
    antwortet
    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:


  • MGK
    antwortet
    bitte löschen... Problem saß vor der Tastatur...

    Einen Kommentar schreiben:


  • Hauke
    antwortet
    Alles klar, Problem gelöst. Mit der aktuellen SVN Version geht's jetzt bei mir auch.

    Einen Kommentar schreiben:


  • Hauke
    antwortet
    Zitat von JuMi2006 Beitrag anzeigen
    Beim Busmaster gibt es mehrere Datensätze, ich vermute da das Problem.
    Genau dort vermute ich es auch. Ich verstehe aber nicht, warum es dann bei Micha mit genau der Syntax funktioniert.

    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:


  • JuMi2006
    antwortet
    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:


  • Hauke
    antwortet
    Seltsam. Das haut bei mir nicht hin. In den über das Webmin erzeugten Diagrammen sehe ich folgende Datenquellen:
    Busmaster:
    Code:
    ;DEF:ds0=81.27A82F000000_errors.rrd:errors:MAX;
    Temperatursensor:
    Code:
    ;DEF:ds0=28.97901B030000_temp.rrd:value:AVERAGE;
    Über rrdtool rrdinfo komme ich an folgendes für den Temperatursensor
    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
    Beim Busmaster ist bereits das Archiv etwas anders strukturiert:
    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
    Wenn es bei dir funktioniert, müsste dein RRD anders strukturiert sein. Kannst du das mal checken?

    Einen Kommentar schreiben:


  • MicHau
    antwortet
    Zitat von Hauke Beitrag anzeigen
    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.
    Habe es gerade ausprobiert. Offenbar ist das RRD für die Busfehler so angelegt, dass nur MAX funktioniert. So geht es bei mir:
    Code:
    <rrd yaxis="Y1" color="#11BB33" label="Errors" datasource="MAX">81.079A2F000000_errors</rrd>

    Einen Kommentar schreiben:


  • Hauke
    antwortet
    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:


  • MicHau
    antwortet
    Das Plugin kann damit auch umgehen:
    Code:
    <rrd datasource="MIN | MAX | AVERAGE">28.2747F0020000_temp</rrd>

    Einen Kommentar schreiben:


  • Hauke
    antwortet
    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:


  • Hauke
    antwortet
    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:


  • netsrac
    antwortet
    Zitat von Hauke Beitrag anzeigen
    Besteht grundsätzlich eigentlich auch die Möglichkeit, die in den RRD's enthaltenen Min/Max-Werte im Diagramm darzustellen?
    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.

    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:

Lädt...
X