Even before it became clear what the new feed-in tariffs would be after the abolition of the net metering scheme, I was already exploring home batteries. Initially, I mainly looked at the large fixed models such as the Sessy or Tesla Powerwall. But soon I became enthusiastic about another type: modular plug-in home batteries.
The big advantage? You can start small and expand your installation step by step. No hassle with installers or major adjustments to your meter box. Just plug & play. Exactly what I was looking for.

My choice: Zendure Hyper2000 + AB2000s
After a long comparison, I finally chose a Zendure home battery. Specifically: the Zendure Hyper2000 with two AB2000s. This inverter can be connected to one or more batteries, making it very flexible to use, and you can simply plug them into a regular socket or a separate circuit.
In the Zendure app, you can set charging and discharging strategies, such as a task planner, dynamic rates, or a smart AI mode. That works quite well, but as my regular readers know: I want full control. That’s why I integrated the Zendure home battery into Home Assistant. In this article, you will read step by step how I did it.
My Zendure system
My Zendure system consists of a Hyper2000 with two AB2000s batteries. This means I have a total of about 4 kWh of storage. The system is modular, so you can add extra batteries later. You can start with an AB1000 battery or an AB2000 battery. These have approximately 1 and 2 kWh of battery capacity, respectively. The Hyper2000 is an inverter that can deliver or charge 1200W in combination with 2 or more batteries. You can also connect solar panels directly to it, allowing you to charge up to 1600W. For now, I have placed my Zendure set in the attic on a shared circuit with the washing machine.



The Hyper2000 can charge and discharge with a maximum of 1200 Watts. However, this requires connecting the battery to its own circuit in the meter box. When you connect the battery to a random socket, you are only allowed to feed in a maximum of 800 Watts according to the standards. This applies to all plug-in home batteries. Fixed installations often have higher capacities and are installed on their own circuit.
Shopping list for plug-in Home Batteries


Zendure SolarFlow 2400AC (2,88kWh)

Zendure SolarFlow 800 Pro (1,92kWh)
Adding Zendure Home Battery to Home Assistant
By following this plan, you’ll gain full control over your home battery within Home Assistant—enhancing energy independence, cost-efficiency, and grid-zero performance. All steps are described in detail later in this article.
- Add Zendure-HA to Home Assistant
Install HACS in Home Assistant if you haven’t already.
Add the Zendure-HA repository as a custom integration.
Download it, then restart Home Assistant.
Go to Settings → Integrations, and add the Zendure integration. - Configure Zendure-HA integration
Create a second account in the Zendure app.
Log in with your primary account and use the “Share Device” feature to invite the second account.
Accept the invitation via the second account.
Use the second account credentials in Home Assistant to log in. - Set up you charge/discharge strategy
The integration supports zero-on-the-meter with the use of a P1 sensor
- Enjoy
Enjoy your use of your solarpower for example overnight!
To integrate your Zendure home battery with Home Assistant, start by adding the HACS integration. Within HACS, there is an integration available for Zendure home batteries. You can download and install the integration via HACS. Add the URL of Zendure-HA as a custom repository to HACS or click the button below.
Click add and then download. Restart Home Assistant to complete the installation. You can now add the Zendure Integration to Home Assistant.


In the configuration of the integration, you need to enter the following values.

Enter the desired values:
- Zendure username of your 2nd account (read below)
- Zendure password of your 2nd account
- P1 sensor for the zero-on-the-meter function (read below)
Two accounts
Zendure only allows one logged-in account per device. This means that when you add your Zendure system to Home Assistant, you log out of your account in the app and vice versa. You can work around this by creating a second Zendure account via the app. Once you have created the second account, log back in with your first account in the app, then choose ‘Share Device’. Invite your second account to share the device. Now log back in with the second account in the app and accept the request from your first account to view the device. Log out again with the second account and log back in with the first account in the app. You can now log in to Home Assistant with the second account.
Zero-on-the-meter with a home battery
The Zendure integration for Home Assistant supports NOM, or zero-on-the-meter mode. This means that there is a net 0 Watt consumption on the smart meter. The consumption in the house is then compensated by discharging the battery. The integration detects that there is a consumption in the house of 250 Watts, for example, and the home battery starts discharging at 250 Watts. The meter then sees a consumption of 0 W because the consumption is offset by the discharging of the battery.
Is there a surplus from your solar panels? Then the zero-on-the-meter mode will ensure that the home battery is charged with that surplus, so that there is a net 0 Watt on the meter again. In the integration, this is called smart matching. For this, the integration needs to know your current consumption and feed-in at this moment.
Most users read their smart meter via DSMR integration with a P1 meter cable with USB or via WiFi or HomeWizard P1 meter. When you use the HomeWizard P1 meter within Home Assistant, you have a sensor available that is positive for consumption and negative for feed-in in Watts. Enter the name of the sensor at P1 sensor for smart matching
. If you have two devices that read the P1 port, you can use a P1 splitter. For example, if you already read your smart meter for smart charging of your electric car. The data from your P1 port is then passed on to both devices.




Shopping list for reading P1 meter with Home Assistant and zero-on-the-meter with home battery

Homewizard P1 meter

P1 meter USB cable

Shelly Energy monitor
Combining P1 meter values
If you use the DSMR P1 integration to read your smart meter via USB, like I do, in combination with your home battery, you need to create a helper that combines the two values of consumption and feed-in into one sensor. You also need to convert that combined value to Watts instead of kW. You do this as follows:
To combine the P1 meter values of feed-in and consumption into one sensor in Home Assistant, we use a Helper. You add this by clicking Add Helper in the menu under Helpers. Then choose Template from the list, and then a Template sensor.
Enter the code below in the status template and adjust the sensor names to match your current consumption and current production sensors from the smart meter integration. If the sensor values are in kW, convert them to Watts by multiplying the value by 1000.
{% set import = states('sensor.electricity_meter_energieverbruik') | float %} {% set export = states('sensor.electricity_meter_energieproductie') | float %} {{ (import - export) *1000| round(2) }}

This template sensor takes the value of the import sensor and subtracts the export value. If the import is greater than 0 (you are consuming power from the grid), then the export is 0, and the number is positive. If the import is 0, and you subtract the export value, the number becomes negative. This is exactly what the Zendure Integration needs. This is also how a standard HomeWizard sensor works.
Finally, click Submit to complete the configuration. Your Zendure Home Battery is now added to Home Assistant!

Zendure Home Battery Configuration in Home Assistant
You now have two items in the integration overview. One is for managing the device, and the other is for controlling the Hyper2000 or another compatible Zendure product.
Under the control panel, you can operate the Hyper2000. You can select an operating mode to decide whether to discharge or charge. Additionally, you can adjust your limits, such as the charging and discharging speed and the minimum and maximum battery percentage (SoC).

Home Battery Strategy in Home Assistant
What is the best home battery charging/discharging strategy? That is quite personal and depends on your home. However, you can consider the following:
- Do you have solar panels and want to store as much solar power as possible in the battery?
- Do you want to charge the battery during the day and cover your night consumption with the home battery?
- Do you want to trade in electricity prices, i.e., charge at the cheapest moment and discharge at the most expensive moment? (dynamic energy contract)
- Do you want zero-on-the-meter all day or for a part of the day?
- Are there other large power consumers, such as a heat pump, air conditioner, stove, or electric car?
- Can these charge or heat smartly? Can you make your current air conditioner smart like I did?
- The capacity of the battery is also very important. A lot of storage means you can bridge a long time, but it also means you need to charge longer.
- Do you want to store solar power in your home battery instead of turning off your solar panels when electricity prices are negative to avoid or limit feed-in costs?
For me, I have now determined the following strategy:
- Charge with solar power or when the electricity price is the lowest when there is no generation
- Discharge when the price is the highest
- Otherwise, zero-on-the-meter until a battery charge of 30%
- The last 30% I use for the morning electricity price peak until there is solar power again
To switch between the different modes at the right times, I created an automation. It is not very useful to take it over exactly because you would have to convert a lot to your own situation. It is better to use the following as a guide to build your own strategy.
To help with the strategy, I created some helpers that simply determine when it is expensive or cheap, and I have a helper that shows what the current strategy is.

