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.


