# 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 | ```cpp // 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` ```cpp 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`