[Home Assistant, MSunPV et Batterie DIY] Mes quelques travaux sur mon install

Plus d'informations
25 Oct 2025 08:14 - 25 Oct 2025 17:44 #46 par domwood
Pour la tension redressée, je tablais sur U alternatif mesuré X racine de 2. (j'avais eu une discussion rapide avec un copain électronicien, que je croise régulièrement chez un ferrailleur :lol: )

Faudrait que je revoies mes bases (j'ai un bac F3, qui date, certe).


edit : plus rapide que de revoir mes bases, mesure avec un pont de diodes aux fesses du transfo : 46V. Je suis bon pour rebobiner le transfo.
Bon, je plaisante, j'ai passé l'âge. Par contre, le copain Seb, je lui en reparlerai, ça c'est sûr ! :silly:
Dernière édition: 25 Oct 2025 17:44 par domwood.

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
05 Nov 2025 11:07 #47 par patmtp35
Hello,

Voila le chargeur 24V a basse d'Emerson R48 + Dps5020 , basé sur le Msupv ou le shelly est opérationnel :) ,je met tous ca au propre et je publie sur mon github , il aura 2 version une 100/100 esphome autonome pas de dépendance a HA et une dépendante de HA .

Hier j'ai grace a lui finit de charger mes batteries a 13h a la place de 16h , du coup apres chauffage de l'eau et de la maison :)

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
05 Nov 2025 14:48 #48 par Ixio_Jo
Content que tu aies pu t'en sortir avec le MCP5020, tu as dû le remplacer ou tu as pu réparer? Hate de voir ton implémentation sous ESPHome, toujours curieux.

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
06 Nov 2025 09:08 - 10 Nov 2025 12:17 #49 par patmtp35
Merci oui je l'ai changer , 1100 ligne de code :) je finie de nettoyer et de commenter tout ca (merci tchat ) . je monte l'esp32 et le canbus dans le botier du dps5020 aussi

j'ai testé en remplaçant le shelly par le msun ca marche nickel aussi .

NE PAS OUBLIER DE MONTER UN disjoncteur DC 63A + du DPS5020 ET Le + DE LA BATTERIE

github.com/patmtp35/Esphome_charger-hybride-lifepo4
Pièces jointes :
Dernière édition: 10 Nov 2025 12:17 par patmtp35.

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
10 Nov 2025 12:17 #50 par patmtp35
Hello,

Alors a la place de la diode moffset , il vaut mieux utiliser un disjoncteur DC , j'ai donc opter comme j'en utilise déjà pour un TONGOU DV 12v-48v 63A piloter .
La diode moffset bloquant le retour du courant vers le DSP5020 celui ci ne peu du coup pas connaitre le voltage de la batterie .

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
16 Nov 2025 16:37 - 16 Nov 2025 20:45 #51 par patmtp35
apres une semaine de tests ca marche super bien ! j'ai optimiser amort le surplus du coup ! et zero injection !
Dernière édition: 16 Nov 2025 20:45 par patmtp35.

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
24 Jan 2026 19:01 #52 par patmtp35
apres qques mois d'utilisation c'est vraiment top enles deux routeur MsunPV et Routeur Batteries fonctionne de concert ! je vais pouvoir rajouter des panneaux !

seule modif afin d'avoir de vraix valeur pour la batteries et non estimées , j'ai installer un smartshunt 500A . j'envisage dans l'année a venir a passer chez les grands en 48v....

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
02 Fév 2026 10:34 #53 par Ixio_Jo
Super !
Moi la batterie est en pause, pas assez de soleil je consomme déjà tout ! Sauf les jours rouges où je me permets une charge nocturne pour limiter encore plus les heures pleines.

Ca marche bien le smartshunt. J'en avait fait un avec un shunt 100A, un INA226 et un ESP8266 (le tout sous ESPHome) et il était très précis pour évaluer ce qui restait dans ma batterie. Il m'a même permis de remonter à la consommation du BMS !
Mais quand j'ai voulu le basculer sur l'ESP32 S3 qui gère tout, ça n'a pas fonctionné (visiblement l'esp32 est plus sensible faut un montage beaucoup plus rigoureux). En voulant réhaussé les niveaux (l'INA226 accepte du 5V), j'ai cramé l'INA226 et l'esp32 (qui lui n'accepte pas du 5V). J'ai racheté un ESP32 S3 et mon système est de nouveau fonctionnel, mais pour le moment le smartshunt, je laisse tomber même si je penser retravailler sur le sujet.. peut être

A bientôt dans le monde des 16s !

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
02 Fév 2026 17:40 #54 par patmtp35
Hello Merci !

Concernant l'AC coupling bidirectionel (ce que l'on fait avec ce système) je vous conseil la chaine E2-nomy sebby a sortie un super système DIY au petit oignon !

Pour ma part j'ai réussi a trouver un multiplus II a un prix imbattable sur LBC , je vais donc pas tarder a Basculer vers la solution que ma inspiré Patrick , j'attend juste un RPI 4 pour y installer venus OS + EPS32 pour la gestion du VE-Direct.

Je change de stratégie voulant Aller vers l'autonomie on sait jamais avec les temps qui courent...

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
13 Fév 2026 12:46 - 13 Fév 2026 13:13 #55 par Ixio_Jo

Hello Merci !

Concernant l'AC coupling bidirectionel (ce que l'on fait avec ce système) je vous conseil la chaine E2-nomy sebby a sortie un super système DIY au petit oignon !

