Hinweis: Schöne Alternative für Charts/Plots mit Grafana und DBLog (MySQL)

Begonnen von Thyraz, 08 Oktober 2017, 15:02:38

Vorheriges Thema - Nächstes Thema

kadettilac89

Zitat von: Happyuser20 am 27 Januar 2019, 18:52:42
Hallo

Hab eine Datei angehängt von den Impulsen heute 6:00 - 16:00. ist jede Menge, hoffe das passt so.

"124619,"       "1"","                "1548602173018"","               "1"""
  unwichtig      ChannelID           Timstamp                              Value

Habe die 150 gewählt, weil mein Stromzähler 150 Impulse pro kWh liefert, war nur so ein Noobversuch  :D

Gruß
HappyUser20

hab mich etwas mit deinen daten gespielt ... aggregation 150 sekunden bring ein ähnliches bild wie im volkszähler. musst halt mal prüfen welcher zeitraum zum aggregieren verwendet wird. du kannst im plot oben auf export klicken und in der exportierten datei prüfen wie viel zeit zwischen den einzelnen punkten ist. datenbank heißt bei mir fhem_mysql. musst anpassen, rest sollte bei dir importierbar sein. channel_id = 1 ...

zur erklärung:


SELECT
  cast((timestamp/1000)/150 as signed integer)*150 as time_sec,
  sum(value)/150*3600/150 as value,
  "150sec" as metric
FROM data
WHERE cast(timestamp/1000 as signed integer) > $__unixEpochFrom() and cast(timestamp/1000 as signed integer) < $__unixEpochTo() and
channel_id = 1
GROUP BY 1
ORDER BY 1


cast((timestamp/1000)/150 as signed integer)*150 as time_sec,
==> 150 ist in diesem fall die aggregation 2,5 minuten.

  sum(value)/150*3600/150 as value,
==> sum(value) = anzahl der ticks / signale vom reader in den 2,5 minuten
==> sum(value)/150*3600/150 as value .... anzahl der ticks/<zeit in sekunden> * <sekunden pro stunde>/<ticks pro kw/h>

kw/h ist leistung = arbeit durch zeit, anzahl der ticks ist hier die arbeit




