Solaredge optimiererdaten auslesen

Für welche Projekte verwendet Ihr OpenHAB? Was habt Ihr automatisiert? Stellt eure Projekte hier vor.

Moderatoren: Cyrelian, seppy

Antworten
Rob69
Beiträge: 73
Registriert: 26. Feb 2021 07:38
Answers: 0

Solaredge optimiererdaten auslesen

Beitrag von Rob69 »

Hallo,

Da ich ja seit einigen Monaten eine PV-Anlage mit Solaredge Optimierern auf dem Dach und die
Daten über die Webschnittstelle auslese, was auch gut funktioniert ,
welches aber nur die Gesamtleistung aber nicht die Leistung jeder Platte bringt habe ich mich auf die Suche nach einer
Möglichkeit gemacht welche dies kann!
Dabei bin auf dies gestoßen:

SolarEdge PV-Leistung auf Panelebene selbst mitloggen und per Grafana visualisieren

Youtube Link : https://www.youtube.com/watch?v=VDLDJ8RomOY&t=8s

Jetzt bin gerade dabei mich ein zu lesen und es aus zu probieren.
Ich habe mir ein Versuchs `Openhab` mit dem jython-Script aufgesetzt.
Aber die Logdatei bringt mir einen Fehler

Code: Alles auswählen

2024-09-30 15:58:41.302 [ERROR] [ipt.internal.ScriptEngineManagerImpl] - Error during evaluation of script '/etc/openhab/automation/jython/solaredge.py': ImportError: No module named requests in /etc/openhab/automation/jython/solaredge.py at line number 1
2024-09-30 15:58:41.307 [WARN ] [ort.loader.AbstractScriptFileWatcher] - Script loading error, ignoring file '/etc/openhab/automation/jython/solaredge.py'
meine jython Datei Ist wie folgt

Code: Alles auswählen

import requests, pickle
from datetime import datetime
import json, pytz
import pandas as pd
from influxdb import DataFrameClient

login_url = "https://monitoring.solaredge.com/solaredge-apigw/api/login"
panels_url = "https://monitoring.solaredge.com/solaredge-web/p/playbackData"

SOLAREDGE_USER = "ich@XXXXXXXXXXX.de" # web username
SOLAREDGE_PASS = "sagichnicht" # web password
SOLAREDGE_SITE_ID = "16XXXXX1" # site id
DAILY_DATA = "4"
WEEKLY_DATA = "5"
INFLUXDB_IP = "192.168.3.30"
INFLUXDB_PORT = 8086
INFLUXDB_DATABASE = "Zuhause"
INFLUXDB_SERIES = "optimisers"
INFLUXDB_RETENTION_POLICY = "autogen"

session = requests.session()
try:  # Make sure the cookie file exists
    with open('solaredge.cookies', 'rb') as f:
        f.close()
except IOError:  # Create the cookie file 
    session.post(login_url, headers = {"Content-Type": "application/x-www-form-urlencoded"}, data={"j_username": SOLAREDGE_USER, "j_password": SOLAREDGE_PASS})
    panels = session.post(panels_url, headers = {"Content-Type": "application/x-www-form-urlencoded", "X-CSRF-TOKEN": session.cookies["CSRF-TOKEN"]}, data={"fieldId": SOLAREDGE_SITE_ID, "timeUnit": DAILY_DATA})
    with open('solaredge.cookies', 'wb') as f:
        pickle.dump(session.cookies, f)
        f.close()
with open('solaredge.cookies', 'rb') as f:
    session.cookies.update(pickle.load(f))
    panels = session.post(panels_url, headers = {"Content-Type": "application/x-www-form-urlencoded", "X-CSRF-TOKEN": session.cookies["CSRF-TOKEN"]}, data={"fieldId": SOLAREDGE_SITE_ID, "timeUnit": DAILY_DATA})
    if panels.status_code != 200:
        session.post(login_url, headers = {"Content-Type": "application/x-www-form-urlencoded"}, data={"j_username": SOLAREDGE_USER, "j_password": SOLAREDGE_PASS})
        panels = session.post(panels_url, headers = {"Content-Type": "application/x-www-form-urlencoded", "X-CSRF-TOKEN": session.cookies["CSRF-TOKEN"]}, data={"fieldId": SOLAREDGE_SITE_ID, "timeUnit": DAILY_DATA})
        if panels.status_code != 200:
            exit()
        with open('solaredge.cookies', 'wb') as f:
            pickle.dump(s.cookies, f)
    response = panels.content.decode("utf-8").replace('\'', '"').replace('Array', '').replace('key', '"key"').replace('value', '"value"')
    response = response.replace('timeUnit', '"timeUnit"').replace('fieldData', '"fieldData"').replace('reportersData', '"reportersData"')
    response = json.loads(response)
    
    data = {}
    for date_str in response["reportersData"].keys():
        date = datetime.strptime(date_str, '%a %b %d %H:%M:%S GMT %Y')
        date = pytz.timezone('Europe/Berlin').localize(date).astimezone(pytz.utc)
        for sid in response["reportersData"][date_str].keys():
            for entry in response["reportersData"][date_str][sid]:
                if entry["key"] not in data.keys():
                     data[entry["key"]] = {}
                data[entry["key"]][date] = float(entry["value"].replace(",", ""))

    df = pd.DataFrame(data)
    conn = DataFrameClient(INFLUXDB_IP, INFLUXDB_PORT, "", "", INFLUXDB_DATABASE)
    conn.write_points(df, INFLUXDB_SERIES, retention_policy=INFLUXDB_RETENTION_POLICY)
nun meine Frage was ist da verkehrt?

Vieleicht kann mir jemand helfen, denn es wäre schon cool wenn es funktionieren würde !
Mein Ziel wäre für jeden Optimierer ( Spannung, Leistung, etc.) ein Item zu haben.


Für jeden Tipp bin ich dankbar

Gruß Rob69

Benutzeravatar
udo1toni
Beiträge: 15240
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: Solaredge optimiererdaten auslesen

Beitrag von udo1toni »

Na ja, Du musst halt alle Abhängigkeiten installieren. Oben im Script stehen diverse imports, die stehen alle für externe Module. Manche davon bringt Python als native Bibliotheken selbst mit, andere musst Du über den Paketmanager nachinstallieren.

Im Video ist das auch beschrieben, allerdings kann es gut sein, dass mindestens die Installation mittels pip nicht sauber durch läuft, da wäre die Frage, ob es Fehlermeldungen gibt.
Unter debian (der Raspberry nutzt ein Image, welches auf debian aufsetzt) sind diverse Pakete mittlerweile nur noch über den debian-eigenen Paketmanager apt installierbar. Leider verwendet der andere Namen für die Pakete, aber eine Suche mittels apt-cache search <name> führt eigentlich schnell zum richtigen Paket. (<name> musst Du dann mit dem Paket ersetzen, nach dem Du suchst, z.B.

Code: Alles auswählen

apt-cache search requests
Wenn die Liste der möglichen Pakete zu lang ist, kannst Du auch

Code: Alles auswählen

apt-cache search requests | grep -i python
verwenden, dann wird die Ausgabe von apt-cache an grep übergeben und es werden nur die Zeilen ausgegeben, in denen die Zeichenfolge python vorkommt (unabhängig von der Schreibweise, wegen des -i)
Mit dem ermittelten Paketnamen kannst Du dann per

Code: Alles auswählen

sudo apt install <paketname>
das richtige Paket installieren.

Damit hast Du allerdings die Daten nur in InfluxDB, nicht in openHAB. Wenn Du die Daten tatsächlich in openHAB haben willst, müsstest Du eher die https-Abfrage mittels http-Addon vornehmen und die Daten in openHAB per jsonpath extrahieren. Die größte Hürde ist dabei erfahrungsgemäß der abgesicherte Zugriff auf die API.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Antworten