HomeWizard P1 dongle

In deze tutorial leg ik stap voor stap uit hoe je een de HomeWizard P1 dongle installeert en configureert. De data opslaat in een MariaDB en Domoticz, en visualiseert in Google Data Studio.

 

 

Benodigdheden:

  • HomeWizard P1 dongle
  • Smartphone, Tablet of ander device met WiFi

Reeds geïnstalleerd en up-and-running:

  • Domoticz
  • 2.4Ghz WIFI-netwerk benaderbaar via andere SSID als je 5Ghz netwerk
  • Node-Red
  • MariaDB

Stappenplan

Stap 1. Installatie van de dongle

Plaats de P1 dongle in P1 poort van de slimme meter (bij de ISKRA AM220 zit deze rechtsboven achter een beschermkapje). Als de LED wit gaat knipperen krijgt hij voldoende voeding van de slimme meter. Zo niet, sluit dan een telefoonadapter of iets dergelijks aan op de micro USB poort. Stap 2. HomeWizard App installeren

  • Download de HomeWizard Energy App via de playstore, en doorloop de volgende schermen:
  • Hou de knop op de dongle zo’n 5 seconden ingedrukt, de LED begint blauw te knipperen. De dongle is nu in pairing mode (en creëert een AP met SSID “P1meterSetup” (wachtwoord is SetupPass))
  • De volgende schermen verschijnen:
  • Na verloop van tijd begint de data binnen te komen in de app

  • Achterhaal in je router het IP-adres wat de dongle heeft gekregen. In mijn geval was het ip-adres 192.168.2.165. Een nslookup van dit adres leverde de hostnaam espressif.sydspost.nl (p.s. toen ik de dongle uitpakte en installeerde had de dongle de firmware versie 1.5.3, de nslookup leverde met deze firmware een hostnaam op die niet aan RFC942 voldeed, name “HW p1dongle 242B76”, een hostnaam met spaties dus. Blijkbaar heeft HomeWizard dit opgelost in de firmware versie die de dongle even later zelf geupdated had, firmware versie 2.3.0, de hostnaam is nu espressif.sydspost.nl)

Stap 3. API uitproberen

{ "smr_version": 50, "meter_model": "ISKRA 2M550T-1011", "wifi_ssid": "H369ABF8AF9", "wifi_strength": 58, "total_power_import_t1_kwh": 14943.6, "total_power_import_t2_kwh": 7005.623, "total_power_export_t1_kwh": 2567.151, "total_power_export_t2_kwh": 6051.882, "active_power_w": 1867, "active_power_l1_w": 1067, "active_power_l2_w": 12, "active_power_l3_w": 794, "total_gas_m3": 4338.403, "gas_timestamp": 210521214009 }

  • werkt dus als een trein

Stap 4. Database aangemaakt

  • Op basis van bovenstaande JSON bericht heb ik de tabel “Slimme meter” aangemaakt in mijn MariaDB “Energy” (zie ook eerdere tutorials zoals Zonnepanelen uitlezen, Slimme watermeter, Verbruik elektrische auto)

CREATE TABLE `slimme_meter` ( `sample datetime` datetime NOT NULL, `levering tarief 1` float(10,3) DEFAULT NULL, `levering tarief 2` float(10,3) DEFAULT NULL, `teruglevering tarief 1` float(10,3) DEFAULT NULL, `teruglevering tarief 2` float(10,3) DEFAULT NULL, `actief vermogen` int(32) DEFAULT NULL, `actief vermogen l1` int(32) DEFAULT NULL, `actief vermogen l2` int(32) DEFAULT NULL, `actief vermogen l3` int(32) DEFAULT NULL, `levering gas` float(10,3) DEFAULT NULL, `delta tarief 1` float(10,3) DEFAULT NULL, `delta tarief 2` float(10,3) DEFAULT NULL, `delta teruglevering tarief 1` float(10,3) DEFAULT NULL, `delta teruglevering tarief 2` float(10,3) DEFAULT NULL, `delta levering gas` float(10,3) DEFAULT NULL, PRIMARY KEY (`sample datetime`) );

  • Vervolgens met onderstaand INSERT statement de huidige meterstanden ingevoerd als eerste record in de database. Dit ten behoeve van de Node-red flow in de volgende stap waarbij de laatste meterstanden worden opgevraagd om de delta tussen de huidige meting en en vorige meting te kunnen bepalen. Verander de rood gekleurde waarden (levering tarief 1, levering tarief 2, teruglevering tarief 1, teruglevering tarief 2, levering gas) in de meetwaarden van je eigen slimme meter, pas eventueel ook de datum aan (niet noodzakelijk)

