API Diagramme PH - Projet Complet

API REST pour la génération de diagrammes Pression-Enthalpie (PH) et calculs thermodynamiques frigorifiques avancés

Python FastAPI Docker AWS


📋 Vue d'ensemble

Cette API permet de:

  • Générer des diagrammes PH interactifs (Plotly) ou statiques (Matplotlib)
  • Calculer les propriétés thermodynamiques des réfrigérants
  • Analyser les cycles frigorifiques (COP, puissance, rendements)
  • Supporter les cycles avec économiseur
  • Calculer la puissance entre deux points d'un cycle
  • Supporter 17 réfrigérants différents

Réfrigérants supportés

R12, R22, R32, R134a, R290, R404A, R410A, R452A, R454A, R454B, R502, R507A, R513A, R515B, R744 (CO2), R1233zd, R1234ze


🏗️ Architecture du système

graph TB
    subgraph "Client Layer"
        A[Jupyter Notebook]
        B[React Application]
        C[Mobile App]
        D[CLI Tools]
    end
    
    subgraph "AWS Cloud"
        E[Route 53 DNS]
        F[CloudFront CDN]
        G[Application Load Balancer]
        
        # API Diagramme PH - Project Overview (English)

        This repository contains a FastAPI-based REST API for generating Pressure-Enthalpy (PH) diagrams
        and performing advanced refrigeration thermodynamic calculations.

        For the full French documentation, see: `README_fr.md` (converted from the original README).

        Badges
        - Python 3.12+
        - FastAPI
        - Docker-ready

        Quick start
        - Install dependencies and run with uvicorn (see documentation in the `docs/` folder).

        Repository structure (short)
        - `app/` : application code
        - `libs/` : native libraries (dll/ and so/)
        - `scripts/` : helper scripts
        - `docs/` : extra documentation

        If you need the original French README, open `README_fr.md`.

pip install -r requirements.txt

# Copier et configurer .env
cp .env.example .env

# Lancer l'API
uvicorn app.main:app --reload --port 8000

Avec Docker

# Build et lancement
docker-compose -f docker/docker-compose.yml up --build

# API disponible sur http://localhost:8000
# Documentation sur http://localhost:8000/docs

📚 Documentation

Endpoints principaux

Endpoint Méthode Description
/api/v1/health GET Vérification santé de l'API
/api/v1/refrigerants GET Liste des réfrigérants disponibles
/api/v1/diagram/generate POST Génération diagramme PH
/api/v1/calculations/cycle POST Calculs cycle frigorifique
/api/v1/calculations/power POST Calcul puissance entre 2 points
/api/v1/properties/calculate POST Propriétés à un point

Exemple d'utilisation

Python

import requests

# Générer un diagramme PH
response = requests.post(
    "http://localhost:8000/api/v1/diagram/generate",
    json={
        "refrigerant": "R134a",
        "output_format": "plotly_json",
        "points": [
            {
                "type": "PT",
                "pressure": 500000,
                "temperature": 5,
                "label": "Évaporateur",
                "order": 1
            },
            {
                "type": "PT",
                "pressure": 1500000,
                "temperature": 80,
                "label": "Compresseur",
                "order": 2
            }
        ],
        "diagram_options": {
            "show_isotherms": True,
            "isotherm_step": 10
        }
    }
)

data = response.json()
print(f"Success: {data['success']}")
# Utiliser data['data']['plotly_figure'] avec Plotly

JavaScript/React

const response = await fetch('http://localhost:8000/api/v1/diagram/generate', {
  method: 'POST',
  headers: {'Content-Type': 'application/json'},
  body: JSON.stringify({
    refrigerant: 'R134a',
    output_format: 'plotly_json',
    points: [
      {type: 'PT', pressure: 500000, temperature: 5, order: 1}
    ]
  })
});

const data = await response.json();
// Afficher avec Plotly.react(divId, data.data.plotly_figure)

cURL

curl -X POST http://localhost:8000/api/v1/diagram/generate \
  -H "Content-Type: application/json" \
  -d '{
    "refrigerant": "R134a",
    "output_format": "matplotlib_png",
    "points": [
      {"type": "PT", "pressure": 500000, "temperature": 5}
    ]
  }'

🧪 Tests

# Installer dépendances de test
pip install -r requirements-dev.txt

# Lancer tous les tests
pytest

# Avec couverture
pytest --cov=app --cov-report=html

# Tests d'intégration uniquement
pytest tests/test_api/

# Tests unitaires uniquement
pytest tests/test_core/

🐳 Déploiement Docker

Build image production

docker build -f docker/Dockerfile -t diagram-ph-api:latest .

Push vers AWS ECR

# Login ECR
aws ecr get-login-password --region eu-west-1 | \
  docker login --username AWS --password-stdin \
  123456789012.dkr.ecr.eu-west-1.amazonaws.com

# Tag et push
docker tag diagram-ph-api:latest \
  123456789012.dkr.ecr.eu-west-1.amazonaws.com/diagram-ph-api:latest
docker push 123456789012.dkr.ecr.eu-west-1.amazonaws.com/diagram-ph-api:latest

