Meterstanden en verbruik HomeWizard P1 meter en Energy Sockets qua gas en stroom uitlezen via SQL

Met live inzicht in het gebruik van stroom en gas is het gemakkelijker om het daadwerkelijk gebruik te analyseren en keuzes te maken. In deze post wordt uitgelegd hoe met standaard Invantive SQL de gemeten waardes op meters van HomeWizard voor gas en stroom uitgelezen kunnen worden. De waardes kunnen daarnaast vastgelegd worden in een database naar wens.

HomeWizard

De fabrikant HomeWizard levert eenvoudige en kosteneffectieve meters die via WiFi communiceren met een eigen app “Energy”. Daarnaast bieden de meters een onbeveiligde API aan op basis van JSON. Op basis van foutmeldingen is te concluderen dat er ook GraphQL gebruikt wordt. Het is niet duidelijk of, wanneer en hoelang de data ook buiten het netwerk opgeslagen wordt.

Er bestaat een P1 meter van HomeWizard voor drie tientjes die de standaard P1-poort van een stroommeter en eventueel daaraan gekoppelde gasmeter kan uitlezen. De P1-poort is altijd aanwezig op een zogenaamde “slimme meter” in Nederland, en is herkenbaar aan het RJ12-stekkerformaat. De P1-poort is (hopelijk) galvanisch gescheiden. Met een nieuwe slimme meter heeft de P1-meter geen hulpvoeding nodig; oudere slimme meters kunnen de P1-meter niet van stroom voorzien en dan is een voeding nodig op basis van micro USB.

Het stroomgebruik van de slimme meter is doorlopend op te vragen (realtime per seconde); daarnaast is het totale stroomgebruik op te vragen van de slimme meter. Het gasverbruik lijkt cumulatief opgevraagd te kunnen worden en wordt blijkbaar enkel per uur uitgewisseld met de slimme meter. Het schijnt dat de energieleverancier die frequentie van eenmaal per uur doorgeven van het gasverbruik kan aanpassen. Het actuele gasverbruik per uur kan hieruit afgeleid worden. Aangezien dezelfde meetwaardes elke dag verzonden worden naar de energieleverancier zouden de metingen exact moeten aansluiten op de rekening. Dit is niet gecontroleerd.

Ook bestaan er Energy Sockets (ook pakweg drie tientjes per stuk); die plug je tussen het stopcontact en de stekker. De meters hebben voor zover bekend geen eigen accu en verzamelen bij stroomverlies dus ook geen gegevens. Daarnaast zijn er meters voor inbouw in de meterkast op basis van Eastron-elementen en mogelijkheden om het netto verbruik te bepalen bij zonpanelen die terugleveren; de werking hiervan wordt niet beschreven.

Er bestaat een abonnement van circa een Euro per maand om meer mogelijkheden te krijgen; dit is niet bekeken.

De meters zijn niet voor alle toepassingen geschikt. Voor zakelijke of gevoelige toepassingen zijn de apparaten minder aanbevelenswaardig. Via de API’s is het met de Energy Sockets ook mogelijk om gekoppelde apparaturen in- en uit te schakelen. De authenticatie daarvoor gebeurt echter op basis van enkel lid zijn van hetzelfde netwerksegment en er is geen vorm van autorisatie of audit trail.

Daarnaast hebben de meters en vooral de app wat moeite met onverwachte gebeurtenissen zoals het verplaatsen tussen stopcontacten en netwerkstoringen. Soms is handmatig opnieuw koppelen nodig en soms duurt het een meerdere uren tot de meters spontaan weer beschikbaar zijn.

Al met al is na een week gebruik te zeggen dat de meters prima zijn om meetpunten te verzamelen voor een analyseproject.

Netwerk

Door een manuele actie (die niet vergrendeld kan worden) kan het apparaat gekoppeld worden met een willekeurig nabij WiFi-netwerk. Dit gebeurt via een app op de telefoon. Na koppeling is het apparaat zichtbaar via Zeroconf.

Het opvragen van de bereikbare meters kan bijvoorbeeld met dns-sd op basis van _hwenergy._tcp:

De naam bestaat uit het soort apparaat, plus de laatste zes posities van het serienummer. In bovenstaand voorbeeld heeft de P1 Meter een serienummer dat eindigt op “249CA2”. De meter kan bereikt worden door “.local” achter de naam te zetten.

De HomeWizard meters zijn gemakkelijk uit te lezen met Postman via het HTTP-protocol:

In bovenstaand voorbeeld is het serienummer zichtbaar via het relatieve pad “/api”.

HomeWizard meters uitlezen

Op basis van het eenvoudige protocol kunnen met standaard SQL de meters als volgt uitgelezen worden:

create or replace table measurements@InMemoryStorage
as
select hst.name
,      htpstat.DATE_RETRIEVAL_UTC
,      dtadev.*
,      dtastat.*
from   ( select 'p1meter-249CA2' name 
         union all select 'energysocket-293A4C' 
         union all select 'energysocket-29307A' 
         union all select 'energysocket-29452E' 
         union all select 'energysocket-294044' 
       ) hst
join   HTTPDOWNLOAD@DataDictionary
       ( 'http://' || hst.name || '.local/api'
       --, diskCache => true
       , diskCacheMaxAgeSec => 86400
       ) htpdev
join   jsontable
       ( ''
         passing htpdev.CONTENTS_CHAR
         columns product_type         varchar2 label 'Product Type'  path 'product_type'
         ,       product_name         varchar2 label 'Product Name'  path 'product_name'
         ,       serial               varchar2 label 'Serial Number' path 'serial'
         ,       api_version          varchar2 label 'API Version'   path 'api_version'
       ) dtadev
