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

