DomotiqueLes articles du blogTutoriaux

Tuto : Connecter Zendure SolarFlow à Home Assistant via MQTT

Bonjour à tous,
Cela fait maintenant quelques jours que je teste la solution solaire Zendure SolarFlow avec le HUB 2000 et forcément une de mes premières préoccupations avec ce genre de produit est de pouvoir le connecter avec ma domotique Home Assistant. Après quelques recherches et tests, je vous propose ici un petit tutoriel pour vous aider à récupérer les informations de mesures de ce kit d’autoconsommation solaire.

Récupération des informations de connexion

Zendure a eu l’intelligence de mettre à disposition un GitHub avec les informations pour récupérer les informations des produits SolarFlow et Superbes via MQTT mais si vous n’êtes pas un expert (comme moi), cela peut demander de longues recherches : https://github.com/Zendure/developer-device-data-report. Je vais m’efforcer de vous faciliter la vie.

Bien sur la première des choses à faire est de créer un compte sur l’application de Zendure, mais je passerai cette étape car je suppose que vous avez déjà réalisé lors de l’installation de vos produits Zendure.

Nous allons donc récuperer les appkey et secret nécessaire à l’identification via MQTT. Pour cela vous devez vous munir de l’email de votre compte Zendure et du numéro de série de votre SolarFlow (ou SuperBase). Puis dans une fenêtre de commande, il suffit de lancer la commande :

curl -H "Content-Type: application/json" -X POST -d '{"snNumber":"HO1XXXXXXXXX","account": "email@gmail.com"}' https://app.zendure.tech/v2/developer/api/apply

Si le retour est positif, vous devriez recevoir un message avec votre appkey et votre secret.

Afin de vérifier que tout est ok, nous allons tester que la connexion à MQTT. Pour cela j’utilise MQTT Explorer. Il suffit d’ajouter une connexion avec comme information :

  • host : mqtt.zen-iot.com
  • Username : le appkey récupéré précemment
  • Password : le secret récupéré précemment
  • dans la partie advanced : ajouter une ligne « APPKEY/# »

Après avoir sauvegarder et connecter, vous allez devoir attendre un peu afin de voir apparaitre les messages dans MQTT :

Si vous voyez bien des messages arriver dans MQTT, nous pouvons passer à l’étape suivante. Si ce n’est pas le cas, attendez… Les messages mettent beaucoup de temps à arriver surtout si votre SolarFlow est en mode « Veille »

Connexion entre MQTT Zendure et Home Assistant

Pour récupérer les données Zendure via MQTT dans Home Assistant, il y a 2 possibilités mais généralement vous n’aurez pas trop le choix du premier si vous utilisez déjà MQTT…

Configuration via l’interface

Le plus simple pour récupérer les données d’un provider MQTT est d’ajouter l’intégration MQTT dans Home Assistant mais uniquement si vous n’avez pas déjà configuré l’intégration MQTT.

Dans la page « Appareils et Services », cliquer sur le bouton ajouter une intégration puis sélectionner « MQTT »

Ensuite vous allez reprendre les informations que nous avons utilisé dans MQTT Explorer pour configurer la connexion.

Dans les options de configuration, il est important de remettre appkey dans la zone de « Préfixe de découverte » et bien sur d’activer la découverte

Logiquement vous devriez voir le nombre d’entités grandir avec le temps.

Et voila c’est terminé, il ne reste plus qu’à utiliser les données à la prochaine étape.

Configuration customisé de Mosquitto

Si vous avez déjà configuré l’intégration MQTT et que vous avez essayé le tutoiement ci dessus, vous avez reçu un message d’erreur « Déjà configuré. Une seule configuration possible. »

Nous allons donc ajouter une nouvelle source à notre broker Mosquitto, mais d’abord il faut vous assurer que la customisation de Mosquitto est possible. Pour cela, il faut vous rendre dans la configuration de l’addon Mosquitto et vous assurez que l’option active est à true et avoir mis un dossier de configuration (dans mon cas un répertoire mosquitto).

