Solar forecast
An hour-by-hour power forecast for your own solar panels, scored against your station's solar sensor, with an API for evcc, EMHASS and Home Assistant.
An hour-by-hour forecast of what your own panels will make over the next two days, for the software that schedules your battery or car charging. Set it up under Setup → Machine learning. It is included in Pro and the free trial.
How it works
Every hour, Pro Weather takes the sunshine forecast from several weather models for your station's location, gives more weight to the models your station's solar sensor has found most accurate, and turns that into power for each of your panel arrays: sun position, panel angle, panel temperature, losses and inverter limit.
The forecast is marked corrected once your solar sensor has scored the models for a couple of days. Without a solar sensor every model counts the same. Your sensor sees the sky, not your roof: to account for shade or dirty panels, send your measured production.
Setting up your panels
Add one row per roof face, up to four. An east-west roof is two rows.
- kWp: peak power of the array, from your installer's paperwork or panel count times panel rating.
- Tilt °: 0 for flat, 90 for a wall. Pitched roofs are usually 30 to 45.
- Azimuth °: 0 is south, -90 east, 90 west, 180 north.
- Losses %: wiring, dirt and inverter. 14% suits most systems.
- Inverter kW: the inverter's maximum output. Leave empty if unknown.
Then create an API token on the same page. Creating a new token stops the old one immediately.
Connect evcc
Add this to evcc.yaml:
tariffs:
solar:
- type: custom
tariff: solar
forecast:
source: http
uri: https://pro-weather.com/api/solar
headers:
- Authorization: Bearer <your token>
jq: .slots | tostring
interval: 1hConnect EMHASS or a script
With a 60-minute optimization time step, pass each slot's value to EMHASS's
dayahead-optim action:
curl -s -H "Authorization: Bearer <your token>" https://pro-weather.com/api/solar \
| jq '{pv_power_forecast: [.slots[].value]}'Node-RED and your own scripts can read the same URL.
Home Assistant
The Pro Weather Solar Forecast integration feeds the Energy dashboard's solar forecast and adds sensors for automations.
- In HACS, open the three-dot menu → Custom
repositories, add
https://github.com/LNNRT-STN/ha-pro-weatheras an Integration, download Pro Weather Solar Forecast and restart Home Assistant. - Under Settings → Devices & services → Add integration, pick Pro Weather Solar Forecast and paste your token.
- Under Settings → Dashboards → Energy, edit your solar production and select the Pro Weather entry as its Solar production forecast.
You get power now, energy this hour and next, energy today, remaining today and tomorrow, peak power and peak time today, and a Corrected by station sensor. "Today" follows your Home Assistant time zone.
For Predbat, point
pv_forecast_today and pv_forecast_tomorrow at the energy today and energy
tomorrow sensors. They carry a Solcast-style detailedForecast attribute with
pv_estimate10 and pv_estimate90 (integration 0.2.0 and later).
Teach it your roof
In the integration's options (Settings → Devices & services → Pro Weather Solar Forecast → Configure), pick your Solar production sensor: the kWh or Wh sensor your Energy dashboard uses for solar production. The integration then sends each finished hour to Pro Weather.
From bright hours where the sky did what the forecast said, Pro Weather learns how much of the forecast your panels actually deliver. Power cuts, snow, a full battery and export limits are left out. After 24 good hours it is applied to every number, and it keeps learning over the last 30 days. Setup → Machine learning shows it, for example "your panels make 92 % of what the forecast expected". It stays between 50% and 130%: a bigger gap means the kWp, tilt or azimuth is wrong.
A battery that is often full can make the number read low, because the inverter then produces less than the roof could.
Without the integration
A REST sensor gives you the rest of today's forecast. In secrets.yaml, set
proweather_solar: "Bearer <your token>", then:
rest:
- resource: https://pro-weather.com/api/solar
headers:
Authorization: !secret proweather_solar
scan_interval: 1800
sensor:
- name: Solar forecast rest of today
unit_of_measurement: kWh
value_template: "{{ ((value_json.daily.values() | list)[0] / 1000) | round(1) }}"A REST sensor cannot feed the Energy dashboard's forecast line.
The API
GET https://pro-weather.com/api/solar with
Authorization: Bearer <your token> returns the next 48 hours:
{
"generatedAt": "2026-09-24T09:12:03.120Z",
"issuedAt": "2026-09-24T09:00:00.000Z",
"corrected": true,
"station": { "name": "Ardooie", "timezone": "Europe/Brussels" },
"arrays": [{ "name": "Roof south", "kwp": 5.2 }],
"scale": { "active": true, "value": 0.92, "samples": 212 },
"slots": [
{ "start": "2026-09-24T09:00:00Z", "end": "2026-09-24T10:00:00Z", "value": 2140, "wh": 2140, "ghi": 512, "p10": 1310, "p90": 2780 }
],
"wh_hours": { "2026-09-24T09:00:00Z": 2140 },
"daily": { "2026-09-24": 14800, "2026-09-25": 21300 },
"daily_p10": { "2026-09-24": 9600, "2026-09-25": 13900 },
"daily_p90": { "2026-09-24": 18900, "2026-09-25": 26100 }
}slots: one per hour, times in UTC.valueis average power in W,whenergy in Wh,ghithe sunshine forecast in W/m².p10andp90are the cautious and bright case in W: one hour in ten should come in belowp10, one in ten abovep90. At night both equalvalue.wh_hours: the same energy keyed by hour start.daily: Wh per day in your station's time zone, starting with the rest of today.daily_p10anddaily_p90add up the hourly cases; treatdaily_p10as a floor for a battery reserve, not a typical bad day.scale: what your measured production has taught the forecast.valueis already applied to every number above, and is 1 whileactiveis false.- A new forecast is ready once an hour; poll every 15 to 60 minutes. More than
60 requests an hour from one address get
429.
Errors: 401 missing or unknown token, 403 plan does not include the solar
forecast, 409 no panels set up or no station location.
Sending production from your own script
The Home Assistant integration does this for you. Anything else can post finished hours with the same token:
curl -s -X POST https://pro-weather.com/api/solar/production \
-H "Authorization: Bearer <your token>" -H "Content-Type: application/json" \
-d '{"hours": [{"start": "2026-09-24T09:00:00Z", "wh": 2140}]}'startis a finished hour in UTC, on the hour;whis what all panels together made in it.- Up to 168 hours per request, none older than 7 days. Resending an hour replaces it, so resending the last day every hour is fine.
- One bad hour rejects the whole request with
400, naming the hour.413above 32 KB,415without the JSON content type,429above 30 requests an hour from one address. - The response gives the number of hours accepted and the current
scale.
