# Plan d'extension — Pompe à chaleur, ECS, Gestion d'énergie

## Vue d'ensemble

L'extension suit l'architecture existante du plugin :

```
energypluginnymea.cpp (init)
    ├── SmartChargingManager   (existant — VE)
    ├── HeatPumpManager        (NOUVEAU — PAC + ECS)
    ├── EnergyPriorityManager  (NOUVEAU — allocation puissance)
    └── NymeaEnergyJsonHandler (étendu — nouvelles méthodes RPC)
```

---

## Fichiers à créer / modifier

### Fichiers NOUVEAUX

| Fichier | Rôle |
|---|---|
| `energyplugin/heatpumpmanager.h/.cpp` | Wrapper PAC + ECS, detection via ThingManager |
| `energyplugin/energyprioritymanager.h/.cpp` | Allocation de puissance par priorité |

### Fichiers MODIFIÉS

| Fichier | Modification |
|---|---|
| `energyplugin/energypluginnymea.cpp` | `init()` instancie les 2 nouveaux managers |
| `energyplugin/nymeaenergyjsonhandler.h` | Ajout déclarations Q_INVOKABLE + signals |
| `energyplugin/nymeaenergyjsonhandler.cpp` | Enregistrement + implémentation RPC |
| `energyplugin/energyplugin.pri` | Ajout des nouveaux .h/.cpp aux HEADERS/SOURCES |
| Plugin d'intégration ETM (JSON) | Ajout ThingClasses heatPump + domesticHotWater |

---

## Étape 1 — Définir les ThingClasses dans le plugin d'intégration ETM

Le fichier `extension/heatpump_dhw_thingclasses.json` contient les définitions JSON
complètes à intégrer dans le fichier `.json` du plugin d'intégration ETM.

### UUIDs à retenir

| Thing | UUID ThingClass |
|---|---|
| Pompe à chaleur | `b5a8f3d2-4c1e-4a9f-8b2d-3e6c0f1d5a7b` |
| ECS (Eau Chaude Sanitaire) | `c7d2e4f1-5b3a-4c0d-9e6f-2a4b7c1d3e5f` |

### États PAC

| State | UUID | Type | Writable |
|---|---|---|---|
| connected | `c3d4e5f6-a7b8-4c9d-0e1f-2a3b4c5d6e7f` | bool | non |
| power | `d4e5f6a7-b8c9-4d0e-1f2a-3b4c5d6e7f8a` | bool | **oui** |
| mode | `e5f6a7b8-c9d0-4e1f-2a3b-4c5d6e7f8a9b` | QString | **oui** |
| targetTemperature | `f6a7b8c9-d0e1-4f2a-3b4c-5d6e7f8a9b0c` | double [15–65°C] | **oui** |
| currentTemperature | `a7b8c9d0-e1f2-4a3b-4c5d-6e7f8a9b0c1d` | double | non |
| outdoorTemperature | `b8c9d0e1-f2a3-4b4c-5d6e-7f8a9b0c1d2e` | double | non |
| currentPower | `c9d0e1f2-a3b4-4c5d-6e7f-8a9b0c1d2e3f` | double (W) | non |
| cop | `d0e1f2a3-b4c5-4d6e-7f8a-9b0c1d2e3f4a` | double | non |
| defrostActive | `e1f2a3b4-c5d6-4e7f-8a9b-0c1d2e3f4a5b` | bool | non |
| errorCode | `f2a3b4c5-d6e7-4f8a-9b0c-1d2e3f4a5b6c` | uint | non |

### Actions PAC

| Action | UUID | Params |
|---|---|---|
| setMode | `a3b4c5d6-e7f8-4a9b-0c1d-2e3f4a5b6c7d` | mode: heating/cooling/auto/standby |
| setTargetTemperature | `c5d6e7f8-a9b0-4c1d-2e3f-4a5b6c7d8e9f` | targetTemperature: double |

### États ECS

| State | UUID | Type | Writable |
|---|---|---|---|
| connected | `c1d2e3f4-a5b6-4c7d-8e9f-0a1b2c3d4e5f` | bool | non |
| power | `d2e3f4a5-b6c7-4d8e-9f0a-1b2c3d4e5f6a` | bool | **oui** |
| targetTemperature | `e3f4a5b6-c7d8-4e9f-0a1b-2c3d4e5f6a7b` | double [40–75°C] | **oui** |
| currentTemperature | `f4a5b6c7-d8e9-4f0a-1b2c-3d4e5f6a7b8c` | double | non |
| boostMode | `a5b6c7d8-e9f0-4a1b-2c3d-4e5f6a7b8c9d` | bool | **oui** |
| currentPower | `b6c7d8e9-f0a1-4b2c-3d4e-5f6a7b8c9d0e` | double (W) | non |

### Actions ECS

| Action | UUID | Params |
|---|---|---|
| triggerBoost | `d8e9f0a1-b2c3-4d4e-5f6a-7b8c9d0e1f2a` | duration: uint (15–120 min) |

---

## Étape 2 — Intégrer HeatPumpManager dans le plugin energy

### Dans `energyplugin.pri` — ajouter :

```qmake
HEADERS += \
    $$PWD/heatpumpmanager.h \
    $$PWD/energyprioritymanager.h \

SOURCES += \
    $$PWD/heatpumpmanager.cpp \
    $$PWD/energyprioritymanager.cpp \
```

### Dans `energypluginnymea.cpp` — `init()` :

```cpp
// [AJOUT] Après la création de SmartChargingManager

HeatPumpManager *heatPumpManager = new HeatPumpManager(
    energyManager(), thingManager(), this);

EnergyPriorityManager *priorityManager = new EnergyPriorityManager(
    energyManager(), thingManager(), this);

// Passer les nouveaux managers au JSON handler (modifier sa signature)
jsonRpcServer()->registerExperienceHandler(
    new NymeaEnergyJsonHandler(spotMarketManager, chargingManager,
                               heatPumpManager, priorityManager, this),
    0, 9);  // Version incrémentée à 9
```

---

## Étape 3 — Nouvelles méthodes API JSON-RPC

### Méthodes Pompe à chaleur

| Méthode | Description |
|---|---|
| `NymeaEnergy.GetHeatPumps` | Liste PAC + états |
| `NymeaEnergy.SetHeatPumpPower` | On/off |
| `NymeaEnergy.SetHeatPumpMode` | Mode heating/cooling/auto/standby |
| `NymeaEnergy.SetHeatPumpTargetTemperature` | Consigne température |

### Méthodes ECS

| Méthode | Description |
|---|---|
| `NymeaEnergy.GetDHWDevices` | Liste ECS + états |
| `NymeaEnergy.SetDHWPower` | On/off |
| `NymeaEnergy.SetDHWTargetTemperature` | Consigne température [40–75°C] |
| `NymeaEnergy.TriggerDHWBoost` | Mode boost (15–120 min) |

### Méthodes Gestion d'énergie

| Méthode | Description |
|---|---|
| `NymeaEnergy.GetManagedLoads` | Toutes les charges avec priorité + puissance |
| `NymeaEnergy.SetLoadPriority` | Modifier la priorité (0=Critical → 4=Optional) |
| `NymeaEnergy.SetAllocatedPower` | Forcer puissance allouée à une charge |
| `NymeaEnergy.GetTotalAvailablePower` | Puissance totale disponible |
| `NymeaEnergy.SetTotalAvailablePower` | Modifier la puissance totale disponible |

### Nouvelles notifications push

| Notification | Déclencheur |
|---|---|
| `NymeaEnergy.HeatPumpStateChanged` | Changement état PAC (température, mode…) |
| `NymeaEnergy.DHWStateChanged` | Changement état ECS |
| `NymeaEnergy.ManagedLoadChanged` | Changement priorité / puissance allouée |
| `NymeaEnergy.TotalAvailablePowerChanged` | Changement puissance totale disponible |

---

## Étape 4 — Logique EnergyPriorityManager

### Algorithme de rééquilibrage (rebalance())

```
1. Calculer la puissance disponible = totalAvailablePower - reservedForCritical
2. Trier les charges par priorité croissante (Critical d'abord)
3. Pour chaque charge (par priorité) :
   a. Si puissance disponible ≥ requestedPower → allouer requestedPower, active=true
   b. Sinon si puissance disponible > 0 → allouer le disponible, active=true (throttle)
   c. Sinon → allouer 0W, active=false (couper)
   d. Déduire de la puissance disponible
4. Émettre managedLoadChanged() pour chaque charge modifiée
5. Appliquer les actions sur les Things correspondants
```