Ensuite il vous faudra parcourir les répertoires partagés de votre installation Home Assistant avec un explorateur de fichier. Vous avez plusieurs répertoire qui sont disponibles, le principale étant « config » ou vous avez surement déjà modifié des fichiers de config. Dans notre cas, nous devons aller dans le répertoire « share » et créer un répertoire « mosquitto » (reprendre le nom que vous avez mis dans la configuration ci dessus). Puis vous allez créer un fichier « zendure.conf ».

Il suffit maintenant d’éditer le fichier « zendure.conf » afin d’intégrer le code suivant (en remplaçant <APPKEY> et <SECRET> que vous avez obtenu précédement):

connection external-bridge
address mqtt.zen-iot.com:1883
remote_username <APPKEY>
remote_password <SECRET>
clientid <APPKEY>

topic <APPKEY>/# in
topic # in 0 homeassistant/sensor/<APPKEY>/ <APPKEY>/sensor/device/

EDIT du 30 mai 2024 : Merci à Flo qui m’a proposé une amélioration dans les commentaires ci-dessous et qui permet d’actualiser les données plus souvent en remplaçant « clientid zendure » par « clientid <APPKEY> »

Nous allons ensuite redémarrer l’addon mosquitto, pour prendre en charge cette nouvelle source.

Si vous utilisez MQTT Explorer pour regarder votre Mosquitto Broker, vous devriez voir apparaitre un nouveau topic avec votre APPKEY. Si vous voyez comme moi, plein d’autre topic apparaitre, je pense que c’est un bug chez eux…

Nous avons donc les données du SolarFlow Zendure (ou Superbase) dans notre broker MQTT, il reste maintenant à les mettre en forme et les rendre disponibles. Pour cela, j’ai créer un certains nombre des sensor et switch dans ma configuration. A noter que je n’utilise pas le fichier « configuration.yaml » mais « mqtt.yaml » (qui est chargé dans configuration.yaml avec la ligne mqtt: !include mqtt.yaml ). Voici le code que j’utilise :

