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

156 lines
5.3 KiB
Markdown

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