Kurzanleitung: Daten vom Solaredge-Portal auslesen

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

Moderatoren: Ulrich, TeamO

Antworten
Benutzeravatar
jjk
Beiträge: 8
Registriert: Sa 12. Sep 2020, 16:55
Danksagung erhalten: 7 Mal
Kontaktdaten:

Kurzanleitung: Daten vom Solaredge-Portal auslesen

Beitrag von jjk »

Solaredge bietet eine API, um Daten vom Portal auszulesen. Das fand ich besonders praktisch im Hinblick auf Summen, da diese von der Solaranzeige nur sehr knapp ausgelesen werden.
So sieht das ganze bei mir zum Schluss im Grafana-Dashboard aus:
sol1.png
sol2.png
sol3.png
Um die Daten zu holen, verwende ich Python, da ich zu dem Zeitpunkt, als ich die Skripte geschrieben habe noch kein PHP konnte. Mit PHP ist das natürlich auch möglich.

Anleitung:

0. API-Key und ID holen
Wenn du auf deinem Solaredge Dashboard bist, ist der Link dazu z.B: monitoring.solaredge.com/solaredge-web/p/site/XXXXXXX/#/dashboard . Hier ist dann XXXXXXX die ID. Unter Admin -> Anlagenzugriff -> Zugriffssteuerung -> API-Zugriff bekommst du einen API-Key. Das geht aber nur, wenn du Admin bist.

1. Module installieren

Code: Alles auswählen

sudo pip3 install influxdb
sudo pip3 install requests
2. Skripte erstellen
Folgendermaßen sehen meine Skripte aus:

Skript für täglich:

Code: Alles auswählen

import requests
from datetime import date
from influxdb import InfluxDBClient

client = InfluxDBClient(host='localhost', port=8086)
client.switch_database('solaranzeige')

today = date.today()
starttime= str(today.year) + "-" + str(today.month) + "-" + str(today.day) + "%2000:00:00"
endtime=   str(today.year) + "-" + str(today.month) + "-" + str(today.day) + "%2023:59:59"
#Abfrage
url='https://monitoringapi.solaredge.com/site/geheim/energyDetails?timeUnit=DAY&startTime=' + starttime + '&endTime=' + endtime + '&api_key=geheim'
r = requests.get(url)
data = r.json()
print(url)
#Verarbeitung

#Eigenverbrauch
if data["energyDetails"]["meters"][0]["type"] == "SelfConsumption":
	eigenverbrauch = data["energyDetails"]["meters"][0]["values"][0]["value"]
	
if data["energyDetails"]["meters"][1]["type"] == "SelfConsumption":
	eigenverbrauch = data["energyDetails"]["meters"][1]["values"][0]["value"]
	
if data["energyDetails"]["meters"][2]["type"] == "SelfConsumption":
	eigenverbrauch = data["energyDetails"]["meters"][2]["values"][0]["value"]
	
if data["energyDetails"]["meters"][3]["type"] == "SelfConsumption":
	eigenverbrauch = data["energyDetails"]["meters"][3]["values"][0]["value"]
	
if data["energyDetails"]["meters"][4]["type"] == "SelfConsumption":
	eigenverbrauch = data["energyDetails"]["meters"][4]["values"][0]["value"]
	
#Produktion
if data["energyDetails"]["meters"][0]["type"] == "Production":
	produktion = data["energyDetails"]["meters"][0]["values"][0]["value"]
	
if data["energyDetails"]["meters"][1]["type"] == "Production":
	produktion = data["energyDetails"]["meters"][1]["values"][0]["value"]
	
if data["energyDetails"]["meters"][2]["type"] == "Production":
	produktion = data["energyDetails"]["meters"][2]["values"][0]["value"]
	
if data["energyDetails"]["meters"][3]["type"] == "Production":
	produktion = data["energyDetails"]["meters"][3]["values"][0]["value"]
	
if data["energyDetails"]["meters"][4]["type"] == "Production":
	produktion = data["energyDetails"]["meters"][4]["values"][0]["value"]

#bezug
if data["energyDetails"]["meters"][0]["type"] == "Purchased":
	bezug = data["energyDetails"]["meters"][0]["values"][0]["value"]
	
if data["energyDetails"]["meters"][1]["type"] == "Purchased":
	bezug = data["energyDetails"]["meters"][1]["values"][0]["value"]
	
if data["energyDetails"]["meters"][2]["type"] == "Purchased":
	bezug = data["energyDetails"]["meters"][2]["values"][0]["value"]
	
if data["energyDetails"]["meters"][3]["type"] == "Purchased":
	bezug = data["energyDetails"]["meters"][3]["values"][0]["value"]
	
if data["energyDetails"]["meters"][4]["type"] == "Purchased":
	bezug = data["energyDetails"]["meters"][4]["values"][0]["value"]

#einspeisung
if data["energyDetails"]["meters"][0]["type"] == "FeedIn":
	einspeisung = data["energyDetails"]["meters"][0]["values"][0]["value"]
	
if data["energyDetails"]["meters"][1]["type"] == "FeedIn":
	einspeisung = data["energyDetails"]["meters"][1]["values"][0]["value"]
	
if data["energyDetails"]["meters"][2]["type"] == "FeedIn":
	einspeisung = data["energyDetails"]["meters"][2]["values"][0]["value"]
	
if data["energyDetails"]["meters"][3]["type"] == "FeedIn":
	einspeisung = data["energyDetails"]["meters"][3]["values"][0]["value"]
	
if data["energyDetails"]["meters"][4]["type"] == "FeedIn":
	einspeisung = data["energyDetails"]["meters"][4]["values"][0]["value"]
	
#verbrauch
if data["energyDetails"]["meters"][0]["type"] == "Consumption":
	verbrauch = data["energyDetails"]["meters"][0]["values"][0]["value"]
	
if data["energyDetails"]["meters"][1]["type"] == "Consumption":
	verbrauch = data["energyDetails"]["meters"][1]["values"][0]["value"]
	
if data["energyDetails"]["meters"][2]["type"] == "Consumption":
	verbrauch = data["energyDetails"]["meters"][2]["values"][0]["value"]
	
if data["energyDetails"]["meters"][3]["type"] == "Consumption":
	verbrauch = data["energyDetails"]["meters"][3]["values"][0]["value"]
	
if data["energyDetails"]["meters"][4]["type"] == "Consumption":
	verbrauch = data["energyDetails"]["meters"][4]["values"][0]["value"]

#Berechnung Verhältnis:
#Eigenverbrauch - Einspeisung
try:
	einspeisung_prozent = einspeisung/produktion
	erfolg_einspeisung_prozent = 1
except:
	erfolg_einspeisung_prozent = 0

try:
	bezug_prozent = bezug/verbrauch
	erfolg_bezug_prozent = 1
except:
	erfolg_bezug_prozent = 0
#Ausgabe
print("Eigenverbrauch: " + str(eigenverbrauch))
print("Produktion: " + str(produktion))
print("Bezug: " + str(bezug))
print("Einspeisung: " + str(einspeisung))
print("Verbrauch: " + str(verbrauch))

#In influxdb schreiben
json_body = [
	{
		"measurement": "Summen_Tag",
		"fields": {
			"Eigenverbrauch": eigenverbrauch
		}
	},
]
client.write_points(json_body)
json_body = [
	{
		"measurement": "Summen_Tag",
		"fields": {
			"Produktion": produktion
		}
	},
]
client.write_points(json_body)
json_body = [
	{
		"measurement": "Summen_Tag",
		"fields": {
			"Bezug": bezug
		}
	},
]
client.write_points(json_body)
json_body = [
	{
		"measurement": "Summen_Tag",
		"fields": {
			"Einspeisung": einspeisung
		}
	},
]
client.write_points(json_body)
json_body = [
	{
		"measurement": "Summen_Tag",
		"fields": {
			"Verbrauch": verbrauch
		}
	},
]
client.write_points(json_body)

if erfolg_einspeisung_prozent == 1:
	json_body = [
		{
			"measurement": "Summen_Tag",
			"fields": {
				"Einspeisung_Prozent": einspeisung_prozent
			}
		},
	]
	client.write_points(json_body)
if erfolg_bezug_prozent == 1:
	json_body = [
		{
			"measurement": "Summen_Tag",
			"fields": {
				"Bezug_Prozent": bezug_prozent
			}
		},
	]
	client.write_points(json_body)
Skript für wöchentlich:

Code: Alles auswählen

import requests
from datetime import date
from influxdb import InfluxDBClient

client = InfluxDBClient(host='localhost', port=8086)
client.switch_database('solaranzeige')

today = date.today()
starttime= str(today.year) + "-" + str(today.month) + "-" + str(today.day) + "%2000:00:00"
endtime=   str(today.year) + "-" + str(today.month) + "-" + str(today.day) + "%2023:59:59"
#Abfrage
url='https://monitoringapi.solaredge.com/site/geheim/energyDetails?timeUnit=WEEK&startTime=' + starttime + '&endTime=' + endtime + '&api_key=geheim'
r = requests.get(url)
data = r.json()
print(url)
#Verarbeitung

#Eigenverbrauch
if data["energyDetails"]["meters"][0]["type"] == "SelfConsumption":
	eigenverbrauch = data["energyDetails"]["meters"][0]["values"][0]["value"]
	
if data["energyDetails"]["meters"][1]["type"] == "SelfConsumption":
	eigenverbrauch = data["energyDetails"]["meters"][1]["values"][0]["value"]
	
if data["energyDetails"]["meters"][2]["type"] == "SelfConsumption":
	eigenverbrauch = data["energyDetails"]["meters"][2]["values"][0]["value"]
	
if data["energyDetails"]["meters"][3]["type"] == "SelfConsumption":
	eigenverbrauch = data["energyDetails"]["meters"][3]["values"][0]["value"]
	
if data["energyDetails"]["meters"][4]["type"] == "SelfConsumption":
	eigenverbrauch = data["energyDetails"]["meters"][4]["values"][0]["value"]
	
#Produktion
if data["energyDetails"]["meters"][0]["type"] == "Production":
	produktion = data["energyDetails"]["meters"][0]["values"][0]["value"]
	
if data["energyDetails"]["meters"][1]["type"] == "Production":
	produktion = data["energyDetails"]["meters"][1]["values"][0]["value"]
	
if data["energyDetails"]["meters"][2]["type"] == "Production":
	produktion = data["energyDetails"]["meters"][2]["values"][0]["value"]
	
if data["energyDetails"]["meters"][3]["type"] == "Production":
	produktion = data["energyDetails"]["meters"][3]["values"][0]["value"]
	
if data["energyDetails"]["meters"][4]["type"] == "Production":
	produktion = data["energyDetails"]["meters"][4]["values"][0]["value"]

#bezug
if data["energyDetails"]["meters"][0]["type"] == "Purchased":
	bezug = data["energyDetails"]["meters"][0]["values"][0]["value"]
	
if data["energyDetails"]["meters"][1]["type"] == "Purchased":
	bezug = data["energyDetails"]["meters"][1]["values"][0]["value"]
	
if data["energyDetails"]["meters"][2]["type"] == "Purchased":
	bezug = data["energyDetails"]["meters"][2]["values"][0]["value"]
	
if data["energyDetails"]["meters"][3]["type"] == "Purchased":
	bezug = data["energyDetails"]["meters"][3]["values"][0]["value"]
	
if data["energyDetails"]["meters"][4]["type"] == "Purchased":
	bezug = data["energyDetails"]["meters"][4]["values"][0]["value"]

#einspeisung
if data["energyDetails"]["meters"][0]["type"] == "FeedIn":
	einspeisung = data["energyDetails"]["meters"][0]["values"][0]["value"]
	
if data["energyDetails"]["meters"][1]["type"] == "FeedIn":
	einspeisung = data["energyDetails"]["meters"][1]["values"][0]["value"]
	
if data["energyDetails"]["meters"][2]["type"] == "FeedIn":
	einspeisung = data["energyDetails"]["meters"][2]["values"][0]["value"]
	
if data["energyDetails"]["meters"][3]["type"] == "FeedIn":
	einspeisung = data["energyDetails"]["meters"][3]["values"][0]["value"]
	
if data["energyDetails"]["meters"][4]["type"] == "FeedIn":
	einspeisung = data["energyDetails"]["meters"][4]["values"][0]["value"]
	
