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)
noot: 6-11-2022: spontaan, waarschijnlijk na een automatisch firmware update, is mijn hostnaam veranderd in http://hw-p1meter-242b76.sydspost.nl. Blijkbaar is bovenstaand probleem met het niet voldoen aan RFC942 opgelost en genereert de dongle nu een correcte hostname. 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

4 thoughts on “HomeWizard P1 dongle

  1. Marco Cattel says:

    Hey, mooie post! helder en meteen uitgeprobeerd. Alles werkt exact zoals je beschrijft, behalve de datastudio. Mijn mariadb kan niet worden gevonden door een of andere firewall of zo…

    Waar ik mee zit nog is het feit dat ik dit run op een chromebook-linux omgeving. Echter deze wil nog wel eens resetten waardoor ik er pas later achter kom dat ik een dag gemist heb.

    Er is dacht ik geen API om historische data op te vragen toch?
    enige wat ik zie is het abo… van home wizard, maar dat wilden we nou juist niet…

    Beantwoorden
    1. Syds says:

      Marco,

      Dank voor je compliment. Om datastudio met je lokale mariadb/mysql database te verbinden is best wel een lastige inderdaad. De user die je daarvoor gebruikt moet de juiste rechten op de tabellen hebben. Tevens moet je op de router een portforwarding opzetten naar je server op poort 3306. Zie voor meer info https://www.sydspost.nl/index.php/2021/03/23/opbrengst-zonnepanelen-uitlezen-2/. Onder aan deze pagina vindt je meer over het opzetten van een verbinding tussen je database en datastudio.

      Wat dataverlies betreft, misschien is het een optie voor je om een raspberry pi zero 2w of banana pi m2 Zero aan te schaffen. Dit zijn heel kleine microcontrollers die weinig stroom gebruiken maar toch heel krachtig zijn. Op mijn site vind je meer info over hoe deze microcontrollers van Raspbian of Debian linux te voorzien. De raspberry pi zero 2w heb je al voor zo’n 18 euro maar zijn momenteel niet leverbaar. De banana pi m2 Zero is een kloon, is wat duurder maar volop verkrijgbaar. Daarmee je een constante datastroom garanderen. De microcontroller is ook krachtig genoeg om je mariadb en node-red te draaien. Je kunt er gewoon een 32gb of grotere mini SD kaart in stoppen.

      De API draait lokaal op je HomeWizard dongle en slaat geen historie op.

      Beantwoorden
  2. David says:

    Mooi project. Ik ben begonnen met Domoticz en probeer de gegevens van de home wizzard watermeter in Domoticz te krijgen. Ook zou ik graag de totaalstand bij willen houden. Ik loop tegen wat zaken aan.
    Kun je me tegen vergoeding hiermee helpen?

    Beantwoorden
    1. Syds says:

      Natuurlijk wil ik je helpen David, en geef die vergoeding maar aan een goed doel 🙂 Waarmee kan ik je helpen ?

      Beantwoorden

Geef een antwoord

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