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>
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é
- État batterie + load + kWh (ajout dans la séquence Modbus existante)
- 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
.bincompilé par PlatformIO + un fichierwokwi.tomletdiagram.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