Dashboard für Solaredge Wechselrichter + Batterie (Raspi und Mobil)

Hier könnt Ihr Eure Dashborads den anderen Mitgliedern zur Verfügung stellen. Bitte immer auch ein Screenshot dazu laden, damit man sieht wie das Dashboard aussieht und unbedingt auch für welchen Regler / Wechselrichter es ist.

Moderator: Ulrich

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

Dashboard für Solaredge Wechselrichter + Batterie (Raspi und Mobil)

Beitrag von jjk »

Hallo zusammen.
Das ist mein Dashboard. Einige Daten werden von Python Skripten ausgelesen und berechnet, da ich es bisher in Grafana nicht geschafft habe. (und PHP kann ich auch nicht). Auch Daten aus der Solaredge API sind darin enthalten. Die Skripte werden per cron regelmäßig ausgeführt.

Skript: eigenverbrauch.py. Wird einmal pro Minute ausgeführt

Code: Alles auswählen

#!/usr/bin/env python3

from influxdb import InfluxDBClient
from time import asctime
client = InfluxDBClient(host='localhost', port=8086)
client.switch_database('solaranzeige')

#--------------- Berechnung des Eigenverbrauchs ---------------
print(asctime())
print("Berechnung des Eigenverbrauchs")
#Verbrauch ermitteln
results=client.query('SELECT "Verbrauch" FROM "AC" GROUP BY * ORDER BY DESC LIMIT 1')

points = results.get_points

point = 0

for point in points():
	verbrauch = point['Verbrauch']
	verbrauchprint = str(verbrauch)
	print("Verbrauch: " + verbrauchprint)

#AC Leistung ermitteln
results=client.query('SELECT "Leistung" FROM "AC" GROUP BY * ORDER BY DESC LIMIT 1')

points = results.get_points

point = 0

for point in points():
	acleistung = (point['Leistung'])
	acleistungprint = str(acleistung)
	print("AC-Leistung: " + acleistungprint)

#Berechnen
if acleistung >= verbrauch:
	eigenverbrauch = verbrauch
	eigenverbrauchprint = str(eigenverbrauch)
	print("Eigenverbrauch: " + eigenverbrauchprint)

if acleistung < verbrauch:
	eigenverbrauch = acleistung
	eigenverbrauchprint = str(eigenverbrauch)
	print("Eigenverbrauch: " + eigenverbrauchprint)

#Berechnete Werte in die Datenbank eintragen
json_body = [
	{
		"measurement": "Eigenverbrauch",
		"fields": {
			"Eigenverbrauch": eigenverbrauch
		}
	},
]

client.write_points(json_body)
Skript: pv.py. wird einmal pro Minute ausgeführt

Code: Alles auswählen

#!/usr/bin/env python3

from time import asctime
from influxdb import InfluxDBClient
client = InfluxDBClient(host='localhost', port=8086)
client.switch_database('solaranzeige')

#--------------- Berechnung der Modulleistung ---------------
print(asctime())
print("Berechnung der Modulleistung")

#Batterieleistung ermitteln
results=client.query('SELECT "Leistung" FROM "Batterie_1" GROUP BY * ORDER BY DESC LIMIT 1')

points = results.get_points

point = 0

for point in points():
	batterieleistung = point['Leistung']
	batterieleistungprint = str(batterieleistung)
	print("Baterieleistung: " + batterieleistungprint)

#AC Leistung ermitteln
results=client.query('SELECT "Leistung" FROM "AC" GROUP BY * ORDER BY DESC LIMIT 1')

points = results.get_points

point = 0

for point in points():
	acleistung = (point['Leistung'])
	acleistungprint = str(acleistung)
	print("AC-Leistung: " + acleistungprint)

#Berechnen
pvleistung = acleistung+batterieleistung
pvleistungprint = str(pvleistung)
if pvleistung < 50:
	pvleistung2 = 0
	pvleistung = float(pvleistung2)
	pvleistungprint = str(pvleistung)

print("PV-Leistung: " + pvleistungprint)

#Berechnete Werte in die Datenbank eintragen
json_body = [
	{
		"measurement": "PV-Leistung",
		"fields": {
			"PV-Leistung": pvleistung
		}
	},
]

client.write_points(json_body)
Skript: api.py. wird alle 15 Minuten ausgeführt

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: api_woche.py. Wird einmal pro Tag ausgeführt.

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)
Skript: api_monat.py wird einmal am Tag ausgeführt.

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)
Skript: api_jahr.py wird einmal am Tag ausgeführt:

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)
Bei den api skripten muss in Zeile 12 die Site ID und der API Key eingetragen werden.
Die Skripte sind nicht schön und man kann sie auch bestimmt noch optimieren, aber sie funktionieren.
Aber nun zu den Bildern:

Solaranzeige über den PC/raspi:
Solaranzeige PC.png
Und die Solaranzeige übers Handy:
Da die Datei zu groß ist, dass ich sie im Forum hochladen könnte findet ihr sie hier: http://jjk.bplaced.net/solaranzeige_handy.jpg
(alternativ die solaranzeige_handy.txt herunterladen und in solaranzeige_handy.jpg umbenennen.)


Die json-Dateien findet ihr im Anhang
Dateianhänge
solaredge_mobil.json
(65.01 KiB) 197-mal heruntergeladen
solaredge.json
(65.02 KiB) 231-mal heruntergeladen
solaranzeige_handy.txt
(1.1 MiB) 215-mal heruntergeladen

.n3
Beiträge: 9
Registriert: Mi 23. Dez 2020, 19:35
Hat sich bedankt: 3 Mal

Re: Dashboard für Solaredge Wechselrichter + Batterie (Raspi und Mobil)

Beitrag von .n3 »

Hey, das Dashboard gefällt mir schon sehr. Vielleicht kannst du mir bei den folgenden Fragen weiterhelfen:

1. Welche Batterie verwendest du? Geht es generell mit jeder?
2. Wenn ich es richtig sehe, dann beziehst du die Werte für die API Skripte aus dem Internet? Wieso? Die Daten sollten doch auch lokal vorliegen.
3. Wie kriegt man das ID und den API Key her?
4. Hast du vielleicht daran gedacht, Prognose und Wetterdaten einzubeziehen?

Benutzeravatar
jjk
Beiträge: 25
Registriert: Sa 12. Sep 2020, 16:55
Danksagung erhalten: 4 Mal
Kontaktdaten:

Re: Dashboard für Solaredge Wechselrichter + Batterie (Raspi und Mobil)

Beitrag von jjk »

1. Ich verwende eine LG Resu 10. Sollte aber glaub ich mit jeder Batterie funktionieren
2. Ich habe diese Werte (außer die Produktion) nicht lokal gefunden. Könntest du mir einen Tipp geben, wo diese sind?
3. 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.
4. Progrnose ist die Pink gestrichelte Linie. Die passt bei mir leider überhaupt nicht. Wetterdaten brauche ich nicht.

abard
Beiträge: 3
Registriert: Sa 27. Jun 2020, 00:21
Hat sich bedankt: 1 Mal

Re: Dashboard für Solaredge Wechselrichter + Batterie (Raspi und Mobil)

Beitrag von abard »

Mir gefällt der Ansatz die Daten direkt über das Portal auszulesen. BTW - schönes Dashboard.
Da ich absoluter Laie in Sachen Linux bin kann man mir hier 'kurz' helfen?!
Wo müssen die Scripts hin und wie rufe ich diese auf? Ach so - bei mir läuft es im Docker, falls das überhaupt eine Rolle spielt.
Vielen Dank schon mal.
Albert

Benutzeravatar
jjk
Beiträge: 25
Registriert: Sa 12. Sep 2020, 16:55
Danksagung erhalten: 4 Mal
Kontaktdaten:

Re: Dashboard für Solaredge Wechselrichter + Batterie (Raspi und Mobil)

Beitrag von jjk »

Mit Docker kenn ich mich jetzt wieder weniger aus. Ob man das im Container ausführen kann... weiß nicht. Wenn die DB von außerhalb erreichbar ist, wäre das kein Problem. Da könnte man die Skripte auf dem Hostsystem laufen lassen. Wenn Interesse besteht, kann ich vielleicht auch noch eine kleine Anleitung dazu schreiben.

abard
Beiträge: 3
Registriert: Sa 27. Jun 2020, 00:21
Hat sich bedankt: 1 Mal

Re: Dashboard für Solaredge Wechselrichter + Batterie (Raspi und Mobil)

Beitrag von abard »

Eine kleine Anleitung, wo welches Script angelegt bzw. wie man das dann aufruft, wäre für mich als absoluten Linux-Laien sehr hilfreich.

Beste Grüsse
Albert

Benutzeravatar
jjk
Beiträge: 25
Registriert: Sa 12. Sep 2020, 16:55
Danksagung erhalten: 4 Mal
Kontaktdaten:

Re: Dashboard für Solaredge Wechselrichter + Batterie (Raspi und Mobil)

Beitrag von jjk »

Vielleicht finde ich morgen Nachmittag etwas Zeit dazu. In den Skripten hat sich auch in der Zwischenzeit etwas geändert.

tommel87
Beiträge: 3
Registriert: Di 19. Jul 2022, 12:43
Hat sich bedankt: 3 Mal

Re: Dashboard für Solaredge Wechselrichter + Batterie (Raspi und Mobil)

Beitrag von tommel87 »

Hey,
das wäre für mich auch sehr interessant!
Ich habe einfach mal zum Test irgendwo im System eine Datei angelegt und dort den Inhalt des Eigenverbrauch Skripts reinkopiert.
Wenn ich es ausführe bekomme ich allerdings folgenden Fehler:

Code: Alles auswählen

pi@solaranzeige:~/skripts $ python eigenverbrauch.py
Traceback (most recent call last):
  File "eigenverbrauch.py", line 3, in <module>
    from influxdb import InfluxDBClient
ImportError: No module named influxdb
Freue mich über neue Infos zu den Skripten.
Besten Dank,
Thomas

Benutzeravatar
jjk
Beiträge: 25
Registriert: Sa 12. Sep 2020, 16:55
Danksagung erhalten: 4 Mal
Kontaktdaten:

Re: Dashboard für Solaredge Wechselrichter + Batterie (Raspi und Mobil)

Beitrag von jjk »

Hallo Thomas,
ich hab das mal hier beschrieben:
viewtopic.php?t=2632
Du musst das Influxdb Modul von Python zuerst mit

Code: Alles auswählen

sudo pip3 install influxdb
installieren.

Antworten