This forum uses cookies
This forum makes use of cookies to store your login information if you are registered, and your last visit if you are not. Cookies are small text documents stored on your computer; the cookies set by this forum can only be used on this website and pose no security risk. Cookies on this forum also track the specific topics you have read and when you last read them. Please confirm that you accept these cookies being set.

Power price API -> grp. adresses on Wiser
#1
Hello people! Big Grin
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? Tongue 
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)
Reply
#2
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)
Reply
#3
Thats perfect! Big Grin 
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)
Reply
#4
Use the script as is without any modifications. It outputs the hourly data to 5/5/1 .. 5/5/24.
Reply
#5
(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 Smile  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?
Reply
#6
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
Reply
#7
Thanks alot! Big Grin 

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 Smile 
Dont mind the danish text at the right side, im just trying to make my way through the code Tongue 
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)
Reply


Forum Jump: