Power price API -> grp. adresses on Wiser - ClausP - 10.11.2022
Hello people!
Im all new to all this scripting thing with my Wiser.
I have been looking at the forum, and found an other script that more or less say it does what I want.
Then i've changed some of the parameters and the API.
When I run the script i just get this awnswer in the alert log:
Resident script:12: attempt to index a nil value
stack traceback:
Can anyone help?
Code: require('json')
https = require 'ssl.https'
date = os.date('%Y-%m-%d')
url = 'https://api.energidataservice.dk/dataset/Elspotprices?offset=0&filter=%7B%22PriceArea%22:%22dk1%22%7D&sort=HourDK%20DESC&timezone=dk&limit=24'
status = ssl.https.request(url)
data = json.decode(status)
price1 = data[1].SpotPriceDKK
grp.checkupdate('5/5/1', price1)
price2 = data[2].SpotPriceDKK
grp.checkupdate('5/5/2', price2)
price3 = data[3].SpotPriceDKK
grp.checkupdate('5/5/3', price3)
price4 = data[4].SpotPriceDKK
grp.checkupdate('5/5/4', price4)
price5 = data[5].SpotPriceDKK
grp.checkupdate('5/5/5', price5)
price6 = data[6].SpotPriceDKK
grp.checkupdate('5/5/6', price6)
price7 = data[7].SpotPriceDKK
grp.checkupdate('5/5/7', price7)
price8 = data[8].SpotPriceDKK
grp.checkupdate('5/5/8', price8)
price9 = data[9].SpotPriceDKK
grp.checkupdate('5/5/9', price9)
price10 = data[10].SpotPriceDKK
grp.checkupdate('5/5/10', price10)
price11 = data[11].SpotPriceDKK
grp.checkupdate('5/5/11', price11)
price12 = data[12].SpotPriceDKK
grp.checkupdate('5/5/12', price12)
price13 = data[13].SpotPriceDKK
grp.checkupdate('5/5/13', price13)
price14 = data[14].SpotPriceDKK
grp.checkupdate('5/5/14', price14)
price15 = data[15].SpotPriceDKK
grp.checkupdate('5/5/15', price15)
price16 = data[16].SpotPriceDKK
grp.checkupdate('5/5/16', price16)
price17 = data[17].SpotPriceDKK
grp.checkupdate('5/5/17', price17)
price18 = data[18].SpotPriceDKK
grp.checkupdate('5/5/18', price18)
price19 = data[19].SpotPriceDKK
grp.checkupdate('5/5/19', price19)
price20 = data[20].SpotPriceDKK
grp.checkupdate('5/5/20', price20)
price21 = data[21].SpotPriceDKK
grp.checkupdate('5/5/21', price21)
price22 = data[22].SpotPriceDKK
grp.checkupdate('5/5/22', price22)
price23 = data[23].SpotPriceDKK
grp.checkupdate('5/5/23', price23)
price24 = data[24].SpotPriceDKK
grp.checkupdate('5/5/24', price24)
medelpris = price1+price2+price3+price4+price5+price6+price7+price8+price9+price10+price11+price12+price13+price14+price15+price16+price17+price18+price19+price20+price21+price22+price23+price24
gennemsnit = medelpris / 24
grp.checkupdate('5/5/25', gennemsnit)
maxpris = math.max(price1, price2, price3, price4, price5, price6, price7, price8, price9, price10, price11, price12, price13, price14, price15, price16, price17, price18, price19, price20, price21, price22, price23, price24)
grp.checkupdate('5/5/26', maxpris)
minpris = math.min(price1, price2, price3, price4, price5, price6, price7, price8, price9, price10, price11, price12, price13, price14, price15, price16, price17, price18, price19, price20, price21, price22, price23, price24)
grp.checkupdate('5/5/27', minpris)
log(price1, price2)
RE: Power price API -> grp. adresses on Wiser - admin - 10.11.2022
Try this:
Code: url = 'https://api.energidataservice.dk/dataset/Elspotprices?offset=0&filter=%7B%22PriceArea%22:%22dk1%22%7D&sort=HourDK%20DESC&timezone=dk&limit=24'
resp = require('ssl.https').request(url)
data = require('json').decode(resp).records
max = 0
min = math.huge
sum = 0
for i, item in ipairs(data) do
price = item.SpotPriceDKK
max = math.max(max, price)
min = math.min(min, price)
sum = sum + price
grp.checkupdate('5/5/' .. i, price)
end
avg = sum / #data
grp.checkupdate('5/5/25', avg)
grp.checkupdate('5/5/26', max)
grp.checkupdate('5/5/27', min)
RE: Power price API -> grp. adresses on Wiser - ClausP - 10.11.2022
Thats perfect!
Work like a charm! But again, im totally noob, so what do I do to get all 24 hours of the day?
I've done this: (changed the "5/5/ .. i," to 5/5/1.
It gives me 836,75000 in a 4 byte float object.
Code: url = 'https://api.energidataservice.dk/dataset/Elspotprices?offset=0&filter=%7B%22PriceArea%22:%22dk1%22%7D&sort=HourDK%20DESC&timezone=dk&limit=24'
resp = require('ssl.https').request(url)
data = require('json').decode(resp).records
max = 0
min = math.huge
sum = 0
for i, item in ipairs(data) do
price = item.SpotPriceDKK
max = math.max(max, price)
min = math.min(min, price)
sum = sum + price
grp.checkupdate('5/5/1', price)
end
avg = sum / #data
grp.checkupdate('5/5/25', avg)
grp.checkupdate('5/5/26', max)
grp.checkupdate('5/5/27', min)
RE: Power price API -> grp. adresses on Wiser - admin - 10.11.2022
Use the script as is without any modifications. It outputs the hourly data to 5/5/1 .. 5/5/24.
RE: Power price API -> grp. adresses on Wiser - ClausP - 10.11.2022
(10.11.2022, 08:49)admin Wrote: Use the script as is without any modifications. It outputs the hourly data to 5/5/1 .. 5/5/24.
Ah okay Works nicely. The avg, max, min, however doesnt seem to be working?
Would it be possible to isolatae the cheapest 4 hours?
Would you mind spending 5 min explaining what the different lines do?
RE: Power price API -> grp. adresses on Wiser - admin - 10.11.2022
What exactly is not working for min/max/avg? Do you have objects created with correct data type?
This will produce a string with cheapest 4 hours. Set 5/5/28 datatype to 250 byte string.
Code: url = 'https://api.energidataservice.dk/dataset/Elspotprices?offset=0&filter=%7B%22PriceArea%22:%22dk1%22%7D&sort=HourDK%20DESC&timezone=dk&limit=24'
resp = require('ssl.https').request(url)
data = require('json').decode(resp).records
max = 0
min = math.huge
sum = 0
for i, item in ipairs(data) do
price = item.SpotPriceDKK
max = math.max(max, price)
min = math.min(min, price)
sum = sum + price
grp.checkupdate('5/5/' .. i, price)
item.hour = tonumber(item.HourDK:match('T(%d+)'))
end
avg = sum / #data
grp.checkupdate('5/5/25', avg)
grp.checkupdate('5/5/26', max)
grp.checkupdate('5/5/27', min)
table.sort(data, function(a, b)
return a.SpotPriceDKK < b.SpotPriceDKK
end)
list = {}
for i = 1, 4 do
item = data[ i ]
list[ #list + 1 ] = string.format('%d = %.2f', item.hour, item.SpotPriceDKK)
end
hours = table.concat(list, '; ')
grp.checkupdate('5/5/28', hours)
For general info on Lua read this book: http://www.lua.org/pil/contents.html
RE: Power price API -> grp. adresses on Wiser - ClausP - 10.11.2022
Thanks alot!
I've ended up with this, and it seems to be working. I have tried to make the script move the values over to the storage, once a day, to visualise the right cost at the right time
Dont mind the danish text at the right side, im just trying to make my way through the code
Code: url = 'https://api.energidataservice.dk/dataset/Elspotprices?offset=0&filter=%7B%22PriceArea%22:%22dk1%22%7D&sort=HourDK%20DESC&timezone=dk&limit=24'
resp = require('ssl.https').request(url)
data = require('json').decode(resp).records
max = 0 --nulstiller max værdi
min = math.huge --nulstiller min værdi med uendeligt stort tal
sum = 0 --nulstiller sum værdi
--Skriver time:minutter i "tid".
-- %a abbreviated weekday name (e.g., Wed)
-- %A full weekday name (e.g., Wednesday)
-- %b abbreviated month name (e.g., Sep)
-- %B full month name (e.g., September)
-- %c date and time (e.g., 09/16/98 23:48:10)
-- %d day of the month (16) [01-31]
-- %H hour, using a 24-hour clock (23) [00-23]
-- %I hour, using a 12-hour clock (11) [01-12]
-- %M minute (48) [00-59]
-- %m month (09) [01-12]
-- %p either "am" or "pm" (pm)
-- %S second (10) [00-61]
-- %w weekday (3) [0-6 = Sunday-Saturday]
-- %x date (e.g., 09/16/98)
-- %X time (e.g., 23:48:10)
-- %Y full year (1998)
-- %y two-digit year (98) [00-99]
-- %% the character `%´
tidtimer = os.date("%H")
tidminutter = os.date("%M")
for i, item in ipairs(data) do
price = item.SpotPriceDKK/1000 --tildeler ordet price værdien af feltet SpotPriceDKK og deler med 1000 for at gå fra GW til KW.
max = math.max(max, price)
min = math.min(min, price)
sum = sum + price
grp.checkupdate('13/4/' ..i, price)
item.hour = tonumber(item.HourDK:match('T(%d+)'))
--Gemmer prisen fra igår i datalager under Spotpris1...23
if tidtimer == 12 and tidminutter == 00 then
storage.set('Spotpris' ..i, price)
end
end
avg = sum / #data
grp.checkupdate('13/4/25', avg)
grp.checkupdate('13/4/26', max)
grp.checkupdate('13/4/27', min)
table.sort(data, function(a, b)
return a.SpotPriceDKK < b.SpotPriceDKK
end)
list = {}
for i = 1, 4 do
item = data[ i ]
list[ #list + 1 ] = string.format('%d = %.2f', item.hour, item.SpotPriceDKK)
end
hours = table.concat(list, '; ')
grp.checkupdate('13/4/28', hours)
-- viser angivede enheder i loggen
log(avg, max, min, tidtimer, tidminutter, hours)
|