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: