PHP-Skript zur Anzeige der Awattar-Kosten

Im Folgenden ein Skript, das die bis zum aktuellen Zeitpunkt (ganze Stunden bis dahin werden berücksichtigt. die letzte Stunde des Tages wird deshalb nicht berücksichtigr) bei Awattar Hourly aufgelaufenen Kosten berechnet.

  • Am markierten Anfang des Skriptes die Discovergy-Zugangsdaten $username und $password (und optional die ID des Zählers $meterId eintragen). Falls die ID des Zählers nicht eingetragen wird ($meterId = ‚‘;), wird über die API von Discovergy die ID des ersten registrierten Zählers ermittelt und im Weiteren genutzt.
  • Das Skript auf einen Web-Server kopieren. Achtung: Zugangsdaten stehen unverschlüsselt im Skript!!! Deshalb Zugang zum Skript schützen. Alternativ das Skript so ändern, dass die Zugangsdaten als Parameter übermittelt werden und SSL-Verschlüsselung auf dem Server beim Aufrufen des Skripts nutzen.

Bitte um Gnade, ich kann eigentlich kein PHP und das Ganze ist damit ziemlich hingemurkst.

Deshalb: Alles ohne jede Gewähr und für Leute, die wissen was sie tun!!!

Es dürfen gerne Änderungen und Optimierungen vorgenommen werden. Die Berücksichtigung von Ausnahmebedingungen wäre z.B. recht sinnvoll.

Anwendungen:

Der Quelltext des Skripts:

<?

//HIER DISCOVERGY ZUGANGSDATEN UND ZÄHLERID (OPTIONAL) EINGEBEN---BEGIN
//ohne ZählerID wird der erste Zähler verwendet
$username = 'E-Mail-Adresse';
$password = 'Kennwort';
$meterId = '';
//HIER DISCOVERGY ZUGANGSDATEN UND ZÄHLERID (OPTIONAL) EINGEBEN---END

//HIER ZUSATZKOSTEN AWATTAR PRO KWH IN EURO EINGEBEN--------------BEGIN
//die Kosten hängen von der PLZ ab und finden sich unter awattar.de
$awattarKosten = 0.2129;
//HIER ZUSATZKOSTEN AWATTAR PRO KWH IN EURO EINGEBEN--------------END

header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");

$arrContextOptions=array(
      "ssl"=>array(
            "verify_peer"=>false,
            "verify_peer_name"=>false,
        ),
    );  

if (strlen($meterId) == 0) {
	$responseMeter = file_get_contents("https://".$username.":".$password."@api.discovergy.com/public/v1/meters", false, stream_context_create($arrContextOptions));
	$meterText = substr($responseMeter,strpos($responseMeter,"meterId")+10,strpos($responseMeter,"manufacturerId")-2-11-strpos($responseMeter,"meterId"));
	$meterId = $meterText;
}
	
$tagesbeginn = strtotime('today')*1000-1000*60*60;
$tagesende = $tagesbeginn+1000*24*60*60;

$responseVerbrauch = file_get_contents("https://".$username.":".$password."@api.discovergy.com/public/v1/readings?meterId=".$meterId."&resolution=one_hour&from=".$tagesbeginn."&to=".$tagesende."&fields=energy", false, stream_context_create($arrContextOptions));
$responseKosten = file_get_contents("https://api.awattar.de/v1/marketdata?start=".($tagesbeginn+1000*60*60)."&end=".$tagesende, false, stream_context_create($arrContextOptions));
	
$verbrauchTextArray = explode("}}", $responseVerbrauch);
$verbrauchA = array();
for ($i = 0; $i < count($verbrauchTextArray)-1; $i = $i+1) {
	$verbrauchA[$i] = (int)substr($verbrauchTextArray[$i],strpos($verbrauchTextArray[0],"energy")+8);
}

$verbrauchR = array();
for ($i = 0; $i < count($verbrauchA)-2; $i = $i+1) {
	$verbrauchR[$i] = ($verbrauchA[$i+2]-$verbrauchA[$i+1])/10000000000;
}

$kostenTextArray = explode("marketprice", $responseKosten);
$kostenKWH = array();

for ($i = 0; $i < count($kostenTextArray)-1; $i = $i+1) {
	$kostenKWH[$i] = substr($kostenTextArray[$i+1],3,strpos($kostenTextArray[$i+1],",")-3);
	$kostenKWH[$i] = $kostenKWH[$i]/1000;
}

$kostenH = array();
$kosten = 0;
 
for ($i = 0; $i < count($kostenKWH); $i = $i+1) {
	$kostenH[$i] = ($kostenKWH[$i]+$awattarKosten)*$verbrauchR[$i];
	$kostenH[$i] = Round($kostenH[$i]*100)/100;
	$kosten = $kosten+$kostenH[$i];
}

echo $kosten." Euro";
	
;?>

Anpassung für die LaMetric-Time-Anzeige:

Für die LaMetric Time-Anzeige wird am Ende des Skripts anstelle der Ausgabe des Preises mit echo $kosten." Euro"; der folgende Code benötigt:

$out = array('frames'=>array(
               array('index'=>'0',
                     'text'=>$kosten.' €',
				     'icon'=>'95')
));
$outjson = json_encode($out, JSON_PRETTY_PRINT);
echo $outjson;

Discovergy?! @PabloSantiagoDGY

Vielleicht mag Disovergy diese Features ja direkt in ihre API unter entsprechenden Endpunkten integrieren?

Dann kann man sich die Nutzung eines eigenen Webservers sparen. Bei LaMetric könnt ihr kostenlos eine App für den App-Store erstellen, die auf die Daten zugreift. Das ist eine Sache von 3 Minuten, da BASIC Authentification (und sogar OAUTH2) unterstützt wird. Ich habe das selbst getan, allerdings nicht veröffentlicht, da die App meinen Webserver anspricht.

2 Like