Hallo allerseits,
ich habe mich mal an der Implementierung des Voltstorage SMART-Systems versucht und es scheint soweit zu funktionieren. Ich habe keine nennenswerten PHP-Kenntnisse, weswegen der untenstehende Code möglicherweise die Augen schädigt.
Ich habe das nicht als eigenen Regler umgesetzt, sondern in die entsprechende Regler_math.php hineingepackt. Das erschien mir erstmal einfacher umzusetzen (wie gesagt - keine nennenswerte PHP-Erfahrung). Nachdem also der entsprechende PV-Regler via Skript ausgelesen wird, wird ja dann nach der "*_math.php" gesucht und diese ggf. ausgeführt. Hier muss also beiliegender Code rein, damit die Werte der Voltstorage SMART ausgelesen und in die influx-db geschrieben werden.
Ich hoffe, es hilft eventuellen Besitzern weiter ...
Viele Grüße,
Gregor
Code: Alles auswählen
#!/usr/bin/php
<?php
/*************************************************************
//
// Die Funktion callAPI wurde von
//
// https://weichie.com/blog/curl-api-calls-with-php/
//
// uebernommen.
// Der Rest ist Trial and Error
//
*************************************************************/
function callAPI($method, $url, $data){
$curl = curl_init();
switch ($method){
case "POST":
curl_setopt($curl, CURLOPT_POST, 1);
if ($data)
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
break;
case "PUT":
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "PUT");
if ($data)
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
break;
default:
if ($data)
$url = sprintf("%s?%s", $url, http_build_query($data));
}
// OPTIONS:
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HTTPHEADER, array(
'APIKEY: 111111111111111111111',
'Content-Type: application/json',
));
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
// EXECUTE:
$result = curl_exec($curl);
if(!$result){die("Connection Failure");}
curl_close($curl);
return $result;
}
// hier folgend jetzt die Anmeldedaten der VoltStorage-App angeben. Die "validity" kann bleiben und gibt an, wie lange die Anmeldung aktiv bleibt (hier 50 Sekunden)
// Das Passwort steht hier im "Plain-Text". Das kann man sicherlich noch verbessern ... Wer will ... ;-)
$daten["email"] = "captain.picard@enterprise.starfleet";
$daten["password"] = "BeamMeUpScotty";
$daten["validity"] = "50";
// Hier wird das Login-token geholt, da die anderen Abfragen nur nach Authentifizierzung gehen
$make_call = callAPI('POST', 'https://api.voltstorage.com/rest/login/password', json_encode($daten));
$token = json_decode($make_call, true);
// Jetzt wird die 'id' des VoltStorage-Systems geholt (hier des Ersten). Bei einem kaskadierten
// System mehrerer VoltStorage-Boxen muss das hier natuerlich angepasst werden
// Die id kann auch handisch gesetzt werden, da sie in der Voltstorage-App zu finden ist.
$get_product = callAPI('GET', 'https://api.voltstorage.com/rest/products', $token);
$response = json_decode($get_product, true);
$id = $response[0]['id'];
// Jetzt werden die aktuellen Daten ausgelesen ...
$current = callAPI('GET', 'https://api.voltstorage.com/rest/products/'.$id.'/data/latest', $token);
$response = json_decode($current, true);
// ... und verschiedenen Variablen zugeordnet
$Ladungszustand = $response["stateOfCharge"];
$PVLeistung = $response["photovoltaicPower"];
$Eigenverbrauch = $response["householdConsumption"];
$Netzbezug = $response["gridPower"];
$Ladeleistung = $response["powerElectronicsPower"];
// Ladungszustand und Ladeleistung werden umgerechnet und etwas gerundet
// Die Ladeleistung wird dabei noch invertiert, da VoltStorage hier eigentlich die "Entladeleistung" angibt.
$Ladungszustand = round($Ladungszustand*100, 2, PHP_ROUND_HALF_UP); // In Prozent umrechnen und runden
$Ladeleistung = round($Ladeleistung*-1,2,PHP_ROUND_HALF_UP);
// und zusaetzlich in influx abgespeichert (in der Measurement "VoltStorage"
$aktuelleDaten["ZusatzQuery"] = "VoltStorage Ladezustand=".$Ladungszustand;
$aktuelleDaten["ZusatzQuery"] .=",Eigenverbrauch=".$Eigenverbrauch;
$aktuelleDaten["ZusatzQuery"] .=",Netzbezug=".$Netzbezug;
$aktuelleDaten["ZusatzQuery"] .=",Ladeleistung=".$Ladeleistung;
$aktuelleDaten["ZusatzQuery"] .=",GesamtPVLeistung=".$PVLeistung;
$aktuelleDaten["ZusatzQuery"] .= " ".$aktuelleDaten["zentralerTimestamp"];
?>