sensor:
  - name: "Electric Level"
    unique_id: "fpy2m7be_electriclevel"
    state_topic: "<APPKEY>/Fpy2M7Be/state"
    unit_of_measurement: "%"
    device_class: "battery"
    value_template: "{{ value_json.electricLevel }}"
    device: 
      name: "SolarFlow"
      identifiers: "<NUMERODESERIE>"
      manufacturer: "Zendure"
      model: "SmartPV Hub 2000 Controller"

  - name: "Remain Out Time"
    unique_id: "fpy2m7be_remainouttime"
    state_topic: "<APPKEY>/Fpy2M7Be/state"
    value_template: "{{ value_json.remainOutTime | int }}"
    device_class: "duration"
    unit_of_measurement: "min"
    device: 
      name: "SolarFlow"
      identifiers: "<NUMERODESERIE>"
      manufacturer: "Zendure"
      model: "SmartPV Hub 2000 Controller"

  - name: "Remain Input Time"
    unique_id: "fpy2m7be_remaininputtime"
    state_topic: "<APPKEY>/Fpy2M7Be/state"
    value_template: "{{ value_json.remainInputTime | int }}"
    device_class: "duration"
    unit_of_measurement: "min"
    device: 
      name: "SolarFlow"
      identifiers: "<NUMERODESERIE>"
      manufacturer: "Zendure"
      model: "SmartPV Hub 2000 Controller"

  - name: "SOC Set"
    unique_id: "fpy2m7be_socset"
    state_topic: "<APPKEY>/Fpy2M7Be/state"
    unit_of_measurement: "%"
    value_template: "{{ value_json.socSet | int / 10 }}"
    device: 
      name: "SolarFlow"
      identifiers: "<NUMERODESERIE>"
      manufacturer: "Zendure"
      model: "SmartPV Hub 2000 Controller"

  - name: "Output Limit"
    unique_id: "fpy2m7be_outputlimit"
    state_topic: "<APPKEY>/Fpy2M7Be/state"
    value_template: "{{ value_json.outputLimit | int }}"
    unit_of_measurement: "W"
    device: 
      name: "SolarFlow"
      identifiers: "<NUMERODESERIE>"
      manufacturer: "Zendure"
      model: "SmartPV Hub 2000 Controller"

  - name: "Solar Input Power"
    unique_id: "fpy2m7be_solarinputpower"
    state_topic: "<APPKEY>/Fpy2M7Be/state"
    unit_of_measurement: "W"
    device_class: "power"
    value_template: "{{ value_json.solarInputPower | int(0) }}"
    state_class: "measurement"
    device: 
      name: "SolarFlow"
      identifiers: "<NUMERODESERIE>"
      manufacturer: "Zendure"
      model: "SmartPV Hub 2000 Controller"

  - name: "Pack Input Power"
    unique_id: "fpy2m7be_packinputpower"
    state_topic: "<APPKEY>/Fpy2M7Be/state"
    unit_of_measurement: "W"
    device_class: "power"
    value_template: "{{ value_json.packInputPower | int(0) }}"
    state_class: "measurement"
    device: 
      name: "SolarFlow"
      identifiers: "<NUMERODESERIE>"
      manufacturer: "Zendure"
      model: "SmartPV Hub 2000 Controller"

  - name: "Output Pack Power"
    unique_id: "fpy2m7be_outputpackpower"
    state_topic: "<APPKEY>/Fpy2M7Be/state"
    unit_of_measurement: "W"
    device_class: "power"
    value_template: "{{ value_json.outputPackPower | int(0) }}"
    state_class: "measurement"
    device: 
      name: "SolarFlow"
      identifiers: "<NUMERODESERIE>"
      manufacturer: "Zendure"
      model: "SmartPV Hub 2000 Controller"

  - name: "Output Home Power"
    unique_id: "fpy2m7be_outputhomepower"
    state_topic: "<APPKEY>/Fpy2M7Be/state"
    unit_of_measurement: "W"
    device_class: "power"
    value_template: "{{ value_json.outputHomePower | int(0) }}"
    state_class: "measurement"
    device: 
      name: "SolarFlow"
      identifiers: "<NUMERODESERIE>"
      manufacturer: "Zendure"
      model: "SmartPV Hub 2000 Controller"

  - name: "Pack Num"
    unique_id: "fpy2m7be_packnum"
    state_topic: "<APPKEY>/Fpy2M7Be/state"
    value_template: "{{ value_json.packNum | int }}"
    device: 
      name: "SolarFlow"
      identifiers: "<NUMERODESERIE>"
      manufacturer: "Zendure"
      model: "SmartPV Hub 2000 Controller"

  - name: "Pack State"
    unique_id: "fpy2m7be_packstate"
    state_topic: "<APPKEY>/Fpy2M7Be/state"
    value_template: "{{ value_json.packState | int }}"
    device: 
      name: "SolarFlow"
      identifiers: "<NUMERODESERIE>"
      manufacturer: "Zendure"
      model: "SmartPV Hub 2000 Controller"

  - name: "Solar Power 1"
    unique_id: "fpy2m7be_solarpower1"
    state_topic: "<APPKEY>/Fpy2M7Be/state"
    value_template: "{{ value_json.solarPower1 | int(0) }}"
    unit_of_measurement: "W"
    device_class: "power"
    state_class: "measurement"
    device: 
      name: "SolarFlow"
      identifiers: "<NUMERODESERIE>"
      manufacturer: "Zendure"
      model: "SmartPV Hub 2000 Controller"

  - name: "Solar Power 2"
    unique_id: "fpy2m7be_solarpower2"
    state_topic: "<APPKEY>/Fpy2M7Be/state"
    value_template: "{{ value_json.solarPower2 | int(0) }}"
    unit_of_measurement: "W"
    device_class: "power"
    state_class: "measurement"
    device: 
      name: "SolarFlow"
      identifiers: "<NUMERODESERIE>"
      manufacturer: "Zendure"
      model: "SmartPV Hub 2000 Controller"

  - name: "Pass Mode"
    unique_id: "fpy2m7be_passmode"
    state_topic: "<APPKEY>/Fpy2M7Be/state"
    value_template: "{{ value_json.passMode | int }}"
    device: 
      name: "SolarFlow"
      identifiers: "<NUMERODESERIE>"
      manufacturer: "Zendure"
      model: "SmartPV Hub 2000 Controller"

  - name: "Auto Recover"
    unique_id: "fpy2m7be_autorecover"
    state_topic: "<APPKEY>/Fpy2M7Be/state"
    value_template: "{{ value_json.autoRecover | int }}"
    device: 
      name: "SolarFlow"
      identifiers: "<NUMERODESERIE>"
      manufacturer: "Zendure"
      model: "SmartPV Hub 2000 Controller"

  - name: "Hub State"
    unique_id: "fpy2m7be_hubstate"
    state_topic: "<APPKEY>/Fpy2M7Be/state"
    value_template: "{{ value_json.hubState | int }}"
    device: 
      name: "SolarFlow"
      identifiers: "<NUMERODESERIE>"
      manufacturer: "Zendure"
      model: "SmartPV Hub 2000 Controller"

  - name: "Batterie CO4HLMEMA801269 maxTemp"
    unique_id: "fpy2m7be_batterie_1_maxtemp"
    state_topic: "<APPKEY>/Fpy2M7Be/state"
    value_template: >
      {% for i in value_json.packData %}
        {% if i.sn == "CO4HLMEMA801269" %}
          {{ (i.maxTemp | float - 273.15) | round(2) }}
        {% endif %}
      {% endfor %}
    unit_of_measurement: "°C"
    device_class: "temperature"
    device: 
      name: "SolarFlow"
      identifiers: "<NUMERODESERIE>"
      manufacturer: "Zendure"
      model: "SmartPV Hub 2000 Controller"

  - name: "Batterie CO4HLMEMA801269 maxVol"
    unique_id: "fpy2m7be_batterie_1_maxvol"
    state_topic: "<APPKEY>/Fpy2M7Be/state"
    value_template: >
      {% for i in value_json.packData %}
        {% if i.sn == "CO4HLMEMA801269" %}
          {{ i.maxVol | float / 100 }}
        {% endif %}
      {% endfor %}
    unit_of_measurement: "V"
    device_class: "voltage"
    device: 
      name: "SolarFlow"
      identifiers: "<NUMERODESERIE>"
      manufacturer: "Zendure"
      model: "SmartPV Hub 2000 Controller"

  - name: "Batterie CO4HLMEMA801269 minVol"
    unique_id: "fpy2m7be_batterie_1_minvol"
    state_topic: "<APPKEY>/Fpy2M7Be/state"
    value_template: >
      {% for i in value_json.packData %}
        {% if i.sn == "CO4HLMEMA801269" %}
          {{ i.minVol | float / 100 }}
        {% endif %}
      {% endfor %}
    unit_of_measurement: "V"
    device_class: "voltage"
    device: 
      name: "SolarFlow"
      identifiers: "<NUMERODESERIE>"
      manufacturer: "Zendure"
      model: "SmartPV Hub 2000 Controller"

  - name: "Batterie CO4HLMEMA801269 socLevel"
    unique_id: "fpy2m7be_batterie_1_soclevel"
    state_topic: "<APPKEY>/Fpy2M7Be/state"
    value_template: >
      {% for i in value_json.packData %}
        {% if i.sn == "CO4HLMEMA801269" %}
          {{ i.socLevel | int }}
        {% endif %}
      {% endfor %}
    unit_of_measurement: "%"
    device_class: "battery"
    device: 
      name: "SolarFlow"
      identifiers: "<NUMERODESERIE>"
      manufacturer: "Zendure"
      model: "SmartPV Hub 2000 Controller"