#verbrauch
if data["energyDetails"]["meters"][0]["type"] == "Consumption":
	verbrauch = data["energyDetails"]["meters"][0]["values"][0]["value"]
	
if data["energyDetails"]["meters"][1]["type"] == "Consumption":
	verbrauch = data["energyDetails"]["meters"][1]["values"][0]["value"]
	
if data["energyDetails"]["meters"][2]["type"] == "Consumption":
	verbrauch = data["energyDetails"]["meters"][2]["values"][0]["value"]
	
if data["energyDetails"]["meters"][3]["type"] == "Consumption":
	verbrauch = data["energyDetails"]["meters"][3]["values"][0]["value"]
	
if data["energyDetails"]["meters"][4]["type"] == "Consumption":
	verbrauch = data["energyDetails"]["meters"][4]["values"][0]["value"]

#Berechnung Verhältnis:
#Eigenverbrauch - Einspeisung
try:
	einspeisung_prozent = einspeisung/produktion
	erfolg_einspeisung_prozent = 1
except:
	erfolg_einspeisung_prozent = 0

try:
	bezug_prozent = bezug/verbrauch
	erfolg_bezug_prozent = 1
except:
	erfolg_bezug_prozent = 0
#Ausgabe
print("Eigenverbrauch: " + str(eigenverbrauch))
print("Produktion: " + str(produktion))
print("Bezug: " + str(bezug))
print("Einspeisung: " + str(einspeisung))
print("Verbrauch: " + str(verbrauch))

#In influxdb schreiben
json_body = [
	{
		"measurement": "Summen_Woche",
		"fields": {
			"Eigenverbrauch": eigenverbrauch
		}
	},
]
client.write_points(json_body)
json_body = [
	{
		"measurement": "Summen_Woche",
		"fields": {
			"Produktion": produktion
		}
	},
]
client.write_points(json_body)
json_body = [
	{
		"measurement": "Summen_Woche",
		"fields": {
			"Bezug": bezug
		}
	},
]
client.write_points(json_body)
json_body = [
	{
		"measurement": "Summen_Woche",
		"fields": {
			"Einspeisung": einspeisung
		}
	},
]
client.write_points(json_body)
json_body = [
	{
		"measurement": "Summen_Woche",
		"fields": {
			"Verbrauch": verbrauch
		}
	},
]
client.write_points(json_body)

if erfolg_einspeisung_prozent == 1:
	json_body = [
		{
			"measurement": "Summen_Woche",
			"fields": {
				"Einspeisung_Prozent": einspeisung_prozent
			}
		},
	]
	client.write_points(json_body)
if erfolg_bezug_prozent == 1:
	json_body = [
		{
			"measurement": "Summen_Woche",
			"fields": {
				"Bezug_Prozent": bezug_prozent
			}
		},
	]
	client.write_points(json_body)

monatlich:

Code: Alles auswählen

import requests
from datetime import date
from influxdb import InfluxDBClient

client = InfluxDBClient(host='localhost', port=8086)
client.switch_database('solaranzeige')

today = date.today()
starttime= str(today.year) + "-" + str(today.month) + "-" + "01" + "%2000:00:00"
endtime=   str(today.year) + "-" + str(today.month) + "-" + str(today.day) + "%2023:59:59"
#Abfrage
url='https://monitoringapi.solaredge.com/site/geheim/energyDetails?timeUnit=MONTH&startTime=' + starttime + '&endTime=' + endtime + '&api_key=geheim'
r = requests.get(url)
data = r.json()
print(url)
#Verarbeitung

#Eigenverbrauch
if data["energyDetails"]["meters"][0]["type"] == "SelfConsumption":
	eigenverbrauch = data["energyDetails"]["meters"][0]["values"][0]["value"]
	
if data["energyDetails"]["meters"][1]["type"] == "SelfConsumption":
	eigenverbrauch = data["energyDetails"]["meters"][1]["values"][0]["value"]
	
if data["energyDetails"]["meters"][2]["type"] == "SelfConsumption":
	eigenverbrauch = data["energyDetails"]["meters"][2]["values"][0]["value"]
	