Pour ma part j'ai réussi a trouver un multiplus II a un prix imbattable sur LBC , je vais donc pas tarder a Basculer vers la solution que ma inspiré Patrick , j'attend juste un RPI 4 pour y installer venus OS + EPS32 pour la gestion du VE-Direct.

Je change de stratégie voulant Aller vers l'autonomie on sait jamais avec les temps qui courent...

Oui oui, depuis qu'il a repris ce que j'ai fait sur l'alimentation, je suis de près ce qu'il fait, il va beaucoup plus vite que moi ! Du coup ça m'a motiver pour avancer dans le même sens avec mon matériel (je rappel, le chargeur Emerson, un onduleur GTN1200 et le MSunPV), c'est à dire que ça soit l'ESP32S3 qui gère la régulation, HA ne servant qu'à ordonner le mode.
N'ayant pas de mesure de la puissance Enedis consommée directement sur l'ESP32, je dois récupérer l'info directement sur le routeur. Dans la mesure où il ne fait pas de MQTT (un jour j'espère !!), et juste le status.xml accessible en HTTP.
Avec HTTP request c'est facilement faisable, mais c'est une tache synchrone, c'est à dire que l'ESP se met en attente le temps que la réponse arrive, ce qui fait qu'il ramait à mort et ça n'était pas du tout gérable.
L'AI (Claude Sonnet 4.5), m'a suggéré quelques optimisation dont le fait de passer le HTTP request sur le deuxième core.

Vu que je pense que je pense que ça peut intéresser du monde, voila comment je récupère la conso de la maison depuis le MSUNPV sur un esp32 :
 on_boot:
    
    priority: -100
    then:
      - lambda: |-
          #include "esp_http_client.h"
          
          xTaskCreatePinnedToCore(
            [](void *pvParameters) {
              ESP_LOGI("http_task", "Démarrage sur core %d", xPortGetCoreID());
              
              // Configuration du client HTTP avec keep-alive
              esp_http_client_config_t config = {};
              config.url = "http://192.168.1.XXX/status.xml";
              config.timeout_ms = 2000;
              config.keep_alive_enable = true;
              config.keep_alive_idle = 5;
              config.keep_alive_interval = 5;
              config.keep_alive_count = 3;
              
              esp_http_client_handle_t client = esp_http_client_init(&config);
              
              char buffer[2048];
              float last_power   = -999.0;
              float last_panel   = -999.0;
              float last_routage = -999.0;
              
              while(true) {
                uint32_t start = millis();
                
                esp_err_t err = esp_http_client_open(client, 0);
                if (err == ESP_OK) {
                  int content_length = esp_http_client_fetch_headers(client);
                  int total_read = 0;
                  
                  if (content_length > 0 && content_length < sizeof(buffer)) {
                    total_read = esp_http_client_read(client, buffer, content_length);
                    buffer[total_read] = '\0';
                    
                    if (total_read > 0) {
                      std::string data(buffer, total_read);
                      
                      // Parser le XML
                      size_t start_pos = data.find("<inAns>");
                      if (start_pos != std::string::npos) {
                        start_pos += 7;
                        size_t end_pos = data.find("<", start_pos);
                        std::string inAns_content = data.substr(start_pos, end_pos - start_pos);
                        
                        // Extraire les valeurs
                        size_t first_semi = inAns_content.find(";");
                        if (first_semi != std::string::npos) {
                          std::string val1_str = inAns_content.substr(0, first_semi);
                          std::replace(val1_str.begin(), val1_str.end(), ',', '.');
                          
                          size_t second_semi = inAns_content.find(";", first_semi + 1);
                          if (second_semi != std::string::npos) {
                            std::string val2_str = inAns_content.substr(first_semi + 1, second_semi - first_semi - 1);
                            std::replace(val2_str.begin(), val2_str.end(), ',', '.');

                            size_t third_semi = inAns_content.find(";", second_semi + 1);
                            if (third_semi != std::string::npos) {
                              std::string val3_str = inAns_content.substr(second_semi + 1, third_semi - second_semi - 1);
                              std::replace(val3_str.begin(), val3_str.end(), ',', '.');
                              
                              // Mise à jour thread-safe des globales
                              float power = atof(val1_str.c_str());
                              float panel = atof(val2_str.c_str());
                              float routage = atof(val3_str.c_str());

                                                            // Mettre à jour seulement si changement > 0.5W
                              if (fabs(power - last_power) > 0.5) {
                                id(latest_power) = power;
                                last_power = power;
                                // Publish depuis le core 0
                                id(consommation_maison).publish_state(power);
                              }
                              
                              if (fabs(panel - last_panel) > 0.5) {
                                id(latest_panel) = panel;
                                last_panel = panel;
                                id(puissance_panneau).publish_state(panel);
                              }

                              if (fabs(routage - last_routage) > 0.5) {
                                id(latest_routage) = routage;
                                last_routage = routage;
                                id(routage_cumulus).publish_state(routage);
                              }
                              
                              
                              
                              
                              ESP_LOGD("http_task", "Power: %.1f W, Panel: %.1f W, Routage: %.1f  (en %d ms)", 
                                      power, panel,routage, millis() - start);
                            }


                          }
                        }
                      }
                    }
                  }
                  esp_http_client_close(client);
                } else {
                  ESP_LOGW("http_task", "Erreur connexion HTTP: %s", esp_err_to_name(err));
                }
                
                // Attendre 1 seconde
                vTaskDelay(1000 / portTICK_PERIOD_MS);
              }
              
              esp_http_client_cleanup(client);
            },
            "HTTP_Task",
            8192,
            NULL,
            0,
            NULL,
            0  // Core 0
          );
          
          ESP_LOGI("main", "Tâche HTTP créée sur core 0 avec keep-alive");