### Priorités recommandées par type de charge

| Charge | Priorité recommandée |
|---|---|
| Chauffage PAC hiver | Critical (0) |
| ECS (sécurité légionellose) | Critical (0) |
| Chauffage PAC standard | High (1) |
| ECS normale | Normal (2) |
| Recharge VE mode Normal | Normal (2) |
| Recharge VE mode Eco | Low (3) |
| ECS boost | Low (3) |
| Recharge VE spot market | Optional (4) |

---

## Récapitulatif des UUIDs à générer

```
Plugin d'intégration ETM — nouvelles ThingClasses :

HEAT_PUMP_THING_CLASS_ID     = b5a8f3d2-4c1e-4a9f-8b2d-3e6c0f1d5a7b
DHW_THING_CLASS_ID           = c7d2e4f1-5b3a-4c0d-9e6f-2a4b7c1d3e5f

États PAC (StateTypes) :
HP_STATE_CONNECTED           = c3d4e5f6-a7b8-4c9d-0e1f-2a3b4c5d6e7f
HP_STATE_POWER               = d4e5f6a7-b8c9-4d0e-1f2a-3b4c5d6e7f8a
HP_STATE_MODE                = e5f6a7b8-c9d0-4e1f-2a3b-4c5d6e7f8a9b
HP_STATE_TARGET_TEMP         = f6a7b8c9-d0e1-4f2a-3b4c-5d6e7f8a9b0c
HP_STATE_CURRENT_TEMP        = a7b8c9d0-e1f2-4a3b-4c5d-6e7f8a9b0c1d
HP_STATE_OUTDOOR_TEMP        = b8c9d0e1-f2a3-4b4c-5d6e-7f8a9b0c1d2e
HP_STATE_CURRENT_POWER       = c9d0e1f2-a3b4-4c5d-6e7f-8a9b0c1d2e3f
HP_STATE_COP                 = d0e1f2a3-b4c5-4d6e-7f8a-9b0c1d2e3f4a
HP_STATE_DEFROST_ACTIVE      = e1f2a3b4-c5d6-4e7f-8a9b-0c1d2e3f4a5b
HP_STATE_ERROR_CODE          = f2a3b4c5-d6e7-4f8a-9b0c-1d2e3f4a5b6c

Actions PAC (ActionTypes) :
HP_ACTION_SET_MODE           = a3b4c5d6-e7f8-4a9b-0c1d-2e3f4a5b6c7d
HP_ACTION_PARAM_MODE         = b4c5d6e7-f8a9-4b0c-1d2e-3f4a5b6c7d8e
HP_ACTION_SET_TARGET_TEMP    = c5d6e7f8-a9b0-4c1d-2e3f-4a5b6c7d8e9f
HP_ACTION_PARAM_TARGET_TEMP  = d6e7f8a9-b0c1-4d2e-3f4a-5b6c7d8e9f0a

États ECS (StateTypes) :
DHW_STATE_CONNECTED          = c1d2e3f4-a5b6-4c7d-8e9f-0a1b2c3d4e5f
DHW_STATE_POWER              = d2e3f4a5-b6c7-4d8e-9f0a-1b2c3d4e5f6a
DHW_STATE_TARGET_TEMP        = e3f4a5b6-c7d8-4e9f-0a1b-2c3d4e5f6a7b
DHW_STATE_CURRENT_TEMP       = f4a5b6c7-d8e9-4f0a-1b2c-3d4e5f6a7b8c
DHW_STATE_BOOST_MODE         = a5b6c7d8-e9f0-4a1b-2c3d-4e5f6a7b8c9d
DHW_STATE_CURRENT_POWER      = b6c7d8e9-f0a1-4b2c-3d4e-5f6a7b8c9d0e

Actions ECS (ActionTypes) :
DHW_ACTION_TRIGGER_BOOST     = d8e9f0a1-b2c3-4d4e-5f6a-7b8c9d0e1f2a
DHW_ACTION_PARAM_DURATION    = e9f0a1b2-c3d4-4e5f-6a7b-8c9d0e1f2a3b
```
