Solarman Wechselrichter/Inverter Datenlogger

So, ich glaube ich habe es für mich gelöst.
Ausgelesen wird

  • Daten vom Wechselrichter
  • Logdaten

Folgende Variablen hab ich für mich angelegt
Für die API


Für den Wechselrichter

Für das holen eines Tokens habe ich ein eigenes Skript erstellt, da dieser nicht immer neu geholt werden muss. Aber dazu später.

$url=getvalue(38165);
$user=getvalue(47023); //Benutzername vom Onlinezugang
$password=hash("sha256",getvalue(29895)); //Passwort vom Onlinezugang
$appId=getvalue(49005); //Daten kommen von Solarman
$appSecret=getvalue(41880); //Daten kommen Solarman

$erg=array();
$url = $url."/account/v1.0/token?appId=".$appId."&language=en&=";

$curl = curl_init($url);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

$headers = array(
   "Content-Type: application/json",
);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);

$data ="
{
	\"appSecret\": \"".$appSecret."\",
	\"email\": \"".$user."\",
	\"password\": \"".$password."\"
}";

curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
$resp = curl_exec($curl);
curl_close($curl);
$erg=json_decode($resp,true);
if ($erg["success"] == true)
{
	setvalue(24584,$erg["access_token"]);
	setvalue(47369,$erg["refresh_token"]);
	setvalue(52106,time()+$erg["expires_in"]);
}
else
{
	setvalue(24584,"");
	setvalue(47369,"");
	setvalue(52106,"");	
}

Das Auslesen der Daten erfolgt in einem eigenen Skript. Mich interessieren eigentlich nur relaitv wenige Werte.

  • Temperatur vom Wechselrichter
  • Updatezeit
  • Volt, Watt und Ampere der vier Eingänge
    *Logeinträge

Die Werte für die Erzeugung bekomme ich von einer anderen Stelle

<?php

function datenholen($sn)
{
	$token=getvalue(24584);
	$url = getvalue(38165)."/device/v1.0/currentData?appId=APPID&language=en&=";

	$curl = curl_init($url);
	curl_setopt($curl, CURLOPT_URL, $url);
	curl_setopt($curl, CURLOPT_POST, true);
	curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

	$headers = array(
   		"Authorization: bearer ".$token,
   		"Content-Type: application/json",
	);
	curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);

	$data = "{
		\"deviceSn\": \"".$sn."\"
		}";
	curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
	$resp = curl_exec($curl);
	curl_close($curl);
	return $resp;
}

function logdatenholen($sn)
{
	$token=getvalue(24584);
	$url = getvalue(38165)."/device/v1.0/alertList?appId=APPID&language=en&=";
	//Zeitstempel
    $starttimestamp=mktime(0,0,0,date("m"),date("d"),date("y"));
	$endtimestamp=time();

	$curl = curl_init($url);
	curl_setopt($curl, CURLOPT_URL, $url);
	curl_setopt($curl, CURLOPT_POST, true);
	curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

	$headers = array(
   		"Authorization: bearer ".$token,
   		"Content-Type: application/json",
	);
	curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);

	$data = "{
		\"deviceSn\": \"".$sn."\",
		\"endTimestamp\" : \"".$endtimestamp."\",
		\"startTimestamp\" : \"".$starttimestamp."\"		
		}";
	curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
	$resp = curl_exec($curl);
	curl_close($curl);
	return $resp;
}
function logschreiben($geraet,$logdaten)
{
	//level 0:Hinweis, 1:Warnung, 2: Fehler
	//influence 0:kein Einfluss, 1: Produktion, 2: Sicherheit, 3:Produktion&Sicherheit
	$level="";
	$influence="";
	foreach ($logdaten as $eintrag)
	{
		switch ($eintrag["level"])
		{
			case 0: $level="MESSAGE";break;
			case 1: $level="WARNING";break;
			case 2: $level="ERROR";break;
		}
		switch ($eintrag["influence"])
		{
			case 0: $influence="kein Einfluss";break;
			case 1: $influence="Produktion";break;
			case 2: $influence="Sicherheit";break;
			case 3: $influence="Produktion&Sicherheit";break;
		}
                // ich schreibe alle Logeinträge in das SymconLog und dieses in eine MySQL Datenbank. Das muss jeder anders machen
	 	Global_Log_Eintrag_erstellen($level,$geraet,date("d.m.Y G:i:s",$eintrag["alertTime"])." ".$eintrag["alertName"]." ".$influence);
	}
}

//eventuell Token holen
if (time()>=getvalue(52106)) IPS_RunScriptWait(56619); //ScriptID Token holen
//Logdaten Logger
logschreiben("WR Logger",json_decode(logdatenholen("SERIENNUMMER_LOGGER"),true)["alertList"]);
//Wechselrichter
logschreiben("WRr",json_decode(logdatenholen("SERIENNUMMER_WECHSELRICHTER"),true)["alertList"]);
//Modul 1
logschreiben("WR Modul1",json_decode(logdatenholen("SERIENNUMMER_WR-1"),true)["alertList"]);
//Modul 2
logschreiben("WR Modul2",json_decode(logdatenholen("SERIENNUMMER_WR-2"),true)["alertList"]);
//Modul 3
logschreiben("WR Modul3",json_decode(logdatenholen("SERIENNUMMER_WR-3"),true)["alertList"]);
//Modul 4
logschreiben("WR Modul4",json_decode(logdatenholen("SERIENNUMMER_WR-4"),true)["alertList"]);
//Logger
//var_dump(json_decode(datenholen("SERIENNUMMER_LOGGER"),true));
//Wechselrichter
$wrdaten=json_decode(datenholen("SERIENNUMMER_WR"),true);
setvalue(20614,mktime(intval($wrdaten["dataList"][7]["value"]),intval($wrdaten["dataList"][8]["value"]),intval($wrdaten["dataList"][9]["value"]),intval($wrdaten["dataList"][5]["value"]),intval($wrdaten["dataList"][6]["value"]),intval($wrdaten["dataList"][4]["value"])));
setvalue(42688,$wrdaten["dataList"][39]["value"]);

//PV1
setvalue(15569,$wrdaten["dataList"][17]["value"]);
setvalue(10271,$wrdaten["dataList"][21]["value"]);
setvalue(12127,$wrdaten["dataList"][13]["value"]);

//PV2
setvalue(19442,$wrdaten["dataList"][18]["value"]);
setvalue(14759,$wrdaten["dataList"][22]["value"]);
setvalue(39168,$wrdaten["dataList"][14]["value"]);

//PV3
setvalue(20520,$wrdaten["dataList"][19]["value"]);
setvalue(54745,$wrdaten["dataList"][23]["value"]);
setvalue(48708,$wrdaten["dataList"][15]["value"]);

//PV4
setvalue(22639,$wrdaten["dataList"][20]["value"]);
setvalue(44506,$wrdaten["dataList"][24]["value"]);
setvalue(12708,$wrdaten["dataList"][16]["value"]);

Das Skript zum Holen der Daten läuft bei mir alle 5 Minuten, da die Inervalle genau diese 5 Minuten betragen.
Im Webfront schaut das dann bei mir so aus

Grundsätzlich kommen noch wesentlich mehr Werte rüber. Auch von den Anschlüssen. Aber zum einen ist da vieles doppelt und wirklich interessant sind sie nicht. Zumindest nicht für mich.
Bei Fragen oder Anregungen gerne melden.

1 „Gefällt mir“