switch:
  - unique_id: "fpy2m7be_masterswitch"
    state_topic: "<APPKEY>/Fpy2M7Be/state"
    state_off: false
    command_topic: "<APPKEY>/Fpy2M7Be/masterSwitch/set"
    name: "Master Switch"
    device_class: "switch"
    value_template: "{{ value_json.masterSwitch | default('') }}"
    payload_on: true
    payload_off: false
    state_on: true
    device: 
      name: "SolarFlow"
      identifiers: "<NUMERODESERIE>"
      manufacturer: "Zendure"
      model: "SmartPV Hub 2000 Controller"

  - unique_id: "fpy2m7be_buzzerswitch"
    state_topic: "<APPKEY>/Fpy2M7Be/state"
    state_off: false
    command_topic: "<APPKEY>/Fpy2M7Be/buzzerSwitch/set"
    name: "Buzzer Switch"
    device_class: "switch"
    value_template: "{{ value_json.buzzerSwitch | default('') }}"
    payload_on: true
    payload_off: false
    state_on: true
    device: 
      name: "SolarFlow"
      identifiers: "<NUMERODESERIE>"
      manufacturer: "Zendure"
      model: "SmartPV Hub 2000 Controller"

attention à bien :

  • modifier le <APPKEY> et remplacer Fpy2M7Be par votre code unique pour chaque state_topic.
  • modifier le <NUMERODESERIE> dans identifiers
  • si vous voulez gérer les unique_id avec le code appareil, attention à mettre en minuscule ! sinon rien ne sera créer. Croyez mon expérience…

