Yesterday, 15:09
I received a new kWh meter, a ZIV E0090. I think it’s DSMR 5.0.
I’m currently using this script, which works, but can it be extended with real-time current values and such?
I’d actually like to use everything that can be read out in graphs.
-- P1 poort uitlezen (ultra-licht)
local LAST = '!'
local serial = require('serial')
local port = serial.open('/dev/ttyUSB0', {
baudrate = 115200, -- DSMR2/3: 9600, DSMR4: 115200
databits = 8, -- DSMR2/3: 7, DSMR4: 8
stopbits = 1,
parity = 'none',-- DSMR4: 'none'
duplex = 'full'
})
local function read_frame(p)
local buf = {}
while true do
local c = p:read(1)
if c == nil or c == LAST then break
elseif c ~= '\r' then buf[#buf+1] = c end
end
return table.concat(buf)
end
local data = read_frame(port)
port:flush()
if not data then return end
-- Helper: parse getal met punt, return number of nil
local function num(pat)
local s = data:match(pat)
return s and tonumber(s) or nil
end
-- Verbruik kWh (T1,T2) en totaal
local t1 = num([[1%-0:1%.8%.1%((%d+%.%d+)]])
local t2 = num([[1%-0:1%.8%.2%((%d+%.%d+)]])
if t1 then grp.update('14/0/1', t1) end
if t2 then grp.update('14/0/2', t2) end
local v_tot = (t1 or 0) + (t2 or 0)
if t1 or t2 then grp.update('14/0/0', v_tot) end
-- Verbruik € (alleen als prijs aanwezig)
do
local prijs = grp.getvalue('14/0/11')
if type(prijs) == 'number' and (t1 or t2) then
grp.update('14/0/13', v_tot * prijs)
end
end
-- Retour kWh (T1,T2) en totaal
local r1 = num([[1%-0:2%.8%.1%((%d+%.%d+)]])
local r2 = num([[1%-0:2%.8%.2%((%d+%.%d+)]])
if r1 then grp.update('14/0/4', r1) end
if r2 then grp.update('14/0/5', r2) end
local r_tot = (r1 or 0) + (r2 or 0)
if r1 or r2 then grp.update('14/0/3', r_tot) end
-- Retour € (alleen als prijs aanwezig)
do
local prijs = grp.getvalue('14/0/12')
if type(prijs) == 'number' and (r1 or r2) then
grp.update('14/0/14', r_tot * prijs)
end
end
-- Actueel tarief (T1/T2 laatste cijfer)
do
local t = data:match([[0%-0:96%.14%.0%(%d%d%d(%d)]])
if t then grp.update('14/0/10', t) end
end
-- Actueel verbruik kW/W en €
do
local p_kw = num([[1%-0:1%.7%.0%((%d+%.%d+)]])
if p_kw then
grp.update('14/0/6', p_kw)
grp.update('14/0/7', p_kw * 1000)
local prijs = grp.getvalue('14/0/11')
if type(prijs) == 'number' then grp.update('14/0/15', p_kw * prijs) end
end
end
-- Actueel retour kW/W
do
local pr_kw = num([[1%-0:2%.7%.0%((%d+%.%d+)]])
if pr_kw then
grp.update('14/0/8', pr_kw)
grp.update('14/0/9', pr_kw * 1000)
end
end
-- Gas m³ en €
do
local gas = num([[0%-1:24%.2%.1%(.+%)%((%d+%.%d+)]])
if gas then
grp.update('14/1/0', gas)
local prijs = grp.getvalue('14/1/1')
if type(prijs) == 'number' then grp.update('14/1/2', gas * prijs) end
end
end
I’m currently using this script, which works, but can it be extended with real-time current values and such?
I’d actually like to use everything that can be read out in graphs.
-- P1 poort uitlezen (ultra-licht)
local LAST = '!'
local serial = require('serial')
local port = serial.open('/dev/ttyUSB0', {
baudrate = 115200, -- DSMR2/3: 9600, DSMR4: 115200
databits = 8, -- DSMR2/3: 7, DSMR4: 8
stopbits = 1,
parity = 'none',-- DSMR4: 'none'
duplex = 'full'
})
local function read_frame(p)
local buf = {}
while true do
local c = p:read(1)
if c == nil or c == LAST then break
elseif c ~= '\r' then buf[#buf+1] = c end
end
return table.concat(buf)
end
local data = read_frame(port)
port:flush()
if not data then return end
-- Helper: parse getal met punt, return number of nil
local function num(pat)
local s = data:match(pat)
return s and tonumber(s) or nil
end
-- Verbruik kWh (T1,T2) en totaal
local t1 = num([[1%-0:1%.8%.1%((%d+%.%d+)]])
local t2 = num([[1%-0:1%.8%.2%((%d+%.%d+)]])
if t1 then grp.update('14/0/1', t1) end
if t2 then grp.update('14/0/2', t2) end
local v_tot = (t1 or 0) + (t2 or 0)
if t1 or t2 then grp.update('14/0/0', v_tot) end
-- Verbruik € (alleen als prijs aanwezig)
do
local prijs = grp.getvalue('14/0/11')
if type(prijs) == 'number' and (t1 or t2) then
grp.update('14/0/13', v_tot * prijs)
end
end
-- Retour kWh (T1,T2) en totaal
local r1 = num([[1%-0:2%.8%.1%((%d+%.%d+)]])
local r2 = num([[1%-0:2%.8%.2%((%d+%.%d+)]])
if r1 then grp.update('14/0/4', r1) end
if r2 then grp.update('14/0/5', r2) end
local r_tot = (r1 or 0) + (r2 or 0)
if r1 or r2 then grp.update('14/0/3', r_tot) end
-- Retour € (alleen als prijs aanwezig)
do
local prijs = grp.getvalue('14/0/12')
if type(prijs) == 'number' and (r1 or r2) then
grp.update('14/0/14', r_tot * prijs)
end
end
-- Actueel tarief (T1/T2 laatste cijfer)
do
local t = data:match([[0%-0:96%.14%.0%(%d%d%d(%d)]])
if t then grp.update('14/0/10', t) end
end
-- Actueel verbruik kW/W en €
do
local p_kw = num([[1%-0:1%.7%.0%((%d+%.%d+)]])
if p_kw then
grp.update('14/0/6', p_kw)
grp.update('14/0/7', p_kw * 1000)
local prijs = grp.getvalue('14/0/11')
if type(prijs) == 'number' then grp.update('14/0/15', p_kw * prijs) end
end
end
-- Actueel retour kW/W
do
local pr_kw = num([[1%-0:2%.7%.0%((%d+%.%d+)]])
if pr_kw then
grp.update('14/0/8', pr_kw)
grp.update('14/0/9', pr_kw * 1000)
end
end
-- Gas m³ en €
do
local gas = num([[0%-1:24%.2%.1%(.+%)%((%d+%.%d+)]])
if gas then
grp.update('14/1/0', gas)
local prijs = grp.getvalue('14/1/1')
if type(prijs) == 'number' then grp.update('14/1/2', gas * prijs) end
end
end