Skip to content

EN Configuration

cardinal808 edited this page Nov 4, 2026 · 4 revisions

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.

Step by step

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.

Step 0: Check what you need

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.

Step 1: Place the files and restart

  1. Put the forecasting and savings package files in the same packages folder 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 add zendure_negative_price_global.yaml (see step 8).
  2. Replace the automation and the dashboard with the versions from this set (or merge the changes into your own version).
  3. 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.

Step 2: Make the settings blocks visible

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.

Step 3: Check Gielz's basics

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.

Step 4: Enter the solar panel counter

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.

Step 5: Enter the solar forecast

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:

  1. Go to Settings → Devices & services → Entities.
  2. Search for solcast (or energy_production).
  3. 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.

Step 6: Choose charge margin, reliability and dip hold

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.

Step 7: Enter the savings settings (optional)

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.

Step 8: No export at a negative price (optional)

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).

  1. 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.
  2. 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.

Step 9: Exclude the chart sensor from the recorder

Add this to configuration.yaml and restart Home Assistant:

recorder:
  exclude:
    entities:
      - sensor.zendure_forecast_chart

Without it you get a warning in the log that the attributes are too large. Nothing breaks, but your database grows for no reason.

Step 10: Choose the mode and check

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.

What to expect in the first week

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.

Common mistakes

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.

Reference: all settings

Choosing the mode

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.

Configuration (Forecasting)

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.

Configuration (Savings)

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.

Configuration (Negative Price)

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 no longer needs to be set

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.

Gielz settings used by the forecasting

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.

Configuration (Dashboard)

  • 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.

Fixed values

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.

Recorder

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_chart

A restart of Home Assistant is needed afterwards.

See also: How the forecasting works · Dashboard · FAQ

Clone this wiki locally