Après un redémarrage complet ou un rechargement de configuration des entités MQTT, si tout va bien, vous devriez avoir un nouvelle appareil disponible dans votre entité MQTT :

Exploitation et affichage des données dans Home Assistant

Maintenant que tout est disponible dans Home Assistant, il ne reste plus qu’a afficher cela. Je me suis fais une page en utilisant la nouvelle fonctionnalité type de vue « Sections » pour créer 3 sections : Production Solaire, Batterie et Consommation maison :

Voici le code si vous souhaitez vous en inspirer :

views:
  - type: sections
    max_columns: 4
    title: Zendure
    path: zendure2
    sections:
      - type: grid
        cards:
          - type: glance
            entities:
              - entity: sensor.solarflow_pack_state
              - entity: sensor.solarflow_hub_state
          - type: custom:apexcharts-card
            update_delay: 3s
            update_interval: 1min
            graph_span: 6h
            header:
              show: true
              title: Production Solaire
              show_states: true
              colorize_states: true
            all_series_config:
              stroke_width: 2
            yaxis:
              - id: first
                apex_config:
                  tickAmount: 5
                  title:
                    text: Power (Watts)
            series:
              - entity: sensor.solarflow_solar_input_power
                yaxis_id: first
                float_precision: 0
                unit: Watts
                fill_raw: zero
                group_by:
                  func: max
                  duration: 1m
            show:
              last_updated: true
          - type: custom:apexcharts-card
            update_delay: 3s
            update_interval: 1min
            graph_span: 6h
            header:
              show: true
              title: Solaire Input 1
              show_states: true
              colorize_states: true
            all_series_config:
              stroke_width: 2
            yaxis:
              - id: first
                apex_config:
                  tickAmount: 5
                  title:
                    text: Power (Watts)
            series:
              - entity: sensor.solarflow_solar_power_1
                yaxis_id: first
                float_precision: 0
                unit: Watts
                fill_raw: zero
                group_by:
                  func: max
                  duration: 1m
            show:
              last_updated: true
          - type: custom:apexcharts-card
            update_delay: 3s
            update_interval: 1min
            graph_span: 6h
            header:
              show: true
              title: Solaire Input 2
              show_states: true
              colorize_states: true
            all_series_config:
              stroke_width: 2
            yaxis:
              - id: first
                apex_config:
                  tickAmount: 5
                  title:
                    text: Power (Watts)
            series:
              - entity: sensor.solarflow_solar_power_2
                yaxis_id: first
                float_precision: 0
                unit: Watts
                fill_raw: zero
                group_by:
                  func: max
                  duration: 1m
            show:
              last_updated: true
          - type: horizontal-stack
            cards:
              - type: custom:mushroom-template-card
                primary: Buzzer Switch
                secondary: ''
                icon: >
                  {{
                  iif(is_state('switch.solarflow_buzzer_switch','on'),'mdi:flash',
                  'mdi:flash-off') }}
                entity: switch.solarflow_buzzer_switch
                icon_color: >
                  {{ iif(is_state('switch.solarflow_buzzer_switch','on'),
                  'green', 'red') }}
              - type: custom:mushroom-template-card
                primary: Buzzer Switch
                secondary: ''
                icon: >
                  {{
                  iif(is_state('switch.solarflow_master_switch','on'),'mdi:flash',
                  'mdi:flash-off') }}
                entity: switch.solarflow_buzzer_switch
                icon_color: >
                  {{ iif(is_state('switch.solarflow_master_switch','on'),
                  'green', 'red') }}
        title: Production Solaire
      - type: grid
        cards:
          - type: glance
            entities:
              - entity: sensor.solarflow_batterie_co4hlmema801269_maxtemp
              - entity: sensor.solarflow_batterie_co4hlmema801269_minvol
              - entity: sensor.solarflow_batterie_co4hlmema801269_maxvol
          - type: gauge
            entity: sensor.solarflow_electric_level
            min: 0
            max: 100
            needle: true
            segments:
              - from: 0
                color: '#800000'
              - from: 10
                color: '#db4437'
              - from: 50
                color: '#ffa600'
              - from: 90
                color: '#43a047'
              - from: 99
                color: '#209cee'
            name: Niveau de Batterie
          - type: custom:apexcharts-card
            update_delay: 3s
            update_interval: 1min
            graph_span: 6h
            header:
              show: true
              title: Batterie Total Restante
              show_states: true
              colorize_states: true
            all_series_config:
              stroke_width: 2
            yaxis:
              - id: first
                apex_config:
                  tickAmount: 5
                  title:
                    text: Charge (%)
            series:
              - entity: sensor.solarflow_electric_level
                yaxis_id: first
                float_precision: 0
                fill_raw: zero
                group_by:
                  func: max
                  duration: 1m
            show:
              last_updated: true
          - type: glance
            entities:
              - entity: sensor.solarflow_soc_set
              - entity: sensor.solarflow_remain_input_time
              - entity: sensor.solarflow_remain_out_time
        title: Batterie
      - type: grid
        cards:
          - type: glance
            entities:
              - entity: sensor.solarflow_output_limit
          - type: custom:apexcharts-card
            update_delay: 3s
            update_interval: 1min
            graph_span: 6h
            header:
              show: true
              title: SolarFlow -> Maison
              show_states: true
              colorize_states: true
            all_series_config:
              stroke_width: 2
            yaxis:
              - id: first
                apex_config:
                  tickAmount: 5
                  title:
                    text: Power (Watts)
            series:
              - entity: sensor.solarflow_output_home_power
                yaxis_id: first
                float_precision: 0
                unit: Watts
                fill_raw: zero
                group_by:
                  func: max
                  duration: 1m
            show:
              last_updated: true
          - type: custom:apexcharts-card
            update_delay: 3s
            update_interval: 1min
            graph_span: 6h
            header:
              show: true
              title: Conso Maison
              show_states: true
              colorize_states: true
            all_series_config:
              stroke_width: 2
            yaxis:
              - id: first
                apex_config:
                  tickAmount: 5
                  title:
                    text: Power (Watts)
            series:
              - entity: sensor.teleinfo_1
                yaxis_id: first
                float_precision: 0
                unit: Watts
                fill_raw: zero
                group_by:
                  func: max
                  duration: 1m
            show:
              last_updated: true
        title: Maison
    cards: []

