Logic Machine Forum
Solcast API - Printable Version

+- Logic Machine Forum (https://forum.logicmachine.net)
+-- Forum: LogicMachine eco-system (https://forum.logicmachine.net/forumdisplay.php?fid=1)
+--- Forum: Scripting (https://forum.logicmachine.net/forumdisplay.php?fid=8)
+--- Thread: Solcast API (/showthread.php?tid=3863)



Solcast API - pioneersteffen - 08.02.2022

Hi @all,

I need your help please. I want to use the solcast API to get a forecast for my photovoltaic system. In detail I want to get the hourly forecasts for the next 24 hours and write them to group addresses.

Here is the link for the API documentation: https://docs.solcast.com.au/?_ga=2.241211524.703493069.1644347168-1194480310.1635183319&_gac=1.19879242.1640546987.Cj0KCQiAwqCOBhCdARIsAEPyW9kCem_dj5euOt6FBwpI3iijBCW3wuG4M59UtrIywvhlh6FObji2FWsaAh_lEALw_wcB#world-api-pv-power

Here is my actual code:

Code:
require('json')
https = require 'ssl.https'

appid = 'XX'
lat = '52.436225'
lon ='10.42526'
azi = '170'
hours = '24'
format = 'json'
tilt = '33'
capa = '8'

url = 'https://api.solcast.com.au/world_pv_power/forecasts?latitude=%s&longitude=%s&hours=%s&format=%s&tilt=%s&capacity=%s&azimuth=%s&api_key=%s'
url = string.format(url, lat, lon, hours, format, tilt, capa, azi, appid)

res, code, headers, status = ssl.https.request(url)
log (code, status, headers)
data = json.pdecode(res)

--Fault messages:
if not data then
  alert('Error converting data')
  return

end

if not res then
  alert('Error collecting data')
  return
end

data = data.forecasts

-- forecast +30min

grp.write('45/1/1', data.pv_estimate)


I getting the following failure message: 

Code:
Solcast 08.02.2022 22:01:35
User script:36: attempt to index field 'pv_estimate' (a nil value)
stack traceback:
User script:36: in main chunk

Where is my failure? Can you help me please?

Many thanks for help!

Best Regards 
Steffen


RE: Solcast API - admin - 09.02.2022

Try data[1].pv_estimate instead of data.pv_estimate.


RE: Solcast API - pioneersteffen - 09.02.2022

Hi admin,

many thanks for your help. The first line (21:30) is working now. Stupid question from my side: how to get access to the 22:00 forecast? Is this data[2].pv_estimate?

Code:
string: {"forecasts":[{"period_end":"2022-02-09T21:30:00.0000000Z","period":"PT30M","pv_estimate":0},{"period_end":"2022-02-09T22:00:00.0000000Z","period":"PT30M","pv_estimate":0},{"period_end":"2022-02-09T22:30:00.0000000Z","period":"PT30M","pv_estimate":0},{"period_end":"2022-02-09T23:00:00.0000000Z","period":"PT30M","pv_estimate":0}, ……

Many thanks.

Best Regards 
Steffen


RE: Solcast API - admin - 10.02.2022

Yes, data[2], data[3] and so on.


RE: Solcast API - pioneersteffen - 11.02.2022

Hi Admin,

many thanks for your help!

I want to include a repeat loop to write the next 12h into group addresses. Unfortunately my actual code doesn’t work. Can you please give me a hint for the loop?

Many thanks for your help!

Best Regards 
Steffen 

Code:
require('json')

https = require 'ssl.https'


appid = 'XXX'
lat = '52.436225'
lon ='10.42526'
azi = '170'
hours = '24'
format = 'json'
tilt = '33'
capa = '8'

url = 'https://api.solcast.com.au/world_pv_power/forecasts?latitude=%s&longitude=%s&hours=%s&format=%s&tilt=%s&capacity=%s&azimuth=%s&api_key=%s'

url = string.format(url, lat, lon, hours, format, tilt, capa, azi, appid)

res, code, headers, status = ssl.https.request(url)
log (code, status, headers, res)

data = json.pdecode(res)

--Fault messages:

if not data then
  alert('Error converting data')
  return
end

if not res then
  alert('Error collecting data')
  return
end

data = data.forecasts

i=1
repeat

grp.write('45/1/'..i, data[i].pv_estimate)
    i = i + 1

until i>24



RE: Solcast API - admin - 11.02.2022

The loop looks correct though a for loop over the whole data set makes more sense.
Code:
for i, row in ipairs(data) do
  log(i, row)
  grp.write('45/1/'..i, row.pv_estimate)
end

Keep in mind that there's a limit on API calls so your script might not produce any results if you hit this limit.


RE: Solcast API - pioneersteffen - 06.03.2022

Sorry for the late reply. 

@admin: Many thanks for your idea.

Here is my actual script which calculates the forecast for the next 24h, today and tomorrow. I hope somebody can use it to progress with it.


Code:
require('json')
https = require 'ssl.https'


appid = 'xxx'
lat = '52.436225'
lon ='10.42526'
azi = '170'
hours = '48'
format = 'json'
tilt = '33'
capa = '8'

url = 'https://api.solcast.com.au/world_pv_power/forecasts?latitude=%s&longitude=%s&hours=%s&format=%s&tilt=%s&capacity=%s&azimuth=%s&api_key=%s'
url = string.format(url, lat, lon, hours, format, tilt, capa, azi, appid)

res, code, headers, status = ssl.https.request(url)
log (code, status, headers)
data = json.pdecode(res)

--Fault messages:
if not data then
  alert('Error converting data')
  return
end

if not res then
  alert('Error collecting data')
  return
end

data = data.forecasts

-- PV Forecast Calculation***************************************************************************
now = os.date('*t')
hour = now.hour
i=1
j=2
k=1
forecastsum=0
rest_hour = 24 - hour

repeat

   forecast = data[i].pv_estimate + data[j].pv_estimate
   
   forecastsum = forecastsum + forecast
   
     -- next 24h
     if k == 24 then
        forecast_24h = forecastsum
        grp.write('43/4/25', forecast_24h)
     end
     -- today
     if rest_hour == k then
        forecast_today = forecastsum
        grp.write('43/4/26', forecast_today)
     end
   
     -- tomorrow
     if (rest_hour + 24) == k then
        forecast_tomorrow = forecastsum - forecast_today
        grp.write('43/4/27', forecast_tomorrow)
     end

-- hourly forecasts next 24h
    if k < 25 then
      grp.write('43/4/'..k, forecast)
    end
   
i = i + 2
j = j + 2
k = k + 1

until k > (rest_hour + 24)
   

-- *************************************************************************************************