{
  "annotations": {
    "list": [
      {
        "builtIn": 1,
        "datasource": "-- Grafana --",
        "enable": true,
        "hide": true,
        "iconColor": "rgba(0, 211, 255, 1)",
        "name": "Annotations & Alerts",
        "type": "dashboard"
      }
    ]
  },
  "editable": true,
  "gnetId": null,
  "graphTooltip": 0,
  "id": 15,
  "links": [],
  "panels": [
    {
      "aliasColors": {
        "150sec": "#3f6833",
        "1h": "#0a50a1",
        "Stromverbrauch_150sec": "#0a50a1",
        "Total": "#cffaff"
      },
      "bars": false,
      "dashLength": 10,
      "dashes": false,
      "datasource": "FHEM MySQL",
      "fill": 1,
      "gridPos": {
        "h": 9,
        "w": 12,
        "x": 0,
        "y": 0
      },
      "id": 2,
      "interval": "1m",
      "legend": {
        "alignAsTable": false,
        "avg": true,
        "current": false,
        "max": true,
        "min": true,
        "rightSide": true,
        "show": true,
        "total": false,
        "values": true
      },
      "lines": true,
      "linewidth": 1,
      "links": [],
      "nullPointMode": "connected",
      "percentage": false,
      "pointradius": 5,
      "points": false,
      "renderer": "flot",
      "seriesOverrides": [
        {
          "alias": "1h",
          "bars": true,
          "lines": false
        },
        {
          "alias": "Total",
          "color": "#ffffff",
          "hideTooltip": true
        }
      ],
      "spaceLength": 10,
      "stack": false,
      "steppedLine": false,
      "targets": [
        {
          "format": "time_series",
          "group": [],
          "groupBy": [
            {
              "params": [
                "$__interval"
              ],
              "type": "time"
            },
            {
              "params": [
                "null"
              ],
              "type": "fill"
            }
          ],
          "hide": false,
          "metricColumn": "none",
          "orderByTime": "ASC",
          "policy": "default",
          "rawQuery": true,
          "rawSql": "SELECT\r\n  cast((timestamp/1000)/3600 as signed integer)*3600 as time_sec,\r\n  sum(value)/3600*3600/150 as value,\r\n  \"1h\" as metric\r\nFROM data\r\nWHERE cast(timestamp/1000 as signed integer) > $__unixEpochFrom() and cast(timestamp/1000 as signed integer) < $__unixEpochTo() and\r\nchannel_id = 1\r\nGROUP BY 1\r\nORDER BY 1\r\n",
          "refId": "A",
          "resultFormat": "time_series",
          "select": [
            [
              {
                "params": [
                  "ChannelID"
                ],
                "type": "column"
              }
            ]
          ],
          "table": "volkszaehler",
          "tags": [],
          "timeColumn": "Value",
          "timeColumnType": "int",
          "where": [
            {
              "name": "$__unixEpochFilter",
              "params": [],
              "type": "macro"
            }
          ]
        },
        {
          "format": "time_series",
          "group": [],
          "groupBy": [
            {
              "params": [
                "$__interval"
              ],
              "type": "time"
            },
            {
              "params": [
                "null"
              ],
              "type": "fill"
            }
          ],
          "hide": false,
          "metricColumn": "none",
          "orderByTime": "ASC",
          "policy": "default",
          "rawQuery": true,
          "rawSql": "SELECT\r\n  cast((timestamp/1000)/150 as signed integer)*150 as time_sec,\r\n  sum(value)/150*3600/150 as value,\r\n  \"150sec\" as metric\r\nFROM data\r\nWHERE cast(timestamp/1000 as signed integer) > $__unixEpochFrom() and cast(timestamp/1000 as signed integer) < $__unixEpochTo() and\r\nchannel_id = 1\r\nGROUP BY 1\r\nORDER BY 1\r\n",
          "refId": "B",
          "resultFormat": "time_series",
          "select": [
            [
              {
                "params": [
                  "ChannelID"
                ],
                "type": "column"
              }
            ]
          ],
          "table": "volkszaehler",
          "tags": [],
          "timeColumn": "Value",
          "timeColumnType": "int",
          "where": [
            {
              "name": "$__unixEpochFilter",
              "params": [],
              "type": "macro"
            }
          ]
        },
        {
          "format": "time_series",
          "group": [],
          "hide": false,
          "metricColumn": "none",
          "rawQuery": true,
          "rawSql": "SELECT\r\n  max(cast((timestamp/1000)/150 as signed integer)*150 + 150) as time_sec,\r\n  sum(value)/150 as value,\r\n  \"Total\" as metric\r\nFROM data\r\nWHERE cast(timestamp/1000 as signed integer) > $__unixEpochFrom() and cast(timestamp/1000 as signed integer) < $__unixEpochTo() and\r\nchannel_id = 1\r\n\r\nORDER BY 1",
          "refId": "C",
          "select": [
            [
              {
                "params": [
                  "value"
                ],
                "type": "column"
              }
            ]
          ],
          "timeColumn": "time",
          "where": [
            {
              "name": "$__timeFilter",
              "params": [],
              "type": "macro"
            }
          ]
        }
      ],
      "thresholds": [],
      "timeFrom": null,
      "timeRegions": [],
      "timeShift": null,
      "title": "Volkszähler",
      "tooltip": {
        "shared": true,
        "sort": 0,
        "value_type": "individual"
      },
      "type": "graph",
      "xaxis": {
        "buckets": null,
        "mode": "time",
        "name": null,
        "show": true,
        "values": []
      },
      "yaxes": [
        {
          "format": "short",
          "label": null,
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        },
        {
          "format": "short",
          "label": null,
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        }
      ],
      "yaxis": {
        "align": false,
        "alignLevel": null
      }
    }
  ],
  "refresh": false,
  "schemaVersion": 16,
  "style": "dark",
  "tags": [],
  "templating": {
    "list": []
  },
  "time": {
    "from": "2019-01-26T23:02:46.005Z",
    "to": "2019-01-27T23:01:52.459Z"
  },
  "timepicker": {
    "refresh_intervals": [
      "5s",
      "10s",
      "30s",
      "1m",
      "5m",
      "15m",
      "30m",
      "1h",
      "2h",
      "1d"
    ],
    "time_options": [
      "5m",
      "15m",
      "1h",
      "6h",
      "12h",
      "24h",
      "2d",
      "7d",
      "30d"
    ]
  },
  "timezone": "",
  "title": "volkszaehler",
  "uid": "pDbNvKmgz",
  "version": 13
}



ChrisW

Ich habe da noch ein komisches Problem. Ich habe immer wieder diese Streifen im Bild. grün = OK gelb = nodata
Das kommt vom Alert das habe ich in einem anderen Dashboard für Luftfeuchte .. ABER wieso taucht es bei meinem Hausstrom auf ?
Siehe screen da ist kein Alert
Das verschandelt die sachen total
Raspberry PI3 mit allem möglichen.

kadettilac89

Zitat von: ChrisW am 29 Januar 2019, 10:21:40
Ich habe da noch ein komisches Problem. Ich habe immer wieder diese Streifen im Bild. grün = OK gelb = nodata
Das kommt vom Alert das habe ich in einem anderen Dashboard für Luftfeuchte .. ABER wieso taucht es bei meinem Hausstrom auf ?
Siehe screen da ist kein Alert
Das verschandelt die sachen total


was du siehst ist eine annotation und kein alert. ist bei einstellungen - annotation ... vielleicht hast du hier rumgeklickt. ansosnten weiß ich auch nicht.

ChrisW

hehe ja wie auch immer .. denke ich hab das wohl aus versehen Aktiviert :) Danke.

Komisch ist das ich seit 7:30 Uhr keine Daten mehr in Grafana habe .. habe ja diesen Cronjob angelegt.. kann man sich da irgendwie benachrichtigen lassen wenn da ein Fehler passiert ist ?
Habe die vermutung das da irgendwas nicht läuft ...
Edit:
Im chronograf steht nun hinter der Datenbank .autogen ??!! Ich bekomme dort auch wieder nichts angezeigt ( Das ist immer wenn das script noch läuft ) Aber ich habe es ja auch alle 5 Minuten und Maximal 15 minuten zurück eingestellt..
Als ob sich das "aufgehangen hätte"

Das mysql2influx.log ist nun schon 56 Mb gross letzte änderung 6:41 ... ich versuche mal ob dort was drin steht aber ob ich das geöffnet bekomme

