External integration - Zendure

:battery: Zendure (external integration) — presentation + recap up to v1.3.0

Hello everyone :waving_hand:

I realize I’ve never opened a dedicated topic for the Zendure external integration, even though it’s been around since this summer (first version on July 19, 2026). I’m making up for lost time: here’s a complete presentation and a recap of the versions up to v1.3.0, which has just been released. This topic will then be used to announce new features and gather your feedback.

:puzzle_piece: What is it?

An external Gladys integration for Zendure SolarFlow / Hyper solar batteries. It runs in its own container, is installed from the integrations catalog (Energy section) and sends the telemetry of your batteries to Gladys, from the Zendure cloud and, if you wish, directly from the local MQTT of each device.

:sparkles: What is supported

  • Models: SolarFlow 800, 800 Pro, 1600 AC+, 2400 AC+, 2400 AC, 2400 Pro, and Hyper 2000 (experimental).
  • 5 measurements per battery (read-only), categorized in Gladys’s energy categories since v1.3.0:
    • Battery level, charging power, and discharging power → Storage battery;
    • power to the house → Home output sensor;
    • solar input power → Energy production sensor.
  • Local MQTT (optional): values refreshed every 1 to 3 seconds instead of about 30 seconds via the cloud, and telemetry continues during a Zendure cloud or internet outage.
  • Automatic cloud fallback, device by device: if a battery goes silent locally, the integration automatically switches to the cloud, then returns to local as soon as messages resume.
  • Transport badges on each device: Local, Cloud, Cloud + orange dot (degraded: the device should be local but is running on cloud fallback, the reason is displayed on hover) and Unreachable.
  • Connection status on the configuration screen (missing key, unreachable cloud, or invalid key).
  • Publication of values paced under the Gladys core’s request limit, which slows itself down if the core is saturated, to handle a large fleet (I run with about fifteen SolarFlows).

:rocket: Installation

  1. In the Zendure mobile app, developer / Home Assistant integration section: generate (or copy) your authorization key (the “HA key”).
  2. In Gladys: Integrations → search for Zendure → Install.
  3. Configuration tab: paste the key, adjust the refresh interval if needed (30 seconds by default), optionally enable local MQTT (zenSDK), then Save configuration.
  4. Create your batteries from the Discovery tab.

The complete step-by-step guide is in the integration documentation (link “Documentation” on the configuration screen).

:scroll: Version recap

  • v1.0.1 (July 19): first version: discovery of SolarFlow 800 Pro via Zendure cloud, read-only telemetry, periodic polling, and real-time MQTT.
  • v1.1.0 (July 21): local MQTT with cloud fallback per device and automatic return to local, transport badges, connection status, and 6 additional SolarFlow / Hyper models.
  • v1.2.0 (July 24):
    • degraded badge (orange dot) when a battery runs on cloud fallback;
    • FR/EN documentation and “Getting Started” section on the configuration screen;
    • adaptive publication rate under the core limit;
    • reliability: our own MQTT request echoes no longer distort telemetry, empty or invalid interval → 30 seconds, 15-second delay on the cloud, no cached values republished during an outage.
  • v1.3.0 (October 16):
    • measurements move to Gladys’s energy categories (Storage battery, Home output sensor, Energy production sensor): your home battery no longer counts in Gladys’s “low battery” alerts;
    • the pack powers are now called Charging power and Discharging power: the old names (“Battery input/output power”) were read backwards compared to what they measure;
    • categorized in the Energy section of the catalog;
    • the entire integration in French, English, German, and Spanish (configuration, messages, documentation);
    • technical upgrade (SDK 0.15, release tooling, version notes on GitHub).

:warning: Prerequisites

  • Gladys ≥ 4.86.0 for v1.3.0.
  • A Zendure account with your batteries already online in the app.
  • For local MQTT: enable it in the Zendure app (developer mode).

:counterclockwise_arrows_button: Did you already have your batteries before v1.3.0?

After the update (Update button in the Supervision tab), your batteries keep their old categories until you apply the new definition: in the Discovery tab, click Update on each battery (marked Already added). Features are updated in place: history, scenes, and dashboards are preserved.

:light_bulb: Good to know

  • One cloud consumer per Zendure account: if Home Assistant or a second Gladys instance uses the cloud connection of the same account, they compete for it and the telemetry becomes intermittent. For a second consumer, use local MQTT, which has no such limit. The integration signals this situation once in its logs when it detects it.
  • A battery in “Cloud (degraded)” while local MQTT is enabled: its firmware may have stopped publishing locally without warning. In the Zendure app, disable then re-enable MQTT control for this battery, and it will restart in less than a minute.
  • Integration stuck in “degraded” right after installation, with WebSocket timeouts in the logs: check that the machine’s firewall allows the port used by external integrations to reach Gladys (see this topic).

:motorway: What’s next

  • Control of the batteries (charge/discharge setpoints, output limits): this is the next big step.
  • Additional measurements (charge/discharge index, remaining energy, emergency output) once their names are confirmed on real telemetry.

:test_tube: Feedback welcome

Thanks in advance for your feedback :folded_hands:

:new_button: Update: v1.3.1 → v1.5.0

Big day on the Zendure integration! Here’s what’s new since v1.3.0:

v1.3.1 — security

  • MQTT library updated (6 vulnerabilities fixed, including 4 that could crash the integration). Reconnection after a broker refusal (session taken over by another client of the account, broker restart) is preserved.

v1.4.0 — feature names

  • New Feature Names option (French, English, German, Spanish): the batteries you create afterward have their features in your language. An already created battery keeps its names.
  • An unrecognized Zendure model appears in the Logs tab with its exact name (Unsupported Zendure model skipped: productModel "..."). Copy it into an issue and I’ll add it.

v1.5.0 — energy, control and widgets (:warning: Gladys ≥ 5.1.0)

:high_voltage: Energy

  • 4 new kWh meters: energy charged, discharged, solar and sent to the house. Zendure only reports power, so the integration accumulates them itself. The meters survive restarts, and a silence of more than 5 minutes is not counted.
  • Solar energy directly feeds Gladys’ production charts.
  • Remaining energy in kWh: the charge level multiplied by the capacity of the declared packs (AB1000, AB2000, AB3000, integrated packs).

:control_knobs: Control from scenes (category Integrations)

  • Set output limit, Set charge limit (AC charging from the grid), Set AC mode (charge / discharge), Set charge levels (target 70-100 %, floor 0-50 %).
  • Safeguards protect the battery:
    • limits are capped at the model’s nominal power;
    • power limits are sent in « smart mode », kept in memory and not written to flash;
    • a same setting does not change more than once every 3 s (power) or 30 s (mode, levels);
    • an already applied value is not resent.
  • New Battery reachability trigger: a battery no longer reports anything, or reports again (local MQTT mode).

:bar_chart: Two dashboard widgets

  • Zendure Battery: level and live power, source (local / cloud / fallback / unreachable), stored energy, limits, current mode and charge levels. Two buttons open a pre-filled form to modify them.
  • Battery group: several batteries combined under a name of your choice. They display the average level (weighted by capacity), total power, stored energy and a line per battery. In three-phase, place a group per phase (« Phase L1 », « L2 », « L3 ») and a last one without selection for the entire site.

:counterclockwise_arrows_button: To enjoy it

  1. Supervision → Update.
  2. Discovery tab: click Update on each battery (marked « Already added ») to add the energy features. History, scenes and dashboards are preserved.
  3. Add the widgets from the dashboard edit.

:motorway: Next steps

Gladys does not yet have a « setpoint » type for a battery, hence the control by scenes and widgets for now. A core PR is in progress to add it: charge and discharge power limits, target charge level, discharge reserve and mode (feat(battery-storage): add power limit, state-of-charge limit and mode commands by Terdious · Pull Request #3210 · GladysAssistant/Gladys · GitHub). Once integrated, these settings will be directly modifiable from the card of each battery.

:test_tube: Feedback welcome

  • Control on your models: limits, AC mode, charge levels. In particular the SOC scale according to the firmwares: report any strange behavior to me.
  • Energy meters: are they consistent with the Zendure app over a day?
  • Group widgets for those who have multiple batteries.

Full changelog: gladys-zendure/CHANGELOG.md at master · Terdious/gladys-zendure · GitHub

Quick update on the announced follow-up: everything is ready on the core, SDK, and integration sides, only the merges are left. @pierre-gilles, when you have a moment to review them :smiley:

The PR has evolved quite a bit with the reviews. It now adds standard rules for storage batteries, valid for all brands (plug-in batteries, hybrid inverters…):

  • charge and discharge power limits;
  • network charge limit: it caps the AC charge without capping solar power;
  • target charge level and discharge reserve;
  • mode: auto, charge, discharge, standby, off-peak hours, backup.

Plus a new category « House Output » with its output power limit: the maximum power the device sends to the house, solar and battery combined. This is the setting most frequently adjusted on a SolarFlow, and it also applies to micro-inverters (Hoymiles, APsystems, Enphase…). The measurements remain in « House Output Sensor », just as a thermostat’s setpoint is separate from the temperature measurement.

On the integration side, the branch is ready and tested: output limit, AC charge limit, charge levels, and AC mode (charge/discharge) become adjustable directly from each battery’s card. They go through the same safeguards as scenes: power model ceiling, smart mode, rate limiting, already applied value not returned. The card then displays the value actually applied by the battery. It will remain pending until Gladys knows these new types. I will validate it on my own batteries before the release.

Thanks in advance! As soon as these PRs are published, I will update the integration side.