[TUTO] Connecter/contrôler sa batterie Hyper2000 ZENDURE depuis HA

Bonjour à tous,

J’ai acheté récemment une batterie Zendure (Hyper2000 + AB2000) pour stocker le surplus de mes panneaux solaires. N’ayant pas trouver de tuto complet (mais des morceaux par ici par là) pour connecter et contrôler ma batterie depuis HA, et ayant pas mal galéré pour y arriver, j’ai rédigé ce tuto pour ceux qui seraient dans le même cas que moi.

J’utilise la méthode du broker externe « ioBroker » (je sais qu’il y a une autre méthode que je n’ai pas testé personnellement), qui a l’avantage d’être très réactive et de permettre le contrôle de l’Hyper 2000 en écriture.

Voilà les étapes à suivre :

Etape 1 - Installation de ioBroker

La première étape consiste à installer ioBroker. Je ne déraillerai pas ici cette étape car il différentes méthodes d’installation (debian, window, …) et libre à chacun d’utiliser la méthode qui convient le mieux à sa configuration, son matériel et son niveau de connaissance :

Personnellement j’ai une VM windows 11 sous Proxmox qui tourne sur la même machine que HA, j’ai donc choisi l’installation windows de ioBroker

Etape 2 - Installation et configuration de l’adaptateur MQTT dans IoBroker

Une fois ioBroker installé et fonctionnel, il faudra installer dans ioBroket l’adaptateur MQTT :

Et le configurer comme indiqué ci-dessous.
Dans l’onglet « connection » configurez votre adresse IP, un user et un mot de passe :

Dans l’onglet « server setting » cocher « publier sans retain » :

Dans l’onglet « MQTT setting » :

  • Ajouter le mask « zendure-solarflow.0.* »
  • Cocher « send states (ack=true) »
  • Cocher « use different topic names »

Etape 3 - Installation et configuration de l’adaptateur Zendure-solarflow dans IoBroker

Il faut installer ensuite dans ioBroker l’adapteur « zendure-solarflow » :

Et le configurer sur serveur UE avec vos identifiants de l’application Zendure :

ATTENTION : Dés que ioBroker sera connecté à votre compte Zendure, l’application de votre téléphone sera automatiquement déconnectée. Pour garder le contrôle sur l’application Zendure avec votre smartphone, il faudra créer un partage d’appareil avec un second compte Zendure

Etape 4 - Vérification avec MQTT explorer

C’est le moment de vérifier dans MQTT explorer que notre MQTT Zendure diffuse bien les informations :

Vous devriez obtenir cette données :

Etape 5 - Configurer le broker externe dans HA

Tout d’abord il va falloir créer un fichier « iobroker.conf » dans le répertoire share/mosquitto de votre HA :

Avec le contenu suivant (à adapter avec votre IP et les username/password/clientid définis dans ioBroker) :

Dans la configuration du module complémentaire mosquitto broker, activer la customization à « true » pour le répertoire « mosquitto » (celui qui contient le fichier .conf) :

Redémarrez mosquitto broker.

Si la connexion entre HA et ioBroker s’est faite correctement, vous devriez avoir ceci dans ioBroker avec tous les voyants au vert :

Etape 6 - Récupérer les information de MQTT dans HA

Il est maintenant possible de récupérer dans HA tous les données/contrôles de votre appareil Zendure :

Exemple de contrôle des limites entrée et sortie AC de l’Hyper2000 (de type « number ») :

############################################################
##                         MQTT  ZENDURE                  ##
############################################################

- name: "P Limite Sortie AC"
  unique_id: "Hyper2000_setOutputLimit"
  state_topic: "zendure-solarflow/0/xxxxx/yyyyyyyy/control/setOutputLimit"
  command_topic: "zendure-solarflow/0/xxxxxx/yyyyyyyy/control/setOutputLimit/set"
  value_template: >
    {{ int(value, 0) }}
  min: 0
  max: 1200
  step: 5
  mode: slider
  unit_of_measurement: "W"
  icon: "mdi:home-plus"
  device:
    name: "IoBroker-Zendure"
    identifiers: "Io-Zendure"
    manufacturer: "Zendure"
    model: "Hyper 2000"

- name: "P Limite Entrée AC"
  unique_id: "Hyper2000_setInputLimit"
  state_topic: "zendure-solarflow/0/xxxxxx/yyyyyyy/control/setInputLimit"
  command_topic: "zendure-solarflow/0/xxxxxx/yyyyyyyy/control/setInputLimit/set"
  value_template: >
    {{ int(value, 0) }}
  min: 0
  max: 1200
  step: 5
  mode: slider
  unit_of_measurement: "W"
  icon: "mdi:home-plus"
  device:
    name: "IoBroker-Zendure"
    identifiers: "Io-Zendure"
    manufacturer: "Zendure"
    model: "Hyper 2000"

Exemple de contrôle du mode AC de l’Hyper2000 (de type « select ») :

- name: "Mode Hyper   1-> Charge  2-> Décharge"
  unique_id: "iobroker_hyper_2000_mode_hyper"
  state_topic: "zendure-solarflow/0/xxxxx/yyyyyyyyyy/acMode"
  command_topic: "zendure-solarflow/0/xxxxxx/yyyyyyyyyyy/control/acMode/set"
  value_template: "{{ value }}"
  options:
    - "0"
    - "1"
    - "2"
  device: 
    name: "IoBroker-Zendure"
    identifiers: "Io-Zendure"
    manufacturer: "IoBroker-Zendure"
    model: "Hyper 2000"

Exemple de contrôle du mode AC de l’Hyper2000 (de type « select ») :

############################################################
##                         MQTT  ZENDURE                  ##
############################################################

- name: "Niveau batterie"
  unique_id: "Hyper2000_electricLevel"
  state_topic: "zendure-solarflow/0/xxxxxx/yyyyyy/electricLevel"
  unit_of_measurement: "%"
  value_template: '{{ value }}'
  icon: "mdi:battery-unknown"
  force_update: true
  device_class: battery
  device:
    name: "IoBroker-Zendure"
    identifiers: "Io-Zendure"
    manufacturer: "Zendure"
    model: "Hyper 2000"

- name: "P Entrée AC"
  unique_id: "Hyper2000_gridInputPower"
  state_topic: "zendure-solarflow/0/xxxxxx/yyyyyyy/gridInputPower"
  unit_of_measurement: "W"
  value_template: '{{ value }}'
  icon: "mdi:transmission-tower-export"
  force_update: true
  device_class: power
  device:
    name: "IoBroker-Zendure"
    identifiers: "Io-Zendure"
    manufacturer: "Zendure"
    model: "Hyper 2000"

Ce qui donne ceci dans HA :


Etape 7 - Créer vos automatisations dans HA

Les automatisations sont très personnelles, chacun ayant ses propres attentes et objectifs de fonctionnement. Je partage les miennes si ça peux aider.

!!! UPDATE DU 30/12/2024 !!!

Personnellement j’ai créé 4 automatisations :

  • Charge AC : charge la batterie avec le surplus solaire en laissant une seuil de xxW paramétrable (réglé à 50W chez moi)
  • Décharge AC : décharge la batterie suivant ma consommation par pas de 50W
  • Mode intelligent : bascule automatiquement du mode charge au mode décharge (et inversement) suivant la mesure d’injection ou soutirage réseau (avec des seuils de basculement à -80/+80W pendant 1min)
  • Gestion mode : permet de basculer du mode automatique (ou intelligent) aux modes charge et décharge manuels

Automatisation « Gestion mode » :

Déclencheur :

Je déclenche sur un changement d’état du sélecteur « Mode batterie Zendure » :

Ensuite choix entre 3 actions possibles suivant le mode sélectionné :

Choix 1 : mode « Charge » qui désactive tous les automatismes et envoie des requêtes MQTT pour activer la charge de l’hyper (AC mode = 1) en ayant préalablement remis à 0 la consigne de décharge

Choix 2 : mode « Décharge » qui désactive tous les automatismes et envoie des requêtes MQTT pour activer la décharge de l’hyper (AC mode = 2) en ayant préalablement remis à 0 la consigne de charge

Choix 3 : mode « Automatique » qui :

  • désactive les automatismes « Charge » et « Décharge »,
  • envoie des requêtes MQTT pour mettre l’hyper en mode neutre (AC mode = 0) en ayant préalablement remis à 0 les consignes de charge et décharge,
  • active l’automatisme « Mode intelligent »,
  • enfin réactive le mode « Charge » ou « décharge » en fonction de la valeur du surplus (charge si surplus >0, décharge si surplus=0) lorsque le mode automatique est sélectionné.




Automatisation « Mode intelligent » :

Déclencheur :

Je déclenche sur un pic positif ou négatif de consommation/injection de -80/+80W pendant 1 minutes (pour préserver l’électronique de l’hyper)

Ensuite choix entre 2 actions possibles suivant le mode sélectionné :

