MK6 v2.2.0

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 :

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é :


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