On a besoin de variables globales :
globals:
  - id: latest_power
    type: float
    restore_value: no
    initial_value: '0.0'
  - id: latest_panel
    type: float
    restore_value: no
    initial_value: '0.0'
  - id: latest_routage
    type: float
    restore_value: no
    initial_value: '0.0'    
et des sensors associés :
sensor:
  - platform: template
    name: "Consommation Maison"
    id: consommation_maison
    unit_of_measurement: "W"
    device_class: power
    state_class: measurement
    accuracy_decimals: 1
    device_id: powermeter
    lambda: return id(latest_power);
    update_interval: never

  - platform: template
    name: "Puissance Panneau"
    id: puissance_panneau
    unit_of_measurement: "W"
    device_class: power
    state_class: measurement
    accuracy_decimals: 1
    device_id: powermeter
    lambda: return id(latest_panel);
    update_interval: never    

  - platform: template
    name: "Routage Cumulus"
    id: routage_cumulus
    unit_of_measurement: "%"
    device_class: power_factor
    state_class: measurement
    accuracy_decimals: 1
    device_id: powermeter 
    lambda: return id(latest_routage);
    update_interval: never   

Pour la suite, j'ai intégré un PID trouvé sur le git de E2-nomy sebby, j'ai modifié quelques points pour que ça régule mieux et la je suis assez satisfait. Je n'ai plus qu'à modifié tous mes automatismes sur HA maintenant !
Dernière édition: 13 Fév 2026 13:13 par Ixio_Jo.
Les utilisateur(s) suivant ont remercié: patmtp35

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
13 Fév 2026 13:08 - 15 Fév 2026 17:50 #56 par patmtp35
A yes belle Avancé ! c'est genial claude saunet.....

J'ai avancé aussi de mon coté install du RPI4 + venusos 3.70 + Esp32-Ve-Direct ca parle et communique avec HA , il me manque qques cable et je bascule sur le Multiplus II en 48V je garderais le R48 mais du coup avec ton système en Secours.

Ceci étant Petit Retex en mode 24V pour ceux qui souhaiterais , le système évoqué et tre stable, mais depend beaucoup de Ha, on a la possibilité de s'en abrogé ceci etant. J'ai 3 fois moins injecté (et c'est le but) qu avant de l'avoir, du coup moins consommé sur le GRID , la batterie etant bien vite et plus souvent pleinne.
Bien reglé il faut trouver les bons seuils ca cohabite tres bien avec notre super MSunPV !

j'ai mis toutes les sources sur le github , plus simple a maintenir :)
Dernière édition: 15 Fév 2026 17:50 par patmtp35.

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
13 Fév 2026 13:46 #57 par patrick
Bonjour,

Dans la mesure où il ne fait pas de MQTT (un jour j'espère !!)

Pas encore de MQTT mais si tu as moyen d'envoyer avec HA un msg en UDP, les nouvelles versions de firmware à venir devraient bien améliorer la récup des données...:)
Les utilisateur(s) suivant ont remercié: patmtp35

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
13 Fév 2026 14:43 #58 par Ixio_Jo
En UDP, je pense qu'on améliore bien les choses, surtout si tu y mets un header et que tu laisses la connexion ouverte! J'ai hate !
Les utilisateur(s) suivant ont remercié: patmtp35

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
20 Fév 2026 10:30 #59 par Ixio_Jo
Coucou
Après quelques tests et amélioration, j'ai une version qui tient à peu près la route.
Je vous propose l'ensemble du YAML du développement ESPHome sur mon github. Il n'a pas vocation à utilisé tel quel mais si ça peut aider :
github.com/IxioJo/ESP_Battery/blob/main/README.md

Il est un peu bordélique, mais je vais essayer de nettoyer un peu
Les utilisateur(s) suivant ont remercié: patmtp35

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
20 Fév 2026 15:12 #60 par patmtp35
bravo !

merci pour le partage !

Connexion ou Créer un compte pour participer à la conversation.

Propulsé par Kunena