Mock MK6 v2.2.0 — Guide
Présentation
Stub REST des contrôleurs MK6 Synapse, conforme au swagger MC2 v1.0.5. Simule les 5 MK6 ROUVAI (12 PRM) avec données de monitoring réalistes (vent, puissance, états). Mode dual : mock local ou supervision production.
Démarrage rapide
pip install fastapi uvicorn httpx markdown
# Instance unique
python mock_mk6.py --port 9001
# HTTPS auto-signé
python mock_mk6.py --port 9001 --ssl --ssl-host 20.19.89.53
# 5 instances ROUVAI (un terminal par instance)
for port in 9001 9002 9003 9004 9005; do
python mock_mk6.py --port $port &
done
Configuration
Cascade de priorités
CLI args → ENV vars → Fichier config "runtime" → Defaults hardcodés
(priorité max) (priorité min)
Paramètres configurables
| Paramètre | CLI | ENV | Config runtime | Default |
|---|---|---|---|---|
| Chemin config | --config /path |
MOCK_MK6_CONFIG_PATH |
— | ./mk6_targets.json |
| Mode supervision | --mode production |
MOCK_MK6_MODE |
runtime.mode |
mock |
| Port | --port 9001 |
— | — | 9001 |
Fichier mk6_targets.json
Contient les cibles production (IP réelles des MK6) et une section "runtime" optionnelle :
{
"runtime": {
"mode": "mock"
},
"mode": "mock",
"production": {
"ROU1.1": { "ip": "10.0.1.1", "port": 8443, "site": "Rougemont1_PDL1" },
"ROU1.2": { "ip": "10.0.1.2", "port": 8443, "site": "Rougemont1_PDL3" }
}
}
Exemple Docker Compose
services:
mock-mk6-rou1-1:
image: python:3.12-slim
command: python mock_mk6.py --port 9001 --ssl
environment:
- MOCK_MK6_MODE=mock
ports:
- "9001:9001"
Modes de fonctionnement
Mode mock (défaut)
Les MK6 sont provisionnés dynamiquement via POST /mock/mk6/{id}/provision.
Les données de monitoring sont simulées (vent, puissance, états).
Toutes les écritures (POST, PATCH, DELETE) sont autorisées.
Mode production (supervision)
Les données sont proxiées depuis les vrais MK6 listés dans mk6_targets.json.
Toutes les écritures sont bloquées (HTTP 403) — sécurité mode supervision.
API Reference
Endpoints MK6 — swagger MC2 v1.0.5
| Méthode | Endpoint | Description |
|---|---|---|
| POST | /api/v1/mk6/{id}/requests |
Soumettre une consigne (Psetpoint, stop, main_reset) |
| POST | /api/v1/mk6/{id}/requests/batch |
Batch de consignes |
| GET | /api/v1/mk6/{id}/monitoring |
Topologie + state |
| GET | /api/v1/mk6/{id}/monitoring/sites |
Données complètes tous sites |
| GET | /api/v1/mk6/{id}/monitoring/sites/{sycode} |
Données d'un site |
| GET | /api/v1/mk6/{id}/monitoring/planning |
Planning tous sites |
| GET | /api/v1/mk6/{id}/monitoring/planning/{sycode} |
Planning d'un site |
| GET | /api/v1/mk6/{id}/planning |
Planning complet |
| GET | /api/v1/mk6/{id}/planning/{rid} |
Détail consigne |
| PATCH | /api/v1/mk6/{id}/planning/{rid} |
Modifier consigne |
| DELETE | /api/v1/mk6/{id}/planning/{rid} |
Supprimer consigne |
Codes erreur MC2
| Code | Nom | Signification |
|---|---|---|
| 400 | BAD_REQUEST | set invalide |
| 404 | SITE_NOT_FOUND | sycode inconnu |
| 405 | REQUEST_NOT_FOUND | ID consigne inconnu |
| 409 | REQUEST_LOCKED | consigne active, non modifiable |
| 422 | INVALID_TIME_RANGE | end_time ≤ start_time |
| 441 | INVALID_VALUE | psetpoint > pmax |
| 442 | MISSING_FIELD | champ obligatoire absent |
| 443 | CONFIRMATION_REQUIRED | main_reset sans confirm=true |
| 503 | SITE_NOT_ACCESSIBLE | site state=0 |
Endpoints mock (pilotage)
| Méthode | Endpoint | Description |
|---|---|---|
| POST | /mock/mk6/{id}/provision |
Provisionner un MK6 avec ses sites |
| GET | /mock/mk6 |
Lister tous les MK6 provisionnés |
| POST | /mock/mk6/{id}/fault/{sycode} |
Mettre un site en défaut |
| DELETE | /mock/mk6/{id}/fault/{sycode} |
Rétablir un site |
| POST | /mock/mk6/{id}/site-state/{sycode} |
Forcer state (0/1/2) |
| POST | /mock/mk6/{id}/offline\|unreachable\|online |
Contrôle réseau |
| POST | /mock/mk6/{id}/auth |
Activer/désactiver Bearer auth |
| GET | /mock/mk6/{id}/state |
État complet debug |
| POST/GET | /mock/time |
Horloge simulée |
| POST | /mock/time/release |
Libérer l'horloge |
| POST | /mock/reset |
Reset global |
| POST | /mock/mk6/{id}/sites/{sycode}/inject_external |
Injecter contrainte DEIE/SCADA |
| DELETE | /mock/mk6/{id}/sites/{sycode}/inject_external |
Supprimer contrainte externe |
| POST | /mock/mk6/{id}/inject-planning |
Injecter consigne fantôme planning (R3 réconciliation) |
| DELETE | /mock/mk6/{id}/inject-planning |
Purger toutes les consignes fantĂ´mes |
Endpoints debug (console technique)
| Méthode | Endpoint | Description |
|---|---|---|
| GET | /api/v1/debug/requests |
Historique requĂŞtes (avec ?since_id=N) |
| DELETE | /api/v1/debug/requests |
Vider le log |
Endpoints supervision
| Méthode | Endpoint | Description |
|---|---|---|
| GET | /supervision |
Dashboard HTML |
| POST | /supervision/mode |
Basculer mock/production |
| POST | /supervision/reload-config |
Recharger mk6_targets.json |
| GET | /supervision/api/time |
Horloge |
| GET | /supervision/api/inventory |
Inventaire unifié |
| GET | /supervision/api/mk6/{id}/monitoring |
Proxy monitoring |
| GET | /supervision/api/mk6/{id}/planning |
Proxy planning |
Console technique
Panneau pliable en bas de la page supervision. Capture toutes les requĂŞtes
/api/v1/ et /mock/ avec :
- Timestamp, méthode, path, query params
- Request body et response body complets (jamais tronqués)
- Bouton đź“‹ Copier sur chaque bloc JSON
- Infos clés en ligne repliée : pour POST (Psetpoint, stop, preset, site), pour PATCH (state, psetpoint, dates)
- Filtres : source (API/browser), endpoints, MK6, sites
- Groupement par instance (mode multi-port)
- Export texte de la console
Responsive
La page supervision s'adapte aux écrans < 1100px (grille verticale) et < 768px (cartes compactes).
Raccourcis clavier
| Raccourci | Action |
|---|---|
Escape |
Replier la console technique |
Ctrl+Shift+R |
Rafraîchir toutes les cartes MK6 |
Contraintes externes (DEIE/SCADA)
Simule une contrainte imposée par un système externe (DEIE Enedis, SCADA opérateur) sur un site.
Permet de tester la détection EXTERNAL_CONSTRAINT_DETECTED côté Gateway.
Injection :
curl -X POST $BASE/mock/mk6/MK6_ROU1.1/sites/8FV898VMwWX0/inject_external \
-H "Content-Type: application/json" \
-d '{"source": "DEIE", "value_kw": 3000}'
Avec fenêtre temporelle (optionnel) — active uniquement quand now est dans [start_time, end_time[ :
curl -X POST $BASE/mock/mk6/MK6_ROU1.1/sites/8FV898VMwWX0/inject_external \
-H "Content-Type: application/json" \
-d '{"source": "DEIE", "value_kw": 3000,
"start_time": "2026-03-14T10:00:00Z",
"end_time": "2026-03-14T14:00:00Z"}'
Si start_time/end_time absents → contrainte permanente jusqu'au DELETE.
Suppression :
curl -X DELETE $BASE/mock/mk6/MK6_ROU1.1/sites/8FV898VMwWX0/inject_external
Visibilité :
GET /monitoring/sites/{sycode}→ champexternal_constraint(non-null si active)GET /mock/mk6/{id}/state→sites.{sycode}.external_constraint- Page supervision (
/supervision) → bandeau ambre sous la consigne du site - Page simulation MdW (
/simulation) → contrôles DEIE/SCADA dans le panneau MK6 par site
Topologie ROUVAI
| Instance | Port | MK6 ID | Sites | PRM |
|---|---|---|---|---|
| 1 | 9001 | MK6_ROU1.1 | PDL1 + PDL2 | 2 |
| 2 | 9002 | MK6_ROU1.2 | PDL3 | 1 |
| 3 | 9003 | MK6_ROU1.3 | PDL6bis | 1 |
| 4 | 9004 | MK6_ROU2 | PDL10 + PDL8 + PDL5 + PDL9 | 4 |
| 5 | 9005 | MK6_VAI | PDL4 + PDL3 + PDL2 + PDL1 | 4 |
Spécifications API (Swagger / OpenAPI)
Swagger de production — Synapse MC2 v1.0.5
Le fichier swagger_MC2_Innergex_MA01_rev05.yaml est le contrat d'interface officiel
entre la Gateway et les contrĂ´leurs MK6 Synapse. C'est le document que Benjamin
(Operametrix) utilise pour implémenter la Gateway dans Ignition.
Il peut servir à générer un client stub :
openapi-generator-cli generate -i swagger_MC2_Innergex_MA01_rev05.yaml -g python -o client_mk6/
Swagger du mock (en ligne)
Le mock expose un Swagger UI interactif sur /docs et la spec JSON brute sur
/openapi.json (auto-générés par FastAPI). Ces endpoints incluent l'API MC2
plus les endpoints de pilotage (/mock/*), debug (/api/v1/debug/*) et supervision
(/supervision/*).
Pas de fichier statique dans l'archive — la spec est toujours à jour sur le mock en cours d'exécution.
Environnement de développement
VS Code
Créer .vscode/launch.json :
{
"version": "0.2.0",
"configurations": [
{ "name": "MK6 :9001", "type": "debugpy", "request": "launch",
"program": "mock_mk6.py", "args": ["--port", "9001"] },
{ "name": "MK6 :9002", "type": "debugpy", "request": "launch",
"program": "mock_mk6.py", "args": ["--port", "9002"] }
],
"compounds": [
{ "name": "All MK6 ROUVAI (5 instances)",
"configurations": ["MK6 :9001", "MK6 :9002", "MK6 :9003", "MK6 :9004", "MK6 :9005"] }
]
}
Docker
docker build -t mock-mk6 .
docker run -p 9001:9001 -p 9002:9002 -p 9003:9003 -p 9004:9004 -p 9005:9005 mock-mk6
Mode développement (rechargement à chaud)
Par défaut, supervision.html est mis en cache au premier chargement. Pour recharger à chaque requête :
MOCK_MK6_DEV=1 python mock_mk6.py --port 9001
Tests
# Tests de régression Python (177 tests, TestClient, rapide)
python test_mock_mk6_regression.py
# Tests JS de supervision.html (59 tests)
npm install jsdom && node test_supervision_js.js
# Structure documentaire (19 tests)
python test_doc_structure.py
Dépannage
| SymptĂ´me | Cause probable | Solution |
|---|---|---|
Address already in use |
Port déjà occupé | Tuer le process ou changer de port |
| 403 sur toute écriture | Mode production actif | POST /supervision/mode {"mode":"mock"} |
| Pas de données monitoring | MK6 non provisionné | POST /mock/mk6/{id}/provision |
| Console technique vide | Filtres actifs | Vérifier les filtres source/endpoint |
| HTML inchangé après modif | Cache statique | Relancer avec MOCK_MK6_DEV=1 |