Ich bin wie bereits berichtet an einem längeren und grösseren Projekt, nämlich der Realisierung eines Smart Home basierend auf Loxone. Dazu habe ich derzeit einen kleinen Aufbau auf dem Bürotisch mit Loxone und zusätzlicher Peripherie, aber es macht natürlich auch Sinn bestehendes einzubinden. So kam mir der Gedanke, die erfassten Daten des Energiemonitors Smappee, welchen ich hier schonmal ausführlich getestet hatte, auch einzubinden. Damit erspare ich mir den Kauf eines Energiemessgeräts, zum Beispiel auf Modbus-Basis.
Smappee auslesen
Tollerweise bietet Smappee eine API an um auf die erfassten Daten zuzugreifen. Da dies Loxone selbst nicht direkt kann, muss dies mittels einem Webserver im eigenen Netzwerk geschehen. Zuerst habe ich das mit einem Raspberry Pi aufgebaut und jetzt bin ich mittlerweile aber auf mein Synology NAS umgestiegen, dass sowieso am Netz hängt. Ziel wäre es zukünftig aber ein Raspberry Pi mit diversen Funktionen für Loxone laufen zu lassen, dazu aber später mal mehr..
Das nachfolgende Script bezieht die Messwerte von Smappe und stellt sie als Ausgabe zur Verfügung. Das Script ist mehr oder weniger direkt von Dago übernommen. Wichtig ist, das Script über den Webserver greift über das Netzwerk auf Smappee zu, das Passwort ist nicht dasselbe welches ihr für das Webinterface von Smappee verwendet habt. Standard-Passwort ist «admin» und kann im Webinterface von Smappee (http://SMAPPEE_IP/smappee.html) geändert werden.
<?php
$smappee_ip = '192.168.1.66'; // Smappee ip
$smappee_password = 'admin'; // Smappee password (default: admin)
$curl = curl_init();
$result = getData();
if (preg_match("/login/i", $result) or (empty($result)))
{
login();
$result = getData();
}
$output = parseData($result);
echo($output);
curl_close($curl);
function login()
{
global $curl;
global $smappee_ip, $smappee_password;
$url = 'http://'.$smappee_ip.'/gateway/apipublic/logon';
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_TIMEOUT, 10);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_HTTPHEADER,
array('Content-Type:application/json',
'Content-Length: ' . strlen($smappee_password))
);
curl_setopt($curl, CURLOPT_POSTFIELDS, 'admin');
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_COOKIEFILE, 'smappee.cookie');
$result = curl_exec($curl);
}
function getData()
{
global $curl;
global $smappee_ip;
$url = 'http://'.$smappee_ip.'/gateway/apipublic/reportInstantaneousValues';
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_TIMEOUT, 10);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_COOKIEFILE, 'smappee.cookie');
curl_setopt($curl, CURLOPT_POST, 0);
$result = curl_exec($curl);
return $result;
}
function parseData($data)
{
$data_array = json_decode($data);
$unformatted = $data_array->report;
preg_match("/voltage=(\\d*.\\d)/", $unformatted, $matches);
$volt = $matches[1];
preg_match_all("/ activePower=(\\d*.\\d*)/", $unformatted, $matches);
$p1_watt = $matches[1][0];
$p2_watt = $matches[1][1];
$p3_watt = $matches[1][2];
preg_match_all("/current=(\\d*.\\d*)/", $unformatted, $matches);
$p1_amp = $matches[1][0];
$p2_amp = $matches[1][1];
$p3_amp = $matches[1][2];
preg_match_all("/ cosfi=(\\d*.\\d*)/", $unformatted, $matches);
$p1_cos = $matches[1][0];
$p2_cos = $matches[1][1];
$p3_cos = $matches[1][2];
preg_match_all("/ peak active power (\d*.\d*)/", $unformatted, $matches);
$p1_peak_w = $matches[1][0];
$p2_peak_w = $matches[1][1];
$p3_peak_w = $matches[1][2];
preg_match_all("/ W at (\\d{2}\\/\\d{2}\\/\\d{4} \\d{2}:\\d{2}:\\d{2})/", $unformatted, $matches);
$p1_peak_ts = strtotime($matches[1][0]);
$p2_peak_ts = strtotime($matches[1][1]);
$p3_peak_ts = strtotime($matches[1][2]);
$all_watt = (float)$p1_watt+(float)$p2_watt+(float)$p3_watt;
$all_ampere = (float)$p1_amp+(float)$p2_amp+(float)$p3_amp;
$all_peak = (float)$p1_peak_w+(float)$p2_peak_w+(float)$p3_peak_w;
$all = array("watt"=>$all_watt,"volt"=>$volt,"ampere"=>$all_ampere);
$p1 = array("watt"=>$p1_watt,"volt"=>$volt,"ampere"=>$p1_amp,"cosfi"=>$p1_cos,"peak"=>$p1_peak_w,"peak_ts"=>$p1_peak_ts);
$p2 = array("watt"=>$p2_watt,"volt"=>$volt,"ampere"=>$p2_amp,"cosfi"=>$p2_cos,"peak"=>$p2_peak_w,"peak_ts"=>$p2_peak_ts);
$p3 = array("watt"=>$p3_watt,"volt"=>$volt,"ampere"=>$p3_amp,"cosfi"=>$p3_cos,"peak"=>$p3_peak_w,"peak_ts"=>$p3_peak_ts);
$output = array("all"=>$all,"p1"=>$p1,"p2"=>$p2,"p3"=>$p3);
return json_encode($output);
}
?>
PHP Daten in Loxone einlesen
Das obige Script kopiere auf meinen Webserver, in meinem Fall eben das genannten Synology NAS, ich habe alle Loxone relevanten Scripts in einen unterordner gepackt. Das Script kann ich testweise in einem Browser aufrufen: http://IP-SYNOLOGY-NAS/loxone/smappee.php und der Output sollte in etwa wie folgt aussehen:
{"all":{"watt":483.691,"volt":"236.0","ampere":3.005},"p1":{"watt":"108.343","volt":"236.0","ampere":"0.847","cosfi":"53,","peak":"6368.116","peak_ts":false},"p2":{"watt":"276.61","volt":"236.0","ampere":"1.443","cosfi":"80,","peak":"8479.458","peak_ts":false},"p3":{"watt":"98.738","volt":"236.0","ampere":"0.715","cosfi":"58,","peak":"8141.688","peak_ts":1449410520}}
Was mich jetzt primär interessiert ist vorerst der erste Wert hinter watt, also der aktuelle Gesamtverbrauch. Hier kann man noch beliebige weitere Paramater abfragen. In der Loxone Config lege ich einen «Virtuellen HTTP Eingang» an (linker Screenshot) und gebe dort die IP meines Webservers mit Adresse des PHP-Scripts an. Den Abfragezyklus habe ich anfänglich auf dem Minium von 10s gehabt, bin aber mittlerweile auf 1 Minute umgestiegen was reichen sollte. Zu dem Eingang fügt man nun einen «Virtuellen HTTP Eingang Befehl» hinzu, sauber bennen und als Befehlserkennung: {«all»:{«watt»:\v eingeben:
Smappee Daten in Loxone einlesen
Den Eingang kann man in Loxone Config reinziehen und die Testphase aktivieren, spätestens nach dem Abfragezyklus-Intervall sollten dort Werte erscheinen, wenn sie auch im Browser sichtbar sind. Ansonsten die Befehlserkennung nochmals überprüfen.
Den Eingang habe ich nun nach einem Dividierer durch den Faktor 1000 in den Baustein «Verbrauchszähler» angeschlossen. Dieser erwartet kW Werte, Smappee liefert in Watt ab. Den Zähler lasse ich nun mal einige Zeit laufen, er kann nun Tages-, Wochen, Monats- und Jahresverbrauchswerte visualisieren und Statistiken ausgeben.
Smappee Daten in Loxone verarbeiten mit Verbrauchszähler
Fazit
Genau darum habe ich Loxone lieben gelernt. Ein umfangreiches Smart Home System, welches extrem mächtig daher kommt und trotzdem in einem gewissen Masse offen ist. Wie schonmal erwähnt, bringe ich auch Daten von Arduino in Loxone, mit einem Raspberry Pi und einem Webserver auf dem NAS klappt es auch schon und die eigene Hardware läuft sowieso. Ich halte euch auf dem Laufenden was als nächsten folgt…