Files
gilles a8f0d6ccba Initial commit — KC868-A2 contrôleur solaire ESP32
Fonctionnalités :
- Lecture RS485 Modbus Epever Tracer 4210N (115200 bps, FC03/FC04/FC16)
- Moteur de règles JSON (LittleFS) — commande automatique des relais
- Interface web mobile-first (dashboard, règles, config, historique, EPEVER, debug)
- WiFi AP+STA simultanés avec reconnexion automatique et portail captif
- mDNS configurable (pv.local par défaut)
- Configuration registres EPEVER depuis l'UI (18 registres holding)
- Historique basse/haute résolution avec graphes canvas
- VPN WireGuard optionnel (désactivé par défaut, config via UI)
- OTA firmware + filesystem via ElegantOTA
- Deep sleep / économie d'énergie

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-09 19:25:01 +02:00

5.3 KiB

Améliorations prévues


1. Historique 24h (graphique)

Graphique des tensions batterie et PV sur les dernières 24h.

Approche :

  • Buffer circulaire en RAM : 1 point toutes les 5 min → 288 points max
  • Rendu avec Chart.js (version minifiée, stockée dans LittleFS)
  • Endpoint GET /api/history → JSON tableau horodaté

2. Valeurs sortie de charge (load) Epever

Lecture des registres de la sortie load du régulateur.

Donnée Registre Unité Facteur
Tension load 0x310C V ÷100
Courant load 0x310D A ÷100
Puissance load 0x310E W ÷100

À ajouter dans SystemState et dans modbus_epever.cpp.


3. Consommation et production en kWh

L'Epever Tracer 4210N calcule les kWh en interne — aucun calcul côté ESP32 nécessaire.

Donnée Registre Unité Facteur
Énergie générée aujourd'hui 0x3300 kWh ÷100
Énergie générée totale 0x3302 kWh ÷100
Énergie consommée aujourd'hui 0x3304 kWh ÷100
Énergie consommée totale 0x3306 kWh ÷100

Les registres 0x3302 et 0x3306 (total) sont sur 32 bits — lire 2 registres consécutifs et combiner : valeur = (reg_H << 16) | reg_L.

À ajouter dans SystemState, lus dans modbus_epever.cpp avec les autres registres.


4. État batterie

L'Epever fournit le SOC, la température et le statut de charge.

4.1 SOC et température

Donnée Registre Unité Facteur
SOC (charge restante) 0x311A % ÷1
Température batterie 0x3110 °C ÷100

4.2 Statut de charge — registre 0x3200

Bits Valeur Signification
3-2 00 Pas de charge
3-2 01 Charge float
3-2 10 Charge boost
3-2 11 Charge égalisation
1 1 Batterie en sous-tension
0 1 Batterie en surtension
// Extraction du statut de charge (bits 3-2)
uint8_t statutCharge = (reg0x3200 >> 2) & 0x03;
// "Float" / "Boost" / "Égalisation" / "Arrêt"

bool sousVoltage  = (reg0x3200 >> 1) & 0x01;
bool surVoltage   = (reg0x3200 >> 0) & 0x01;

4.3 Champs à ajouter dans SystemState

float    batTemperature  = 0.0f;  // °C
uint8_t  batSOC          = 0;     // %
uint8_t  batStatutCharge = 0;     // 0=arrêt, 1=float, 2=boost, 3=égalisation
bool     batSousVoltage  = false;
bool     batSurVoltage   = false;

Ordre d'implémentation suggéré

  1. État batterie + load + kWh (ajout dans la séquence Modbus existante)
  2. Historique 24h (après étape 6 sleep)

5. Émulateur ESP32 (investigation)

Interface web 3 volets : GPIO / terminal série / webserver embarqué.

Options évaluées

Technologie Offline Docker .bin Arduino WiFi AP Complexité Licence
Wokwi CLI ✗ (cloud token) partiel ✓ simulé faible payant
QEMU Espressif ✗ (réseau non émulé) moyenne GPL
Velxio ✓ (1 commande) ✓ (backend Wokwi) ? faible AGPL
Renode ✗ partiel haute MIT

Blocage principal

Ce projet repose sur WiFi AP + AsyncWebServer — le webserver de l'ESP32 ne peut fonctionner que si la couche réseau WiFi est émulée. Seul Wokwi émule le WiFi (IP simulée accessible depuis l'hôte). QEMU n'émule pas le WiFi.

Recommandation

Wokwi CLI + VS Code extension est la seule option viable pour voir tourner le webserver dans un navigateur :

  • Fonctionne avec le .bin compilé par PlatformIO + un fichier wokwi.toml et diagram.json
  • Émule WiFi, Serial, GPIO sur ESP32
  • Accès au webserver ESP32 via http://localhost:9080 (port-forward Wokwi)
  • Licence : gratuit pour open-source (nécessite un token API gratuit)

Architecture envisagée (sous-dossier emulator/) :

emulator/
  wokwi.toml      # pointe vers ../.pio/build/kc868_a2/firmware.bin
  diagram.json    # schéma KC868-A2 : relais, DI, RS485 stub
  README.md       # instructions lancement

Commande de lancement : wokwi-cli simulate --timeout 0

Limitation connue

Les registres Modbus RS485 devront être stubés dans diagram.json (composant uart-stub ou script Python injecté via Wokwi API) pour que la lecture Epever renvoie des données simulées. Sans cela, rs485_ok = false et l'historique ne s'alimente pas.

Décision → Implémenté (emulator/)

Solution retenue : QEMU fork Espressif (GPL) + stub Modbus Python + UI 3 volets.

emulator/
├── Dockerfile          # Ubuntu + QEMU Espressif + esptool
├── docker-compose.yml  # volume .pio/build, ports 8888/10080
├── entrypoint.sh       # merge flash, lance stub + UI + QEMU
├── modbus_stub.py      # esclave Modbus RTU, registres Epever simulés
├── server.py           # proxy /api/* + SSE serial + sert UI
└── ui/index.html       # 3 volets : GPIO | webserver iframe | terminal

Lancement : cd emulator && docker compose up --build