Domoticz en P1 Enelogic

Ik wilde graag mijn slimme meter uit kunnen lezen met Domoticz, zodat ik uiteindelijk integraal inzicht krijg in ons energieverbruik in combinatie met energielevering. Nu is er (nog) geen standaard interface met Enelogic, dus ik ben zelf wat gaan hobby-en. Hieronder een howto. Ik ben geen perl-expert dus de code is misschien niet netjes, maar het werkt! Ik lees met een cronjob elke minuut de p1 uit, de waarden gaan met json naar Domoticz. Zo simpel.

enelogic p1

Howto

Creëer dummy hardware in Domoticz en noem die Enelogic. Voeg een virtuele sensor toe, noem die ook Enelogic, kies als type “P1 Smart Meter (Electric)”. Ga naar devices, zoek je sensor en noteer de IDX. Creëer onderstaand perl-script, pas je eigen waarden aan en draai die 1 keer. Nu zie je als het goed is de meterstanden in Domoticz. Als dit klopt kun je het script met crontab starten zo vaak je wilt. Ik doe elke minuut.

#!/usr/bin/perl
use LWP::Simple;
 
# vul hier IDX van device in, ip van domoticz-server, en de poort (8080)
my $IDX="qq"; 
my $DomoticzIP = "mijn_ip";
my $DomoticzPort = "mijn_poort";
 
# load data
#vul de hostname van enelogic in, default enelogic
my $curl = get('http://enelogic:1000/cgi/electricityMeter/update');
 
$curl =~ /e_consumed_2" unit="kWh">(\d+.\d\d\d)/;
$verbruik_hoog=$1*1000;
 
$curl =~ /e_consumed_1" unit="kWh">(\d+.\d\d\d)/;
$verbruik_laag=$1*1000;
 
$curl =~ /e_produced_2" unit="kWh">(\d+.\d\d\d)/;
$levering_hoog=$1*1000;
 
$curl =~ /e_produced_1" unit="kWh">(\d+.\d\d\d)/;
$levering_laag=$1*1000;
 
$curl =~ /p_consumed" unit="kW">(\d+.\d\d\d)/;
$verbruik=$1*1000;
 
$curl =~ /p_produced" unit="kW">(\d+.\d\d\d)/;
$levering=$1*1000;
 
if ($verbruik_hoog<1) {exit -1;}
if ($verbruik_laag<1) {exit -2;}
if ($levering_hoog<1) {exit -3;}
if ($levering_laag<1) {exit -4;}
 
my $url = 'http://'.$DomoticzIP.':'.$DomoticzPort.'/json.htm?type=command&param=udevice&idx='.$IDX.'&nvalue=0&svalue='.$verbruik_hoog.';'.$verbruik_laag.';'.$levering_hoog.';'.$levering_laag.';'.$verbruik.';'.$levering;
$curl = get($url);

Nota bene 1

Ik heb wel gemerkt dat de Enelogic er niet goed tegen kan als er door meer clients tegelijk wordt gevraagd om de update. Dan loopt hij vast en reageert hij niet meer. Ik heb daarom andere database acties in bovenstaand script geïntegreerd, zodat er maar 1 verzoek aan de Enelogic tegelijk komt.

Nota bene 2

Ik had wat moeite om JSON in te lezen in domoticz. Dat kwam omdat alles goed moet staan. Ik heb wachtwoord beveiliging. Ik kreeg steeds not authorized terug, behalve vanuit de browser waarin ik was ingelogd. Ik mocht niet eens /json.html aanroepen zonder parameters.

  1. Je moet bij de instellingen in domoticz aangeven dat je vanaf het lokale netwerk kan inloggen zonder wachtwoord.
  2. Vergeet niet domoticz opnieuw te starten na het wijzigen van deze instelling, want dit is een opstart-optie. Zolang je dat niet doet blijf je proberen, maar zal het niet gaan werken.
  3. Zorg ervoor dat je het lokale netwerk definieert als ipv6 adres bij de instellingen in domoticz, als je die ook gebruikt, of gebruik in je script het ipv4 adres. Dat laatste heb ik gedaan.

PHP-script van lezer ontvangen

Onderstaand PHP-script leest de gasstanden uit. Ik heb in mijn perl-script geen gas, omdat wij geen gasaansluiting hebben. Ik kan dat dus ook niet testen.

<code class="language-php">&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;body&gt;
&lt;?php
$xml=simplexml_load_file("http://enelogic:1000/cgi/gasMeter/update") or die("Error: Cannot create object");
$DomoticzIP = "mijn_ip";
$DomoticzPort = "mijn_poort";
$IDX = "qq";
$actual_consumed = floatval($xml-&gt;reading[0])*1000;
$curl = curl_init();
curl_setopt ($curl, CURLOPT_URL, "http://{$DomoticzIP}:{$DomoticzPort}/json.htm?type=command&amp;param=udevice&amp;idx={$IDX}&amp;nvalue=0&amp;svalue={$actual_consumed}");
curl_exec ($curl);
curl_close ($curl);
?&gt;
&lt;/body&gt;
&lt;/html&gt;
</code>

Geef een reactie

%d bloggers liken dit: