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:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
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:
123456789101112131415161718192021222324
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:
123456789101112131415161718192021222324
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:
123456789101112131415161718192021222324252627282930313233343536373839
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:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
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: