a8f0d6ccba
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>
156 lines
5.3 KiB
Markdown
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`
|
|
|