Repository navigation
EN Configuration
Applies to Forecasting 2026.11.2 · based on Gielz v20261007
New here? Follow the step-by-step guide below first. The Reference after it explains each setting on its own.
Allow about half an hour. All examples assume a Zendure 2400 AC with two 2.88 kWh batteries (5.76 kWh in total), Solcast and a SolarEdge inverter. If you use something else, everything works the same way; only the sensor names differ.
| Needed | Why | Do you have it? |
|---|---|---|
| Gielz's package, working | The forecasting builds on it. The Smart Matching (zero on the meter) mode must already work. | Settings tab, Linked Zendure card: you see a picture of your Zendure and a recent automation heartbeat. |
| A P1 meter in Home Assistant | For import, export and your usage. | HomeWizard P1, SlimmeLezer/ESPHome or the DSMR integration. |
| A dynamic contract and the Nord Pool integration (HACS) | For today's and tomorrow's prices. | You have a sensor like sensor.nordpool_kwh_nl_eur_3_10_021. |
| A solar forecast | To know how much sun is still coming. | Solcast PV Forecast (recommended) or Forecast.Solar. |
| A total counter for your solar panels | To learn your self-consumption and daily usage. | A sensor in kWh that only goes up (see step 4). |
| apexcharts-card and card-mod (HACS) | For the charts and the Plan Timeline. | Under HACS → Frontend. |
Gielz's package not working yet? Start with Gielz's wiki and come back afterwards.
- Put the forecasting and savings package files in the same
packagesfolder as Gielz's package file, and replace Gielz's package file with the version from this set. If you do not want to export at a negative price, also addzendure_negative_price_global.yaml(see step 8). - Replace the automation and the dashboard with the versions from this set (or merge the changes into your own version).
- Restart Home Assistant (a full restart, not just a YAML reload: new helpers are added).
Check: under Developer tools → States, sensor.zendure_forecast_plan exists.
Some blocks on the Settings tab stay hidden until you switch them on. This is the most common mistake: "I can't find Configuration (Forecasting)".
On the Settings tab, in the dashboard block at the bottom, switch on:
- the help texts toggle: shows a short explanation with each block. Useful the first time.
- the PV toggle: shows, among others, the Configuration (PV) and Configuration (Negative Price) blocks.
- the dynamic toggle: shows, among others, Gielz's block for dynamic prices.
- Show Forecasting On Dashboard: shows Configuration (Forecasting) and Configuration (Savings) and the forecasting sections on the Zendure tab.
The forecasting uses a few of Gielz's settings. If they are wrong, the planner calculates wrong. Go through them once. In doubt, first press Gielz's default settings button in the basic block, then adjust.
| Setting (Gielz) | Example | Why it matters for the forecasting |
|---|---|---|
| Max. charge power | 2400 W | Sets how much a charge slot yields: 2400 W × 15 minutes = 0.6 kWh per quarter hour. After a few charging sessions the planner uses the measured power if that is lower. |
| Min. / max. state of charge | 10% / 100% | Sets the usable capacity: 5.76 kWh × (100 − 10)% = 5.18 kWh. |
| Nord Pool sensor | sensor.nordpool_kwh_nl_eur_3_10_021 |
The prices the plan is based on. |
| 15-minute prices | on with a quarter-hour contract | Calculate per quarter hour or per hour. |
| Minimal spread | the default value | Minimum price difference (in %, after loss) before charging from the grid pays off. Higher = only charge on large differences. |
Check: on the Zendure tab, the Dynamic Today chart shows today's prices.
On the Settings tab, block Configuration (Forecasting). Start with the bottom sensor; it is the trickiest.
Solar panels production sensor (total kWh) must be a counter that goes up since installation and never jumps back to 0.
| Example | Why | |
|---|---|---|
| ✅ Right |
sensor.solaredge_ac_energy_kwh with a value of 18432.5 kWh |
Total counter, only goes up. |
| ❌ Wrong | sensor.solaredge_energy_today |
Jumps to 0 every night. |
| ❌ Wrong |
sensor.solaredge_ac_power with a value of 1850 W |
That is power (W), not energy (kWh). |
Tip: use the same sensor you have under Solar panels in Home Assistant's Energy dashboard. That is a proper total counter by definition. Wh and MWh are fine too; they are converted automatically.
In the same block, fill in the two forecast sensors.
| Field | Solcast (recommended) | Forecast.Solar |
|---|---|---|
| Solar remaining today sensor | sensor.solcast_pv_forecast_forecast_remaining_today |
sensor.energy_production_today_remaining |
| Solar tomorrow sensor | sensor.solcast_pv_forecast_forecast_tomorrow |
sensor.energy_production_tomorrow |
Your names may differ slightly (for example with _2 at the end). To find the right one:
- Go to Settings → Devices & services → Entities.
- Search for
solcast(orenergy_production). - Click the sensor, open the cog and copy the Entity ID.
Note: enter the entity ID (starts with sensor.), not the display name.
| What you enter | |
|---|---|
| ✅ Right | sensor.solcast_pv_forecast_forecast_tomorrow |
| ❌ Wrong |
Forecast Tomorrow (the display name) |
| ❌ Wrong |
solcast_pv_forecast_forecast_tomorrow (without sensor.) |
Why Solcast? Solcast gives a forecast per half hour. With it the planner knows when the sun will cover your usage, and how much you need from the battery until then. Forecast.Solar works too, but then the planner assumes the sun covers your usage 3 hours after sunrise, and the Solar row in the Plan Timeline stays empty.
These three set how cautious the planner is. Start with the starting values and adjust after a week.
| Setting | Starting value | What it means in the example |
|---|---|---|
| Battery charge margin % | 10% | 10% of 5.76 kWh = 0.58 kWh of extra buffer on top of what the planner expects to need. |
| Solar forecast reliability % | 0 (= 100%) | The forecast is used as it is. |
| Hold discharge in cheap dip | off | The battery discharges as in normal smart matching. |
Charge margin example. The planner expects you to need 3.2 kWh from the battery until tomorrow morning. With a 10% margin it aims for 3.2 + 0.58 = 3.78 kWh. If your evening is heavier than expected (tumble dryer, induction hob), those 0.58 kWh absorb it.
- Often still buying expensive power in the evening with an empty battery? Raise the margin to 15–20%.
- Battery often still largely full in the morning? Lower it to 5%. Every kWh charged unnecessarily costs you charge and discharge loss.
Reliability example. Solcast forecasts 12 kWh tomorrow. At 80% the planner uses 12 × 0.8 = 9.6 kWh, and charges a bit more from the grid. After a week, compare the forecast with what your panels actually produced (Energy dashboard). If Solcast was about 20% too high every time, set it to 80%. If it is accurate, leave it at 0.
Hold discharge in cheap dip. Switch this on if your prices have clear dips and peaks (for example cheap in the afternoon, expensive in the evening). The battery then stays full during the cheap dip and only delivers in the expensive hours. If the battery will not last until the end of the evening and no charge moment is left, it keeps its charge for the most expensive quarter hours (smart hold). Leave it off for the first week, so you first see how the normal plan behaves. See How the forecasting works.
If you want to see what solar, battery and your dynamic contract bring in, fill in the Configuration (Savings) block. Use all-in amounts per kWh (including energy tax and VAT). The amounts below are only examples; use your own supplier's.
| Setting | Example | Explanation |
|---|---|---|
| Fixed supply tariff | € 0.28 | What you would pay on a fixed contract, to compare with. |
| Fixed feed-in tariff | € 0.28 | With full net metering equal to the supply price. |
| Dynamic supply markup | € 0.00 | Leave at 0 if your Nord Pool sensor already shows all-in prices. If it shows only the bare market price, enter the markup your supplier charges (purchase fee, energy tax, VAT). |
| Dynamic feed-in markup | € −0.02 | Negative if your supplier deducts something per kWh fed in. |
| Dynamic feed-in bonus % | 0% | Only if your supplier pays a percentage on top of the market price. |
| Battery purchase price | € 1,800 | Battery, inverter and installation together. |
Check: how do you know whether your sensor is all-in? Look at the current price on the Zendure tab. Around € 0.20–0.35 means probably all-in. Around € 0.05–0.15 means the bare market price.
Only needed if you placed zendure_negative_price_global.yaml (step 1). The module calculates the feed-in price per quarter hour: market price + bonus % (only when the market price is positive) + feed-in markup, using the amounts from step 7. So fill those in first. When the feed-in price is negative, the installation does not export.
On the Settings tab, block Configuration (Negative Price) (below Configuration (PV); visible with the PV toggle).
- Switch on No export at negative price. From now on, at a negative price the module turns on Gielz's PV Export Disabled and back off afterwards. Charging from solar and discharging to the house keep working.
- Do you also have an external inverter (for example SolarEdge next to the Zendure)? Set Number of external inverters to 1 or 2 and fill in per inverter:
| Limit type | For | Limiter entity | What the module does |
|---|---|---|---|
| Production limit | SolarEdge, OpenDTU/Hoymiles, APsystems, Fronius Modbus | a number.*, e.g. number.solaredge_modbus_active_power_limit
|
Regulates every 10 s on the grid meter: the inverter powers the house but does not export. Also fill in the power sensor (W, e.g. sensor.solaredge_modbus_ac_power). |
| Export limit | GoodWe, Growatt | a number.* with the export limit |
Sets the export limit to 0; the inverter regulates on its own meter. |
| (on/off only) | Enphase | a switch.*
|
Turns the switch off and back on afterwards. |
| (via actions) | Huawei, Sofar | a script.*
|
Starts the script with block: true or false. An example is at the top of zendure_negative_price_global.yaml. |
The external inverter is only limited when the Zendure cannot absorb the surplus any more (battery full or charging at maximum power). With 2 inverters the primary (choose the one with a production limit) regulates on the grid meter and the secondary goes fully to its minimum. Afterwards the module restores everything as it was.
SolarEdge Modbus Multi: switch on power control in the integration options, otherwise the limit entity does not exist.
Check: the Feed-in badge in the block shows the current feed-in price. At a negative price the red Export blocked badge appears and a line is written to the logbook.
Add this to configuration.yaml and restart Home Assistant:
recorder:
exclude:
entities:
- sensor.zendure_forecast_chartWithout it you get a warning in the log that the attributes are too large. Nothing breaks, but your database grows for no reason.
On the Zendure tab, choose the mode Dynamic Smart Matching + Forecasting. Then look at Forecasting on the same tab:
| Check | Good | Not good → what to do |
|---|---|---|
| Notices at the top | No notices. | Blue mode not active: choose the mode. Orange solar forecast sensor missing: check step 5. |
| State | Charge, Waiting, Not needed or Not favorable. | No prices: check the Nord Pool sensor (step 3). No battery data: the Zendure cannot be reached; check its IP address. |
| Plan | A sentence in plain language with the next charge block: when, how long, about how many kWh and the average price. | Empty or an error: press Recalculate and wait a minute. |
| Collected data → Grid | P1 meter (kWh counters) | Calculated from power: your P1 counters were not detected. It works, but slightly less precisely; report which P1 you have. |
| Collected data → Solar production | Goes up after a few sunny hours. | Stays 0: the solar panel counter is wrong (step 4). |
You do not need to press Recalculate after changing a setting: the planner recalculates on every change and otherwise every minute.
The planner learns from your own house. In the first days it is therefore more cautious and less precise.
| When | What happens |
|---|---|
| Right away | The plan uses starting values: 8 kWh usage per day and 30% direct solar usage. |
| After about 2 hours | Your own daily usage is calculated. |
| After the first sunny hours | Your own direct solar usage is calculated. |
| After 3 workdays and 1 weekend | The usage profile per hour is mostly filled: the planner sees your evening peak. Until then it blends the measurements with your daily average. |
| After 7 days | All data at full strength. A good moment to adjust charge margin and reliability (step 6). |
| After 2 working weeks and 5 weekend days | The spread of usage within each hour (per quarter hour) counts fully. Until then the planner moves gradually from evenly spread to your own pattern. |
| What you see | Cause | Fix |
|---|---|---|
| Block Configuration (Forecasting) is missing | Hidden. | Switch on Show Forecasting On Dashboard (step 2). |
| Block Configuration (Negative Price) is missing | Hidden, or the package is not placed. | Switch on the PV toggle (step 2) and check step 1. |
| Orange notice about the solar forecast | Display name or typo entered. | Copy the entity ID, starting with sensor. (step 5). |
| Plan charges much more than expected | Solar sensor not found: that solar then counts as 0 kWh. | Check the notice and step 5. |
| Solar production and self-consumption stay 0 | Daily counter or power sensor entered. | Use a total counter in kWh (step 4). |
| State No prices | Nord Pool sensor empty or wrong. | Step 3. |
| "The plan is a simulation" | The mode is still set to something else. | Choose Dynamic Smart Matching + Forecasting (step 10). |
| Plan Timeline stays on Loading… | apexcharts-card or card-mod missing, or the planner still has to calculate. | Install both via HACS and press Recalculate. |
More questions: FAQ.
On the Zendure tab, choose the mode Dynamic Smart Matching + Forecasting. In all other modes the planner still calculates, but it does not charge; the dashboard then says the plan is a simulation.
On the Settings tab, block Configuration (Forecasting):
| Setting | What it does | Advice |
|---|---|---|
| Solar remaining today sensor | Entity (kWh) with the solar still expected today. | Solcast: sensor.solcast_pv_forecast_forecast_remaining_today. Forecast.Solar also works, but without per-half-hour detail (see below). |
| Solar tomorrow sensor | Entity (kWh) with the expected solar for tomorrow. | Solcast: sensor.solcast_pv_forecast_forecast_tomorrow. |
| Solar panels production sensor (total kWh) | An increasing total counter of your solar panels, used to calculate self-consumption and daily usage. | For example your inverter's energy counter (SolarEdge, Enphase, …). Wh and MWh are converted automatically. Not a daily counter. |
| Battery charge margin % | Extra buffer on top of the expected battery usage, as a percentage of battery capacity (0–50%). Absorbs forecast errors. | 10% is a good middle ground. Higher: less chance of expensive purchases, but more often unnecessary charging (with loss). Lower: tighter, more risk. |
| Solar forecast reliability % | The solar forecast is multiplied by this percentage. 0 = 100%. | 80% if your forecast is often too optimistic. Leave at 0 if it is accurate. |
| Hold discharge in cheap dip | Holds the battery during a cheap dip when charging is still needed, and keeps the charge for the most expensive quarter hours if the battery will not last (see How the forecasting works). The path check takes it into account. | On if your prices have a clear dip and clear peaks. |
Why Solcast? Solcast gives a forecast per half hour (detailedForecast). With it the planner knows when the sun will cover your usage, which the path check uses. Without it, it assumes sunrise + 3 hours. The "Solar" row in the Plan Timeline also needs the detailed forecast.
On the Settings tab, block Configuration (Savings). Enter all-in prices per kWh (including energy tax and VAT).
| Setting | What it does |
|---|---|
| Fixed supply tariff | The supply price of a fixed or variable contract, to compare with. |
| Fixed feed-in tariff | The feed-in price with that contract. With full net metering equal to the supply price. |
| Dynamic supply markup | Markup on top of the price from the Nord Pool sensor. If your sensor is already all-in, leave it at 0. |
| Dynamic feed-in markup | Fixed amount per kWh on feed-in; negative if the supplier deducts something. Also used for the feed-in price in Negative Price. |
| Dynamic feed-in bonus % | Percentage of the market price added on feed-in, only when that price is positive. Also used for the feed-in price in Negative Price. |
| Battery purchase price | What the battery with inverter and installation cost. Needed for the payback time. |
| Battery already earned back (before measuring) | Optional: what the battery earned before this measurement started. |
| Restart total | Only resets the total; day, month and year continue. |
Savings are counted from the moment the package runs; earlier periods are not calculated afterwards.
On the Settings tab, block Configuration (Negative Price), below Configuration (PV). Only with zendure_negative_price_global.yaml.
| Setting | What it does |
|---|---|
| No export at negative price | On: at a negative feed-in price Gielz's PV Export Disabled is turned on, and back off afterwards. |
| Number of external inverters | 0 = the Zendure only. 1 or 2 = also limit external inverters. |
| Limit type |
Production limit (regulates on the grid meter) or Export limit (goes to 0). Applies to the primary inverter with a number.*. |
| Inverter limiter entity |
number.*, switch.* or script.* of the (primary) inverter. |
| External inverter power sensor (W) | Production limit only; makes regulating faster and more accurate. Without a sensor it regulates in steps of 5%. |
| Inverter limiter entity (secondary) | With 2 inverters only. Goes fully to its minimum as soon as the Zendure cannot absorb the surplus. |
The module only restores what it changed itself. If you set the number to 0 while something is limited, that is restored first.
| What | How it works now |
|---|---|
| Solar self-consumption | Calculated from day 1 from your own measurements. |
| Default daily usage | Calculated from about 2 hours after installation; more accurate every day. |
| Usage per hour and per quarter hour | Learned from your own measurements (see How the forecasting works). |
| P1 counters | Detected automatically: SlimmeLezer/ESPHome DSMR (sensor.energy_consumed_tariff_1/2, sensor.energy_produced_tariff_1/2), HomeWizard P1 (sensor.p1_meter_energy_import/export) and the DSMR integration. |
| Efficiency | From Gielz's total RTE. |
| Workday or weekend | Monday to Friday, or the Workday integration if present. |
| Setting (Gielz) | Use in the forecasting |
|---|---|
| Max. charge power | Power used to charge from the grid in a charge slot; determines how many kWh a slot yields. Also used by Negative Price to see whether the Zendure charges at full power. |
| Max. discharge power | Used in the Plan Timeline. |
| Charge buffer | With a production limit, Negative Price aims just below this buffer, so the Zendure keeps charging at full power. |
| PV Export Disabled | Turned on and off automatically by Negative Price. |
| Minimal spread | Minimum price difference for scenario B and for a charge slot (after loss). |
| 15-minute prices | Calculate per quarter or per hour. |
| Nord Pool sensor | Today's and tomorrow's prices (also used for the savings and the feed-in price). |
| Min./max. state of charge | Determine the usable battery capacity. |
- Show Forecasting On Dashboard: shows or hides the forecasting sections and the configuration blocks for Forecasting and Savings.
- Gielz's PV toggle also shows the Configuration (Negative Price) block.
- Gielz's general help texts also apply to the forecasting, savings and negative price sections.
At the top of the planner in zendure_forecasting_global.yaml there are fixed values with the prefix c_, with an explanation. For example the threshold to start charging (0.3 kWh), the minimum size of a gap for the path check (15 minutes, 0.2 kWh), how quickly the spread per quarter hour counts fully and the starting values. Normally you do not need to change them.
Exclude the chart sensor from the recorder. Its attributes exceed the recorder limit (16 kB), and you do not need its history:
recorder:
exclude:
entities:
- sensor.zendure_forecast_chartA restart of Home Assistant is needed afterwards.
See also: How the forecasting works · Dashboard · FAQ
🇳🇱 Nederlands
🌍 English