Determining the right (dis)charge moments for your home battery
The helper ‘Cheapest 3 consecutive hours’ turns on when the block of 3 cheap hours in a row starts. I also have a ‘Cheapest 4 separate hours’ helper that turns on when one of the 4 cheapest hours of the day starts. This way, it may be that some charging is done at night because there are one or two cheap hours that are not in a block of 3. The 3 most expensive hours turn on when the block of 3 most expensive hours starts. I chose blocks of 3 hours because the battery can be fully charged or discharged in about 3 – 4 hours. The limit is between 800 and 1200 Watts maximum for a Hyper2000. How to create the helpers is described in my article on dynamic electricity prices in Home Assistant.
Then there is the ‘number of negative hours today’ helper, which shows the number of hours the purchase electricity price is negative. This way, you can determine whether you feed in the solar power, whether or not for a pittance, or send it to the battery when the price is not yet negative and then possibly turn off the solar panels.


In this graph, I keep track of the SoC (State of Charge/battery percentage) against the electricity price per hour. You can see that during the morning price peak, around 7-9 am, the battery has discharged to 5%. Then it slowly started charging with the excess solar power (zero on the meter). Then, between 12:00 and 15:00, the battery fully charged with solar power. When it was full, 95%, it started discharging again around the evening peak, and it does zero on the meter until 22:00. If the battery still has more than 30% left, it continues with zero-on-the-meter until 30% battery charge (SoC). When the morning peak occurs again, the cycle starts anew.
How much can you charge and discharge with a home battery?
How much you can charge with your home battery depends on the capacity of the home battery itself. In my case, I have a Zendure hyper2000 with 2 AB2000s batteries underneath. Each battery has a capacity of 1.92kWh. That means you can store 2×1.92= 3.84kWh. That’s almost 4 kWh. But charging 3.84 kWh does not mean 3.84 kWh of stored energy. Internally, the battery works on direct current (DC). What comes out of your socket is alternating current (AC). To go from alternating to direct current, it must be converted. This always loses some energy, which is why the Hyper2000 gets warm. The same happens in reverse, so 3.84 kWh of stored energy does not mean 3.84 kWh of feed-in. Additionally, it is also good not to let the battery run completely empty and fully charge it. This extends the lifespan. So you lose some tenths of kWh here and there that you can actually use. Keep this in mind when determining the size of your storage!
Tracking charging and discharging of the home battery
I keep track of what is charged and discharged ‘this hour’ and ‘today’ in kWh via a utility meter. From the integration, only a current charging and discharging sensor is available in Watts. To convert from Watts to kWh, you need to calculate it. You do this using an Integral helper.

Converting from Watts to kWh
To convert from Watts to kWh in Home Assistant, create an Integral helper. Choose the Hyper2000 Output Home Power
sensor as the source and choose the Left Riemann sum. A Left Riemann Sum calculates the energy (kWh) by multiplying the power (W) at the beginning of each time block (interval that the sensor is updated) by the length of the block, and summing it all up within an hour. The result is then kWh. Do this also for the Hyper2000 grid Input Power sensor
.

The result is 2 sensors in kWh. From these sensors, you create 2 utility meters that keep track of how much is charged and discharged today by the home battery. I also created utility meters per hour to keep track of the costs and savings.