if data["energyDetails"]["meters"][3]["type"] == "SelfConsumption":
	eigenverbrauch = data["energyDetails"]["meters"][3]["values"][0]["value"]
	
if data["energyDetails"]["meters"][4]["type"] == "SelfConsumption":
	eigenverbrauch = data["energyDetails"]["meters"][4]["values"][0]["value"]
	
#Produktion
if data["energyDetails"]["meters"][0]["type"] == "Production":
	produktion = data["energyDetails"]["meters"][0]["values"][0]["value"]
	
if data["energyDetails"]["meters"][1]["type"] == "Production":
	produktion = data["energyDetails"]["meters"][1]["values"][0]["value"]
	
if data["energyDetails"]["meters"][2]["type"] == "Production":
	produktion = data["energyDetails"]["meters"][2]["values"][0]["value"]
	
if data["energyDetails"]["meters"][3]["type"] == "Production":
	produktion = data["energyDetails"]["meters"][3]["values"][0]["value"]
	
if data["energyDetails"]["meters"][4]["type"] == "Production":
	produktion = data["energyDetails"]["meters"][4]["values"][0]["value"]

#bezug
if data["energyDetails"]["meters"][0]["type"] == "Purchased":
	bezug = data["energyDetails"]["meters"][0]["values"][0]["value"]
	
if data["energyDetails"]["meters"][1]["type"] == "Purchased":
	bezug = data["energyDetails"]["meters"][1]["values"][0]["value"]
	
if data["energyDetails"]["meters"][2]["type"] == "Purchased":
	bezug = data["energyDetails"]["meters"][2]["values"][0]["value"]
	
if data["energyDetails"]["meters"][3]["type"] == "Purchased":
	bezug = data["energyDetails"]["meters"][3]["values"][0]["value"]
	
if data["energyDetails"]["meters"][4]["type"] == "Purchased":
	bezug = data["energyDetails"]["meters"][4]["values"][0]["value"]

#einspeisung
if data["energyDetails"]["meters"][0]["type"] == "FeedIn":
	einspeisung = data["energyDetails"]["meters"][0]["values"][0]["value"]
	
if data["energyDetails"]["meters"][1]["type"] == "FeedIn":
	einspeisung = data["energyDetails"]["meters"][1]["values"][0]["value"]
	
if data["energyDetails"]["meters"][2]["type"] == "FeedIn":
	einspeisung = data["energyDetails"]["meters"][2]["values"][0]["value"]
	
if data["energyDetails"]["meters"][3]["type"] == "FeedIn":
	einspeisung = data["energyDetails"]["meters"][3]["values"][0]["value"]
	
if data["energyDetails"]["meters"][4]["type"] == "FeedIn":
	einspeisung = data["energyDetails"]["meters"][4]["values"][0]["value"]
	
#verbrauch
if data["energyDetails"]["meters"][0]["type"] == "Consumption":
	verbrauch = data["energyDetails"]["meters"][0]["values"][0]["value"]
	
if data["energyDetails"]["meters"][1]["type"] == "Consumption":
	verbrauch = data["energyDetails"]["meters"][1]["values"][0]["value"]
	
if data["energyDetails"]["meters"][2]["type"] == "Consumption":
	verbrauch = data["energyDetails"]["meters"][2]["values"][0]["value"]
	
if data["energyDetails"]["meters"][3]["type"] == "Consumption":
	verbrauch = data["energyDetails"]["meters"][3]["values"][0]["value"]
	
if data["energyDetails"]["meters"][4]["type"] == "Consumption":
	verbrauch = data["energyDetails"]["meters"][4]["values"][0]["value"]

#Berechnung Verhältnis:
#Eigenverbrauch - Einspeisung
try:
	einspeisung_prozent = einspeisung/produktion
	erfolg_einspeisung_prozent = 1
except:
	erfolg_einspeisung_prozent = 0

try:
	bezug_prozent = bezug/verbrauch
	erfolg_bezug_prozent = 1
except:
	erfolg_bezug_prozent = 0
#Ausgabe
print("Eigenverbrauch: " + str(eigenverbrauch))
print("Produktion: " + str(produktion))
print("Bezug: " + str(bezug))
print("Einspeisung: " + str(einspeisung))
print("Verbrauch: " + str(verbrauch))

