Connect pvnode with Home Assistant
pvnode has an official Home Assistant integration. It uses the V2 API, adds a device per site and per roof surface, feeds the Energy Dashboard, and manages its own polling so it never spends more of your request quota than your plan actually produces.
Setup is two steps: paste an API key, pick your site from a list.
Installation
The integration is not (yet) part of the default HACS catalogue, so it is added as a custom repository.
- Install HACS if you don't have it yet.
- HACS → Integrations → ⋮ → Custom repositories
- Add
https://github.com/darwindaume/ha-pvnodewith the category Integration. - Install pvnode, then restart Home Assistant.
The button opens the repository directly in your own Home Assistant. It works from the device you are reading this on, as long as My Home Assistant is set up in your instance.
Prefer a manual install? Copy custom_components/pvnode from the repository into your
config/custom_components/ directory and restart. HACS is only the convenient path — and the
one that tells you about updates.
Setup
- Settings → Devices & Services → Add Integration → pvnode
- Paste your API key (create one here).
- Choose your site from the list. With a single site the step is skipped.
There is nothing else to configure. Forecast horizon and refresh cadence follow from your pvnode plan and are steered by the API itself — the integration asks exactly when a new computation is available, and survives a restart without a single extra request.
Add the integration again for each additional site.
Changing plan
Forecast horizon and the uncertainty band adjust themselves on the next refresh — no reload needed. The band sensors appear after the first forecast update, not immediately after setup.
If you don't want to wait, press "Refresh forecast now" on the pvnode device. Home Assistant's own Reload does not help here: it falls back to the stored forecast and deliberately avoids a request while that one is still current.
Every press counts against your request quota, even when the server returns the same computation. After a plan change it is different — the server-side cache is invalidated, so a genuine recomputation happens.
Sensors
Each site becomes a device, each roof surface a sub-device.
Site
| Sensor | Unit | Meaning |
|---|---|---|
| Power forecast now | W | forecast for the current 15-minute slot |
| Power forecast in 30 minutes / 1 hour | W | for short-term automations |
| Peak power today / tomorrow | W | daily maximum |
| Time of peak power today / tomorrow | time | when the maximum occurs |
| Clearsky power now | W | reference without clouds |
| Energy forecast today / tomorrow / in N days | kWh | daily total, straight from pvnode |
| Clearsky energy today | kWh | daily total without clouds |
| Remaining yield today | kWh | what is still to come from now on |
| Energy this / next hour | Wh | short-term window |
| Temperature forecast, weather code | °C, WMO | site-wide |
The number of day sensors follows your plan.
Disabled by default, individually enabled in the entity registry: wind speed, relative humidity, precipitation, snow water equivalent, and global, diffuse and beam irradiance.
Only on a suitable plan: power and energy forecast as a (min)/(max) pair.
Roof surface
Power forecast now, energy forecast today and tomorrow, plus tilted irradiance before and after shading (disabled by default).
Daily energy per roof surface is derived — pvnode reports daily totals for the site as a whole only. For accounting, the site-level value is the authoritative one.
Diagnostics
Forecast computed at, next forecast update (with included and available as attributes),
requests remaining. The request counter is account-wide, not per site.
Energy Dashboard
pvnode can supply the forecast curve for a solar panel in the Energy Dashboard.
A real production meter is required. For "Solar production" the Energy Dashboard needs an
accumulating energy sensor (state_class: total or total_increasing) — typically from your
inverter. A forecast is not a meter and cannot fill that field.
- Settings → Dashboards → Energy
- Under Solar panels, add your production sensor.
- Under Forecast, select pvnode.
The forecast then appears as a curve above actual production. It is fetched live on every page load and not historised — looking back, you always see the current forecast, not the one from back then.
Charts
Home Assistant ships no built-in card for forecast curves. The usual route is the ApexCharts card from HACS.
Every power sensor carries its full time series in the forecast attribute:
Code
Replace sensor.my_site_... below with your own entity IDs (find them under Developer Tools
→ States, filter pvnode). The gap between the two lines is the loss to cloud cover.
Code
Migrating from Forecast.Solar
Remove Forecast.Solar first, then set up pvnode and adjust your automations.
The left column shows the entity ID Forecast.Solar assigns permanently — identical in
every installation, so you can search your YAML for it. The right column shows the sensor
name in pvnode. A fixed entity ID cannot be listed there: it is built from your site name,
so for "House North" it becomes sensor.house_north_energy_forecast_today.
| Forecast.Solar — entity ID | pvnode — sensor name |
|---|---|
sensor.energy_production_today | Energy forecast today |
sensor.energy_production_tomorrow | Energy forecast tomorrow |
sensor.energy_production_today_remaining | Remaining yield today |
sensor.power_production_now | Power forecast now |
sensor.power_production_next_hour | Power forecast in 1 hour |
sensor.power_highest_peak_time_today | Time of peak power today |
sensor.power_highest_peak_time_tomorrow | Time of peak power tomorrow |
sensor.energy_current_hour | Energy this hour |
sensor.energy_next_hour | Energy next hour |
On top of that you gain values with no previous equivalent: clearsky power and energy as a cloudless reference, weather and irradiance data, separate sensors per roof surface and — depending on your plan — the uncertainty band.
The forecast source in the Energy Dashboard has to be selected once more: it hangs off the config entry, not the entities.