Choix 1 : Si j’injecte plus de 80w dans le réseau :

  • Je désactive l’automatisme « décharge »
  • Je force la consigne de décharge de l’hyper à 0W (requête MQTT)
  • J’active le mode charge de l’hyper AC mode = 1 (requête MQTT)
  • Je force la consigne de charge de l’hyper à 0W (requête MQTT)
  • J’active l’automatisation de « charge »

Choix 2 : Si je consomme plus de 80w dans le réseau :

  • Je désactive l’automatisme « charge »
  • Je force la consigne de charge de l’hyper à 0W (requête MQTT)
  • J’active le mode décharge de l’hyper AC mode = 2 (requête MQTT)
  • Je force la consigne de décharge de l’hyper à 0W (requête MQTT)
  • J’active l’automatisation de « décharge »

Automatisation « Charge » :

Pour l’automatisation de recharge, j’ai tout d’abord créé une entrée « Seuil mini charge AC » qui me permet de définir le seuil de surplus à partir duquel la batterie va charger :

J’ai réglé ce seuil à 50W

J’ai également créé une entrée « limite de charge » pour brider la charge à une valeur max si nécessaire :

Ensuite dans la configuration yaml, je calcule le surplus solaire. Celui ci est égal à la valeur absolue (on veut une valeur positive) de la mesure de mon shelly moins la puissance AC qui est envoyée dans la batterie (puisqu’il s’agit de surplus qu’on envoie directement dans la batterie et qui n’est pas vu par le shelly). Si la puissance AC envoyée dans la batterie est inconnue (ça arrive de temps en temps avec MQTT), je ne considère que la mesure du shelly (toujours en valeur absolue). Ca donne ceci :

           - name: Surplus PV
        unique_id: "Surplus_PV"
        unit_of_measurement: "W"
        state: >
          {% if has_value('sensor.iobroker_zendure_puissance_reseau_zendure') %}
            {% if states('sensor.shellypro3em_a0dd6ca18868_phase_c_active_power')|int - states('sensor.iobroker_zendure_puissance_reseau_zendure')|int < 0 %}
              {{ (states('sensor.shellypro3em_a0dd6ca18868_phase_c_active_power')|int - states('sensor.iobroker_zendure_puissance_reseau_zendure')|int)|abs }}
            {% else %}
              {{ 0 }}
            {% endif %}
          {% else %}
            {% if states('sensor.shellypro3em_a0dd6ca18868_phase_c_active_power')|int < 0 %}
              {{ (states('sensor.shellypro3em_a0dd6ca18868_phase_c_active_power')|int)|abs }}
            {% else %}
              {{ 0 }}
            {% endif %}
          {% endif %}

Ensuite j’ai un autre calcul pour la consigne de charge AC qui, uniquement s’il y a du surplus, est égale au surplus moins le seuil de charge (celui que je règle à 50W):

      - name: Consigne_Charge_AC
        unique_id: "Cons_Charge_AC"
        unit_of_measurement: "W"
        state: >
          {% if states('sensor.surplus_pv')|int > states('input_number.zendure_seuil_charge_ac')|int %}
            {% if (states('sensor.surplus_pv')|int - states('input_number.zendure_seuil_charge_ac')|int) < 1200 %}
              {{ states('sensor.surplus_pv')|int - states('input_number.zendure_seuil_charge_ac')|int }}
            {% else %}
              {{ 1200 }}
            {% endif %} 
          {% else %}
            {{ 0 }}
          {% endif %}

Et enfin mon automatisation très simple :

  • Déclenchée toutes les 10s
  • A condition que le niveau de la batterie soit inférieur à 100%
  • Un 1er SI-Alors vérifie que l’hyper est bien en mode charge (AC mode=1), le SINON modifie l’AC mode à 1 si besoin
  • Un second SI-Alors vérifie si la consigne de charge est supérieure à la limite que je me suis fixé:
  • Si OUI alors définis que le contrôle MQTT « SetInputLimit » de l’hyper2000 est égal à la valeur limite fixée
  • Si NON alors je définis que le contrôle MQTT « SetInputLimit » de l’hyper2000 est égal à la consigne de charge AC que j’ai calculé dans config.yaml

Ca donne ceci :


Automatisation « Décharge » :

Pour l’automatisation de décharge, j’ai tout d’abord créé une entrée « Consigne décharge AC » qui me permet de définir la puissance de décharge par pas de 50W :

J’ai également créé une entrée « limite de décharge » pour brider la décharge à une valeur max si nécessaire :

Et enfin mon automatisation :

  • Déclenchée toutes les 10s
  • A condition que le niveau de la batterie soit supérieur à 15%
  • En fonction de la variation plus ou moins importante de la consommation, j’incrémente ou décrémente de 1, 2 voir 4 pas la consigne (soit incrémentation/décrémentation de 50W/100W/200W)
  • Je limite la décharge à la valeur maximum définie si besoin
  • Si la charge de la batterie est inférieure à 15% je force la décharge à 0W
  • J’active le mode « décharge » de l’hyper (requête MQTT sur l’acMode) s’il n’est pas déjà actif.

Ca donne ceci :




Avec ce choix parmi 6 actions :

Option 1 (+1 pas) :

Option 2 (+2 pas) :

Option 3 (+4 pas) :

Option 4 (-1 pas) :

…et ainsi de suite pour option 5 (-2 pas) et option 6 (-4 pas)

Voilà c’est une manière (parmi tant d’autres certainement) de recréer un mode intelligent dans HA. Ensuite vous pourrez facilement jongler entre les différents mode suivant vos plannings, charger la nuit si besoin la veille d’un jour tempo, géré les priorités avec un autre équipement tel qu’un routeur, bref les possibilités sont grandes et vont bien au delà de ce que propose aujourd’hui l’appli Zendure.

Merci pour ceux qui ont lu jusqu’au bout ce très long tuto et bon courage pour ceux qui vont essayer de l’appliquer! :wink:

7 « J'aime »

Bravo @Julien_Galliot , tu as fait un super tuto de la courte procédure que j’avais donné dans un autre post pour Zendure.
Cela à dû te prendre un certain temps, mais tout est bien détaillé.

Bonjour @olivr2s oui tout à fait et merci beaucoup pour ta procédure et ton aide! Je suis sur des groupes facebook dédiés au solaire ou aux produits Zendure et il y a pas mal de demandes pour un tuto pour la gestion de l’hyper2000 dans HA. J’ai donc pris un peu de temps pour faire la synthèse de ce que tu avais déjà commencé, des wiki github allemands sur le sujet et quelques compléments… Je pense aussi y ajouter quand j’aurai un peu de temps plus de détails sur la partie automatisation, qui n’est pas forcément simple pour reproduire le mode « intelligent » natif de l’appli Zendure directement dans HA.

1 « J'aime »

J’avais effectivement vu sur Facebook tes réponses à ceux qui cherchaient aussi à piloter le hyper 2000 avec HA (tu me trouveras pas sur Facebook, j’utilise le compte de ma femme juste pour lire les discussions…:sweat_smile:)
Reproduire le mode intelligent via des automatismes de HA est assez complexe. Vivement que Zendure écoute les utilisateurs et ajoute le pilotage du mode intelligent en MQTT.

J’ai mis un peu de temps a trouver la bonne formule pour les automatisations mais ça marche plutôt bien.

Voilà ce que ça donne sur une journée comme hier sans aucune intervention de ma part, HA a tout géré automatiquement :

Mais la donnée dont je suis le plus satisfait c’est celle ci :grin: :

Hello, pourrais-tu partager ton automatisation ?
je n’arrive pas à avoir un truc aussi précis que toi quand il faut la recharger :smiley:

Salut,

Pour l’automatisation de recharge, j’ai tout d’abord créé une entrée « Seuil mini charge AC » qui me permet de définir le seuil de surplus à partir duquel la batterie va charger :

image

J’ai réglé ce seuil à 50W

Ensuite dans la configuration yaml, je calcule le surplus solaire. Celui ci est égal à la valeur absolue (on veut une valeur positive) de la mesure de mon shelly moins la puissance AC qui est envoyée dans la batterie (puisqu’il s’agit de surplus qu’on envoie directement dans la batterie et qui n’est pas vu par le shelly). Si la puissance AC envoyée dans la batterie est inconnue (ça arrive de temps en temps avec MQTT), je considère que le surplus est de 0. Ca donne ceci :

      - name: Surplus PV
        unique_id: "Surplus_PV"
        unit_of_measurement: "W"
        state: >
          {% if has_value('sensor.iobroker_zendure_puissance_reseau_zendure') %}
            {% if states('sensor.shellypro3em_a0dd6ca18868_phase_c_active_power')|int - states('sensor.iobroker_zendure_puissance_reseau_zendure')|int < 0 %}
              {{ (states('sensor.shellypro3em_a0dd6ca18868_phase_c_active_power')|int - states('sensor.iobroker_zendure_puissance_reseau_zendure')|int)|abs }}
            {% else %}
              {{ 0 }}
            {% endif %}
          {% else %}
            {{ 0 }}
          {% endif %}

