DESS needs a rework from SCRATCH

It’s a pleasure to share my experience with the Victron community, thank you too, maybe I will give a try to 3.6 and share results. The promise of the Dynamic ESS (DESS) is fantastic: a smart system that uses weather forecasts and dynamic pricing to optimize your battery usage and deliver significant savings. However, in practice, I found that the DESS algorithm often lacks the intelligence to achieve this successfully. For me, a simple, manual charging schedule has proven far more effective.

The Problem: When “Smart” Isn’t Smart

When I first enabled DESS (on Venus 3.55), I quickly noticed some illogical behaviors:

  1. Wasting Free Weekend Sun: On weekend, with grid power at its cheapest (€0.08/kWh), DESS would charge the battery from the grid and maintain it at 70% SOC (LiFePo4 battery likes 40-50%). This meant that when on monday the sun was at its peak, my system couldn’t absorb the free solar energy and would be forced to export it. The optimal strategy would be to start the day with a lower SOC to maximize solar self-consumption, knowing that grid power is cheap if needed.
  2. Gambling on the Forecast (and Losing): In other instances, DESS would either keep the battery too full, wasting potential solar generation, or let it get dangerously low late in the afternoon. It failed to proactively charge during cheaper mid-day hours, even when the forecast made it obvious the battery wouldn’t have enough power to cover the expensive evening peak (18:00-22:00).

My goal is simple: self-consumption first, and only sell to the grid if there’s a true excess. The DESS logic was failing to deliver this.

My Workaround: A More Reliable Manual Schedule

Ultimately, I found I could achieve better savings by disabling DESS and creating a simple schedule based on my home’s typical consumption patterns:

  • 7:00 - 8:00: Charge the battery to a minimum of 35%. This provides me 15% of battery before the minimum SOC, just enough power to cover our morning usage (high prices until 14:00) before the solar panels start producing.
  • 16:30 - 18:00: Ensure the battery has a minimum SOC of 50%. This is my “bridge,” giving me enough stored energy to get through the expensive evening peak hours without buying from the grid.

Is this system perfect? No. On a very cloudy day, it might not be enough. But for the vast majority of the time, this simple, predictable logic is more profitable than the “dynamic” decisions made by DESS.

The Path Forward: How DESS Could Become Truly Dynamic

The core issue is that DESS seems to be programmed with rigid, mathematical SOC targets for each hour taking into account the forecasted prices and generation/consumption. It needs to be more flexible. Imagine if the system used a true Model Predictive Control (MPC) engine. Instead of just following a static plan, it would constantly re-evaluate its strategy.

For example, it could ask itself every 30 minutes:

“It’s 4:00 PM and my battery is at 30%. Given the forecasted load, solar production, and upcoming price changes, what is the most cost-effective action right now? Should I charge from the grid to prepare for the evening peak? How much energy do I need to bridge the gap until the cheap overnight rates kick in?”

By continuously asking and answering these questions, the system would become truly optimal. It would adapt to any situation—including unexpected high-consumption events like charging an electric car—because it would always be reacting to the current state and the near future forecast. This would transform DESS from a rigid scheduler into the intelligent energy manager we all want it to be.

Also, take into account, for the battery health, try your best to maintain between 30 an 60% for lithium batteries.

My config:

DESS example, here I was watching its behaviour, and based on the predictions, the system maintained a too high SOC; I had to “manually” reduce SOC charging my car from 13 to 14:30 to avoid “wasting” energy to the grid (this comsunption was not forecasted). After other suboptimal behaviours and this, I switched off DESS:

(text translated with Gemini 2.5)