Et voila, c’est fini pour ce tutoriel d’intégration des données Zendure SolarFlow dans Home Assistant. C’est vraiment appreciable que Zendure ai mis par défaut cette données à disposition mais malheureusement, je trouve que les données ne sont pas mis à jours assez souvent.

EDIT du 30 mai 2024 : Merci à Flo qui m’a proposé une amélioration dans les commentaires ci-dessous et qui permet d’actualiser les données plus souvent en remplaçant « clientid zendure » par « clientid <APPKEY> »

Je constate un décalage de temps entre l’application sur mon smartphone et les données qui arrivent dans MQTT. De même, dommage de ne pas avoir de données sur l’énergie (en Wh) produit, consommé et stocké qui aurait pu être utilisées dans le Dashboard Energy de HA. Je sais que cela devrait être possible en créant des sensors sur base des sensor power mais comme ils ne sont pas assez mis à jour, je pense que l’info ne sera pas cohérente.

Bref, j’espère que ce tutoriel vous aura bien aidé, n’hésitez pas à me poser vos question dans les commentaires.

Julien

Passionné depuis mon plus jeune âge par les nouvelles technologies et doublé d’un acheteur compulsif, j’ai toujours adoré les nouveaux produits HighTech. Je m’aperçois que les « gadgets » deviennent plutôt des outils du quotidien voire du futur, mais le regard de beaucoup de personnes n’évolue pas aussi vite que les technologies. Qui n’a jamais fait face à la fameuse question « Ça sert à quoi? » en montrant sa nouvelle acquisition à son entourage.

Articles similaires

30 commentaires

  1. Bonjour,
    Merci pour la vulgarisation du git de zendure!
    Je viens de faire la manœuvre pour avoir mes key et secret mais j’ai une erreur 400
    Pourriez vous m’aider?

    {« code »:400, »success »:false, »data »:{}, »msg »: »JSON parse error: Cannot construct instance of `org.zendure.modules.openApi.dto.DeveloperApplyDto` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value (‘{snNumber:H01HLM********,account:*************@gmail.com}’); nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `org.zendure.modules.openApi.dto.DeveloperApplyDto` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value (‘{snNumber:H01HLM*********,account:**********@gmail.com}’)\n at [Source: (PushbackInputStream); line: 1, column: 1] »}

    1. Hello
      est ce que tu as bien remplacé les valeurs pour ton serial number et ton email?
      j’ai l’impression que tu as utilisé directement la commande que j’ai mis avec mes valeurs anonymisées.

  2. Hello Hello!!!
    Je viens d’ajouter zendure sur HA.
    Petite question le taux de rafraichissement des données est t’il long pour vous aussi? 4 à 20min
    Message récurent sur le journal de mosquitto:
    2024-05-04 08:27:54: New connection from 172.30.32.2:59530 on port 1883.
    2024-05-04 08:27:54: Client closed its connection.
    2024-05-04 08:27:57: Connecting bridge external-bridge (mqtt.zen-iot.com:1883)
    2024-05-04 08:27:58: Client local.zendure closed its connection.
    2024-05-04 08:28:03: Connecting bridge external-bridge (mqtt.zen-iot.com:1883)
    2024-05-04 08:28:04: Client local.zendure closed its connection.

    1. Hello

      ok top! mais effectivement le taux de rafraîchissement n’est pas super. je l’ai remonté aux ingénieurs.
      j’ai remarqué que si le système est « En veille » dans l’application c’est encore pire (d’où les 20 minutes).

  3. Merci pour le Tuto

    Pour éviter et actualiser les données beaucoup plus souvent
    Connecting bridge external-bridge (mqtt.zen-iot.com:1883)
    Client local.zendure closed its connection.

    Remplacer dans le fichier .conf de mqtt

    clientid zendure —- clientid

  4. Merci pour le Tuto

    Pour éviter et actualiser les données beaucoup plus souvent
    Connecting bridge external-bridge (mqtt.zen-iot.com:1883)
    Client local.zendure closed its connection.

    Remplacer dans le fichier .conf de mqtt

    clientid zendure —- clientid appkey

  5. merci pour le guide, cela a parfaitement fonctionné pendant 2 jours, maintenant Mqqt ne reçoit plus de données. pouvez-vous m’aider?

  6. Hello,
    Domage que Zendure ne sortent pas les infos directement sur le module sur son réseau local, mais a travers son cloud 🙁 donc plus d’internet, plus de gestion du solaire

  7. Encore une solution qui n’est pilotable que via internet…😤
    On ne choisit home assistant pour ses capacités ET son autonomie…

    Et bien aussi intéressante soit elle et me concernant Ils peuvent se la garder…

  8. Bonjour, comment fait on pour configurer mosquitto quand il est déjà configurer pour récupérer les données d’un dtu. Je ne peux pas changer false en true sinon je perd mes autres données.
    Merci à vous de m’éclairer.

  9. Bonjour. savez vous comment faire remonter les données de l’énergie qui entre dans les batteries et ressort vers la maison pour les faire apparaitre dans le tableau energie de home assistant ?

    j’ai créé des entrées basées sur packinputpower et packoutputpower masi cela ne fontionne pas.

    1. Bonjour,
      Pour cela il te faut créer 2 sensors
      le premier un capteur d’intégral en trapèze ( il y a des tuto pour cela)
      et le second un compteur de services publiques ( Pareil il y a des tutos pour cela)

      1. merci. c’est que j’ai fait en me basant sur la valeur des sensors mais j’ai toujours cette erreur dans le tableau energie.

  10. Bonjour ,
    j’ai besoin d’un petit coup de main svp !
    sous mqtt explorer , j’ai bien la remontée d’info de mon zendure mais dans mon Mosquitto broker , j’ai cette erreur :
    1730046533: Loading config file /share/mosquitto/zendure.conf
    2024-10-27 17:28:53: Warning: Mosquitto should not be run as root/administrator.
    2024-10-27 17:28:53: mosquitto version 2.0.18 starting
    2024-10-27 17:28:53: Config loaded from /etc/mosquitto/mosquitto.conf.
    2024-10-27 17:28:53: Loading plugin: /usr/share/mosquitto/go-auth.so
    2024-10-27 17:28:53: ├── Username/password checking enabled.
    2024-10-27 17:28:53: ├── TLS-PSK checking enabled.
    2024-10-27 17:28:53: └── Extended authentication not enabled.
    2024-10-27 17:28:53: Opening ipv4 listen socket on port 1883.
    2024-10-27 17:28:53: Opening ipv6 listen socket on port 1883.
    2024-10-27 17:28:53: Opening websockets listen socket on port 1884.
    2024-10-27 17:28:53: Connecting bridge zendure-broker (3.68.115.36:1883)
    2024-10-27 17:28:53: mosquitto version 2.0.18 running
    2024-10-27 17:28:53: New connection from ::1:42154 on port 1883.
    2024-10-27 17:28:53: Client disconnected due to protocol error.
    [17:28:53] INFO: Successfully send discovery information to Home Assistant.
    [17:28:54] INFO: Successfully send service information to the Supervisor.
    2024-10-27 17:29:03: New connection from 172.30.32.2:32910 on port 1883.
    2024-10-27 17:29:03: Client closed its connection.

    mon .conf (j’ai bien remplacé aapkey et appsecret)
    connection zendure-broker
    address mqtt-eu.zen-iot.com:1883
    remote_username
    remote_password
    remote_clientid
    topic /# in

    vous auriez une idée ?
    merci d’avance

    1. Hello
      pour moi je ne vois pas d’erreur, j’ai exactement la même chose.
      est ce que tu as bien attendu un moment?
      par moment c’est long à arriver, surtout si le Zendure est en veille, il n’a plus d’activité…

      1. oui j’ai attendu et via mqtt explorer , j’ai bien les données qui redescendent .
        on a l’impression qu’il n’a pas le bon client !

        j’ai trouvé ça, je vais essayer
        customize:
        active: true
        folder: mosquitto
        Create /share/mosquitto/acl.conf with the contents:

        acl_file /share/mosquitto/accesscontrollist
        Create /share/mosquitto/accesscontrollist with the contents:

        user addons
        topic readwrite #

        user homeassistant
        topic readwrite #

        user [YOUR_MQTT_USER]
        topic readwrite #

  11. Bonjour Julien,

    Je suis entrain d’essayé d’intégrer mon Zendure hyper 2000 à home assistant en suivant votre tuto mais n’ayant aucune compétence et le vocabulaire en programmation je suis bloqué à « parcourir les répertoires partagés de votre installation Home Assistant avec un explorateur de fichier » je ne sais pas du tout comment faire cette opération pour avancer dans votre tuto. En tapant cette phrase sur le net je ne trouve pas de tuto pour avancer. Auriez vous une explication plus concrète pour que je puisse allé au bout de ce tuto?
    Cdt Dom.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Bouton retour en haut de la page