#In influxdb schreiben
json_body = [
	{
		"measurement": "Summen_Monat",
		"fields": {
			"Eigenverbrauch": eigenverbrauch
		}
	},
]
client.write_points(json_body)
json_body = [
	{
		"measurement": "Summen_Monat",
		"fields": {
			"Produktion": produktion
		}
	},
]
client.write_points(json_body)
json_body = [
	{
		"measurement": "Summen_Monat",
		"fields": {
			"Bezug": bezug
		}
	},
]
client.write_points(json_body)
json_body = [
	{
		"measurement": "Summen_Monat",
		"fields": {
			"Einspeisung": einspeisung
		}
	},
]
client.write_points(json_body)
json_body = [
	{
		"measurement": "Summen_Monat",
		"fields": {
			"Verbrauch": verbrauch
		}
	},
]
client.write_points(json_body)
if erfolg_einspeisung_prozent == 1:
	json_body = [
		{
			"measurement": "Summen_Monat",
			"fields": {
				"Einspeisung_Prozent": einspeisung_prozent
			}
		},
	]
	client.write_points(json_body)
if erfolg_bezug_prozent == 1:
	json_body = [
		{
			"measurement": "Summen_Monat",
			"fields": {
				"Bezug_Prozent": bezug_prozent
			}
		},
	]
	client.write_points(json_body)

jährlich:

Code: Alles auswählen

import requests
from datetime import date
from influxdb import InfluxDBClient

client = InfluxDBClient(host='localhost', port=8086)
client.switch_database('solaranzeige')

today = date.today()
starttime= str(today.year) + "-" + str(today.month) + "-" + str(today.day) + "%2000:00:00"
endtime=   str(today.year) + "-" + str(today.month) + "-" + str(today.day) + "%2023:59:59"
#Abfrage
url='https://monitoringapi.solaredge.com/site/geheim/energyDetails?timeUnit=YEAR&startTime=' + starttime + '&endTime=' + endtime + '&api_key=geheim'
r = requests.get(url)
data = r.json()
print(url)
#Verarbeitung

#Eigenverbrauch
if data["energyDetails"]["meters"][0]["type"] == "SelfConsumption":
	eigenverbrauch = data["energyDetails"]["meters"][0]["values"][0]["value"]
	
if data["energyDetails"]["meters"][1]["type"] == "SelfConsumption":
	eigenverbrauch = data["energyDetails"]["meters"][1]["values"][0]["value"]
	
if data["energyDetails"]["meters"][2]["type"] == "SelfConsumption":
	eigenverbrauch = data["energyDetails"]["meters"][2]["values"][0]["value"]
	
if data["energyDetails"]["meters"][3]["type"] == "SelfConsumption":
	eigenverbrauch = data["energyDetails"]["meters"][3]["values"][0]["value"]
	
if data["energyDetails"]["meters"][4]["type"] == "SelfConsumption":
	eigenverbrauch = data["energyDetails"]["meters"][4]["values"][0]["value"]
	
#Produktion
if data["energyDetails"]["meters"][0]["type"] == "Production":
	produktion = data["energyDetails"]["meters"][0]["values"][0]["value"]
	
if data["energyDetails"]["meters"][1]["type"] == "Production":
	produktion = data["energyDetails"]["meters"][1]["values"][0]["value"]
	
if data["energyDetails"]["meters"][2]["type"] == "Production":
	produktion = data["energyDetails"]["meters"][2]["values"][0]["value"]
	
if data["energyDetails"]["meters"][3]["type"] == "Production":
	produktion = data["energyDetails"]["meters"][3]["values"][0]["value"]
	
if data["energyDetails"]["meters"][4]["type"] == "Production":
	produktion = data["energyDetails"]["meters"][4]["values"][0]["value"]

#bezug
if data["energyDetails"]["meters"][0]["type"] == "Purchased":
	bezug = data["energyDetails"]["meters"][0]["values"][0]["value"]
	
if data["energyDetails"]["meters"][1]["type"] == "Purchased":
	bezug = data["energyDetails"]["meters"][1]["values"][0]["value"]
	