Calculating costs and savings of home battery with Home Assistant
Calculating the savings and costs of charging your home battery is more complicated than it seems. Initially, I thought that multiplying the current power (W) by the price per kWh would be enough to determine the savings and costs of your home battery. After a few days, I already had savings of tens of euros. My gut feeling tells me that this is not correct. So I started using a different calculation method. Ultimately, it may be a bit cumbersome in Home Assistant, but it is correct.
To arrive at this calculation method for the savings (or costs) of my home battery in Home Assistant, I first did the calculation manually. This way, I knew what I should end up with. What I did was note the meter readings of the Home Battery discharge and charge sensors at every whole hour. The difference between the previous value and the current value is what was charged or discharged by the home battery in the past hour. You need to multiply that value by the electricity price of that hour, and do that for the entire day. Then you have what you spend or earn per day with your home battery.
Configuring savings and costs of home battery in Home Assistant
Above in the article, I have already explained how to create the correct sensors with the helpers in Home Assistant. We will now further expand these with 5 numeric inputs:
- input_number.home_battery_discharge_this_hour_savings
- input_number.home_battery_discharge_today_savings
- input_number.home_battery_charge_costs_this_hour
- input_number.home_battery_charge_costs_today
- input_number.home_battery_net_savings_costs_lifetime
The settings of these numeric inputs are all the same: a negative value of, for example, -1000 and a positive value of +1000. The step size is set to 0.0001.
We will create 5 template sensors from these 5 numeric inputs. I do this so that history is stored and to display them on a dashboard, which does not look as nice with the numeric inputs.
- sensor.home_battery_discharge_this_hour_savings
- sensor.home_battery_discharge_today_savings
- sensor.home_battery_charge_costs_this_hour
- sensor.home_battery_charge_costs_today
- sensor.home_battery_net_savings_costs_lifetime
The template values are quite simple, adjust per input_number.
{{ states('input_number.home_battery_charge_costs_this_hour') | float }}

We will update the values using an automation. I trigger the automation every 58th second of the 59th minute of every hour. This way, the values are updated 2 seconds before the whole hour based on the hourly utility meters and the current electricity price. If you do the calculation at 0 minutes on the hour, the utility meters are reset to 0 and the electricity price is adjusted to that of the next hour. The ‘today’ sensors are updated based on the hourly sensors. The input_numbers are updated, and the sensors change with the template that listens to changes in the input_number.
alias: Update charging costs description: "" triggers: - trigger: time_pattern hours: "*" minutes: "59" seconds: "58" conditions: [] actions: - target: entity_id: input_number.home_battery_charge_costs_this_hour data: value: | {{ states('sensor.home_battery_charge_this_hour') | float * states('sensor.zonneplan_current_electricity_tariff') | float }} action: input_number.set_value alias: >- [CHARGING] Multiply the number of kWh from the hourly Utility meter by the kWh price of this hour - target: entity_id: input_number.home_battery_charge_costs_today data: value: | {{ states('input_number.home_battery_charge_costs_this_hour') | float + states('input_number.home_battery_charge_costs_today') | float }} action: input_number.set_value alias: "[CHARGING] Add the charging costs of this hour to the costs of today" - target: entity_id: input_number.home_battery_discharge_this_hour_savings data: value: | {{ states('sensor.home_battery_discharge_this_hour') | float * states('sensor.zonneplan_current_electricity_tariff') | float }} action: input_number.set_value alias: >- [DISCHARGING] Multiply the number of kWh from the hourly Utility meter by the kWh price of this hour - target: entity_id: input_number.home_battery_discharge_today_savings data: value: > {{ states('input_number.home_battery_discharge_this_hour_savings') | float + states('input_number.home_battery_discharge_today_savings') | float }} action: input_number.set_value alias: "[DISCHARGING] Add the discharge savings of this hour to today" mode: single
Charging costs and savings home battery calculation
The above Home Assistant automation does the following in short:
- Charging costs this hour = Number of kWh charged this hour (utility meter) * electricity price (€/kWh)
- Charging costs today = Charging costs today + Charging costs this hour
- Discharge savings this hour = Number of kWh discharged this hour (utility meter) * electricity price (€/kWh)
- Discharge savings today = Discharge savings today + Discharge savings this hour
The ‘today’ meters run up and down throughout the day until you reset them at 00:00 at night. I also do this with an automation. At that time, the lifetime sensor is updated, which keeps track of the net result in euros of what the battery does.
alias: Reset charging and discharging savings costs description: "" triggers: - trigger: time at: "23:59:59" conditions: [] actions: - action: input_number.set_value metadata: {} data: value: | {{ states('sensor.home_battery_net_savings_costs_lifetime') | float + states('sensor.home_battery_net_savings_costs_today') | float }} target: entity_id: input_number.home_battery_net_savings_costs_lifetime alias: Update lifetime result - action: input_number.set_value metadata: {} data: value: 0 target: entity_id: - input_number.home_battery_discharge_today_savings - input_number.home_battery_charge_costs_today alias: Reset counters for today mode: single
Local MQTT Communication
The developer of the Zendure Home Assistant integration is actively working on enabling local communication with the Zendure Hypers2000 and AC2400. The advantage of this is that you can communicate directly with Home Assistant via MQTT, instead of going through the Zendure cloud.
So far, this functionality is not yet available in a stable release, but it is available as a pre-release. You can download the pre-releases via HACS by clicking the menu button next to the integration name and selecting ‘Redownload’.

When reconfiguring the integration, you’ll see several new options. To use local MQTT communication, you need to enable the option ‘Use local Mosquitto MQTT Add-On’. This requires that you have the Mosquitto Add-On installed and configured. Fortunately, this is very easy, as it can be installed directly from the official add-on store.
The advantage of using this add-on is that everything is handled automatically. The integration will create the necessary users itself to communicate with the Zendure MQTT server.
Don’t forget to add the MQTT integration to Home Assistant after installing the add-on.

Next, enter your Wi-Fi SSID and password so the integration can pass this information to the Hyper2000 to reconnect to your Wi-Fi network. Click Submit and make sure the Hyper2000 is within Bluetooth range of Home Assistant.
A reset of the Hyper2000 is performed via Bluetooth during this process, and the new MQTT server is configured as part of the setup.
Bluetooth connection Hyper2000 and Home Assistant
If your Home Assistant server doesn’t have Bluetooth or is out of Bluetooth range, you can use an ESP32 Bluetooth proxy. This is very easy to set up by flashing a Bluetooth proxy image onto an ESP32. You can buy an ESP32 on Amazon or bol.com. The new generation of Shelly devices with Bluetooth also provide Bluetooth support to Home Assistant—super convenient!
To add Bluetooth support to Home Assistant, connect the ESP32 to your laptop or desktop, then go to the ESPHome Web Installer and click Connect. Next, click Install, and your ESP32 will be prepared to connect to your Home Assistant setup.


Home Assistant will automatically detect your Bluetooth proxy and prompt you to add it. You’ll now see a Bluetooth integration appear in your integrations overview. Click on it, then click Configure.
In the next screen, select Advertisement Monitor.

Here you’ll see a list of devices that have been detected via Bluetooth by the Bluetooth proxy. The device with “Zen” in the name is your Hyper2000. From here on, everything happens automatically.
If a so-called freeze occurs or there’s another connection issue, Home Assistant can reset the Hyper2000 and get it working again. It’s been running very stable for me for quite a while now!

Hyper2000 freeze
Sometimes it happens that you can no longer communicate with the Hyper2000 in any way. This is called a freeze. It’s obviously very frustrating, especially if it causes the battery to behave undesirably.
By using local communication in combination with a Bluetooth connection, you can reset the Hyper and get it responding to your commands again. How to do this is explained in the chapter above.
What does the home battery yield?
I’ll be honest, in terms of yield in euros, it has been disappointing so far. The net costs/savings sensor I created for this purpose is at a small € 1.40 after 12 days with the above-applied strategy. To recoup the purchase value of € 1300, we will need to be patient. Fortunately, we still have a lot of time to experiment with strategies, and there will likely be developments in politics. I have now purchased the battery to experiment with charging and discharging and to be ahead of the real run on home batteries. Who knows, this may have been the perfect time to step in. Maybe not… Time will tell.