☁️ Déploiement AWS Elastic Beanstalk

Préparation (une seule fois)

# Installer EB CLI
pip install awsebcli

# Initialiser EB
eb init -p docker -r eu-west-1 diagram-ph-api

# Créer environnement
eb create diagram-ph-api-prod \
  --instance-type t3.medium \
  --scale 2

Déploiement

# Déploiement automatique avec script
chmod +x deployment/scripts/deploy.sh
./deployment/scripts/deploy.sh

# Vérifier le statut
eb status

# Voir les logs
eb logs --stream

Rollback

chmod +x deployment/scripts/rollback.sh
./deployment/scripts/rollback.sh

🎯 Fonctionnalités Frigorifiques

Calculs supportés

1. Coefficient de Performance (COP)

COP_froid = Q_évap / W_comp
COP_chaud = Q_cond / W_comp

2. Puissances

Q_évap = ṁ × (h_sortie_évap - h_entrée_évap)
Q_cond = ṁ × (h_entrée_cond - h_sortie_cond)
W_comp = ṁ × (h_sortie_comp - h_entrée_comp)

3. Rendements

  • Isentropique: η_is = (h_sortie_isentropique - h_entrée) / (h_sortie_réel - h_entrée)
  • Volumétrique: η_vol = Volume_aspiré_réel / Volume_balayé
  • Mécanique: η_méca = Puissance_utile / Puissance_absorbée

4. Cycle avec économiseur

Amélioration typique: 5-15% de COP en plus

Principe:

  • Sous-refroidissement du liquide avant détente principale
  • Injection de vapeur flash au compresseur (pression intermédiaire)
  • Réduction de la quantité de liquide à évaporer

📊 Performance

Objectifs

Métrique Cible Status
Latence P50 < 200ms
Latence P95 < 500ms
Latence P99 < 1000ms
Throughput 100 req/s/instance
Disponibilité > 99% 🔄
Taux d'erreur < 0.1% 🔄

Optimisations

  • Cache multi-niveaux: LRU + TTL pour propriétés thermodynamiques
  • Pré-calcul: Courbes de saturation au démarrage
  • Compression: Gzip automatique pour réponses volumineuses
  • Parallélisation: Asyncio pour I/O

💰 Coûts AWS estimés

Configuration Production Standard

Service Configuration Coût/mois
EC2 (2x t3.medium) 2 vCPU, 4 GB RAM ~$60
Application Load Balancer ~$20
Data Transfer 100 GB ~$9
CloudWatch Logs + Métriques ~$5
TOTAL ~$94/mois

🔒 Sécurité

  • HTTPS obligatoire (certificat SSL via AWS)
  • Rate limiting (100 req/minute par IP)
  • CORS configuré
  • Validation stricte des inputs (Pydantic)
  • Logs d'audit complets
  • Pas d'eval() ou exec() sur inputs utilisateur

📈 Monitoring

Métriques CloudWatch

  • Latence des requêtes API
  • Taux d'erreur par endpoint
  • Utilisation CPU/RAM
  • Nombre de requêtes par réfrigérant
  • Cache hit/miss ratio

Logs structurés

Format JSON pour analyse automatisée:

{
  "timestamp": "2025-10-18T12:30:00Z",
  "level": "INFO",
  "message": "Diagram generated",
  "refrigerant": "R134a",
  "duration_ms": 245,
  "output_format": "plotly_json"
}

🤝 Contribution

Processus

  1. Fork le projet
  2. Créer une branche feature (git checkout -b feature/amazing-feature)
  3. Commit les changements (git commit -m 'Add amazing feature')
  4. Push vers la branche (git push origin feature/amazing-feature)
  5. Ouvrir une Pull Request

Standards de code

# Formatage
black app/ tests/

# Linting
ruff check app/ tests/

# Type checking
mypy app/

📝 Licence

Ce projet est sous licence MIT. Voir le fichier LICENSE pour plus de détails.


👥 Auteurs


🙏 Remerciements

  • FastAPI pour le framework web performant
  • Plotly et Matplotlib pour la visualisation
  • AWS pour l'infrastructure cloud
  • La communauté Python pour les bibliothèques

📞 Support


🗺️ Roadmap

Version 1.1 (Q1 2026)

  • Support de réfrigérants supplémentaires
  • Calculs de cycles multi-étagés
  • Export PDF des diagrammes
  • API GraphQL en parallèle de REST

Version 1.2 (Q2 2026)

  • Machine learning pour optimisation de cycles
  • Comparaison automatique de réfrigérants
  • Calculs de dimensionnement d'équipements
  • Application mobile native

Version 2.0 (Q3 2026)

  • Simulation dynamique de cycles
  • Intégration BIM/CAD
  • Marketplace de cycles optimisés
  • Certification énergétique automatique

Dernière mise à jour: 18 octobre 2025 Version: 1.0.0 Status: 🚀 Prêt pour implémentation

Description
No description provided
Readme 477 MiB
Languages
Python 65.4%
TypeScript 33.6%
Dockerfile 0.4%
PowerShell 0.2%
CSS 0.2%
Other 0.2%