if data["energyDetails"]["meters"][2]["type"] == "Purchased":
	bezug = data["energyDetails"]["meters"][2]["values"][0]["value"]
	
if data["energyDetails"]["meters"][3]["type"] == "Purchased":
	bezug = data["energyDetails"]["meters"][3]["values"][0]["value"]
	
if data["energyDetails"]["meters"][4]["type"] == "Purchased":
	bezug = data["energyDetails"]["meters"][4]["values"][0]["value"]

#einspeisung
if data["energyDetails"]["meters"][0]["type"] == "FeedIn":
	einspeisung = data["energyDetails"]["meters"][0]["values"][0]["value"]
	
if data["energyDetails"]["meters"][1]["type"] == "FeedIn":
	einspeisung = data["energyDetails"]["meters"][1]["values"][0]["value"]
	
if data["energyDetails"]["meters"][2]["type"] == "FeedIn":
	einspeisung = data["energyDetails"]["meters"][2]["values"][0]["value"]
	
if data["energyDetails"]["meters"][3]["type"] == "FeedIn":
	einspeisung = data["energyDetails"]["meters"][3]["values"][0]["value"]
	
if data["energyDetails"]["meters"][4]["type"] == "FeedIn":
	einspeisung = data["energyDetails"]["meters"][4]["values"][0]["value"]
	
#verbrauch
if data["energyDetails"]["meters"][0]["type"] == "Consumption":
	verbrauch = data["energyDetails"]["meters"][0]["values"][0]["value"]
	
if data["energyDetails"]["meters"][1]["type"] == "Consumption":
	verbrauch = data["energyDetails"]["meters"][1]["values"][0]["value"]
	
if data["energyDetails"]["meters"][2]["type"] == "Consumption":
	verbrauch = data["energyDetails"]["meters"][2]["values"][0]["value"]
	
if data["energyDetails"]["meters"][3]["type"] == "Consumption":
	verbrauch = data["energyDetails"]["meters"][3]["values"][0]["value"]
	
if data["energyDetails"]["meters"][4]["type"] == "Consumption":
	verbrauch = data["energyDetails"]["meters"][4]["values"][0]["value"]

#Berechnung Verhältnis:
#Eigenverbrauch - Einspeisung
try:
	einspeisung_prozent = einspeisung/produktion
	erfolg_einspeisung_prozent = 1
except:
	erfolg_einspeisung_prozent = 0

try:
	bezug_prozent = bezug/verbrauch
	erfolg_bezug_prozent = 1
except:
	erfolg_bezug_prozent = 0
#Ausgabe
print("Eigenverbrauch: " + str(eigenverbrauch))
print("Produktion: " + str(produktion))
print("Bezug: " + str(bezug))
print("Einspeisung: " + str(einspeisung))
print("Verbrauch: " + str(verbrauch))

#In influxdb schreiben
json_body = [
	{
		"measurement": "Summen_Jahr",
		"fields": {
			"Eigenverbrauch": eigenverbrauch
		}
	},
]
client.write_points(json_body)
json_body = [
	{
		"measurement": "Summen_Jahr",
		"fields": {
			"Produktion": produktion
		}
	},
]
client.write_points(json_body)
json_body = [
	{
		"measurement": "Summen_Jahr",
		"fields": {
			"Bezug": bezug
		}
	},
]
client.write_points(json_body)
json_body = [
	{
		"measurement": "Summen_Jahr",
		"fields": {
			"Einspeisung": einspeisung
		}
	},
]
client.write_points(json_body)
json_body = [
	{
		"measurement": "Summen_Jahr",
		"fields": {
			"Verbrauch": verbrauch
		}
	},
]
client.write_points(json_body)

if erfolg_einspeisung_prozent == 1:
	json_body = [
		{
			"measurement": "Summen_Jahr",
			"fields": {
				"Einspeisung_Prozent": einspeisung_prozent
			}
		},
	]
	client.write_points(json_body)
if erfolg_bezug_prozent == 1:
	json_body = [
		{
			"measurement": "Summen_Jahr",
			"fields": {
				"Bezug_Prozent": bezug_prozent
			}
		},
	]
	client.write_points(json_body)

