# Méthodes de Calcul Thermique PAC Collective — v2.9.3

## Introduction

Ce document décrit les méthodes de calcul utilisées par le simulateur SolarPac pour le dimensionnement des pompes à chaleur collectives en copropriété. L'objectif est de permettre à un bureau d'études thermique externe de comprendre et valider la logique sans lire le code source.

**Version moteur** : 2.9.3  
**Date de mise à jour** : Janvier 2025

### Historique des versions

| Version | Modifications |
|---------|---------------|
| 2.9.3 | **Full PAC** : Marge de sécurité réduite à 0% par défaut. Le dimensionnement au bin le plus froid (quantile 0,5%) garantit déjà une couverture > 100% vs TrefCold (quantile 1%). L'appoint n'est sollicité que pour les conditions extrêmes hors scénario météo. |
| 2.9.2 | **Doctrine Full PAC** : Le point de dimensionnement est désormais le centre du bin le plus froid (quantile 0,5%) au lieu de TrefCold (quantile 1%). Cela garantit 100% de couverture PAC sur TOUT le scénario météo, supprimant l'appoint des coûts énergétiques nominaux. |
| 2.9.1 | **Recalibrage dégivrage** : Pénalités ajustées aux performances PAC modernes (6%/5%/4%/3% selon altitude). Suppression de la pénalité cyclage (non justifiée pour PAC inverter). |
| 2.7.1 | **Correction critique** : L'exclusion ECS est maintenant faite **en amont** lors de la génération des bins (chaleurPourBinsDimensionnement). |
| 2.7.0 | **Anti-surdimensionnement** : Séparation stricte Chauffage/ECS dans P2 (DJU). |
| 2.6.2 | Patch V8 : djuBase depuis moteur (source de vérité), phrase "bouclier" BE dans annexe |

---

## A) Méthode Climatique

### Principe
Utilisation de **bacs de température** (méthode EN 14825 / standard BET thermique) pour intégrer les besoins.

### NOUVEAUTÉ v2.6 : Détection automatique du périmètre des bacs

Le moteur détecte automatiquement si les bacs représentent :
- **Année complète (~8760h)** → SCOP annuel, comparable aux valeurs réglementaires
- **Saison de chauffe (2500-8000h)** → SCOP sur période de chauffe (non annualisé)
- **Périmètre atypique** → Warning + interprétation prudente

| Somme heures | Périmètre | Interprétation SCOP |
|--------------|-----------|---------------------|
| 8200-9100h | Année complète | SCOP annuel |
| 2500-8200h | Saison de chauffe | SCOP saison (non annualisé) |
| < 2500h | Atypique | Warning + prudence |
| > 9500h | Atypique | Warning + prudence |

### Règle d'arrêt chauffage mi-saison + hystérésis bins (v2.5)
- **Seuil d'arrêt** : 15°C en plaine, 14°C en montagne (occupation hivernale)
- **Seuil de reprise** : 13°C

#### Hystérésis par facteur de chauffe
Au lieu d'un skip brutal des bins au-dessus du seuil, un **facteur linéaire** est appliqué :

```
if Text >= heatingStopTemp → factor = 0 (pas de chauffage)
if Text <= heatingRestartTemp (13°C) → factor = 1 (chauffage plein)
else → factor = (heatingStopTemp - Text) / (heatingStopTemp - 13)
```

**Exemple plaine (seuil 15°C)** :
- Bin à 12°C : factor = 1.0 → 100% chaleur
- Bin à 14°C : factor = (15-14)/(15-13) = 0.5 → 50% chaleur
- Bin à 15°C : factor = 0 → 0% chaleur

### Pénalité cyclage (v2.9.1 - SUPPRIMÉE)
La pénalité cyclage de 5% sur le COP au-dessus de 7°C a été **supprimée** car elle n'est plus justifiée pour les PAC inverter modernes. Les compresseurs à vitesse variable s'adaptent à la charge sans cycles marche/arrêt fréquents.

### Sanity checks v2.6
| Check | Condition | Action |
|-------|-----------|--------|
| Périmètre heures | < 2500h ou > 9500h | Warning fort |
| Bins non triés | Text non croissant | Warning + recommandation |
| Doublons température | Même Text × plusieurs bins | Warning + agrégation recommandée |
| Heures totales = 0 | Aucune donnée | Alerte bloquante |
| Chaleur totale = 0 | Aucun besoin | Warning |
| LWT hors plage | < 30°C ou > 70°C | Warning |
| Tbase hors plage | > 0°C ou < -25°C | Warning |

### Base DJU selon altitude
| Altitude | Base DJU | Justification |
|----------|----------|---------------|
| < 800m (plaine) | 18°C | Standard réglementaire |
| 800-1200m | 19°C | Montagne basse |
| > 1200m | 20°C | Haute montagne / stations |