Ensuite j’ai un autre calcul pour la consigne de charge AC qui, uniquement s’il y a du surplus, est égale au surplus moins le seuil de charge (celui que je règle à 50W):

      - name: Consigne_Charge_AC
        unique_id: "Cons_Charge_AC"
        unit_of_measurement: "W"
        state: >
          {% if states('sensor.surplus_pv')|int > states('input_number.zendure_seuil_charge_ac')|int %}
            {% if (states('sensor.surplus_pv')|int - states('input_number.zendure_seuil_charge_ac')|int) < 1200 %}
              {{ states('sensor.surplus_pv')|int - states('input_number.zendure_seuil_charge_ac')|int }}
            {% else %}
              {{ 1200 }}
            {% endif %} 
          {% else %}
            {{ 0 }}
          {% endif %}

Et enfin mon automatisation très simple :

  • Déclenchée toutes les 10s
  • Si la prise connectée de mon hyper est ON
  • Si le niveau de la batterie est inférieur à 100
  • Alors je définis que le contrôle MQTT « SetInputLimit » de l’hyper2000 est égal à la consigne de charge AC que j’ai calculé.

Ca donne ceci :

Avec cette automatisation, je régule la charge avec un marge de 50W que j’ai défini dans le seuil de charge.

Hmm, c’est globalement ce que j’ai fait :face_with_raised_eyebrow:
Après j’ai ce résultat, l’onduleur prend beaucoup de temps de switch entre injection/recharge :smiley:

Bonjour,

De mon côté j’ai 3 automatisation : une pour la charge, une pour la décharge, une dernière pour le basculement de charge à décharge ou inversement.

Pour cette dernière, j’ai défini un hystérésis de -100W/+100W avec une temporisation de 1 min pour basculer d’un mode à l’autre :

Si je suis à plus de 100W consommé pendant une minute, j’active la décharge avec l’automatisation associée, si je suis à plus de 100W injecté sur le réseau pendant une minute, j’active la charge et l’automatisation associée :

Bonjour,

C’est obligatoire de passer par IObroker ? Y’a pas moyen avec Mosquitto directement dans ha ?

Merci

Iobroker fait le lien entre le Hyper 2000 comme si c’était l’application mobile et un serveur MQTT local pour récupérer les informations ou envoyer des commandes.
Donc oui c’est obligatoire pour le moment sauf si un dev fait la même chose sous Home Assistant…

Bonjour à tous

merci Julien gaillot pour ton travail

J aurais besoin d’aide pour configurer l adaptateur MQTT

Dans l onglet connection je ne peux pas sélectionner mon adresse ip
Elle n apparait pas
j’ai le choix entre 4 adresses

mais je ne suis pas lié

Auriez vous une idée de mon problème

Merci
Bonnes fêtes de fin d année a tous

J’ai le même problème. Mais pas encore trouvé de solution et vous ?

Non toujours pas

J ai iobroker sur un nas synology

Mais mon ip est en bridge
Je sais pas si mon problème vient de la

Moi j’utilise Docker sur Mac mini. du coup dans les ip de la configuration j’ai uniquement localhost en 127. Mais du coup je pointe avec ha vers l’ip de mon Mac mini. Mais ça ne donne rien et dans IoBroquer ça fonctionne pas non plus j’ai comme vous.

moi, j’ai ajouté 2 fichiers sous le repertoire mosquitto de ha:

  • accesscontrollist

    j’y ai mis mes utilisateurs (mqtt, l’id zendure, …)
  • acl.conf
    image

Même souci. En mode serveur, doit on renseigner l’adresse IP du serveur ioBroker, ou celui de HA ?
Pour ma part, uniqument celui de iobroker est proposé, et çà ne marche pas chez moi. Si c’est celui de HA, il n’est pas proposé…

Bonjour,

C’est l’adresse IP du serveur IoBroker qui doit être renseignée.

Bonjour,

Il ne te propose pas l’adresse IP de ton serveur IoBroker?

Le fait de ne pas être « lié » peut venir de la configuration du broket externe dans HA.

As-tu essayer de te connecter à IoBroker avec MQTT Explorer. Si tu arrives à te connecter avec MQTT explorer, le voyant « lié » du serveur IoBroker passera au vert. Dans ce cas le seveur est fonctionnel et le problème vient de HA.

Bonjour, c’est bien l’adresse IP du serveur IoBroker. As-tu essayer de te connecter au serveur avec MQTT explorer?

1 « J'aime »