INSERT INTO `` (`sample datetime`,`levering tarief 1`,`levering tarief 2`,`teruglevering tarief 1`,`teruglevering tarief 2`,`actief vermogen`,`actief vermogen l1`,`actief vermogen l2`,`actief vermogen l3`,`levering gas`,`delta tarief 1`,`delta tarief 2`,`delta teruglevering tarief 1`,`delta teruglevering tarief 2`,`delta levering gas`) VALUES ('2021-05-21 21:42:28',14943.600,7005.645,2567.151,6051.882,0,0,0,0,4338.403,0.000,0.000,0.000,0.000,0.000);

  • Geef de MariaDB gebruiker “googledata” leesrechten op de tabel “slimme meter”, dit t.b.v. Google data studio

grant select on energy.slimme_meter to 'googledata'@'%';   Stap 5. Node-red flow aangemaakt

  • Toelichting
Node Doel
Run once Start dit deel van de flow eenmalig op bij het opstarten van Node-red
Get last added values Bouwt een SQL-statement op die de laatst toegevoegde meterstanden ophaalt uit de tabel “slimme meter”
Database Connectie naar de MariaDB database ‘Energy’
Set previous meter readings Plaatst de meterstanden ‘levering tarief 1’, ‘levering tarief 2’, ‘teruglevering tarief 1’, ‘teruglevering tarief 2’ en ‘levering gas’ in de flow context
Interval Zorgt er voor dat iedere 5 minuten de waarden uit de API van de dongle worden ingelezen in de database
HomeWizard Energy P1 HTTP get “http://espressif.sydspost.nl/api/v1/data”
Build SQL Bouwt het INSERT statement op met waarden uit het JSON bericht uit de dongle, bepaalt de delta waarden tussen de huidige en de vorige meting, en zet de nieuwe meterstanden in de flow context
Database Connectie naar de MariaDB database ‘Energy’
Msg.topic Debugging
  • Export van de flow

[{"id":"32a3499c.31c8a6","type":"tab","label":"Slimme meter","disabled":false,"info":""},{"id":"8c726c09.6e93b","type":"function","z":"32a3499c.31c8a6","name":"Build SQL","func":"// {\n//    \"smr_version\": 50, \n//    \"meter_model\": \"ISKRA  2M550T-101\",\n//    \"wifi_ssid\": \"My Wi-Fi\",\n//    \"wifi_strength\": 100,\n//    \"total_power_import_t1_kwh\": 10830.511,\n//    \"total_power_import_t2_kwh\": 2948.827,\n//    \"total_power_export_t1_kwh\": 1285.951,\n//    \"total_power_export_t2_kwh\": 2876.514,\n//    \"active_power_w\": -543,\n//    \"active_power_l1_w\": -676,\n//    \"active_power_l2_w\": 133,\n//    \"active_power_l3_w\": 0,\n//    \"total_gas_m3\": 2569.646,\n//    \"gas_timestamp\": 210606140010\n// }\n\nvar sql = \"insert into slimme_meter (`sample datetime`, `levering tarief 1`, `levering tarief 2`, `teruglevering tarief 1`, `teruglevering tarief 2`, `actief vermogen`, `actief vermogen l1`, `actief vermogen l2`, `actief vermogen l3`, `levering gas`, `delta tarief 1`, `delta tarief 2`, `delta teruglevering tarief 1`, `delta teruglevering tarief 2`,`delta levering gas`)\"\nsql = sql + \"values (:sample_datetime, :levering_tarief_1, :levering_tarief_2, :teruglevering_tarief_1, :teruglevering_tarief_2, :actief_vermogen, :actief_vermogen_l1, :actief_vermogen_l2, :actief_vermogen_l3, :levering_gas, :delta_tarief_1, :delta_tarief_2, :delta_teruglevering_tarief_1, :delta_teruglevering_tarief_2, :delta_levering_gas);\";\n\nmsg.payload.sample_datetime=new Date();\nmsg.payload.levering_tarief_1=msg.payload[\"total_power_import_t1_kwh\"];\nmsg.payload.levering_tarief_2=msg.payload[\"total_power_import_t2_kwh\"];\nmsg.payload.teruglevering_tarief_1=msg.payload[\"total_power_export_t1_kwh\"];\nmsg.payload.teruglevering_tarief_2=msg.payload[\"total_power_export_t2_kwh\"];\nmsg.payload.actief_vermogen=msg.payload[\"active_power_w\"];\nmsg.payload.actief_vermogen_l1=msg.payload[\"active_power_l1_w\"];\nmsg.payload.actief_vermogen_l2=msg.payload[\"active_power_l2_w\"];\nmsg.payload.actief_vermogen_l3=msg.payload[\"active_power_l3_w\"];\nmsg.payload.levering_gas=msg.payload[\"total_gas_m3\"];\nmsg.payload.delta_tarief_1=msg.payload[\"total_power_import_t1_kwh\"] - flow.get(\"levering_tarief_1\");\nmsg.payload.delta_tarief_2=msg.payload[\"total_power_import_t2_kwh\"] - flow.get(\"levering_tarief_2\");\nmsg.payload.delta_teruglevering_tarief_1=msg.payload[\"total_power_export_t1_kwh\"] - flow.get(\"teruglevering_tarief_1\");\nmsg.payload.delta_teruglevering_tarief_2=msg.payload[\"total_power_export_t2_kwh\"] - flow.get(\"teruglevering_tarief_2\");\nmsg.payload.delta_levering_gas=msg.payload[\"total_gas_m3\"] - flow.get(\"levering_gas\");\n\n// node.warn(flow.get(\"levering_tarief_1\"));\n// node.warn(flow.get(\"levering_tarief_2\"));\n// node.warn(flow.get(\"teruglevering_tarief_1\"));\n// node.warn(flow.get(\"teruglevering_tarief_2\"));\n// node.warn(flow.get(\"levering_gas\"));\n\nflow.set(\"levering_tarief_1\",msg.payload.levering_tarief_1);\nflow.set(\"levering_tarief_2\",msg.payload.levering_tarief_2);\nflow.set(\"teruglevering_tarief_1\",msg.payload.teruglevering_tarief_1);\nflow.set(\"teruglevering_tarief_2\",msg.payload.teruglevering_tarief_2);\nflow.set(\"levering_gas\",msg.payload.levering_gas);\n\nmsg.topic=sql;\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":620,"y":160,"wires":[["c05d4fa9.4a2a9"]]},{"id":"aefc334f.f0a0a","type":"debug","z":"32a3499c.31c8a6","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"topic","targetType":"msg","statusVal":"","statusType":"auto","x":1040,"y":160,"wires":[]},{"id":"c05d4fa9.4a2a9","type":"mysql","z":"32a3499c.31c8a6","mydb":"8056d2ce.5f8c8","name":"Database","x":820,"y":160,"wires":[["aefc334f.f0a0a"]]},{"id":"b2499835.eb3748","type":"inject","z":"32a3499c.31c8a6","name":"Run once","props":[],"repeat":"","crontab":"","once":true,"onceDelay":0.1,"topic":"","x":140,"y":80,"wires":[["f223071b.d8a678"]]},{"id":"f223071b.d8a678","type":"function","z":"32a3499c.31c8a6","name":"Get last added values","func":"var sql = \"select * from slimme_meter where `sample datetime` = (select max(`sample datetime`) from slimme_meter);\"\n\nmsg.topic=sql;\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":360,"y":80,"wires":[["b6ab26c6.0552a8"]]},{"id":"b6ab26c6.0552a8","type":"mysql","z":"32a3499c.31c8a6","mydb":"8056d2ce.5f8c8","name":"Database","x":620,"y":80,"wires":[["9cabe089.395ad"]]},{"id":"9cabe089.395ad","type":"function","z":"32a3499c.31c8a6","name":"Set previous meter readings","func":"flow.set(\"levering_tarief_1\",msg.payload[0][\"levering tarief 1\"]);\nflow.set(\"levering_tarief_2\",msg.payload[0][\"levering tarief 2\"]);\nflow.set(\"teruglevering_tarief_1\",msg.payload[0][\"teruglevering tarief 1\"]);\nflow.set(\"teruglevering_tarief_2\",msg.payload[0][\"teruglevering tarief 2\"]);\nflow.set(\"levering_gas\",msg.payload[0][\"levering gas\"]);\n\n// node.warn(flow.get(\"levering_tarief_1\"));\n// node.warn(flow.get(\"levering_tarief_2\"));\n// node.warn(flow.get(\"teruglevering_tarief_1\"));\n// node.warn(flow.get(\"teruglevering_tarief_2\"));\n// node.warn(flow.get(\"levering_gas\"));\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":880,"y":80,"wires":[[]]},{"id":"5f757b69.1e0884","type":"inject","z":"32a3499c.31c8a6","name":"Interval","props":[],"repeat":"300","crontab":"","once":false,"onceDelay":0.1,"topic":"","x":140,"y":160,"wires":[["a3b91f83.17e2d"]]},{"id":"a3b91f83.17e2d","type":"http request","z":"32a3499c.31c8a6","name":"HomeWizard Energy P1","method":"GET","ret":"obj","paytoqs":"ignore","url":"http://espressif.sydspost.nl/api/v1/data","tls":"","persist":false,"proxy":"","authType":"","x":370,"y":160,"wires":[["8c726c09.6e93b"]]},{"id":"8056d2ce.5f8c8","type":"MySQLdatabase","z":"","name":"mysql","host":"localhost","port":"3306","db":"energy","tz":"","charset":"UTF8"}]