**Source de vérité (v2.6.2)** : La base DJU affichée dans l'annexe technique est toujours celle calculée par le moteur thermique (`climate.djuBase`). Aucune déduction indirecte depuis `altitudeCategory` n'est utilisée quand la valeur moteur est disponible, garantissant une cohérence totale entre calculs et rapports.

---

## B) Méthode Puissance

### Algorithme de consensus (4 méthodes)

Le dimensionnement repose sur la convergence de 4 méthodes indépendantes :

1. **P1 (Bins/Météo)** : Extrapolation de la signature thermique vers Tbase
   - Régression linéaire sur les 4 bins les plus froids
   - Pente bornée pour éviter les valeurs délirantes

2. **P2 (DJU/Facture)** : Dérivation depuis la consommation historique
   - Formule : `P = Q_utile × ΔT_design / (DJU × 24)`
   - Q_utile = consommation × rendement chaudière

3. **P3 (W/m²)** : Garde-fou typologique
   - Valeurs de référence selon isolation, âge, DPE
   - Plage : 30-90 W/m² selon typologie

4. **P4 (BE)** : Données bureau d'études
   - Si besoins validés par BE disponibles, inclus dans le consensus
   - Ne remplace pas les autres méthodes (confirme la convergence)

### Dimensionnement final

- **Point de base** : température minimale climatique (Tbase: -7 à -25°C)
- **Marge de sécurité** : paramétrable 0-100% (défaut 20%)
- **Optimisation n-1 modules** : 
  - Déficit acceptable < 12% par rapport au **besoin** (pMinRetenu)
  - Non par rapport à P_install qui inclut la marge
  - Évite le surdimensionnement excessif

### Seuil CEE 400 kW
Si puissance > 400 kW, optimisation pour rester sous seuil CEE si déficit acceptable.

---

## C) Méthode SCOP

### Calcul COP brut par bin

- **Source** : Tables constructeur Daikin EWYE070CZN-A2
- **Interpolation** : Bilinéaire (Text × LWT)
- **Convention dégivrage v2.4** : COP brut calculé **SANS** pénalité de dégivrage
  → Le waterfall applique la pénalité séparément (anti double-comptage)

### Loi d'eau multi-segments v2.5 — SOURCE DE VÉRITÉ

#### Règle critique : lwtAtBase = source de vérité

La LWT au point froid est **toujours `lwtAtBase`** (valeur utilisée pour le dimensionnement et le point critique), **pas `optimizedWaterLaw.lwtMax`**.

**Pourquoi ?**
- Cohérence : le SCOP doit refléter le même régime que le dimensionnement
- Anti-optimisme : si forceLWT65=true, le SCOP doit être calculé avec LWT=65°C au point froid

#### Points de la loi d'eau

Les points sont issus de `optimizedWaterLaw` (pas hardcodés) :
- **textCold** = `optimizedWaterLaw.textCold` (ex: Tbase = -12°C)
- **textMid** = `optimizedWaterLaw.textMid` (ex: +2°C)
- **textWarm** = `optimizedWaterLaw.textWarm` (ex: +12°C)

Les LWT correspondantes :
- **lwtCold** = `lwtAtBase` ← SOURCE DE VÉRITÉ (pas optimizedWaterLaw.lwtMax)
- **lwtMid** = `optimizedWaterLaw.lwtMid`
- **lwtWarm** = `optimizedWaterLaw.lwtWarm`

#### Plateau au-dessus de textWarm
Au-dessus de textWarm et jusqu'au seuil d'arrêt chauffage, la LWT reste constante à `lwtWarm`.

**Valeurs typiques :**
| Régime | LWT cold | LWT mid | LWT warm |
|--------|----------|---------|----------|
| Plancher | 40°C | 35°C | 28°C |
| Radiateurs HT conservateur | **65°C** | 46°C | 35°C |
| Radiateurs HT (montagne optimisé) | 50°C | 42°C | 30°C |

### Waterfall de pénalités (v2.9 — périmètre départ production)

```
COP catalogue (6.00 @7°C/35°C)
    ↓ Intégration bins (climat réel + loi d'eau via Text × LWT)
COP brut pondéré (~2.5-3.5)
    ↓ Dégivrage (5-10% selon altitude)
= SCOP final (~2.3-3.2)
```

**Principe fondamental :** On compare les coûts d'énergie sur des périmètres identiques (départ production = sortie chaudière/PAC).

**Seule pénalité applicable : Dégivrage**
- C'est une consommation électrique additionnelle propre à la PAC
- Variable selon altitude (air sec = moins de givre)

**Exclusions (même périmètre avant/après) :**
- **Loi d'eau** : déjà intégrée dans le COP par bin via l'interpolation Daikin (Text × LWT)
- **Pertes réseau** : identiques avant (chaudière) et après (PAC) → neutres pour la comparaison
- **Pertes ballon** : identiques avant/après → neutres pour la comparaison

### Facteurs de dégivrage selon altitude (v2.9.1 recalibrés)

Ces valeurs reflètent les performances des PAC modernes (inverter, R-454C) avec dégivrage optimisé.

| Altitude | Pénalité | Justification |
|----------|----------|---------------|
| < 400m (humide) | 6% | PAC moderne, climat humide (côtes, IDF) |
| < 800m (standard) | 5% | Conditions standards, inverter efficace |
| 800-1200m | 4% | Humidité réduite, dégivrage modéré |
| > 1200m | 3% | Air sec, givre limité |

---

## D) Méthode ECS

### Dimensionnement conservateur hiver (v2.4)

- **Température ECS hiver** : `clamp(Tbase + 8°C, -7°C, +2°C)`
  - Ex: Tbase = -17°C → Text_ECS = -7°C (pas 0°C trop optimiste)
- **LWT ECS** : 60°C minimum (anti-légionelle obligatoire)
- **Capacité évaluée** au point froid pour garantir recharge rapide

### Justification du surdimensionnement ECS
- Garantir la continuité de service
- Permettre des relances rapides après pointes
- Limiter le recours aux résistances électriques
- Couvrir les cycles anti-légionelle hebdomadaires

---

## E) Limites Connues (Honnêteté BET)

### Hypothèses simplificatrices
- **Inertie bâtiment** : non modélisée finement (hypothèse quasi-statique)
- **Apports solaires/internes** : moyennés, non détaillés heure par heure
- **Usage réel** : dépendant des occupants (consigne, ventilation, équipements)

### Données d'entrée
- **Météo** : distribution type ajustée ΔT, pas données météo réelles du site
- **Réseau hydraulique** : pertes estimées forfaitairement selon vétusté déclarée
- **DPE** : si postes non détaillés, répartition estimée

### Précision attendue
- **Puissance** : ±15% (selon qualité des données d'entrée)
- **SCOP** : ±15% (selon conditions réelles du site)
- **Économies** : indicatives, sensibles aux prix de l'énergie

---

## F) Références

- **EN 14825** : Norme européenne pour le calcul du SCOP saisonnier
- **RT2012 / RE2020** : Réglementation thermique française
- **Tables Daikin** : Données constructeur EWYE070CZN-A2
- **Retours terrain** : Installateurs montagne Savoie/Haute-Savoie

---

## G) Changelog

### v2.6.0 (Janvier 2025)
- **Détection automatique périmètre bacs** : FULL_YEAR / HEATING_SEASON / UNKNOWN
- **Interprétation SCOP adaptée** : "SCOP annuel" vs "SCOP saison de chauffe"
- **Sanity checks complets** :
  - Bins non triés → warning + recommandation tri
  - Doublons température → warning + recommandation agrégation
  - Heures/chaleur nulles → alerte ou warning
  - Bornes lwtAtBase (30-70°C) et Tbase (0 à -25°C) → warning si hors plage
- **binsCoverage exposé** : type, sumHeures, label, scopLabel dans le résultat moteur
- **6 nouveaux tests Vitest** : détection périmètre, robustesse bins

### v2.5.0 (Janvier 2025)
- **lwtAtBase = source de vérité** : LWT au point froid toujours = lwtAtBase (cohérence dimensionnement + point critique)
- **Points loi d'eau exacts** : textCold/textMid/textWarm depuis optimizedWaterLaw (pas hardcodés)
- **Hystérésis bins par facteur de chauffe** : facteur linéaire [0-1] entre 13°C et seuil d'arrêt (approximation défendable)
- **Sanity checks bins** : warning si somme heures ≠ 8760h ± 200h
- **4 nouveaux tests Vitest** : lwtAtBase source de vérité, hystérésis bins, sanity check heures

### v2.4.0 (Janvier 2025)
- Loi d'eau multi-segments (3 points cold/mid/warm)
- Règle d'arrêt chauffage mi-saison + hystérésis
- ECS hivernal clampé [-7°C ; +2°C]
- networkAge exposé comme paramètre utilisateur
- Pénalité cyclage charge partielle (-5% COP > 7°C)
- Tests de monotonicité (COP/LWT, climat, modules)

### v2.3.0
- Convention dégivrage anti double-comptage
- methodBE utilise climate.djuBase
- Extrapolation bins sécurisée (pente bornée)
- Optimisation n-1 vs besoin (pas vs P_install)

### v2.2.0
- Unification LWT (forceLWT65 + allowLowerWaterTemp)
- DJU base variable selon altitude
- COP brut pondéré par bins (non constant)

---

*Document généré par SolarPac — Pour validation BET externe*
