17. Februar 2016
4 Minuten zu lesen

Smappee Daten in Loxone einlesen und nutzen

Smappee leuchtet grün wenn alles in Ordnung istIch 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

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

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…

11 Comments

  1. Jörg

    Deine Integrationslösung gefällt mir als Loxone-Fan wirklich gut! Mich würde deine Erfahrung zum Smappee interessieren. Wie genau misst der Adapter den Strom bzw. wie schnell werden aktuelle Verbrauchsänderungen in der Praxis aktualisiert?

    Grüße
    Jörg

    • Hans

      Ciao Jörg,

      danke, ich finde die Messung ziemlich schnell und genau. Wobei ich das nie so 100%ig überprüft habe. Aber einen Smappee Bericht habe ich ja online, wie oft du von Loxone aus die Daten abholst bleibt ja dir überlassen.

  2. Chris

    Hallo Hans,

    Was mir an Loxone Air gefällt ist, ja das es grundsätzlich ohne Cloud operiert. Scheinbar unterstützt ja Loxone die Verbrauchsmessung auch über die Smart Socket Air.
    Hast du das im Einsatz, kannst du irgendwo ein Screenshot platzieren (oder habe ich das übersehen). Ich würde gerne sehen wie die Messung visualisiert wird. Eventuell ob sogar eine Kostenberechnung mit vernünftigem Aufwand möglich ist.
    Oder dient die Messung nur à la «ich chalte ein oder aus wenn wenn der Verbrauch zu hoch ist».

    Danke

  3. John

    Danke für das Teilen deiner Arbeit. Ich nutze Smappee seit 2015 in einer Mietwohnung und plane es in diesem Jahr mit in unser noch zu bauendes Haus zu nehmen. Dieses wird mittels Loxone smart gemacht, da kommt dein Tipp genau richtig.

  4. Ralf

    Hallo Hans,

    Es gibt ja auch einen Gas und Wasser Monitor von Smappee. Hast Du eine Idee wie man auch diese Daten (also den Gas oder Wasserverbrauch) mittels des Skripts auslesen kann.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahren Sie mehr darüber, wie Ihre Kommentardaten verarbeitet werden .

Hat Ihnen der Artikel gefallen? Bitte teilen Sie Ihre Gedanken mit anderen.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahren Sie mehr darüber, wie Ihre Kommentardaten verarbeitet werden .