join   HTTPDOWNLOAD@DataDictionary
       ( 'http://' || hst.name || '.local/api/v1/data'
       ) htpstat
join   jsontable
       ( ''
         passing htpstat.CONTENTS_CHAR
         columns smr_version               int32    label 'SMR Version'   path 'smr_version'
         ,       meter_model               varchar2 label 'Meter Model'   path 'meter_model'
         ,       wifi_ssid                 varchar2 label 'WiFi SSID'     path 'wifi_ssid'
         ,       wifi_strength             int16    label 'WiFi Strength' path 'wifi_strength'
         ,       total_power_import_t1_kwh number   path 'total_power_import_t1_kwh'
         ,       total_power_export_t1_kwh number   path 'total_power_export_t1_kwh'
         ,       total_power_import_t2_kwh number   path 'total_power_import_t2_kwh'
         ,       total_power_export_t2_kwh number   path 'total_power_export_t2_kwh'
         ,       active_power_w            number   path 'active_power_w'
         ,       active_power_l1_w         number   path 'active_power_l1_w'
         ,       active_power_l2_w         number   path 'active_power_l2_w'
         ,       active_power_l3_w         number   path 'active_power_l3_w'
         ,       total_gas_m3              number   path 'total_gas_m3'
         ,       gas_timestamp             int64    path 'gas_timestamp'
       ) dtastat

Het resultaat hiervan is een in-memory tabel met de metingen en wat eigenschappen van de verschillende meters, zoals:

De volgende query toont een overzicht van de bekende meters:

--
-- Devices.
--
select name
,      product_type
,      product_name
,      serial
,      api_version
,      smr_version
,      meter_model
,      wifi_ssid
,      wifi_strength
from   MEASUREMENTS@InMemoryStorage

met als resultaat:

Tenslotte kunnen de tellerstanden opgevraagd worden met een query zoals:

select name
,      'total_power_import_t1_kwh'
       counter_code
       label 'Counter Code'
,      'Counter 1 KwH Received Total'
       counter_description
       label 'Description'
,      total_power_import_t1_kwh
       counter_value
       label 'Counter Value'
,      DATE_RETRIEVAL_UTC
from   MEASUREMENTS@InMemoryStorage
where  coalesce(total_power_import_t1_kwh, 0) != 0
union all
select name
,      'total_power_import_t2_kwh'
,      'Counter 2 KwH Received Total'
,      total_power_import_t2_kwh
,      DATE_RETRIEVAL_UTC
from   MEASUREMENTS@InMemoryStorage
where  coalesce(total_power_import_t2_kwh, 0) != 0
union all
select name
,      'total_power_export_t1_kwh'
,      'Counter 1 KwH Delivered Total'
,      total_power_export_t1_kwh
,      DATE_RETRIEVAL_UTC
from   MEASUREMENTS@InMemoryStorage
where  coalesce(total_power_export_t1_kwh, 0) != 0
union all
select name
,      'total_power_export_t2_kwh'
,      'Counter 2 KwH Delivered Total'
,      total_power_export_t2_kwh
,      DATE_RETRIEVAL_UTC
from   MEASUREMENTS@InMemoryStorage
where  coalesce(total_power_export_t2_kwh, 0) != 0
union all
select name
,      'active_power_w'
,      'Current Consumption W'
,      active_power_w
,      DATE_RETRIEVAL_UTC
from   MEASUREMENTS@InMemoryStorage
union all
select name
,      'active_power_l1_w'
,      'Line 1 Current Consumption W'
,      active_power_l1_w
,      DATE_RETRIEVAL_UTC
from   MEASUREMENTS@InMemoryStorage
where  active_power_l1_w is not null
union all
select name
,      'active_power_l2_w'
,      'Line 2 Current Consumption W'
,      active_power_l2_w
,      DATE_RETRIEVAL_UTC
from   MEASUREMENTS@InMemoryStorage
where  active_power_l2_w is not null
union all
select name
,      'active_power_l3_w'
,      'Line 3 Current Consumption W'
,      active_power_l3_w
,      DATE_RETRIEVAL_UTC
from   MEASUREMENTS@InMemoryStorage
where  active_power_l3_w is not null
union all
select name
,      'total_gas_m3'
,      'Gas Consumption Total m3'
,      total_gas_m3
,      to_date('20' || to_char(gas_timestamp), 'YYYYMMDDHH24MISS')
       /* Correction from CET to UTC. */
       + round(sysdateutc - sysdate, 1)
from   MEASUREMENTS@InMemoryStorage
where  total_gas_m3 is not null

Het resultaat qua meterstanden uit de API van de P1 Meter en de Energy Sockets is dan bijvoorbeeld:

Merk op dat de - zoals eerder besproken - voor de gasmeter alleen het totale verbruik op te vragen is. De timestamp die hiervoor gebruikt wordt lijkt in het formaat “JJMMDDUUMMSS” te zijn, maar dan volgens de lokale tijd. Op dit moment wordt een correctie toegepast naar UTC. Het is onzeker of de gasmeter zelf ook rekening houdt met zomer-/wintertijd. Volgens de specificaties in de NEN-EN-IEC 62056-21 Mode D protocolbeschrijving voor de slimme meter staat dit in de timestamp van het P1 Telegram, maar dit is niet gecontroleerd. Het is ook niet zichtbaar voor zover bekend in het veld gas_timestamp van de HomeWizard API.