Manuel installateur SCADA V18
Ce manuel s'adresse aux installateurs et techniciens qui mettent en service, configurent et maintiennent une installation SCADA V18. Pour l'utilisation quotidienne par les opérateurs, voir le manuel utilisateur.
1. Architecture V18
Capteurs / Actionneurs (4-20 mA, TOR, vannes, pompes) â cĂąblage physique ⌠Cartes I/O Beckhoff BK9000 (coupleurs Modbus TCP + modules KL) â Modbus TCP (switch ethernet) ⌠Mini PC industriel Linux (IPC) âââ Runtime (G1) â boucle asyncio, pymodbus, port 8765 âââ Serveur (G2) â FastAPI + WebSockets, port 8000 â HTTP + HTTPS (Tailscale) ⌠Clients navigateur / PWA mobile
Points clés V18 :
- Pas d'OpenPLC â le runtime Python parle directement Modbus TCP aux coupleurs
- Deux process sĂ©parĂ©s : Runtime (G1) + Serveur (G2) â communicants via WebSocket interne
- Deux bases SQLite :
scada_v18.db(runtime, donnĂ©es live + historique) etserre.dbcĂŽtĂ© serveur (config, bureaux, alarmes, courbes) - Mode WAL activĂ© sur les 2 bases â lecteurs/Ă©crivains concurrents
- Frontend JS vanilla (pas de framework), widgets autonomes
Adresses Modbus
Les adresses Modbus de chaque canal sont calculĂ©es automatiquement selon la position physique des modules KL sur le rail Beckhoff. Vous n'avez pas Ă les saisir manuellement â il suffit de dĂ©clarer les modules dans le bon ordre.
2. AccĂšs super utilisateur
Le panneau d'administration n'est pas accessible via un menu visible. Il faut entrer la combinaison clavier :
Ctrl + Alt + 2 + 2
Ce panneau contient les onglets :
| Onglet | Contenu |
|---|---|
| â GĂ©nĂ©ral | Configuration IA (provider + clĂ©) |
| 𧩠Widgets | Activer/désactiver les widgets dans le menu d'ajout |
| đ Runtime (G1) | Statut runtime, cycle, chemin DB |
| đ Serveur (G2) | Statut serveur, port, clients connectĂ©s, taille DB |
| đ§ Config matĂ©riel | Armoires, coupleurs, modules KL, attribution canaux, wizard installation, fonctionnalitĂ©s |
| đ Licence | Ătat licence, renouvellement, import token |
| đ« Support | Soumettre un ticket revendeur |
| đ VPN | Configuration Tailscale (super utilisateur) |
3. Premier déploiement
IPC neuf (Debian 13)
Un script setup_ipc.sh automatise toute l'installation sur un IPC vierge :
git clone https://github.com/Fkruger22/serre-v17-openplc.git /opt/scada cd /opt/scada/v18 sudo bash setup_ipc.sh
Le script installe :
- Python 3.11 + dĂ©pendances (FastAPI, pymodbus 3.x, aiosqlite, pywebpushâŠ)
- Service systemd
scada-runtime(G1) +scada-serveur(G2) - Certificats VAPID pour Web Push
- Permissions sudo restreintes pour Tailscale
Mise Ă jour depuis Windows (poste dev)
Depuis le PC de développement Windows :
cd f:\scada+plc bash deploy_v18.sh
Le script effectue : push GitHub â pull IPC â restart services â vĂ©rification statut.
4. Coupleurs Beckhoff BK9000
Le SCADA V18 communique avec des coupleurs Beckhoff BK9000 en Modbus TCP. Chaque coupleur supporte jusqu'à 64 modules KL (entrées/sorties).
Configuration du coupleur
- Adresse IP fixe Ă attribuer (ex:
192.168.1.3) - Port Modbus TCP : 502 (par défaut)
- Unit ID : 0 (par défaut)
- Mode compact : pas de bits de statut dans le registre de données
- Détection fil coupé : valeur > 32767 (bit de signe)
- Registre statut :
0x100Câ K-bus, configuration, watchdog - Plage AI : 0â32767 (mode compact)
Watchdog
5. Armoires & coupleurs
Ctrl+Alt+22 â Config matĂ©riel â Armoires
Une armoire regroupe un ou plusieurs coupleurs Modbus. Elle correspond physiquement à une armoire électrique de la serre.
Créer une armoire
- Onglet Config matĂ©riel â bouton ïŒ Armoire
- Saisissez le nom (ex:
Armoire 1) et une description - L'armoire apparaĂźt dans l'arborescence
Ajouter un coupleur Modbus
- SĂ©lectionnez l'armoire â bouton ïŒ Coupleur
- Saisissez l'IP (ex:
192.168.1.3) et le port (502 par dĂ©faut) - Le runtime tente la connexion â pastille verte si OK, rouge si timeout
Insertion entre coupleurs
Glissez-déposez un coupleur entre deux séparateurs animés pour l'insérer à une position précise. L'ordre dans l'arborescence reflÚte l'organisation physique du rail.
6. Modules KL
Catalogue KL replié + zone de drop entre séparateurs
Les modules KL Beckhoff sont les briques d'I/O insérées sur le rail à cÎté du coupleur. Le SCADA fournit un catalogue intégré.
Catalogue intégré
| Référence | Type | Canaux | FC Modbus |
|---|---|---|---|
| KL1104 | DI (entrée digitale) | 4 | FC02 |
| KL1408 | DI | 8 | FC02 |
| KL1809 | DI | 16 | FC02 |
| KL2404 | DO (sortie digitale) | 4 | FC01 |
| KL2408 | DO | 8 | FC01 |
| KL2809 | DO | 16 | FC01 |
| KL3054 / 3404 / 3458 / 3468 | AI 4-20mA / 0-10V | 4-8 | FC04 |
| KL3202 / 3204 | AI PT100 | 2-4 | FC04 |
| KL3312 | AI Thermocouple | 2 | FC04 |
| KL4404 / 4408 | AO 4-20mA / 0-10V | 4-8 | FC03 |
Pour ajouter un nouveau modÚle non listé, modifier v18/runtime/kl_library.py.
Ajouter un module Ă un coupleur
- Cliquez sur un coupleur dans l'arborescence â la zone modules s'affiche Ă droite
- Le catalogue KL est repliĂ© par dĂ©faut â cliquez pour dĂ©plier les sections (DI / DO / AI / AO)
- Glissez la référence souhaitée vers la zone de drop entre les séparateurs animés
- Le module est inséré à la position voulue, les adresses Modbus sont recalculées automatiquement
Suppression
Survolez un module â bouton â rouge avec hover. Si le module a des canaux cĂąblĂ©s Ă des variables, un message dĂ©taillĂ© liste les variables impactĂ©es avant la suppression.
7. Attribution canaux
Attribution variable physique â canal Modbus
Une fois les modules KL déclarés, il faut cùbler logiquement chaque variable physique de l'installation à un canal Modbus.
Workflow
- Créez d'abord l'arborescence des équipements via le wizard d'installation
- Onglet Config matĂ©riel â Attribution canaux
- Liste de gauche : variables physiques de l'installation (sondes, sorties, contacts) â non cĂąblĂ©es en haut, cĂąblĂ©es en bas
- Liste de droite : canaux disponibles, groupés par module KL
- Glissez une variable de gauche sur un canal de droite
- Pour les analogiques (AI/AO) : configurez le scaling (raw_min/raw_max â val_min/val_max) + filtre Ă©ventuel
- Pour les digitaux (DI/DO) : pas de scaling, juste l'attribution
Scaling des entrées/sorties analogiques
val_physique = val_min + (raw - raw_min) Ă (val_max - val_min) / (raw_max - raw_min)
Exemple : sonde 4-20mA mesurant 0-50°C â
- raw_min = 0, raw_max = 32767 (pleine échelle BK9000 mode compact)
- val_min = -10, val_max = 60 (selon la sonde)
- Le runtime applique automatiquement la conversion Ă chaque cycle
Filtres
Filtres disponibles par variable (configurables dans Attribution canaux) : moyenne mobile, médiane, butterworth, plage de validité.
8. Wizard installation â Ătape 1 : Domaines
Wizard installation â sĂ©lection des domaines
Le wizard d'installation crĂ©e l'arborescence des Ă©quipements logiques. Accessible depuis Config matĂ©riel â bouton Nouvelle installation ou Modifier installation.
Sélection des domaines
Cochez les domaines présents dans votre serre :
- đ€ïž MĂ©tĂ©o â station mĂ©tĂ©o
- đĄïž Climat â compartiments
- đ„ Ănergie â chaudiĂšres, ballons stratifiĂ©s, collecteurs chaleur/COâ
- đ§ Irrigation â stations, groupes, vannes, rĂ©servoirs
- â SystĂšme â gestionnaire alarmes, coupleurs (auto)
Décocher un domaine purge ses quantités et son arbre des étapes suivantes.
9. Wizard â Ătape 2 : QuantitĂ©s
Pour chaque domaine activé, saisissez le nombre d'équipements de chaque type :
- Climat : nombre de compartiments
- Ănergie : nombre de chaudiĂšres, ballons, collecteurs
- Irrigation : nombre de stations d'irrigation, réservoirs eau claire/drainage
- Météo : 0 ou 1 station
Les quantités sont utilisées à l'étape suivante pour générer l'arborescence par défaut.
10. Wizard â Ătape 3 : Arborescence
Arborescence éditable des équipements
L'arbre des équipements est généré automatiquement à partir des quantités. Vous pouvez :
- Renommer chaque équipement (clic sur le nom)
- Ajouter des enfants optionnels (briques) â ex: ajouter une 2á” sonde temperature Ă un compartiment
- Supprimer un Ă©quipement non obligatoire (â)
- CÎté ouvrant : sélectionner Gauche / Droite (alterne par défaut)
Auto-nommage
Les noms par défaut sont générés selon la position dans la fratrie : "Compartiment 1", "Compartiment 2"⊠Le flag nom_auto=1 en DB indique qu'un nom est auto-généré et donc retraduisible quand la langue change. Renommer manuellement bascule en nom_auto=0 (nom figé).
Enfants obligatoires
Le catalogue dĂ©clare des enfants obligatoires (ex: chaudiĂšre â 1 brĂ»leur). Ces enfants sont créés automatiquement et marquĂ©s obligatoires (couleur bleue, pas de bouton â).
11. Wizard â Ătape 4 : Liens
DĂ©finition des liens entre Ă©quipements (chaleur, COâ)
Les liens définissent les relations entre équipements de domaines différents. Deux types :
Chaleur (rĂšgle stricte)
Chaque collecteur chaleur doit recevoir des chaudiÚres/ballons et alimenter des circuits HT/BT. Exclusivité : une chaudiÚre ne peut alimenter qu'un seul collecteur. Les chaudiÚres/ballons/circuits non assignés sont grisés et bloquants.
COâ (rĂšgle souple)
- Chaque vanne COâ doit ĂȘtre attribuĂ©e Ă un collecteur COâ
- Chaque collecteur COâ doit avoir au moins une source (chaudiĂšre fumĂ©es OU source COâ liquide)
- Pas d'exclusivitĂ© sur les sources â une chaudiĂšre peut alimenter plusieurs collecteurs COâ
12. Wizard â Ătape 5 : Validation
Récapitulatif de l'installation avant application :
- Nombre d'équipements par domaine
- Liens chaleur / COâ Ă©tablis
- Variables physiques Ă cĂąbler ensuite via Attribution canaux
Cliquez sur Appliquer au runtime :
- Le serveur valide la cohérence (enfants obligatoires, liens, variables physiques cablees)
- Les équipements sont insérés en DB
- Le runtime est rechargé (lit la nouvelle config sans redémarrer le process)
- Vous repassez à l'étape Attribution canaux pour cùbler les variables physiques
13. Domaine Météo
Une seule station météo par installation. Variables physiques :
- Sondes :
temperature,humidite,rayonnement(W/mÂČ),vitesse_vent,direction_vent - Capteur de pluie (DI)
- Optionnel :
co2_ext
Variables calculées
sunrise_min/sunset_minâ calculĂ©es parcalculer_soleilselon date + latituderayonnement_cumulâ intĂ©grale journaliĂšre (MJ)securite_vent,securite_pluie,securite_gelâ flags pilotĂ©s parcontroler_meteo_securite
14. Domaine Climat
Compartiments â la chaĂźne de chauffage est : compartiment â circuit HT/BT â collecteur â chaudiĂšre.
Briques sous compartiment
sonde_temperature(1 ou plus â rĂ©gulation + contrĂŽle dĂ©rive)sonde_humiditesonde_co2moteurĂ©cran thermique / ombragevanne_co2brumisateur,deshumidificateur,eclairage(sorties)ouvrant(cĂŽtĂ© gauche / droit, mode coefficient ou limitation vitesse vent)
Fonctionnalités activables
Onglet Fonctionnalités du compartiment :
- Chauffage (intrinsĂšque) â PID + bornes
chauffage_kp/ki/kd - AĂ©ration â PID
- HumiditĂ© â brumisation et dĂ©shumidification
- COâ â enrichissement
- Ăcran â Ă©nergĂ©tique nuit + ombrage jour selon rayonnement
- Ăclairage â DLI cible
- Ouvrant vent / abritĂ© â sĂ©curitĂ© vent + bornes ouverture min/max par cĂŽtĂ©
15. Domaine Ănergie
Domaine introduit en V18. Regroupe :
- ChaudiĂšres â avec brĂ»leur 2 allures OU modulant (exclusif)
- Ballons stratifiés (open buffer)
- Collecteurs chaleur â agrĂšgent demande circuits, distribuent vers chaudiĂšres/ballons
- Collecteurs COâ â distribution COâ vers vannes compartiment
- Source COâ liquide â alternative aux fumĂ©es chaudiĂšre
- Source externe (chauffage importé, ex: cogénération)
Régulation chaudiÚre
Bornes temp_mini / temp_maxi :
- Brûleur démarre quand
temp_depart < temp_mini - BrĂ»leur s'arrĂȘte quand
temp_depart >= temp_maxi temp_maxi_alarmedéclenche l'alarme surchauffe- Anti-cycles via
devi_min_s(TON) sur la chaudiĂšre
Brûleur 2 allures
Bascule petite/grande allure selon écart consigne avec hystérésis :
delta_grande_allure(3 °C) â passage en grande alluredelta_petite_allure(1 °C) â retour en petite allureallure_min_s(60 s) â temps min entre bascules
Brûleur modulant
PID autour de consigne â demande_bruleur 0â100 %. La modulation 0 % â 0 kW (plage minâmax kW selon brĂ»leur).
V3V chaudiĂšre (anticondensation)
Régulation proportionnelle temp_retour_min = temp_depart à coeff_anticond (par défaut 0.8). Maintient le retour au-dessus de cette valeur pour éviter la condensation dans le corps de chauffe.
16. Domaine Irrigation
HiĂ©rarchie : Station â Groupe â Vanne.
Station d'irrigation
- Pompe â dĂ©bit cible
- Doseurs EC A/B/C/D â ratio configurable + cycle PWM
- Doseur pH â mode acide (pH-) OU base (pH+) (jamais les 2)
- Sondes EC/pH â sonde 1 (rĂ©gulation) + sonde 2 optionnelle (dĂ©tection dĂ©rive)
- Réservoirs liés (eau claire + drainage)
Groupe d'irrigation
Un groupe regroupe plusieurs vannes simultanées. ParamÚtres :
- 4 pĂ©riodes actives (P1-P4) â dĂ©but/fin en minutes
- 4 dĂ©clencheurs (D1-D4) â type (heure fixe / cyclique / joules) + paramĂštres associĂ©s
- Vannes simultanées par période
Vanne d'arrosage
- Mode arrĂȘt : 0=Temps, 1=Litres, 2=cc/goutteur
- Quantité cible, nombre de goutteurs, vol/goutteur
- Confirmation_s â dĂ©lai avant alarme si dĂ©bit ne monte pas
17. Domaine SystĂšme
Domaine technique pour la gestion globale.
Coupleurs Modbus (auto-créés)
Pour chaque coupleur déclaré dans Config matériel, un équipement coupleur_modbus est créé automatiquement sous SystÚme. Il expose :
connecte(booléen)adresse_ip,portalm_defaut_coupleur(alarme K-bus / config / watchdog)
Gestionnaire d'alarmes (auto-créé)
Voir section Gestionnaire d'alarmes.
18. Régulation PID
Tous les contrÎleurs (chauffage, aération, V3V, brûleur modulant) utilisent un PID standard avec gains kp / ki / kd configurables par équipement.
Réglages typiques
| Régulation | kp | ki | kd |
|---|---|---|---|
| Chauffage compartiment | 2 â 4 | 0.05 â 0.2 | 0 â 0.5 |
| AĂ©ration compartiment | 2 â 4 | 0.05 â 0.2 | 0 â 0.5 |
| V3V circuit | 5 â 10 | 0 â 0.1 | 0 â 0.5 |
Les gains sont stockĂ©s en consigne et modifiables Ă chaud â la prochaine itĂ©ration du PID utilise les nouveaux gains.
Anti-windup
Le PID intÚgre un saturateur d'intégrale pour éviter le wind-up quand la sortie est saturée (ex: V3V à 100 %).
19. Sécurités météo
Trois sécurités pilotées par controler_meteo_securite :
Vent fort
seuil_vent_fort(typiquement 8-12 m/s)confirm_vent_sâ durĂ©e min au-dessus du seuil pour activerseuil_vent_okâ hystĂ©rĂ©sis pour lever la sĂ©curitĂ©retour_vent_sâ durĂ©e min sous le seuil pour rĂ©ouverture- Action : ferme tous les ouvrants Ă 0 %
Pluie
- Capteur DI
pluie confirm_pluie_sâ dĂ©lai de confirmation (filtre les fausses dĂ©tections)retour_pluie_sâ dĂ©lai aprĂšs arrĂȘt avant rĂ©ouverture
Gel
seuil_gel(typiquement 2 °C)- Action : ferme ouvrants + active chauffage antigel
20. Gestionnaire d'alarmes
Le gestionnaire d'alarmes agrÚge toutes les alarmes en 3 sorties DO classifiées :
alm_climat_globalâ agrĂ©gation des alarmes compartiment / mĂ©tĂ©oalm_irrigation_globalâ agrĂ©gation alarmes station/dosage/rĂ©servoiralm_systeme_globalâ agrĂ©gation alarmes coupleur / brĂ»leur / surchauffe
Ces 3 sorties pilotent typiquement des relais externes (sirĂšne, voyant, GSM autonomeâŠ).
Entrées externes NF
3 entrĂ©es DI normalement fermĂ©es (NF) â alarme si contact ouvert :
entree_alarme_climatentree_alarme_irrigationentree_alarme_systeme
Permettent de remonter au SCADA des alarmes externes (groupe froid, défaut moteur, etc.).
Création automatique
Le conteneur gestionnaire_alarmes est créé automatiquement sous SystÚme au reload runtime via _sync_coupleurs_systeme. Les 3 sorties DO + 3 entrées DI sont obligatoires (couleur bleue dans le wizard, non supprimables). L'installateur peut ajouter d'autres entree_alarme_* NF supplémentaires.
21. Réservoirs & drainage
2 types de réservoirs :
- reservoir_eau_claire â alimentation pompe irrigation
- reservoir_eau_drainage â rĂ©cupĂ©ration drainage
Niveaux
3 contacts DI possibles par réservoir : contact_niveau_bas, contact_niveau_milieu, contact_niveau_haut. Pour chaque niveau, configurez les actions :
alarmeâ alm_niveau_*arret_pompeâ bloque la pompe d'irrigationferme_v3vâ force la V3V mĂ©lange Ă fermĂ©e
Drainage (calcul %)
Le FB controler_drainage intĂšgre debit_station (arrosage) + debit_drainage sur le cycle pompe ONâOFF, expose pct_drainage. Indicateur clĂ© culture hors-sol (cible 20-30 %).
22. Courbes de programmation
Les courbes permettent de programmer une consigne variable dans le temps (ex: température jour/nuit avec rampes).
- Stockées dans
data/curves.jsoncÎté serveur - Liées à la variable (varKey), pas au tableau qui les affiche
- 8 points horaires par courbe
- Modes : Absolu / Lever ± / Coucher ±
- Le runtime relit
curves.jsonchaque seconde et applique la valeur interpolée à la consigne - Export/import dans la sauvegarde JSON globale
Interpolation
interpoler_courbe(curve, temps_min) calcule la valeur courante par interpolation linéaire entre les points actifs. La courbe se boucle sur 24 h.
23. VPN Tailscale
Tailscale fournit un accÚs distant sécurisé HTTPS sans configuration routeur. URL stable : https://scada-ipc.<tailnet>.ts.net.
Installation initiale
cd /opt/scada/v18 sudo bash install_tailscale.sh
Le script installe Tailscale, configure les permissions sudo et active tailscale serve pour le port 8000.
Onglet VPN
Ctrl+Alt+22 â onglet đ VPN :
- Statut â installĂ© / connectĂ© au tailnet / serve actif
- Hostname, IP Tailscale, URL HTTPS
- Boutons : Install / Up / Down / Cert / Serve On / Serve Off
- Peers â liste des appareils du tailnet
- Log â sortie des commandes
Authentification initiale
Cliquez sur Up â l'URL d'authentification Tailscale est extraite et affichĂ©e. Ouvrez-la dans un navigateur, validez l'appareil dans votre tailnet.
Certificat HTTPS
Cliquez sur Cert pour générer le certificat Let's Encrypt automatique (nécessite HTTPS Certificates activé dans l'admin Tailscale).
24. Web Push (VAPID)
Les notifications push utilisent le protocole VAPID. CÎté serveur :
- Module
v18/serveur/push.pyavec pywebpush 2.0 - Clés VAPID générées au premier boot, stockées en
data/vapid_keys.json - Table
push_subscriptionsen DB serveur - Broadcast automatique sur transition
alm_*_globalFalse â True - Cleanup auto des subscriptions mortes (50 Ă©checs consĂ©cutifs â suppression)
Endpoints
| Endpoint | Méthode | RÎle |
|---|---|---|
| /api/push/vapid_public_key | GET | Clé publique pour le client |
| /api/push/subscribe | POST | Enregistrer un abonnement client |
| /api/push/unsubscribe | POST | Désabonnement |
| /api/push/test | POST | Envoyer un push de test |
Détection alarmes
Les alarmes sont détectées dynamiquement par pattern (préfixe alm_, securite_, entree_alarme NF). Ajouter une nouvelle alarme = ajouter le label dans fr.json/alarmes, zéro code à modifier.
25. Configuration IA
Ctrl+Alt+22 â onglet â GĂ©nĂ©ral â Intelligence Artificielle.
| Provider | ModĂšle | Notes |
|---|---|---|
| đŁ Anthropic (Claude) | claude-haiku-4-5-20251001 | Cloud â recommandĂ© pour conseil agro |
| đą OpenAI | gpt-4o-mini | Cloud â alternative |
| đ” Gemini (Google) | gemini-2.0-flash | Cloud â free tier gĂ©nĂ©reux |
| đĄ LM Studio | llama-3.2-11b-vision-instruct | Local â gratuit, pas de rĂ©seau |
Saisissez votre clé API (sauf LM Studio qui demande l'URL http://localhost:1234). Cliquez sur Sauver.
La clĂ© est stockĂ©e dans serre_production.db table app_settings. Les widgets IA conseil + analyse maladies utilisent cette mĂȘme clĂ© via le module ia_helpers.py.
26. Export / Import config
Export
Onglet Config matĂ©riel â bouton Exporter config. GĂ©nĂšre un JSON contenant :
- Armoires, coupleurs, modules KL, canaux
- Ăquipements logiques (arborescence + alias + nom_auto)
- Variables (avec scaling et filtres)
- Consignes utilisateur
- Liens entre Ă©quipements (chaleur, COâ)
- Fonctionnalités activées
- Courbes de programmation
Une copie horodatée est aussi sauvegardée automatiquement dans data/backups/config_YYYY-MM-DD_HHMMSS.json à chaque export.
Import
Cliquez sur Importer config, sélectionnez un fichier JSON. Le serveur efface l'installation courante et recrée tout depuis le JSON.
27. Audit V18
Le script v18/tests/audit_v18.py automatise 11 audits depuis le poste Windows de développement :
cd f:\scada+plc python v18/tests/audit_v18.py --all --runs 3 --output v18/rapports/AUDIT_$(date +%Y_%m_%d).md
Ătapes :
- Backup config courante
- Tests unitaires (pytest sur Function Blocks)
- Audit sécurité (rate limiting, headers HTTP, XSS)
- Audit architecture (taille fichiers, couplage runtime/serveur)
- Fuzzing IA â N runs (Sonnet gĂ©nĂšre des configs alĂ©atoires rĂ©alistes)
- Audit adversarial (5 attaques robustesse)
- Audit performance (taille snapshot, débit API, DB)
- Audit frontend (doublons variables, validation)
- Audit alarmes (déclenchement, latch, acquittement)
- Audit i18n (symétrie FR/EN, hardcodes, fetch _urlLang)
- Restauration config (avec relance sim_modbus pour mapping coherent)
L'audit doit toujours ĂȘtre lancĂ© depuis Windows (jamais SSH IPC) â sim_modbus tourne sur le PC dev.
CohĂ©rence catalogue â runtime
L'analyse statique catalogue â runtime (catĂ©gories A-F) est faite par Claude Code en fin d'audit, puis appendĂ©e au fichier rapport. Elle vĂ©rifie qu'aucune variable lue/Ă©crite par un FB n'est absente du catalogue, et que tous les FB sont orchestrĂ©s dans main.py.
28. Simulation Modbus
Le serveur Modbus de simulation simulation/sim_modbus.py permet de tester sans matériel terrain.
Lancement
cd f:\scada+plc start_sim.bat
Ouvre une console séparée. Le sim sert à 192.168.1.3:502 et expose un serveur HTTP de scénarios sur :7001.
Mode nominal
Météo réelle Open-Meteo + oscillations T° + rétroaction simple (ouvrir un ouvrant fait baisser la température).
Scénarios métier
POST sur http://localhost:7001/scenario/<nom> :
alarme_externe_climatâ force le contact NF entree_alarme_climat Ă ouvertalarme_externe_irrigationalarme_externe_systemeniveau_bas_drainagedefaut_sonderesetâ retour mode nominal
Override primitif
POST http://localhost:7001/force {"fc":4,"addr":0,"val":12345} â forcer une valeur Modbus brute.
29. Mise Ă jour
Pour déployer une nouvelle version sur l'IPC :
cd f:\scada+plc bash deploy_v18.sh
Le script :
- git push depuis Windows vers GitHub
- SSH IPC â git pull
- pip install -r requirements.txt (si modifié)
- systemctl restart scada-runtime scada-serveur
- Vérification statut /api/status
Service worker (PWA)
Ă chaque mise Ă jour qui touche le frontend, bumpez CACHE_NAME dans sw.js (ex: v95 â v96). Le SW activera automatiquement la nouvelle version et les clients PWA se rechargeront via controllerchange.
30. Sauvegarde DB
Les 2 bases sont en mode WAL avec auto_vacuum INCREMENTAL. Sauvegarde recommandée :
- Quotidien :
data/scada_v18.db(runtime + historique) - Quotidien :
data/serre.db(config serveur, alarmes, courbes) - Hebdomadaire :
data/serre_production.db(cultures, opérateurs, sessions) - Backups config JSON dans
data/backups/
Pour archiver manuellement :
sqlite3 data/scada_v18.db ".backup data/backups/scada_v18_$(date +%Y%m%d).db"
31. Function Blocks runtime
27 FB Python dans v18/runtime/fonctions/ :
| FB | Domaine | RĂŽle |
|---|---|---|
| controler_compartiment | Climat | Orchestrateur compartiment |
| controler_chauffage | Climat | PID chauffage |
| controler_aeration | Climat | PID aération |
| controler_humidite | Climat | Brumisation / déshumidification |
| controler_co2 | Climat | Vanne COâ enrichissement |
| controler_ecran | Climat | Position écran (énergétique + ombrage) |
| controler_eclairage | Climat | DLI cible |
| controler_ouvrant | Climat | Ouvrants cÎté vent / abrité |
| controler_circuit | Climat | Demande chauffage circuit HT/BT |
| controler_chaudiere | Ănergie | Bornes temp_mini/maxi + brĂ»leur |
| controler_bruleur_modulant | Ănergie | PID brĂ»leur modulant |
| controler_v3v | Ănergie | V3V circuit |
| controler_v3v_chaudiere | Ănergie | V3V anticondensation |
| controler_moteur | Tous | Moteurs avec course_total_s + recalage butées |
| controler_pompe_irrigation | Irrigation | Pompe arrosage |
| controler_dosage_ec | Irrigation | Doseurs EC PWM |
| controler_dosage_ph | Irrigation | Doseur pH (acide ou base) |
| controler_alarmes_irrigation | Irrigation | Alarmes EC/pH/débit |
| controler_groupe_irrigation | Irrigation | Périodes + déclencheurs groupe |
| controler_vanne | Irrigation | Vanne arrosage individuelle |
| controler_irrigation_station | Irrigation | Orchestrateur station |
| controler_irrigation | Irrigation | Boucle (legacy, Ă terminer) |
| controler_drainage | Irrigation | % drainage par cycle pompe |
| controler_reservoir | Irrigation | Niveaux + actions |
| controler_meteo_securite | Météo | Sécurités vent/pluie/gel |
| controler_alarmes_globales | SystÚme | Agrégation 3 sorties DO |
| calculer_soleil | Météo | sunrise_min / sunset_min |
Ordre d'orchestration dans runtime/main.py : mĂ©tĂ©o â compartiments (chauffage, aĂ©ration, COââŠ) â circuits â chaudiĂšres â irrigation â rĂ©servoirs â alarmes globales. Cycle 1 s par dĂ©faut.
32. API REST principale
Lecture
| Endpoint | Description |
|---|---|
| GET /api/status | Statut runtime + serveur |
| GET /api/config/installation?lang=xx | Arbre des équipements |
| GET /api/picker/catalogue?lang=xx | Catalogue picker variables |
| GET /api/config/fonctionnalites/catalogue_filtre | Fonctionnalités filtrées par prérequis |
| GET /api/alarm/history | Historique alarmes (filtrable) |
| GET /api/alarm/detected | Ătat courant des alarmes (reconstruit depuis history) |
| GET /api/curves | Liste courbes de programmation |
| GET /api/desks | Liste bureaux sauvegardés |
Ăcriture
| Endpoint | Description |
|---|---|
| POST /api/write | Ăcrire une consigne (UPSERT en DB + bridge runtime) |
| POST /api/config/installation | Créer une installation |
| PUT /api/config/installation | Modifier une installation existante |
| POST /api/config/valider | Valider la config (avant Appliquer) |
| POST /api/curves | Sauver une courbe |
| POST /api/alarm/action | Détecter / Confirmer une alarme |
WebSocket
ws://<host>:8000/ws â diffusion snapshot complet Ă chaque cycle runtime + broadcast alarmes Ă©vĂ©nementiel.
33. Dépannage
Runtime déconnecté
- Vérifier
systemctl status scada-runtime - Logs :
journalctl -u scada-runtime -f - Tester ping coupleur :
ping 192.168.1.3 - Tester Modbus :
nc -vz 192.168.1.3 502
Tableaux systĂšme vides
- Le picker peut tarder Ă charger aprĂšs reload â attendre 1-2 s
- Vérifier que les variables physiques sont cùblées (Attribution canaux)
- Vérifier les fonctionnalités activées sur l'équipement
Push notifications ne marchent pas
- NĂ©cessite HTTPS (Tailscale ou autre) â pas en HTTP local
- Vérifier que les clés VAPID existent dans
data/vapid_keys.json - VĂ©rifier que le service worker est enregistrĂ© (DevTools â Application â Service Workers)
- Inspecter
/api/push/testdans Postman pour test isolé
IA conseil retourne erreur 400
- Crédit API épuisé (le message exact s'affiche dans le widget depuis la fix HTTP body)
- ClĂ© invalide / rĂ©voquĂ©e â recharger via Ctrl+Alt+22 â GĂ©nĂ©ral
- Provider tombĂ© â basculer sur LM Studio en local le temps de la rĂ©solution
Frontend cache stale aprĂšs deploy
- Hard refresh : Ctrl+Shift+R
- Si PWA installĂ©e : DevTools â Application â Service Workers â Unregister puis hard refresh
- Vérifier que CACHE_NAME a été bumpé dans
sw.js
Doublons d'équipements aprÚs modifs successives
- Vérifier
_DOMAINE_MAPdans routes_config_materiel.py â chaque type doit y ĂȘtre listĂ© sinon parent_id=None et la rĂ©conciliation ne match pas - Cas connu corrigĂ© : gestionnaire_alarmes (rattachĂ© Ă 'systeme' en V18.5)