Stap 6. Domoticz geconfigureert

  • Voor het inlezen van de meterstanden in Domoticz maak ik gebruik van een HTTP/HTTPS poller op het Hardware tab

  • Toelichting op niet default waarden

Attribuut

Waarde

Toelichting

Naam

P1 slimme meter

Zinvolle naam

Type

HTTP/HTTPS poller

 

ContentType

application/json

API van dongle geeft een JSON bericht terug

URL

http://espresif.sydspost.nl/api/v1/data

URL van de API

Commando

p1.lua

Naam van het lua script wat uitgevoerd moet worden nadat het JSON bericht is opgehaald

Vernieuwen

300

Om de 5 minuten het JSON bericht ophalen

 

  • Vervolgens twee virtuele sensors aangemaakt voor electra en gas
  •   Achterhaal op het tabblad Apparaten de IDX’en van beide virtuele sensoren:  

Electra: 228, Gas: 229

    • Tevens een lua script aangemaakt die de waarden toevoegt aan de virtuele sensors, dit lua script geplaatst in /home/pi/domoticz/scripts/lua_parsers  (vervang de roodgekleurde waarden door de IDX van de door jou aangemaakte virtuele sensors)

pi@raspberrypi:~/domoticz/scripts/lua_parsers $ cat p1.lua
------ BEGIN ------
-- Read API values
s = request['content'];

--
-- Gasmeter
--
local idGas = 229
local a = domoticz_applyJsonPath(s,'.total_gas_m3')
domoticz_updateDevice(idGas,'',a*1000)

--
-- Energiemeter
--

-- Dal import value
local b = domoticz_applyJsonPath(s,'.total_power_import_t1_kwh')
-- Piek import value
local c = domoticz_applyJsonPath(s,'.total_power_import_t2_kwh')
-- Dal return value
local d = domoticz_applyJsonPath(s,'.total_power_export_t1_kwh')
-- Piek return value
local e = domoticz_applyJsonPath(s,'.total_power_export_t2_kwh')
-- Active Watt Usage
local f = domoticz_applyJsonPath(s,'.active_power_w')
local g = domoticz_applyJsonPath(s,'active_power_l1_w')
local h = domoticz_applyJsonPath(s,'active_power_l2_w')
local i = domoticz_applyJsonPath(s,'active_power_l3_w')
--

local idEnergy = 228
domoticz_updateDevice(idEnergy,'',b*1000 ..";"..c*1000 ..";"..d..";"..e..";"..f..";"..'0')
------ END ------

  • Tot slot de logging gechecked, en ta-da de waarden komen binnen
2021-06-01 18:24:13.095 Status: P1 slimme meter: Worker started…
2021-06-01 18:24:18.162 CLuaHandler (updateDevice from LUA) : idx=229 nvalue= svalue=4364593.0 invalue=0 signallevel=12 batterylevel=255
2021-06-01 18:24:18.173 CLuaHandler (updateDevice from LUA) : idx=228 nvalue= svalue=15145155.0;7042123.0;2602.256;6130.956;5157.0;0 invalue=0 signallevel=12 batterylevel=255
 

Stap 7. Google data studio rapportage gemaakt:

  • Op het dashboard een tweetal staafdiagrammen toegevoegd die het stroomverbruik, en de teruglevering van stroom over de afgelopen week weergeeft

  • Tevens een staafdiagram voor het gas verbruik

 

  • Hiervoor heb ik de volgende SQL-statements gebruikt
Rapport element SQL-statement

Dashboard:

  • Verbruik afgelopen 30 dagen
  • Teruglevering afgelopen 30 dagen
  • Gas

 

select `sample datetime` as ‘sample_datetime’,
`levering tarief 1` as ‘levering_tarief_1’,
`levering tarief 2` as ‘levering_tarief_2’,
`teruglevering tarief 1` as ‘teruglevering_tarief_1’,
`teruglevering tarief 2` as ‘teruglevering tarief 2’,
`actief vermogen` as ‘actuele levering’,
`levering gas` as ‘levering_gas’,
`delta tarief 1` as ‘delta_tarief_1’,
`delta tarief 2` as ‘delta_tarief_2’,
`delta teruglevering tarief 1` as ‘delta_teruglevering_tarief_1’,
`delta teruglevering tarief 2` as ‘delta_teruglevering_tarief_2’,
`delta levering gas` as ‘delta_levering_gas’
from slimme_meter
order by `sample datetime`;

  • En de volgende instellingen

 

Links

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *