FHEM – csv Datei als Reading einlesen

Ich stand vor dem Problem, dass ich den Tagesertrag aus einem Kaco Wechselrichter in FHEM anzeigen lassen wollte. Die csv die diesen Wert beinhaltet ist jedoch tagesaktuell und die URL zum Aufruf muss somit parametrisiert werden.

URL zur  csv: http://lokaleIP/20180108.csv

KacoCSV

Es gibt eine realtime.csv, diese beinhaltet leider nicht den Tagesertrag.
Wäre dies der Fall wäre das Auslesen ganz einfach.

Daniel Waschto war so nett und hat basierend auf meinen Daten eine Anleitung geschrieben, die mit einer FHEM Routine und slurp die Daten laden sollte. Dies war jedoch ein Problem, da es anscheinend nur mit lokal auf dem Raspberry Pi verfügbaren csv funktioniert, nicht jedoch mit virtuellen csv wie beim Kaco Wechselrichter.

Ich habe mit mit Hilfe einer befreundeten Entwicklerin nun geschafft mit dem folgenden at die csv Daten für den Tagesertrag in ein Reading eines Dummy Device zu schreiben.

Ein Problem war, dass das csv unsichtbare Steuerzeichen enthält und im Grunde 2 Headerzeilen hat. Der Tagesertrag steht in der 2. Zeile als letzter Wert. Danach kommt ein unsichtbares Steuerzeichen.

Es wäre auch eine Option gewesen die Webseite des Wechselrichters zu parsen und sich die den Wert von der index.html zu holen. Das Problem ist aber dass die Seite mit Javascript arbeitet und das Feld DayValue erst zur Laufzeit gefüllt wird. Es ist somit deutlich aufwendiger da die Aufrufe der Seite in FHEM alle nach gebaut werden müssten.

wget

Umgesetzt wurde es nun mit wget.

wget

#############################

defmod atKacoCSVdaily at +*00:15:00 {\
\
#\
# bitte den abzufragenden Webserver konfigurieren:\
#\
my $adresse = “http://192.168.178.56”;;\
\
my ($jahr, $monat, $tag) = (localtime(time))[5,4,3];;\
$jahr += 1900;;\
$monat += 1;;\
my $abfragedatum = sprintf(“%04d%02d%02d”, $jahr, $monat, $tag);;\
\
Log 3,”KACO CSV Ertrag: Heute=$jahr $monat $tag”;;\
\
my $text = `wget –read-timeout=30 –quiet –tries=3 -O – “${adresse}/${abfragedatum}.csv” | sed -e ‘s/\x0d/;;/g’`;;\
\
if ($text) {\
my $impValue = (split(‘;;’, $text))[9];;\
\
fhem(“setreading WechselrichterErtrag Tagesertrag ${impValue}”);;\
} \
else {\
Log 1, “Es liegt noch keine aktuelle csv vom Wechselrichter vor!”;;\
\
fhem(“setreading WechselrichterErtrag Tagesertrag 0”);;\
}\
}\

attr atKacoCSVdaily DbLogExclude .*
attr atKacoCSVdaily alignTime 00:00:00
attr atKacoCSVdaily room 6_AT-Befehle

#############################

Das atKacoCSVdaily liest die jeweilige Tages csv und übergibt den Wert $impValue an das dummy Device ‘WechselrichterErtrag’ und füllt dort das Reading ‘Tagesertrag’. Da die tägliche CSV erst zur Verfügung steht wenn der WR angefangen hat Strom zu produzieren wurde noch das ‘else’ eingebaut. Es stetzt den Tagesertrag auf ‘0’ und schreibt ins Log wenn keine csv gefunden wurde.

FHEMdummyTagesertrag

Kompatibilität

Da viele Herstelle die gleiche Software im Wechselrichter benutzen, könnte es sein, dass dies auch bei anderen Wechselrichter funktioniert. Der Code in der main.js legt dies jedenfalls nah. Dort sind aufgelistet KACO, SUNPOWER, BLUEPLANET SCHUECO, INVENTUX und WUERTH.