Influx DB nach Excel dumpen

PDF Dokumente für Informationen im Detail, sowie Bauanleitungen.

Moderatoren: Ulrich, TeamO

Stefan_E
Beiträge: 17
Registriert: Do 2. Jan 2020, 22:08

Influx DB nach Excel dumpen

Beitrag von Stefan_E »

Ich hab mir ein perl script gebastelt, mit dem ich die Influx DB flexibel nach Excel dumpen kann. Wenn's jemandem etwas nützt: hier eine kurze Uebersicht. Ich denk, ich leg mir damit ein monatliches Archiv des Verhaltens meiner Anlage an.

Das Script und eine Dokumentation ist im Anhang. Es kann sowohl auf dem Raspi installiert werden (einfach, aber langsam) oder auf einem PC (etwas mehr Installationsschritte, dafür schneller - bei mir 10x schneller).

Im einfachsten Fall (ohne config.ini file) wird ein Excel File mit einem Tab für den laufenden Monat generiert, das die Tabellen PV, AC, Batterie, Summen enthält.

Code: Alles auswählen

perl Dump_InFluxDB.pl
Es gibt aber auch ein config.ini file, mit dem man sagen kann:
  • welche Tabellen genau gedumped werden sollen
  • dass man gewisse columns nicht sehen will
  • gewisse columns aus Rohdaten gerechnet werden sollen
  • Excel charts erstellt werden sollen
Und man kann in der Command Line sagen, welcher Zeitraum geholt werden soll - z.B., nur "heute", letzten Monat, ... etc.

Das .pdf File im Anhang beschreibt die Details (sorry - auf English, da ich immer wieder Versatzstücke aus anderen Scripts und Dokumenten verwende...)

Beispiel: Mit dem config.ini file unten sagt man:
  • kontaktiere Influx auf 192.168.178.89 (mein SolarAnzeige Raspi)
  • hol Daten aus den Tabellen PV und AC (Datenbank solaranzeige ist default)
  • lösche die Columns die zu String 3 gehören (im Moment nichts angeschlossen ... - die Batterie ist wegen Covid in China steckengeblieben)
  • rechne eine Column 'Inverter_Loss_%' aus DC und AC Leistung
  • generiere einen Plot, der diesen Loss gegen die DC Leistung aufträgt (alle calls set_xxx sind nur zur Verschönerung der Defaults)
Der Plot unten enthält Daten von einem Tag für einen Kostal Plenticore Plus 10

Code: Alles auswählen

[GENERAL]
# Demo config.ini file
host       : 192.168.178.89                                                                     # host containing db
tables     : { 01_Data => PV, AC ; }

[01_Data]                                                                                       # tab name; must be key in hash 'tables' in secion [GENERAL]
# List of field names to be dropped:
drop       : { PV.Leistung_Str_3 ;
               PV.Spannung_Str_3 ;
               PV.Strom_Str_3    ;
             }

calculate  : { Inverter_Loss_% => if('PV.Gesamtleistung'=0, "", ('PV.Gesamtleistung' - 'AC.Leistung')/'PV.Gesamtleistung') ; }

charts     : { Eff_Loss => add_chart( type => 'scatter',
                                      name => 'Inverter',
                                      embedded => 1 )
                           add_series( categories => 'PV.Gesamtleistung',
                                       values     => 'Inverter_Loss_%',
                                       name       => 'Inverter Efficiency Loss',
                                       marker     => { type => 'diamond', size => 3 } )
                           set_x_axis( name       => 'PV.Gesamtleistung',
                                       name_font  => { name => 'Calibri (Body)', size => 10.5, bold => 1 },
                                       num_font   => { name => 'Calibri (Body)', size =>  9,   bold => 0 },
                                       min        =>     0,
                                       max        => 10000 )
                           set_y_axis( name       => 'Efficiency Loss',
                                       name_font  => { name => 'Calibri (Body)', size => 10.5, bold => 1 },
                                       num_font   => { name => 'Calibri (Body)', size =>  9,   bold => 0 },
                                       num_format => '0.0%',
                                       major_unit =>  0.1, 
                                       min        =>    0,
                                       max        =>  0.4 )
                           set_legend( none => 1 )
                           insert_chart('AB3', $chart);
             }
Fragen beantworte ich natürlich gerne, und falls jemand Bugs entdeckt bin ich auch da ... Neue Features nach Lust und Laune 8-)

Enjoy!
Dateianhänge
Capture.PNG
Capture.PNG (17.13 KiB) 2240 mal betrachtet
dump_Influx.zip.txt
Endung .txt entfernen --> .zip
(692.49 KiB) 106-mal heruntergeladen

Stefan_E
Beiträge: 17
Registriert: Do 2. Jan 2020, 22:08

Re: Influx DB nach Excel dumpen

Beitrag von Stefan_E »

Minor bug fixes
Dateianhänge
dump_Influx.zip.txt
(692.68 KiB) 83-mal heruntergeladen

r2d2master
Beiträge: 19
Registriert: Di 16. Apr 2019, 14:28

Re: Influx DB nach Excel dumpen

Beitrag von r2d2master »

Hi Stefan,
coole Software.
Habe es gestern installiert und ausprobiert.
Ich hatte nur Probleme mit dem Englisch, da ich die Vokabeln der Programmierung nur sehr schlecht verstehe.
Aber nachdem ich es, nach langem installieren, ausprobieren konnte und auch verstanden habe, wie es mit dem Datum funktioniert.
Konnte ich die Dumps mal durchführen. Knapp 2 Jahre in einer halben Stunde!
Da brauchte ich mit Grafana downloads deutlich mehr Zeit.
Ich versuche gerade meine Daten nach einem Absturz der SD-Karte zu restaurieren.
Wenn man die Daten nun auch wieder aus den CSV-Files in die Datenbank bekommen könnte.
Wäre es leicht, alles zu korrigieren. Zumindest nach mühsamen aufbereiten der Datenfragmente.
Ich habe es auch schon mal gemacht, es muss eigentlich funktionieren.
Nur leider finde ich meine vor etwa 2 Jahren gefundenen Hilfsmittel nicht mehr.
Da verrenne ich mich mittlerweile in der Welt, der zu vielen Möglichkeiten.
Leider ist die suche inzwischen sehr schwer geworden. Weil es eben auch im Internet zu viele Antworten gibt.
Die richtige zu finden, wird halt immer schwerer.
Wenn Du also etwas hast, womit man die Daten auch wieder in die InfluxDB zurückschreiben kann, wäre das für mich sehr hilfreich!

Danke für Deine Mühe und einer Antwort!

Gruß Martin

Stefan_E
Beiträge: 17
Registriert: Do 2. Jan 2020, 22:08

Re: Influx DB nach Excel dumpen

Beitrag von Stefan_E »

Hallo r2d2master,

sorry fuer die späte Antwort - ich hab grad raus gefunden wie man Themen hier abonnieren kann :-)

Zu Deinem Problem: Eine fertige Antwort habe ich nicht (mir ist zum Glück die Datenbank noch nicht gecrasht ...). Aber der Weg müsste ungefähr so gehen (mit Python):
  1. importiere .csv nach pandas DataFrame
  2. schreibe pandas DataFrame nach Influx
1/ ist hier:

Code: Alles auswählen

import pandas as pd
df = pd.read_csv('value.txt')
2/ geht dann ungefähr so (see docu von influxdb)

Code: Alles auswählen

from influxdb import DataFrameClient
myClient   = DataFrameClient(host='<your_host_name>', port=8086, database='solaranzeige')
myClient.write_points(df, '<measurement_name>)
Das müsstest Du also für die verschiedenen measurements von solaranzeige wiederholen (PV, AC, Batterie, ...)

PS: Wenn's mit dem English an bestimmten Stellen klemmt, lass es mich wissen - ich werd nur nicht das ganze übersetzen :-(

r2d2master
Beiträge: 19
Registriert: Di 16. Apr 2019, 14:28

Re: Influx DB nach Excel dumpen

Beitrag von r2d2master »

Hallo Stefan,
danke für Deine Unterstützung.
Ja abonieren ist schon wichtig und das da ein Haken sitzt wo ein Kreuz rein soll hilft auch nicht wirklich.
Habe es auch gerade getan, denn Deine Antwort ist gerade auch nur beim stöbern meiner Themen gefunden worden.
Ich bin mittlerweile schon ein paar Schritte voran gekommen.
Allerdings klappt es noch nicht so, wie ich es brauche. Ich werde mir das mal anschauen und probieren ob ich damit klar komme.
Ich melde mich dann dazu, wenn es klappt oder auch nicht klappt.

Danke schon mal...

Gruß Martin

r2d2master
Beiträge: 19
Registriert: Di 16. Apr 2019, 14:28

Re: Influx DB nach Excel dumpen

Beitrag von r2d2master »

Hi Stefan,
leider bleibe ich schon beim installieren der Software hängen.
Die Abhängigkeit von pandas erfordert wohl noch Anaconda und das lässt sich bei mir nicht aufspielen.
Oder ich kenne mich einfach nicht damit aus diverse Software zu installieren.
Das sh File lässt sich nicht ausführen.
So scheiterte der Versuch leider bevor ich es testen kann.

Danke für Deine Mühe!

Gruß Martin

Stefan_E
Beiträge: 17
Registriert: Do 2. Jan 2020, 22:08

Re: Influx DB nach Excel dumpen

Beitrag von Stefan_E »

Hallo Martin,

wenn Du ".sh" sagst, bist Du auf Linux; ich vermute auf dem Raspi? Der ist 32-bit und Anaconda verteilt soviel ich sehen, nur 64-bit Versionen.

Ich hab grad pandas auf meinem Raspi installiert: Meine Notes sagen mir:

Code: Alles auswählen

# check that pandas and numpy is installed: Try following sequence of commands
#     ~ $ python3
#     >>> import pandas as pd
#     >>> import numpy as np
#     >>> quit()
#     ~ $
# if this doesn't give an error, pandas and numpy are already installed. Else, check out: 
# https://pandas.pydata.org/pandas-docs/stable/getting_started/install.html

sudo apt install python3-pandas
Bei meiner Lösungsskizze für den Import muss man noch den Index (Zeitstempel) etwas anpassen. Ich kann versuchen, das noch etwas genauer hin zu schreiben.

EDIT: ich merk grad dass mir meine Notes durcheinander gewirbelt sind... ich hoff das oben funktioniert ;-)

r2d2master
Beiträge: 19
Registriert: Di 16. Apr 2019, 14:28

Re: Influx DB nach Excel dumpen

Beitrag von r2d2master »

Hallo Stefan,

danke für Deine Mühe!
Ja, Raspberry ist richtig. Der Raspi 4 hat schon das 64 bit.
Kann aber auch noch im 32bit Modus laufen.
Für den Reparaturversuch habe ich den etwas schnelleren genommen.
Ich werde mir das noch mal anschauen.
Wäre einfacher mit einer fertigen Lösung.
Bei meinem Versuch hängt es vermutlich an den Variablen Typen.
Durch das umwandeln aus Excel und cvs in Text, verschwinden die Zahlen als INT .
Dadurch wird mein schreiben von Influx abgewiesen, weil er nur Strings bekommt.
Evtl. teste ich noch eine Perl Variante, wo ich die Variablen Typen korrigieren kann.
Habe in der Woche nur etwas wenig Zeit dafür.

Ich werde dann berichten!
Danke! Und schon mal ein schönes Wochenende!
Gruß Martin

r2d2master
Beiträge: 19
Registriert: Di 16. Apr 2019, 14:28

Re: Influx DB nach Excel dumpen

Beitrag von r2d2master »

Hallo Stefan,
ich habe alles so weit hinbekommen.
Das Value.txt wurde evtl. schon eingelesen.
Ich sehe ja kein Ergebnis.
Leider hänge ich nun im Schritt des DataFrameClient importierens.
Wie bekomme ich denn den import von influxdb hin.
Da kommt dann die Fehlermeldung "No module named `influxdb`
Die Reihenfolge klappte so, nur musste ich eben erst installen und konnte dann die importe unter python durchführen.
Influxdb ist ja eigentlich installiert. Ich weiß nur nicht, wie ich das modul DataFrameClient noch aktivieren kann.

Das nächste Problem ist dann sicher noch der Zeitstempel.

Danke für Dein Mühe!

Gruß Martin

Stefan_E
Beiträge: 17
Registriert: Do 2. Jan 2020, 22:08

Re: Influx DB nach Excel dumpen

Beitrag von Stefan_E »

Du brauchst noch

Code: Alles auswählen

sudo pip3 install influxdb
um Zugriff auf Influx zu haben

Im Anhang findest Du ein .csv file (gezipped - renamed als .txt), das meinem Dump mit dem perl script oben entspricht. Wie Du siehst, enthält es Daten aus den Tabellen PV, AC und Batterie - plus einige gerechnete Felder (die, nebenbei, keinen Sinn mehr ergeben seit die Batterie installiert ist).

Nehmen wir mal an, wir wollen PV restaurieren. Das sollte mit diesem Script funktionieren (das Du unter import_csv.py speichern kannst):

Code: Alles auswählen

import pandas as pd
from influxdb import DataFrameClient

df = pd.read_csv('SolarAnzeige_2020-12-01.csv')  # .csv file to process
# print(df)

myTable = 'PV'                                   # we want import fields named 'PV.xxx'

cols    = ['Epoch']                              # 'Epoch' will be our time index
map     = { 'Epoch' : 'time' }                   # ... which we want rename to 'time'
for col in df.columns:
    if col.startswith(myTable + '.'):            # find fields named 'PV.xxx'
        cols.append(col)
        map[col] = col[len(myTable)+1:]          # ... we want rename them to 'xxx'
df = df[cols]                                    # reduce dataframe to columns we want
# print(map)
df.rename(columns=map, inplace=True)             # ... and rename as we want them in Influx
df['time'] = pd.to_datetime(df['time'], unit='ns')
df.set_index('time', inplace=True)               # make 'time' our index - ready to import now
# print(df)

myClient = DataFrameClient(host='raspi4', port=8086, database='test')
myClient.write_points(df+0.0, myTable)           # actual import to Influx; +0.0 forces all fields to float
print("... import done")
Das macht folgendes:
  1. einlesen .csv nach Pandas DataFrame
  2. Columns rausholen, die wir brauchen: Epoch (time stamp) und alles was irgendwie 'PV.' heisst
  3. umbenennen der Columns: Wir wollen in Influx ja nicht sehen 'PV.Gesamtleistung', sondern 'Gesamtleistung', etc.
  4. 'Epoch' (die wir in 'time' umbenannt haben - wäre wahrscheinlich nicht nötig) nach time stamp object
  5. import nach Influx - da muss man hostname anpassen (kann auch 'localhost' sein wenn Du auf dem gleichen Raspi bist wo auch Influx liegt
Beachte:
  • das .csv File hat keine Felder fuer xxx_3 (die habe ich im perl config.ini weg konfiguriert). Du wirst sie also auch nicht in Influx sehen. Das ist der dritte String der Kostal unterstützen würde ... - macht nichts: Sobald Solaranzeige diese Felder schreiben will, werden sie dynamisch kreiert.
  • ich hab ein paar raus kommentierte print statements reingeschoben - damit kannst Du überprüfen was passiert.
  • ich schreib vorerst in die Influx datenbank 'test' - die musst Du zuerst kreiert haben. Später willst Du wahrscheinlich in die Datenbank 'solaranzeige' schreiben
Kreieren der Datenbank 'test':

Code: Alles auswählen

%>  influx
>  create database test
>  show databases
>  quit
%>
Import ausführen:

Code: Alles auswählen

%> python3 import_csv.py
Checken, dass der Import funktioniert hat:

Code: Alles auswählen

%>  influx
> show databases                            # 'test' sollte gelistet werden
> use database test
> show measurements                         # PV sollte gelistet werden
> show field keys on test from PV           # sollte alles 'float' sein
> select * from PV                          # listet alle importierten werte - mach das nicht über 2 Jahre!!!
Dateianhänge
SolarAnzeige_2020-12-01.zip.txt
(1.89 MiB) 6-mal heruntergeladen

Antworten