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. Via het Internet is het mogelijk met enkel bezit van het wachtwoord om apparatuur te schakelen; de authenticatie is dus “zwak” of “enkelvoudig”.
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 WiFi 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.