Autor Thema: Hinweis: Schöne Alternative für Charts/Plots mit Grafana und DBLog (MySQL)  (Gelesen 32036 mal)

Offline ChrisW

  • Hero Member
  • *****
  • Beiträge: 2119
Danke klappt glaube ich aber ich skaliere das auf 1M also 1 Monat. Da sind die Markierungen unten nicht für jeden Tag.
Also mal steht da 1/23 das nächste ist dann 1/25. Da kann mann dann bisschen raten wo der 24. ist. Also die Striche nach unten sind nicht Pro Tag

Ich nutze den Wert Energie der zählt immer bis um 23:59 hoch und ist dann wieder 0
Hier mal ein List von dem Gerät vielleicht ist da ein anderer Wert besser ? Also der Power wert vielleicht ?? Schaut aber genauso komisch aus

LIst von dem Gerät
Internals:
   CODE       1
   CUL_0_MSGCNT 4
   CUL_0_RAWMSG E01015CB0D608005101
   CUL_0_RSSI -52
   CUL_0_TIME 2019-01-26 21:38:44
   DEF        1 75
   FUUID      5c45bfc8-f33f-678b-d4b9-e6754d143a6976c9
   IODev      CUL_1
   LASTInputDev CUL_0
   MSGCNT     4
   NAME       Hausstrom
   NR         669
   STATE      W: 32.31 kWh P:  1.28 kW Pmax: 0.224 kW
   TYPE       EMX
   .attraggr:
   .attreocr:
     .*
   .attrminint:
   Helper:
     DBLOG:
       count:
         myDbLog:
           TIME       1548535124.48091
           VALUE      54960
       count_prev:
         myDbLog:
           TIME       1548535124.48091
           VALUE      54952
       energy:
         myDbLog:
           TIME       1548535124.48091
           VALUE      32.31
       peak:
         myDbLog:
           TIME       1548535124.48091
           VALUE      0.224
       pmeter:
         myDbLog:
           TIME       1548535124.48091
           VALUE      56714.3
       power:
         myDbLog:
           TIME       1548535124.48091
           VALUE      1.28
       seqnr:
         myDbLog:
           TIME       1548535124.48091
           VALUE      92
       seqnr_prev:
         myDbLog:
           TIME       1548535124.48091
           VALUE      91
       statCount:
         myDbLog:
           TIME       1548535124.48091
           VALUE      Hour: 177.0000000000 Day: 2423.2833333333 Month: 9502.1600000000 Year: 9502.1600000000 (since: 2019-01-23 )
       statEnergy:
         myDbLog:
           TIME       1548535124.48091
           VALUE      Hour: 2.360 Day: -1.887 Month: -3.016 Year: -3.016 (since: 2019-01-23 )
       state:
         myDbLog:
           TIME       1548535124.48091
           VALUE      W: 32.31 kWh P:  1.28 kW Pmax: 0.224 kW
   READINGS:
     2019-01-26 21:38:44   cost            0
     2019-01-26 21:38:44   count           54960
     2019-01-26 21:38:44   count_prev      54952
     2019-01-25 23:59:05   day             D25 Wd: 34.20 kWh Wm:  34.20 kWh C:  0.00 €
     2019-01-26 21:38:44   energy          32.31
     2019-01-26 21:38:44   error           0
     2019-01-25 23:59:05   first_day       0
     2018-12-31 23:56:25   month           M12 Wm:  32.47 kWh
     2019-01-26 21:38:44   peak            0.224
     2019-01-26 21:38:44   pmeter          56714.3
     2019-01-26 21:38:44   power           1.28
     2019-01-26 21:38:44   seqnr           92
     2019-01-26 21:38:44   seqnr_prev      91
     2019-01-26 21:38:44   statCount       Hour: 177.0000000000 Day: 2423.2833333333 Month: 9502.1600000000 Year: 9502.1600000000 (since: 2019-01-23 )
     2019-01-26 20:59:55   statCountLast   Hour: 285.0000000000 Day: 2564.8000000000 Month: - Year: -
     2019-01-26 21:38:44   statEnergy      Hour: 2.360 Day: -1.887 Month: -3.016 Year: -3.016 (since: 2019-01-23 )
     2019-01-26 20:59:55   statEnergyLast  Hour: 3.800 Day: 3.062 Month: - Year: -
     2019-01-26 21:38:44   statPowerDay    Min: 0.48 Avg: 1.50 Max: 16.00
     2019-01-25 23:59:55   statPowerDayLast Min: 0.48 Avg: 1.44 Max: 22.56
     2019-01-26 21:38:44   statPowerMonth  Min: 0.48 Avg: 1.38 Max: 22.56 (since: 2019-01-22_17:42:26 )
     2019-01-26 21:38:44   statPowerYear   Min: 0.48 Avg: 1.38 Max: 22.56 (since: 2019-01-22_17:42:26 )
     2019-01-26 21:38:44   state           W: 32.31 kWh P:  1.28 kW Pmax: 0.224 kW
   helper:
     _98_statistics myStatDevice
Attributes:
   CostM      28.60
   CostN      0.24
   IODev      CUL_1
   LogM       EnergyM
   LogY       EnergyY
   event-on-change-reading .*
   model      EMWZ
   room       STROM
« Letzte Änderung: 26 Januar 2019, 21:50:44 von ChrisW »
Raspberry PI3 mit allem möglichen.

Offline kadettilac89

  • Hero Member
  • *****
  • Beiträge: 1001
Danke klappt glaube ich aber ich skaliere das auf 1M also 1 Monat. Da sind die Markierungen unten nicht für jeden Tag.
Also mal steht da 1/23 das nächste ist dann 1/25. Da kann mann dann bisschen raten wo der 24. ist. Also die Striche nach unten sind nicht Pro Tag

du willst unter jedem Balken den Tag / Datum als Beschriftung? Das ist ein feature-Request bei Grafana, jedoch funktioniert das noch nicht. Mein letzter Stand.

Offline ChrisW

  • Hero Member
  • *****
  • Beiträge: 2119
achso ich hab gedacht man könnte das schon bestimmen.

Zurück zu der Heizung und dem timecnt.
Der balken sagt gestern ca. 5 stunden ( Okay DB Loggin war erst irgendwann Mittags. )
Heute 12 Uhr sagt er schon 10 Stunden .. das kann gar nicht da die Heizung erst seit 6 Uhr läuft und so durchgehend gelaufen ist.
Ich denke er rechnet den vortag ein ? Habe ja unter Einstellungen 1d eingestellt.. kann es sein das die Werte dann erst morgen stimmen ? Da er ja quasi von Jetzt 24 stunden zurückguckt ?? Oder zählt er das nun jeden tag hoch ?? Heute 20 morgen dann 30 usw,.. ?

Edit: Auch hier bei select mal auf "sum" geändert. Einheiten auf Sekunde hatte da Minuten aus versehen. Behalte es im Auge. Kann ich da sin fhem irgendwie testen das er da auch mal timecnt auf einen Tag hochzählt ? Nur zur Prüfung jetzt?


Beim Hausstrom oben ist es auch komisch steht heute: 4,42KW wenn ich aber beim Gerät in Fhem gucke steht da für heute schon 12KW ..
Edit: Habe nun bei Hausstrom mal bei Select ein last eingebaut. Nun scheint es da auch zu stimmen

Anonsten sehr geil ds Grafana auch mit den Alerts. Aber leider kann man bei den Alerts nicht sagen Alert Ausblenden also den roten Balken :D Wie lange gibt es Grafana den schon ? Wird da viel dran gemacht ?


« Letzte Änderung: 27 Januar 2019, 12:40:01 von ChrisW »
Raspberry PI3 mit allem möglichen.

Offline ChrisW

  • Hero Member
  • *****
  • Beiträge: 2119
Sorry für den Doppelpost aber wegen der Übersicht und für andere die das Problem haben vielleicht besser
Ich habe einheit Sekunden die ich im timecnt ja logge.
Als Einheit habe ich Sekunden ausgewählt.

Bekomme nun im Graf am Rand aber so angaben wie 1.67 Hour .. bekommt man das noch irgendwie besser Formatiert ?
Raspberry PI3 mit allem möglichen.

Offline kadettilac89

  • Hero Member
  • *****
  • Beiträge: 1001
ich verzichte die ganzen fragen als zitat einzufügen.

aggregierung ... daten prüfen, macht dir am besten einen plot in fhem der das ganz stupide ausgibt. im plot - in der defitionsansicht wo du spalten auswählen kannst ... - da kannst du dann "show processed input" klicken, da siehst du dann alles was von der db kommt. diese werten dann in excel aufaddieren ... alternativ musst du im forum suchen, habe sowas in fhem noch nicht benötigt.

wahrscheinlich nimmt er bei 1d genau 24h.

alterts ... was willst du damit sehen? wenn es dir nur um die horizontale linie geht schau dir mal threshold im tab display an

dezimalstellen an der y-achse --> setze decimals 0 dann siehst du nur ganze zahlen.

seit wann gibt es grafana, 2016? noch länger ... `?


Offline ChrisW

  • Hero Member
  • *****
  • Beiträge: 2119
okay dann werd ich da mal weiter basteln Danke.

Wollte meine ersten ergebnisse direkt mal einbauen in tabletui .. per iframe. Das Problem FHEM ist https ( Eigenes selbst erstelltes Zertifikat ) Grafana ist http.

So nun habe ich gesucht und in der grafana.ini rumgespielt hat da das ;http auf ;https geändert nichts ..
Hab ich das ; davor weg gemacht = Docker Kaputt...
Quasi alles von neu :(

Hast du noch einen Tipp für Grafana in https zufällig ? Ohne ein Zertifikat
Raspberry PI3 mit allem möglichen.

Offline Happyuser20

  • New Member
  • *
  • Beiträge: 12
Hab jetzt nochmal von vorne begonnen.

Die Zeitschiene passt schon mal, die Spitzen sind in der Zeit identisch ( siehe Screenshots)

Was aber nicht passt, ist links die Y-Achse. Da sind wir vermutlich wieder bei der Sache mit "Wert/Zeit"

Zitat
SELECT
  cast((timestamp/1000)/150 as signed integer)*150 as time_sec,
  sum(value) as value,
  "Stromverbrauch" 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

Kann mir bitte jemand erläutern was hier genau gemacht wird, vor allem das /150 und *150. timestamp/1000 = ist unix_time in MS ?
"cast((timestamp/1000)/150 as signed integer)*150 as time_sec"

und hier
"WHERE cast(timestamp/1000 as signed integer) > $__unixEpochFrom() and cast(timestamp/1000 as signed integer) < $__unixEpochTo() and
channel_id = 1"


Habe versucht Details über den Volkszähler zu finden, im Bezug auf Wert/Zeit, leider erfolglos.
Das einzige ist der Code des Interpreters der das alles ausrechnet und darstellt.

Zitat
namespace Volkszaehler\Interpreter;
24 
25 /**
26  * Meter interpreter
27  *
28  * @author Steffen Vogel <info@steffenvogel.de>
29  * @author Andreas Götz <cpuidle@gmx.de>
30  */
31 
32 class ImpulseInterpreter extends Interpreter {
33 
34    protected $pulseCount;
35    protected $ts_last; // previous tuple timestamp
36 
37    /**
38     * Generate database tuples
39     *
40     * @return \Generator
41     */
42    public function getIterator() {
43       $this->rows = $this->getData();
44       $this->pulseCount = 0;
45       $this->ts_last = $this->getFrom();
46 
47       foreach ($this->rows as $row) {
48          if ($this->raw) {
49             // raw database values
50             yield array_slice($row, 0, 3);
51          }
52          else {
53             $tuple = $this->convertRawTuple($row);
54             $this->pulseCount += $row[1];
55 
56             $this->updateMinMax($tuple);
57 
58             yield $tuple;
59          }
60       }
61    }
62 
63    /**
64     * Convert raw meter readings
65     */
66    public function convertRawTuple($row) {
67       $delta = $row[0] - $this->ts_last;
68 
69       // (1 imp * 60 min/h * 60 s/min * 1000 ms/s * scale) / (1 imp/kWh * 1ms) = 3.6e6 kW
70       $tuple = array(
71          (float) ($this->ts_last = $row[0]), // timestamp of interval end
72          (float) ($row[1] * 3.6e6 * $this->scale) / ($this->resolution * $delta), // doing df/dt
73          (int) $row[2] // num of rows
74       );
75 
76       return $tuple;
77    }
78 
79    /**
80     * Calculates the consumption
81     *
82     * @return float total consumption in Wh
83     */
84    public function getConsumption() {
85       return $this->channel->getDefinition()->hasConsumption ? $this->scale * $this->pulseCount / $this->resolution : NULL;
86    }
87 
88    /**
89     * Get Average
90     *
91     * @return float average in W
92     */
93    public function getAverage() {
94       if ($this->pulseCount) {
95          $delta = $this->getTo() - $this->getFrom();
96          // 60 s/min * 60 min/h * 1.000 ms/s * 1.000 W/kW = 3.6e9 (Units: s/h*ms/s*W/KW = s/3.600s*.001s/s*W/1.000W = 1)
97          return (3.6e6 * $this->scale * $this->pulseCount) / ($this->resolution * $delta);
98       }
99       else { // prevents division by zero
100          return 0;
101       }
102    }
103 
104    /**
105     * Return sql grouping expression
106     *
107     * Override Interpreter->groupExpr
108     *
109     * For precision when bundling tuples into packages
110     * AccumulatorInterpreter needs MAX instead of SUM.
111     *
112     * @author Andreas Götz <cpuidle@gmx.de>
113     * @param string $expression sql parameter
114     * @return string grouped sql expression
115     */
116    public static function groupExprSQL($expression) {
117       return 'SUM(' . $expression . ')';
118    }
119 }
120 
121 ?>

Einmal angenommen ich möchte Kilowatt pro Stunde darstellen, wie würde das aussehen.

Herzlichen Dank

Gruß
HappyUser20

Offline kadettilac89

  • Hero Member
  • *****
  • Beiträge: 1001
okay dann werd ich da mal weiter basteln Danke.

Wollte meine ersten ergebnisse direkt mal einbauen in tabletui .. per iframe. Das Problem FHEM ist https ( Eigenes selbst erstelltes Zertifikat ) Grafana ist http.

So nun habe ich gesucht und in der grafana.ini rumgespielt hat da das ;http auf ;https geändert nichts ..
Hab ich das ; davor weg gemacht = Docker Kaputt...
Quasi alles von neu :(

Hast du noch einen Tipp für Grafana in https zufällig ? Ohne ein Zertifikat

ohne Zertifikat, http/https umbiegen ... alles halbfertiges gebastle ... sorry, my 2cents.

wenn du das vernünftig machen willst --> reverse proxy über nginx oder apache wobei nginx wahrscheinlich öfter im einsatz ist. anleitung zu reverse proxy in nginx gibts bei grafana.

Offline kadettilac89

  • Hero Member
  • *****
  • Beiträge: 1001
Hab jetzt nochmal von vorne begonnen.

Die Zeitschiene passt schon mal, die Spitzen sind in der Zeit identisch ( siehe Screenshots)

Was aber nicht passt, ist links die Y-Achse. Da sind wir vermutlich wieder bei der Sache mit "Wert/Zeit"

Kann mir bitte jemand erläutern was hier genau gemacht wird, vor allem das /150 und *150. timestamp/1000 = ist unix_time in MS ?
"cast((timestamp/1000)/150 as signed integer)*150 as time_sec"

und hier
"WHERE cast(timestamp/1000 as signed integer) > $__unixEpochFrom() and cast(timestamp/1000 as signed integer) < $__unixEpochTo() and
channel_id = 1"




.... div 1000 weil die timestamps mit ms gespeichert sind, 3 nachkommastellen zur sekunde. grafana braucht aber nur sekunden. durch die gnazzahlige division werden die 3 stellen abgetrennt. warum div 150 weiß ich nicht. wäre aggregation pro 2.5 minuten. alles nur raten.

stelle mal die rohdaten für die grafik aus mysql bereit, für den tag den du im volkszähler plot anzeigst. vielleicht kann ich dir daraus die aggregation rausziehen.

Offline Happyuser20

  • New Member
  • *
  • Beiträge: 12
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

Offline ChrisW

  • Hero Member
  • *****
  • Beiträge: 2119
und wieder die nächste Baustelle  "reverse proxy" ;) Das habe ich für fhem schon irgendwie hinbekommen :D

So langsam weiss ich die es funktioniert Lines & Bars.
Was ich aber nicht schaffe ist zu sagen WAS im Vorne und was im Hintergrund ist.

Auch würde ich gerne die Durchschnittstemperatur anzeigen lassen. Habe MeinWetter und davon Temperatur. Um die Tagestemperatur anzuzeigen brauch ich ja am besten die durchschnittstemperatur ? Ob die jetzt so aussagekräftig ist lassen wir mal dahingestellt.

edit: Okay ich kann die Bars ein wenig Transparent machen. Aber kann es aktuell nicht testen da ich aktuell für heute keine Liene hinter der Bar habe :D Daher klappen auch die ganzen Versuche wohl nicht
« Letzte Änderung: 27 Januar 2019, 19:02:53 von ChrisW »
Raspberry PI3 mit allem möglichen.

Offline kadettilac89

  • Hero Member
  • *****
  • Beiträge: 1001



Was ich aber nicht schaffe ist zu sagen WAS im Vorne und was im Hintergrund ist.
Die Option gibt es glaub ich nicht. Was du testen kannst die SQL abfragen in der Reihenfolge tauschen. Vielleicht funktioniert es. Nach unten kopieren gehtbüber duplicate.

Durchschnittlich vielleicht mit math-funktionen in der Metrik. Verstehe die Anforderung aber nicht.


Offline ChrisW

  • Hero Member
  • *****
  • Beiträge: 2119
Ja irgendwie hat es nun geklappt :)

Sag mal mit dem reverse proxy... ist zwar jetzt nicht ganz passens aber vielleicht kannst du mir ein paar Infos geben...
http://docs.grafana.org/installation/behind_proxy/

Brauch ich da nur die 2 Optionen zu machen ? Oder muss man im Docker Image von Grafana noch den proxy erst einrichten ? Wenn ich die anleitung von FHEM nehme gibt das doch irgendwie mit dem lets encrypt Probleme oder ??
Ich müsste das Zertifikat ja dann irgendwie auf das Grafana System Kopieren. ?!

Mein FHEM läuft auf einem PI da konnte ich das wunderbar alles machen mit lets encrypt .. meinedeomain.de/fhem

ODER
Kann ich im Proxy auf dem fhem system eine Verlinkung in der config zu meiner DOCKERIP:3000 machen ??
Somit brauche ich ja gar keine 2. Löst trotzdem nicht das Provlem das ich im TabletUI welches https ist ( Lokal auch ) nicht das nicht https Grafana einbinden kann

Raspberry PI3 mit allem möglichen.

Offline kadettilac89

  • Hero Member
  • *****
  • Beiträge: 1001
Sag mal mit dem reverse proxy... ist zwar jetzt nicht ganz passens aber vielleicht kannst du mir ein paar Infos geben...

ich habe grafana unter path /grafana

änderungen in grafana.ini

root_url = http://localhost:3000/grafana/

<<<< wenn ohne login in display-mode gearbeitet wird
[auth.anonymous]
enabled = true
org_role = Viewer

in nginx-config. hier ist keine authentifizierung drin. musst dir selber überlegen wie du zugang absichern willst ... ich arbeite mit client certificate, damit hab ich das problem nicht

  location /grafana/ {
     proxy_pass http://localhost:3000/;
   proxy_set_header Host $host;
   proxy_set_header X-Real-IP $remote_addr;
   proxy_set_header X-Forwarded-Host $host;
   proxy_set_header X-Forwarded-Server $host;
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }

mit o.g. config macht nginx die http-https umsetzung. ide set_header-parameter habe ich irgendwo übernommen, ob die so passen weiß ich nicht. aber so wie ich es beurteilen kann läuft es im test. zumindest kommst du dann über https drauf.

zertifikate brauchst du für den server part, deckt dann fhem und grafana ab wenn beides durch einen webserver abgedeckt werden. auf den grafana-server musst du keine certs kopieren da dieser auf http antwortet. welche probleme meinst du? letsencrypt läuft bei mir problemlos.


Offline ChrisW

  • Hero Member
  • *****
  • Beiträge: 2119
okay habs nun auf dem fhem proxy eingerichtet komme nun auch extern per https://meinedomain.de/grafana/ drauf :) War gar nicht so einfach.
Löst aber mein Lokales Problem nicht.

Muss ich nun nurnoch 2 tabletui versionen bauen eine interne und eine externe ..
will ja nicht immer intern alles über meine domain draußen laden ...
Müsste sonst vorher prüfen wenn es lokal ist dann interne URL im Iframe ;)
Raspberry PI3 mit allem möglichen.