LogicMachine Forum
Solcast API - Printable Version

+- LogicMachine 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)     -- *************************************************************************************************