Zur info an Tripower X besitzer, in der aktuellen Firmware 02.06.06.R funktioniert Das Auslesen der einzelnen Stringwerte nicht,
die Modbusregister zeigen alle auf den gleichen Channel, es fehlt eine Differenzierung [0] [1] und [2], das gilt für Leistung, Spannung und Strom der String Register.
Ein Ticket bei SMA ist offen.
was allerdings funktioniert ist die SMA Live API, diese ist lokal und liefert eine .json Datei mit den aktuellen Werten, lässt sich sogar problemlos alle paar Sekunden abrufen
für alle interessierte hier mein Python Skript welches meinen STPX15 mit den fehlenden Werten ausliest, mich interessiert nur die Leistung der einzelnen Stings sowie der Gesamtertrag nach IBN.
Code: Alles auswählen
import requests
import json
import warnings
warnings.filterwarnings('ignore')
user = "Admin"
password = "geheim"
url = "https://192.168.20.238"
def updateTripower():
loginurl = 'https://192.168.20.238/api/v1/token'
postdata = {'grant_type': 'password',
'username': user,
'password': password,
}
# Login & Extract Access-Token
try:
x = requests.post(loginurl, data = postdata, timeout=5, verify=False)
except requests.exceptions.ConnectTimeout:
print("error")
sys.exit(1)
token = x.json()["access_token"]
headers = { "Authorization" : "Bearer " + token }
data_url = url + '/api/v1/measurements/live'
x = requests.post(data_url, headers = headers, data='[{"componentId":"IGULD:SELF"}]' ,verify=False)
livedata = x.json()
pool = "0"
garage = "0"
scheune = "0"
wh_ibn = "0"
wh_today = "0"
for data in livedata:
if data['channelId'] == 'Measurement.DcMs.Watt[]':
pool = round(data['values'][0]['values'][0]) #Poolseite
garage = round(data['values'][0]['values'][1]) #Garage
scheune = round(data['values'][0]['values'][2]) #Scheune
if data['channelId'] == 'Measurement.Metering.TotWhOut':
wh_ibn = round(data['values'][0]['value']) #Ertrag seit IBN
return pool, garage, scheune, wh_ibn, wh_today
if __name__ == '__main__':
pool, garage, scheune, wh_ibn, wh_today = updateTripower()
print(pool, garage, scheune, wh_ibn, wh_today)
Um die Daten in Solaranzeige zu bekommen nutze ich eine _math datei, wichtig ist den Tripower X zuerst, danach erst den z.b Tripower SE abzufragen.
Code: Alles auswählen
<?php
$heute = date("d.m.Y \\u\\m H:i \\U\\h\\r");
$aktuelleDaten["Time_Date"] = $heute["Wert"];
if ($aktuelleDaten["Geraetetype"] == "19051" ) {
// SUNNY Tripower X Serie
// STPX15 auslesen
$stp15_befehl = "python3 /var/www/html/stpx15.py";
$temp_stp15 = shell_exec($stp15_befehl);
$stp15_werte = preg_split("/[\s,\n \]]+/", $temp_stp15);
$funktionen->log_schreiben("Abfrage Werte des STPX15 : ".$temp_stp15,"* ",7);
// Plausible Werte STPX15?
if(strpos($temp_stp15, 'Error') !== false){
$funktionen->log_schreiben("-Error- Abfrage des STPX15 fehlgeschlagen: ".$temp_stp15,"* ",7);
$aktuelleDaten["DC_Leistung_Poolseite"] = "0";
$aktuelleDaten["DC_Leistung_Garagenseite"] = "0";
$aktuelleDaten["DC_Leistung_Scheunenseite"] = "0";
$aktuelleDaten["DC_Leistung_STPX15"] = "0";
$aktuelleDaten["Ertrag_IBN_STPX15"] = "0";
$aktuelleDaten["Ertrag_Heute_STPX15"] = "0";
} else {
$aktuelleDaten["DC_Leistung_Poolseite"] = $stp15_werte[0];
if ($aktuelleDaten["DC_Leistung_Poolseite"] < 0) {
$aktuelleDaten["DC_Leistung_Poolseite"] = "0";
}
$aktuelleDaten["DC_Leistung_Garagenseite"] = $stp15_werte[1];
if ($aktuelleDaten["DC_Leistung_Garagenseite"] < 0) {
$aktuelleDaten["DC_Leistung_Garagenseite"] = "0";
}
$aktuelleDaten["DC_Leistung_Scheunenseite"] = $stp15_werte[2];
if ($aktuelleDaten["DC_Leistung_Scheunenseite"] < 0) {
$aktuelleDaten["DC_Leistung_Scheunenseite"] = "0";
}
$aktuelleDaten["Ertrag_IBN_STPX15"] = $stp15_werte[3];
$aktuelleDaten["DC_Leistung_STPX15"] = $aktuelleDaten["DC_Leistung_Poolseite"] + $aktuelleDaten["DC_Leistung_Garagenseite"] + $aktuelleDaten["DC_Leistung_Scheunenseite"];
$aktuelleDaten["Ertrag_Heute_STPX15"] = $stp15_werte[4];
$funktionen->log_schreiben("Include für STPX15 durchlaufen","* ",7);
}
// Um Summen zu bilden, den STP10SE erneut abfragen
$COM1 = fsockopen("192.168.20.237", $WR_Port, $errno, $errstr, 5);
$rc = $funktionen->modbus_register_lesen($COM1,"30529","0002","S32","03");
$aktuelleDaten["Ertrag_IBN_STP10SE"] = ($rc["Wert"]);
$rc = $funktionen->modbus_register_lesen($COM1,"30535","0002","U32","03");
$aktuelleDaten["Ertrag_Heute_STP10SE"] = ($rc["Wert"]);
$rc = $funktionen->modbus_register_lesen($COM1,"30583","0002","U32","03");
$aktuelleDaten["Einspeisung_Wh"] = $rc["Wert"];
$rc = $funktionen->modbus_register_lesen($COM1,"30581","0002","U32","03");
$aktuelleDaten["Bezug_Wh"] = $rc["Wert"];
$rc = $funktionen->modbus_register_lesen($COM1,"31393","0002","U32","03");
$aktuelleDaten["SpeicherLadeleistung"] = $rc["Wert"];
$rc = $funktionen->modbus_register_lesen($COM1,"31395","0002","U32","03");
$aktuelleDaten["SpeicherEntladeleistung"] = $rc["Wert"];
$rc = $funktionen->modbus_register_lesen($COM1,"30865","0002","S32","03");
$aktuelleDaten["Leistung_Bezug"] = $rc["Wert"];
$rc = $funktionen->modbus_register_lesen($COM1,"30867","0002","S32","03");
$aktuelleDaten["Leistung_Einspeisung"] = $rc["Wert"];
$rc = $funktionen->modbus_register_lesen($COM1,"30845","0002","U32","03");
$aktuelleDaten["SpeicherLadestand_SOC"] = ($rc["Wert"]);
$rc = $funktionen->modbus_register_lesen($COM1,"30773","0002","S32","03");
$aktuelleDaten["DC_Leistung_Straßenseite"] = $rc["Wert"];
$rc = $funktionen->modbus_register_lesen($COM1,"30961","0002","S32","03");
$aktuelleDaten["DC_Leistung_Terassenseite"] = $rc["Wert"];
// Summen bilden
$aktuelleDaten["DC_Leistung_STP10SE"] = $aktuelleDaten["DC_Leistung_Terassenseite"] + $aktuelleDaten["DC_Leistung_Straßenseite"];
$aktuelleDaten["Summe_DC_Leistung"] = $aktuelleDaten["DC_Leistung_STP10SE"] + $aktuelleDaten["DC_Leistung_STPX15"];
$aktuelleDaten["Summe_Ertrag_IBN"] = $aktuelleDaten["Ertrag_IBN_STP10SE"] + $aktuelleDaten["Ertrag_IBN_STPX15"];
$aktuelleDaten["Summe_Ertrag_Heute"] = $aktuelleDaten["Ertrag_Heute_STP10SE"] + $aktuelleDaten["Ertrag_Heute_STPX15"];
$aktuelleDaten["PV_Direktverbrauchsleistung"] = $aktuelleDaten["Summe_DC_Leistung"] - $aktuelleDaten["SpeicherEntladeleistung"] - $aktuelleDaten["SpeicherLadeleistung"] - $aktuelleDaten["Leistung_Einspeisung"];
if ($aktuelleDaten["PV_Direktverbrauchsleistung"] < 0) {
$aktuelleDaten["PV_Direktverbrauchsleistung"] = 0;
}
$aktuelleDaten["Eigenverbrauchsleistung"] = $aktuelleDaten["PV_Direktverbrauchsleistung"] + $aktuelleDaten["SpeicherEntladeleistung"];
if ($aktuelleDaten["Eigenverbrauchsleistung"] < 0) {
$aktuelleDaten["Eigenverbrauchsleistung"] = 0;
}
$aktuelleDaten["Hausverbrauch"] = $aktuelleDaten["Eigenverbrauchsleistung"] + $aktuelleDaten["Leistung_Bezug"];
$aktuelleDaten["Summe_Wechselrichterleistung"] = $aktuelleDaten["Summe_DC_Leistung"] + $aktuelleDaten["SpeicherEntladeleistung"] - $aktuelleDaten["SpeicherLadeleistung"];
// Daten in die InfluxDB speichern
$aktuelleDaten["ZusatzQuery"] .= "\n";
$aktuelleDaten["ZusatzQuery"] .= "Dashboard ";
$aktuelleDaten["ZusatzQuery"] .= "DC_Leistung_STPX15=".$aktuelleDaten["DC_Leistung_STPX15"];
$aktuelleDaten["ZusatzQuery"] .= ",DC_Leistung_Poolseite=".$aktuelleDaten["DC_Leistung_Poolseite"];
$aktuelleDaten["ZusatzQuery"] .= ",DC_Leistung_Garagenseite=".$aktuelleDaten["DC_Leistung_Garagenseite"];
$aktuelleDaten["ZusatzQuery"] .= ",DC_Leistung_Scheunenseite=".$aktuelleDaten["DC_Leistung_Scheunenseite"];
$aktuelleDaten["ZusatzQuery"] .= ",Ertrag_Heute_STPX15=".$aktuelleDaten["Ertrag_Heute_STPX15"];
$aktuelleDaten["ZusatzQuery"] .= ",Ertrag_IBN_STPX15=".$aktuelleDaten["Ertrag_IBN_STPX15"];
$aktuelleDaten["ZusatzQuery"] .= ",Ertrag_IBN_STP10SE=".$aktuelleDaten["Ertrag_IBN_STP10SE"];
$aktuelleDaten["ZusatzQuery"] .= ",Ertrag_Heute_STP10SE=".$aktuelleDaten["Ertrag_Heute_STP10SE"];
$aktuelleDaten["ZusatzQuery"] .= ",Einspeisung_Wh=".$aktuelleDaten["Einspeisung_Wh"];
$aktuelleDaten["ZusatzQuery"] .= ",Bezug_Wh=".$aktuelleDaten["Bezug_Wh"];
$aktuelleDaten["ZusatzQuery"] .= ",DC_Leistung_STP10SE=".$aktuelleDaten["DC_Leistung_STP10SE"];
$aktuelleDaten["ZusatzQuery"] .= ",SpeicherLadeleistung=".$aktuelleDaten["SpeicherLadeleistung"];
$aktuelleDaten["ZusatzQuery"] .= ",SpeicherEntladeleistung=".$aktuelleDaten["SpeicherEntladeleistung"];
$aktuelleDaten["ZusatzQuery"] .= ",Leistung_Bezug=".$aktuelleDaten["Leistung_Bezug"];
$aktuelleDaten["ZusatzQuery"] .= ",Leistung_Einspeisung=".$aktuelleDaten["Leistung_Einspeisung"];
$aktuelleDaten["ZusatzQuery"] .= ",DC_Leistung_Terassenseite=".$aktuelleDaten["DC_Leistung_Terassenseite"];
$aktuelleDaten["ZusatzQuery"] .= ",DC_Leistung_Straßenseite=".$aktuelleDaten["DC_Leistung_Straßenseite"];
$aktuelleDaten["ZusatzQuery"] .= ",SpeicherLadestand_SOC=".$aktuelleDaten["SpeicherLadestand_SOC"];
$aktuelleDaten["ZusatzQuery"] .= ",Summe_DC_Leistung=".$aktuelleDaten["Summe_DC_Leistung"];
$aktuelleDaten["ZusatzQuery"] .= ",Summe_Ertrag_IBN=".$aktuelleDaten["Summe_Ertrag_IBN"];
$aktuelleDaten["ZusatzQuery"] .= ",Summe_Ertrag_Heute=".$aktuelleDaten["Summe_Ertrag_Heute"];
$aktuelleDaten["ZusatzQuery"] .= ",Eigenverbrauchsleistung=".$aktuelleDaten["Eigenverbrauchsleistung"];
$aktuelleDaten["ZusatzQuery"] .= ",PV_Direktverbrauchsleistung=".$aktuelleDaten["PV_Direktverbrauchsleistung"];
$aktuelleDaten["ZusatzQuery"] .= ",Hausverbrauch=".$aktuelleDaten["Hausverbrauch"];
$aktuelleDaten["ZusatzQuery"] .= ",Summe_Wechselrichterleistung=".$aktuelleDaten["Summe_Wechselrichterleistung"];
$aktuelleDaten["ZusatzQuery"] .= " ".$aktuelleDaten["zentralerTimestamp"];
$funktionen->log_schreiben("Include für STP10SE durchlaufen","* ",7);
}
return;
?>
Alle für mich relevanten Werte frage ich erneut ab, ist nicht notwendeig, so aber aktueller, diese werden in ein neues Measurement "Dashboard" gespeichert, ist so nicht notwendig, aber in grafana bei bedarf einfacher quer zu rechnen.