Edit:
Der letzte eintrag ist nich vollständig scheint abgestürzt zu sein ..
2019.01.29 06:41:11 --- Error: Bad Request, Code: 400, 2019-01-29 05:53:21, hm.tur.hof, contact, closed (to VCCU)
2019.01.29 06:41:11 --- Error: Bad Request, Code: 400, 2019-01-29 05:53:21, hm.tur.hof, state, closed
2019.01.29 06:41:13 --- Error: Bad Request, Code: 400, 2019-01-29 05:55:03, handy_tanja_fritz, state, absent
2019.01.29 06:41:16 --- Error: Bad Request, Code: 400, 2019-01-29 05:55:44, Hausstrom, state, W:  4.58 kWh P:  1.12 kW Pmax: 0.254 kW
2019.01.29 06:41:16 --- Error: Bad Request, Code: 400, 2019-01-29 05:55:44, Hausstrom, statEnergy, Hour: 1.480 Day: -20.422 Month: -30.747 Year: -30.747 (since: 2019-01-23 )
2019.01.29 06:41:16 --- Error: Bad Request, Code: 400, 2019-01-29 05:55:44, Hausstrom, statCount, Hour: 111.0000000000 Day: 343.4266666667 Month: 14039.1600000000 Year: 14039.1600000000 (since: 2019
2019.01.29 06:41:16 --- Error: Bad Request,

Die frage ist nun ich muss nun sicher das script mit 12 Stunden abändert das ich da alles wieder in die DB bekomme. ABER was ist mit dem chronjob der hat ja alle 5 Minuten rein . Gibt es da eine elegante lösung ohne chrojob ändern ?
Und wie kann ich mich vor den abstürzen Schnützen ?
Raspberry PI3 mit allem möglichen.

Happyuser20

Danke erstmal für die mühen.

Wo dieser Code hingehört ist mir klar
Zitat

SELECT
  cast((timestamp/1000)/150 as signed integer)*150 as time_sec,
  sum(value)/150*3600/150 as value,
  "150sec" as metric
FROM data
WHERE cast(timestamp/1000 as signed integer) > $__unixEpochFrom() and cast(timestamp/1000 as signed integer) < $__unixEpochTo() and
channel_id = 1
GROUP BY 1
ORDER BY 1


Wohin muss der andere, längere?
Zitatdu kannst im plot oben auf export klicken und in der exportierten datei prüfen wie viel zeit zwischen den einzelnen punkten ist. datenbank heißt bei mir fhem_mysql. musst anpassen, rest sollte bei dir importierbar sein. channel_id = 1 ...

Da stehe ich momentan etwas auf dem Schlauch.  :-[ :-[ :-[

Gruß
HappyUser20

kadettilac89

Zitat von: Happyuser20 am 29 Januar 2019, 11:34:43

Wohin muss der andere, längere?
Da stehe ich momentan etwas auf dem Schlauch.  :-[ :-[ :-[

Gruß
HappyUser20

kadettilac89

Zitat von: ChrisW am 29 Januar 2019, 11:25:04
hehe ja wie auch immer .. denke ich hab das wohl aus versehen Aktiviert :) Danke.

Komisch ist das ich seit 7:30 Uhr keine Daten mehr in Grafana habe .. habe ja diesen Cronjob angelegt.. kann man sich da irgendwie benachrichtigen lassen wenn da ein Fehler passiert ist ?
Habe die vermutung das da irgendwas nicht läuft ...
Edit:
Im chronograf steht nun hinter der Datenbank .autogen ??!! Ich bekomme dort auch wieder nichts angezeigt ( Das ist immer wenn das script noch läuft ) Aber ich habe es ja auch alle 5 Minuten und Maximal 15 minuten zurück eingestellt..
Als ob sich das "aufgehangen hätte"

Das mysql2influx.log ist nun schon 56 Mb gross letzte änderung 6:41 ... ich versuche mal ob dort was drin steht aber ob ich das geöffnet bekomme

Edit:
Der letzte eintrag ist nich vollständig scheint abgestürzt zu sein ..
2019.01.29 06:41:11 --- Error: Bad Request, Code: 400, 2019-01-29 05:53:21, hm.tur.hof, contact, closed (to VCCU)
2019.01.29 06:41:11 --- Error: Bad Request, Code: 400, 2019-01-29 05:53:21, hm.tur.hof, state, closed
2019.01.29 06:41:13 --- Error: Bad Request, Code: 400, 2019-01-29 05:55:03, handy_tanja_fritz, state, absent
2019.01.29 06:41:16 --- Error: Bad Request, Code: 400, 2019-01-29 05:55:44, Hausstrom, state, W:  4.58 kWh P:  1.12 kW Pmax: 0.254 kW
2019.01.29 06:41:16 --- Error: Bad Request, Code: 400, 2019-01-29 05:55:44, Hausstrom, statEnergy, Hour: 1.480 Day: -20.422 Month: -30.747 Year: -30.747 (since: 2019-01-23 )
2019.01.29 06:41:16 --- Error: Bad Request, Code: 400, 2019-01-29 05:55:44, Hausstrom, statCount, Hour: 111.0000000000 Day: 343.4266666667 Month: 14039.1600000000 Year: 14039.1600000000 (since: 2019
2019.01.29 06:41:16 --- Error: Bad Request,

Die frage ist nun ich muss nun sicher das script mit 12 Stunden abändert das ich da alles wieder in die DB bekomme. ABER was ist mit dem chronjob der hat ja alle 5 Minuten rein . Gibt es da eine elegante lösung ohne chrojob ändern ?
Und wie kann ich mich vor den abstürzen Schnützen ?

ich habe nur numerische werte in der mysql, kann sein, dass zu viele errormeldungen etwas überlaufen lassen.

du kannst das script kopieren, die zeit auf 60m oder was auch immer ändern und separat laufen lassen. cron kann dann weiterlaufen. du kannst das originale script auch umbennenen, dann findet der cronjob das script nicht und erzeugt einen fehler. wenn alles erledigt ist, bennenst das originalscript wieder zurück.

ChrisW

super Dankke .. kann man das Log auch ausmachen # vor einer Zeile ? Dann beobachte ich das mal ..
Aktuell ist mein PI abgestürzt  per sudo auf crontab hatte ich nur lesezurgriff .. hab ich sudo reboot gemacht. Kommt nicht mehr wieder :/

EDIT: Na super das wars wohl mit dem PI auch nach Stromlos machen komme ich per ssh nicht mehr drauf
Raspberry PI3 mit allem möglichen.

kadettilac89

Zitat von: ChrisW am 29 Januar 2019, 13:02:51
super Dankke .. kann man das Log auch ausmachen # vor einer Zeile ? Dann beobachte ich das mal ..
Aktuell ist mein PI abgestürzt  per sudo auf crontab hatte ich nur lesezurgriff .. hab ich sudo reboot gemacht. Kommt nicht mehr wieder :/

EDIT: Na super das wars wohl mit dem PI auch nach Stromlos machen komme ich per ssh nicht mehr drauf

ja, log kannst du ausmachen. zusätzlich am besten auch syslog / daemon.log ausschalten sonst werden die files groß

https://community.influxdata.com/t/disable-influxd-logging/429

Happyuser20

Dank dir ,,kadettkilac89" für die Unterstützung, funktioniert soweit.

Gruß
Happyuser20

kadettilac89

Zitat von: Happyuser20 am 03 Februar 2019, 14:30:02
Dank dir ,,kadettkilac89" für die Unterstützung, funktioniert soweit.

Gruß
Happyuser20
Passt, konnte damit für mich selber was testen.

ChrisW

so langsam komme ich wieder zu grafana.
Mein reserve Proxy läuft..

In der grafana.ini habe ich bei root_url die url eingetragen. https://grafana.meinedomain.de
Das klappt auch. Aber wie bekomme ich das hin das es auch lokal geht http(s)://192.168.2.1:3000 ???
Raspberry PI3 mit allem möglichen.

kadettilac89

Zitat von: ChrisW am 05 Februar 2019, 20:30:25
so langsam komme ich wieder zu grafana.
Mein reserve Proxy läuft..

In der grafana.ini habe ich bei root_url die url eingetragen. https://grafana.meinedomain.de
Das klappt auch. Aber wie bekomme ich das hin das es auch lokal geht http(s)://192.168.2.1:3000 ???

ich route alles über extern ... du kannst mal hier durchlesen vielleicht funktioneirt eine der diskutierten settings


https://github.com/grafana/grafana/issues/2066


du kannst mal als root_url "http://localhost" testen. Sollte funktionieren dann musst du aber auch intern über reverse Proxy gehen

kadettilac89

Grafana intern + extern .... location ist bei mir grafana (http(s)://<intern>|<esterne ip>/grafana/)

Nginx reverse für intern über Port 80. .... bei mir läuft alles in Docker, darum "grafana" stattt localhost.

server {
    listen 80;
location /grafana/ {
   proxy_pass http://grafana:3000/;
}
}


für den externen Zugang hast du ja schon eine Location.

Als Root_url ... hab ich "http://localhost/grafana/" ...

andies

Ich lasse mir in grafana drei Zeitreihen anschauen, in etwa so
SELECT
  UNIX_TIMESTAMP(TIMESTAMP) as time_sec,
  CONVERT(VALUE, DECIMAL(7,3)) as value,
  "Wasser" as metric
FROM history
WHERE READING="Warmwassertemperatur" AND DEVICE="Viessmann" AND $__timeFilter(TIMESTAMP)

(dabei sind zwei verschiedene devices involviert). Ich möchte zusätzlich den Durchschnitt der drei Temperaturwerte angezeigt bekommen. Natürlich könnte ich das so machen, dass ich in FHEM den Durchschnitt errechne (in einem dummy) und den dann anzeigen lasse. Aber geht das auch mit den SQL-Aufrufen und wenn ja, wie?
FHEM 6.1 auf RaspPi3 (Raspbian:  6.1.21-v8+; Perl: v5.32.1)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann