Cookie Consent by Free Privacy Policy Generator

Enphase API

Wie komme ich an die Daten meiner Enphase Solaranlage?

Mein Enphase Gateway ist jetzt online und der Zugriff per API möglich. Ich heimautomatisere auch viel. Ich hätte das gerne in meinem eigenen Grafana und würde auch gerne verschiedene Aktionen im Haus triggern lassen wollen.

Also flugs meine IDE gestartet und geschaut was ich da herausholen kann.

Prinzipiell gibt es 3 Wege an die Daten heranzukommen.

  1. Lokales Gateway per API anfragen
  2. Enphase API im Internet abfragen
  3. Daten aus der Webseite nutzen

Das Gateway meldet alle 15 Minuten die Daten an die Enphase Server. Diese Internetverbindung muss man haben, weil daran auch die 25 Jahre Garantie hängt. Ich habe mein mir ein eigenes VLAN mit keiner Möglichkeit in andere VLANs zu kommen angelegt. Bei mir ist das Gateway via Ethernet angeschlossen, welches auch die Empfehlung des Installateurs war.

Lokale API

Lokales Enphase Login

Enphase hatte im letzten Jahr die lokale API geändert. Es gab einen grossen Aufschrei. Viele Tools funktionieren nicht mehr und es ist ein gutes Stück komplizierter geworden (von dem, was ich beurteilen kann).

Das SSL Zertifikat der lokalen Seite bereite einigen Browser Probleme, weil es ungültig ist.

SSL Zertifikat

Jetzt muss man sich unter https://entrez.enphaseenergy.com/ einloggen und ein Token erzeugen. Dieses in obiges Feld einfügen und dann kommt man auf das lokale Gateway.

Leider funktioniert es nicht. Ich sehe kein Gateway, welches ich auswählen kann, also auch kein Access Token.

Enlighten Access token

Was nun?

Ein bisschen Recherche auf Github förderte ein kleines Python Script zutage, welches das Access Token erzeugt. Einzutragen / zu ändern sind Email, Passwort und Seriennummer des Gateways.

Ein Post in der Enphase Community hat dies es noch erweitert und liefert gleich das JSON Objekt von der lokalen API. Das Script loggt sich auf der Webseite ein und fordert das Token an. Funktioniert gut. Schnell noch den angeforderten Endpunkt von /home.json auf /production.json?details=1 ändern und schon haben wir verschiedene Daten zur Verfügung.

Eine Beschreibung der verschiedenen Werte findet man hier:


type inverters - production summary from inverters
type eim - production CT (summary and separate phase L1, L2, L3)
type eim - total-consumption CT (summary and separate phase L1, L2, L3)
type eim - net-consumption CT (summary and separate phase L1, L2, L3)
type acb - battery

Unit:
wNow - Power (Watt)
whToday - Watt Hour Today (Wh)
whLastSevenDays - Watt Hour Last 7 days (Wh)
whLifetime - Wat Hour Lifetime (Wh)
varhLeadLifetime - Capacitive Reactant Energy Lifetime (varh)
varhLagLifetime - Inductive Reactant Energy Lifetime (varh)
vahLifetime - Apparent Energy Volt Amper Hour Lifetime (VAh)
rmsCurrent - Current (A)
rmsVoltage - Voltage (V)
reactPwr - Reactant Power (var)
apprntPwr - Apparent Power (VA)
pwrFactor - Power Factor (cos fi)
vahToday - Apparent Energy Today (VAh)
varhLeadToday - Capacitive Reactant Energy Today (varh)
varhLagToday - Inductive Reactant Energy Today (varh)

Enphase API

Die API hat eine funktionierende Beispielseite und ich konnte es ohne Probleme nachvollziehen. Die Dokumentation der Schnittstelle ist mit OpenAPI gemacht und ich fand alles was ich brauchte.

Leider ist dies eine bezahlt API. Die Pläne gehen von 10000 Abfragen pro Monat (kostenlos) bis 1500000 Abfragen pro Monat (1500 $). 10000 Abfragen pro Monat sind wahrscheinlich ok. Komplette Einbindung in eine Heimautomatisierung kann aber mich aber schnell in einen der Bezahlpläne laufen lassen.

Webseiten Daten

Die wahrscheinlich unzuverlässigste Methode ist, Daten aus der Weboberfläche zu holen. Webinspector angemacht und siehe da, es werden JSON Daten nachgeladen.

Diese today Endpunkt sieht interessant aus. Dieser enthält die Daten die das Gateway alle 15 Minuten an Enphase meldet. Damit lässt sich ein Verlauf anzeigen oder auch die totals anzeigen lassen. Folgende Daten werden ausgegeben:

  • production
  • consumption
  • charge
  • discharge
  • soc
  • generator
  • grid_import
  • solar_home
  • solar_battery
  • solar_grid
  • generator_home
  • generator_battery
  • generator_grid
  • battery_home
  • battery_grid
  • grid_battery
  • grid_home

Alle Punkte haben 96 Datenpunkte für alle 15 min in 24h. Damit lässt sich schon was anfangen. Jetzt kam mir die Idee, das mit dem ersten Ansatz zu kombinieren.

from datetime import datetime

import requests

ENPHASE_TODAY_URL = "https://enlighten.enphaseenergy.com/pv/systems/<SYSTEMID>/today"

USER = <USERNAME>
PASSWORD = <PASSWORT>

DIR = ""

today = datetime.now().strftime('%Y-%m-%d')
INVERTER_POWER_URL = f"https://enlighten.enphaseenergy.com/systems/3610042/inverter_data_x/energy.json?start_date={today}&end_date={today}"
data = {'user[email]': USER, 'user[password]': PASSWORD}
response = requests.post('https://enlighten.enphaseenergy.com/login/login.json', data=data)
response_data = json.loads(response.text)


def fetch_and_save(file, url, cookies):
    x = requests.get(url, cookies=cookies)
    save_file = open(file, "w")
    save_file.write(x.text)
    save_file.close()


fetch_and_save(f"{DIR}enphase-{today}.json", ENPHASE_TODAY_URL, response.cookies)
fetch_and_save(f"{DIR}inverter-{today}.json", INVERTER_POWER_URL, response.cookies)

Und schon habe ich die Daten lokal in einem JSON File. Weil es so schön ist, noch die Wechselrichter abgefragt, um zu sehen, was jeder einzelne der 38 am Tag so geleistet hat. Das Teil läuft jetzt einmal kurz vor Mitternacht jeden Tag und holt die Daten für den Tag ab. Es sind immer alle (Zeit) Daten für den Tag der Abfrage enthalten. Wenn ich mal wieder Zeit habe, werde ich die Daten auch nochmal parsen. Aber erstmal muss meine Anlage tatsächlich auch Daten produzieren.

Wenn Du Fragen hast, melde Dich gerne auf Twitter.