In Zeile 12 müssen bei allen Skripten der API-Key und die Site-ID eingetragen werden. (Da, wo "geheim" steht)
Sollten die Daten auf einer entfernten Influx Datenbank gespeichert werden, müssen in Zeile 5 und 6 hierzu die Zugangsdaten eingetragen werden.

Die Dateien können nun in einem beliebigen Ordner abgespeichert werden. Zum Beispiel in /home/pi/scripts/solaredge/api.py
Man kann natürlich noch viel mehr Daten auslesen. Dafür muss man aber das Skript etwas bearbeiten. Die vollständige API-Beschreibung von Solaredge befindet sich dazu hier: https://www.solaredge.com/sites/default ... ng_api.pdf

3. Cronjobs anlegen
Die Skripte sollen natürlich regelmäßig laufen. Hierzu verwende ich cron. Öffne die Datei /etc/crontab mit root-Rechten, zum Beispiel:

Code: Alles auswählen

sudo nano /etc/crontab
Ich verwende hier folgende Einträge:

Code: Alles auswählen

*/15 *  * * *   pi python3 /home/pi/scripts/solaredge/api.py
*/30 *  * * *   pi python3 /home/pi/scripts/solaredge/api_monat.py
*/30 *  * * *   pi python3 /home/pi/scripts/solaredge/api_jahr.py
*/30 *  * * *   pi python3 /home/pi/scripts/solaredge/api_woche.py
Das bedeutet: Die Datei api.py (täglich) wird alle 15 Minuten ausgeführt. die anderen werden alle 30 Minuten ausgeführt. Die Intervalle können hier nicht nach Belieben verändert werden. Die Solaredge API erlaubt maximal 300 Aufrufe am Tag. Ich habe somit:
4*24+3*2*24=240 Aufrufe am Tag.

4. Spezialfall Docker:
Es macht , denke ich, eher weniger Sinn, die Skripte im Docker-Container auszuführen. Also würde ich vorschlagen, sie außerhalb auszuführen. Hierzu muss beim start des Containers noch der Port der Datenbank nach außen geleitet werden, also:

Code: Alles auswählen

docker run \
  -d \
  -e USER_ID="99" \
  -e GROUP_ID="100" \
  -e TIMEZONE="Europe/Berlin" \
  -e UPDATE="yes" \
  -e MOSQUITTO="yes" \
  -e INFLUXDB="yes" \
  -p 3000:3000 \
  -p 1883:1883 \
  -p 8080:80 \
  -p 8086:8086\
  -v {SOLARANZEIGE_STORAGE}:/solaranzeige \
  -v {INFLUXDB_STORAGE}:/var/lib/influxdb \
  -v {GRAFANA_STORAGE}:/var/lib/grafana \
  -v {PVFORECAST_STORAGE}:/pvforecast \
  -v {WWW_STORAGE}:/var/www \
  --name=Solaranzeige \
  --restart unless-stopped \
  --tmpfs /tmp \
  --tmpfs /var/log \
  takealug/solaranzeige:tag
(Zeile 12)
Mit dem Docker Container habe ich nichts getestet, da ich keine Solaranzeige im Docker habe.

Ich hoffe, jetzt habe ich alles aufgeschrieben. Ist doch etwas länger geworden, als ich beim Schreiben des Titels gedacht hatte.Würde mich über Rückmeldungen freuen.

Century
Beiträge: 25
Registriert: Mi 1. Jun 2022, 06:31

Re: Kurzanleitung: Daten vom Solaredge-Portal auslesen

Beitrag von Century »

Hi,

danke für alle deine Infos. Eines ist mir aber nicht klar. Ich lese den WR aus und schreibe die Daten in die Influx DB. Schreibst du mit deinem Skript in die selben Felder der DB und verheiratest du die Daten oder liest du nix am WR direkt aus.

Wäre ein Import wie in meinem Fall um die Daten der Vergangenheit in die DB zu bringen auch möglich ohne standardt Abfragen umbauen zu müssen ?

Lg
Thomas

PS: Hat sich erledigt ... nehme die History Daten und verrechne sie mit den akteullen

Antworten

Zurück zu „Dokumente, Bauanleitungen und How To's“