Posts: 86
Threads: 17
Joined: Feb 2021
Reputation:
3
Hi,
I bought a Homewizard Wi-fi P1 meter for reading out my electric meter.
This device has an API that returns it's data in plain text (not json).
For example:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
<
Request >
GET http ://{
IP address }/
api /
v1 /
telegram
<
Response >
HTTP /
1.1 200 OK
Content-Type :
text /
plain
Content-Length : <
length >
/
ISK5\\\\2M550T-10111-
3 :
0.2.8 (
50 )
0 -
0 :
1.0.0 (
181106140429W )
0 -
0 :
96.1.1 (
31333631353032362020202020202020 )
1 -
0 :
1.8.1 (
10830.511 *
kWh )
1 -
0 :
1.8.2 (
002948.827 *
kWh )
...
I was wondering if there is any post on the forum someone knows of which should be a good start for a script to read out the data.
Thanks in advance,
Tig
Posts: 8069
Threads: 43
Joined: Jun 2015
Reputation:
470
Try this. This example assumes that strings like "1-0:1.8.2" are unique value keys that are unchanged between requests.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
url =
'http://{IP address}/api/v1/telegram'
response =
require (
'socket.http' ).
request (
url )
lines =
response :
split (
'\n' )
result = {}
for _ ,
line in ipairs (
lines )
do
line =
line :
trim ()
pos =
line :
find (
'(' ,
1 ,
true )
if pos then
key =
line :
sub (
1 ,
pos -
1 )
val =
line :
sub (
pos +
1 , -
2 )
val =
val :
gsub (
'[^%d%.]+' ,
'' )
result [
key ] =
tonumber (
val )
end
end
log (
result )
grp.checkupdate (
'1/1/1' ,
result [
'1-0:1.8.1' ])
grp.checkupdate (
'1/1/2' ,
result [
'1-0:1.8.2' ])
Posts: 16
Threads: 6
Joined: Jun 2020
Reputation:
1
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
require (
'socket.http' )
ip =
'192.168.1.192'
socket.http.TIMEOUT =
5
data =
socket.http.request (
'http://' ..
ip.. '/api/v1/telegram' )
if data then
tarief_1 =
data :
match '1-0:1.8.1%((%d+.%d+)'
tarief_1 =
tonumber (
tarief_1 )
grp.update (
'8/0/1' ,
tarief_1 )
tarief_2 =
data :
match '1-0:1.8.2%((%d+.%d+)'
tarief_2 =
tonumber (
tarief_2 )
grp.update (
'8/0/2' ,
tarief_2 )
tarief_totaal =
tarief_1 +
tarief_2
grp.update (
'8/0/0' ,
tarief_totaal )
verbruik_prijs_kWh =
grp.getvalue (
'8/0/11' )
totaal_verbruik_ € =
tarief_totaal *
verbruik_prijs_kWh
grp.update (
'8/0/13' ,
totaal_verbruik_ €)
retour_1 =
data :
match '1-0:2.8.1%((%d+.%d+)'
retour_1 =
tonumber (
retour_1 )
grp.update (
'8/0/4' ,
retour_1 )
retour_2 =
data :
match '1-0:2.8.2%((%d+.%d+)'
retour_2 =
tonumber (
retour_2 )
grp.update (
'8/0/5' ,
retour_2 )
retour_totaal =
retour_1 +
retour_2
grp.update (
'8/0/3' ,
retour_totaal )
retour_prijs_kWh =
grp.getvalue (
'8/0/12' )
totaal_retour_ € =
retour_totaal *
retour_prijs_kWh
grp.update (
'8/0/14' ,
totaal_retour_ €)
actueel_tarief =
data :
match '14.0%((%d+)'
actueel_tarief =
tonumber (
actueel_tarief )
grp.update (
'8/0/10' ,
actueel_tarief )
actueel_verbruik =
data :
match '1-0:1.7.0%((%d+.%d+)'
actueel_verbruik =
tonumber (
actueel_verbruik )
grp.update (
'8/0/6' ,
actueel_verbruik )
actueel_verbruik_W =
actueel_verbruik *
1000
grp.update (
'8/0/7' ,
actueel_verbruik_W )
verbruik_prijs_kWh =
grp.getvalue (
'8/0/11' )
actueel_verbruik_ € =
actueel_verbruik *
verbruik_prijs_kWh
grp.update (
'8/0/15' ,
actueel_verbruik_ €)
actueel_retour =
data :
match '1-0:2.7.0%((%d+.%d+)'
actueel_retour =
tonumber (
actueel_retour )
grp.update (
'8/0/8' ,
actueel_retour )
actueel_retour_W =
actueel_retour *
1000
grp.update (
'8/0/9' ,
actueel_retour_W )
gas =
data :
match '.+%((%d+.%d+)'
gas =
tonumber (
gas )
grp.update (
'8/1/0' ,
gas )
verbruik_prijs_M ³ =
grp.getvalue (
'8/1/1' )
totaal_gasverbruik =
gas *
verbruik_prijs_M ³
grp.update (
'8/1/2' ,
totaal_gasverbruik )
end
Posts: 86
Threads: 17
Joined: Feb 2021
Reputation:
3
Omg, you are amazing! Thank you very much I'll try it out asap!
Kudos to Admin & Danny!
Thanks
Posts: 16
Threads: 1
Joined: Jun 2016
Reputation:
0
Hello
how to read the peak from 1-0:1.6.0(230514091500S)(01.672*kW)
i try it like this but i don't get a good value:
-- Afnamepiek van dit maand 1-0:1.6.0(230514091500S)(01.672*kW)
afnamepiek = data:match([[1-0:1.6.0%(()(%d+)]])
if nil ~= afnamepiek then
afnamepiek = tonumber(afnamepiek)
--log("Afnamepiek: " .. afnamepiek .. " kW")
grp.checkupdate('32/0/13', afnamepiek)
end
Posts: 16
Threads: 1
Joined: Jun 2016
Reputation:
0
(25.10.2022, 09:09) Danny Wrote: Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
require (
'socket.http' )
ip =
'192.168.1.192'
socket.http.TIMEOUT =
5
data =
socket.http.request (
'http://' ..
ip.. '/api/v1/telegram' )
if data then
tarief_1 =
data :
match '1-0:1.8.1%((%d+.%d+)'
tarief_1 =
tonumber (
tarief_1 )
grp.update (
'8/0/1' ,
tarief_1 )
tarief_2 =
data :
match '1-0:1.8.2%((%d+.%d+)'
tarief_2 =
tonumber (
tarief_2 )
grp.update (
'8/0/2' ,
tarief_2 )
tarief_totaal =
tarief_1 +
tarief_2
grp.update (
'8/0/0' ,
tarief_totaal )
verbruik_prijs_kWh =
grp.getvalue (
'8/0/11' )
totaal_verbruik_ € =
tarief_totaal *
verbruik_prijs_kWh
grp.update (
'8/0/13' ,
totaal_verbruik_ €)
retour_1 =
data :
match '1-0:2.8.1%((%d+.%d+)'
retour_1 =
tonumber (
retour_1 )
grp.update (
'8/0/4' ,
retour_1 )
retour_2 =
data :
match '1-0:2.8.2%((%d+.%d+)'
retour_2 =
tonumber (
retour_2 )
grp.update (
'8/0/5' ,
retour_2 )
retour_totaal =
retour_1 +
retour_2
grp.update (
'8/0/3' ,
retour_totaal )
retour_prijs_kWh =
grp.getvalue (
'8/0/12' )
totaal_retour_ € =
retour_totaal *
retour_prijs_kWh
grp.update (
'8/0/14' ,
totaal_retour_ €)
actueel_tarief =
data :
match '14.0%((%d+)'
actueel_tarief =
tonumber (
actueel_tarief )
grp.update (
'8/0/10' ,
actueel_tarief )
actueel_verbruik =
data :
match '1-0:1.7.0%((%d+.%d+)'
actueel_verbruik =
tonumber (
actueel_verbruik )
grp.update (
'8/0/6' ,
actueel_verbruik )
actueel_verbruik_W =
actueel_verbruik *
1000
grp.update (
'8/0/7' ,
actueel_verbruik_W )
verbruik_prijs_kWh =
grp.getvalue (
'8/0/11' )
actueel_verbruik_ € =
actueel_verbruik *
verbruik_prijs_kWh
grp.update (
'8/0/15' ,
actueel_verbruik_ €)
actueel_retour =
data :
match '1-0:2.7.0%((%d+.%d+)'
actueel_retour =
tonumber (
actueel_retour )
grp.update (
'8/0/8' ,
actueel_retour )
actueel_retour_W =
actueel_retour *
1000
grp.update (
'8/0/9' ,
actueel_retour_W )
gas =
data :
match '.+%((%d+.%d+)'
gas =
tonumber (
gas )
grp.update (
'8/1/0' ,
gas )
verbruik_prijs_M ³ =
grp.getvalue (
'8/1/1' )
totaal_gasverbruik =
gas *
verbruik_prijs_M ³
grp.update (
'8/1/2' ,
totaal_gasverbruik )
end
Thank you this works perfect but i want to read this also :
"Afnamepiek van dit maand" in this format : 1-0:1.6.0(230514091500S)(01.672*kW)
Posts: 119
Threads: 15
Joined: Nov 2019
Reputation:
6
(01.03.2025, 21:23) Keitz Wrote: (25.10.2022, 09:09) Danny Wrote: Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
require (
'socket.http' )
ip =
'192.168.1.192'
socket.http.TIMEOUT =
5
data =
socket.http.request (
'http://' ..
ip.. '/api/v1/telegram' )
if data then
tarief_1 =
data :
match '1-0:1.8.1%((%d+.%d+)'
tarief_1 =
tonumber (
tarief_1 )
grp.update (
'8/0/1' ,
tarief_1 )
tarief_2 =
data :
match '1-0:1.8.2%((%d+.%d+)'
tarief_2 =
tonumber (
tarief_2 )
grp.update (
'8/0/2' ,
tarief_2 )
tarief_totaal =
tarief_1 +
tarief_2
grp.update (
'8/0/0' ,
tarief_totaal )
verbruik_prijs_kWh =
grp.getvalue (
'8/0/11' )
totaal_verbruik_ € =
tarief_totaal *
verbruik_prijs_kWh
grp.update (
'8/0/13' ,
totaal_verbruik_ €)
retour_1 =
data :
match '1-0:2.8.1%((%d+.%d+)'
retour_1 =
tonumber (
retour_1 )
grp.update (
'8/0/4' ,
retour_1 )
retour_2 =
data :
match '1-0:2.8.2%((%d+.%d+)'
retour_2 =
tonumber (
retour_2 )
grp.update (
'8/0/5' ,
retour_2 )
retour_totaal =
retour_1 +
retour_2
grp.update (
'8/0/3' ,
retour_totaal )
retour_prijs_kWh =
grp.getvalue (
'8/0/12' )
totaal_retour_ € =
retour_totaal *
retour_prijs_kWh
grp.update (
'8/0/14' ,
totaal_retour_ €)
actueel_tarief =
data :
match '14.0%((%d+)'
actueel_tarief =
tonumber (
actueel_tarief )
grp.update (
'8/0/10' ,
actueel_tarief )
actueel_verbruik =
data :
match '1-0:1.7.0%((%d+.%d+)'
actueel_verbruik =
tonumber (
actueel_verbruik )
grp.update (
'8/0/6' ,
actueel_verbruik )
actueel_verbruik_W =
actueel_verbruik *
1000
grp.update (
'8/0/7' ,
actueel_verbruik_W )
verbruik_prijs_kWh =
grp.getvalue (
'8/0/11' )
actueel_verbruik_ € =
actueel_verbruik *
verbruik_prijs_kWh
grp.update (
'8/0/15' ,
actueel_verbruik_ €)
actueel_retour =
data :
match '1-0:2.7.0%((%d+.%d+)'
actueel_retour =
tonumber (
actueel_retour )
grp.update (
'8/0/8' ,
actueel_retour )
actueel_retour_W =
actueel_retour *
1000
grp.update (
'8/0/9' ,
actueel_retour_W )
gas =
data :
match '.+%((%d+.%d+)'
gas =
tonumber (
gas )
grp.update (
'8/1/0' ,
gas )
verbruik_prijs_M ³ =
grp.getvalue (
'8/1/1' )
totaal_gasverbruik =
gas *
verbruik_prijs_M ³
grp.update (
'8/1/2' ,
totaal_gasverbruik )
end
Thank you this works perfect but i want to read this also :
"Afnamepiek van dit maand" in this format : 1-0:1.6.0(230514091500S)(01.672*kW)Just add this:
--Afnamepiek
afnamepiek = data:match'1-0:1.6.0%((%d+.%d+)'
afnamepiek = tonumber(afnamepiek)
--log("Afnamepiek: " .. afnamepiek .. " kW")
grp.update('8/0/10', afnamepiek)