⚡ USE CASE #07 - RISQUES CRITIQUES

Électrique & Arc-Flash

Détection Proactive des Risques Électriques & Protection Arc-Flash
Electrical Hazards & Arc-Flash Protection Detection
📋 Contexte Opérationnel / Operational Context

🇫🇷 Français

Les risques électriques et arc-flash représentent l'une des causes les plus graves de blessures et décès en milieu industriel. La surveillance en temps réel des études arc-flash, du travail sous tension, des circuits temporaires non protégés, des dispositifs LOTO et des rallonges électriques est essentielle pour prévenir électrocutions et brûlures catastrophiques.

🇬🇧 English

Electrical hazards and arc-flash represent one of the most serious causes of injury and death in industrial environments. Real-time monitoring of arc-flash studies, energized work, unprotected temporary circuits, LOTO devices, and extension cords is critical to prevent electrocutions and catastrophic burns.

⚠️ Question Métier / Business Question: Comment identifier en temps réel les expositions électriques non conformes et prévenir les incidents arc-flash mortels? / How to identify non-compliant electrical exposures in real-time and prevent fatal arc-flash incidents?
🕸️ Schéma de Graphe Neo4j / Neo4j Graph Schema
⚡ Architecture SafetyGraph - Électrique & Arc-Flash / Electrical Safety
:Asset
Panel
:Document
📊
Arc-Flash Study
:Task
🔧
Energized Work
:Circuit
🔌
Temporary
:Asset
🔒
Isolator
:Asset
🔌
Extension Cord
:PPE
🧤
Arc-Rated PPE
COVERS
ON
PART_OF
FOR
PART_OF
WEARS
Asset:Panel - Tableau électrique
Document:ArcFlashStudy - Étude arc-flash
Task:EnergizedWork - Travail sous tension
Circuit:Temporary - Circuit temporaire
Asset:Isolator - Dispositif d'isolement
Asset:ExtensionCord - Rallonge électrique
PPE - Équipement protection arc-flash
📊 Requête #1 - Tableaux sans Étude Arc-Flash
🇫🇷 Objectif: Identifier les tableaux électriques sans étude arc-flash valide ou avec une étude périmée.
🇬🇧 Objective: Identify electrical panels without valid arc-flash study or with expired study.
💻 Requête Cypher Neo4j
// 📊 Détection: Tableaux électriques sans étude arc-flash ou étude périmée
// Detection: Electrical panels without arc-flash study or expired study

MATCH (pnl:Asset {class: 'Panel'})-[:PART_OF]->(p {id: $projectId})
WHERE NOT (:Document {type: 'ArcFlashStudy'})-[:COVERS]->(pnl)
   OR ANY(
       d IN [(:Document {type: 'ArcFlashStudy'})-[:COVERS]->(pnl) | d] 
       WHERE d.date < $maxAge  // Âge maximal accepté (ex: 5 ans)
   )
WITH pnl,
     COLLECT {
         MATCH (d:Document {type: 'ArcFlashStudy'})-[:COVERS]->(pnl)
         RETURN d.date AS studyDate, d.incidentEnergy AS energy
         ORDER BY d.date DESC
         LIMIT 1
     }[0] AS lastStudy
RETURN 
    pnl.id AS panelId,
    pnl.name AS panelName,
    pnl.location AS location,
    pnl.voltage AS voltageKV,
    pnl.amperage AS amperageA,
    lastStudy.studyDate AS lastStudyDate,
    lastStudy.energy AS lastIncidentEnergy,
    CASE
        WHEN lastStudy IS NULL THEN 'NO_STUDY'
        ELSE 'EXPIRED_STUDY'
    END AS violation,
    CASE
        WHEN pnl.voltage >= 600 THEN 'CRITICAL'
        WHEN pnl.voltage >= 240 THEN 'HIGH'
        ELSE 'MEDIUM'
    END AS riskLevel
ORDER BY pnl.voltage DESC
📊 Exemple de Résultat / Result Example
{
  "panelId": "PANEL-MV-2024-A47",
  "panelName": "Tableau principal moyenne tension / Main MV panel",
  "location": "Salle électrique bâtiment A",
  "voltageKV": 13.8,  // 13.8 kV - Moyenne tension!
  "amperageA": 2000,
  "lastStudyDate": "2018-03-15",  // Étude de 2018 - périmée!
  "lastIncidentEnergy": 28.7,  // 28.7 cal/cm² (énergie incidente)
  "violation": "EXPIRED_STUDY",
  "riskLevel": "CRITICAL",
  "criticalityLevel": "🔴 CRITIQUE / CRITICAL",
  "requiredAction": "Étude arc-flash urgente + étiquetage temporaire / Urgent arc-flash study + temporary labeling"
}
🔧 Requête #2 - Travail sous Tension sans Permis/ÉPI CAT
🇫🇷 Objectif: Détecter les tâches de travail sous tension sans permis valide ou sans équipement de protection arc-flash approprié (catégorie).
🇬🇧 Objective: Detect energized work tasks without valid permit or without appropriate arc-flash protective equipment (category).
💻 Requête Cypher Neo4j
// 🔧 Détection: Travail sous tension sans permis OU ÉPI arc-flash inadéquat
// Detection: Energized work without permit OR inadequate arc-flash PPE

MATCH (t:Task {type: 'EnergizedWork'})-[:ON]->(a:Asset)-[:PART_OF]->(p {id: $projectId})
WHERE NOT (:Permit {type: 'EnergizedWork'})-[:COVERS]->(t)
   OR coalesce(a.requiredArcCat, 2) > 
      max([c IN [(t)<-[:ASSIGNED_TO]-(w)-[:WEARS]->(ppe:PPE) | ppe.arcCat] | c])
WITH t, a,
     EXISTS {
         MATCH (:Permit {type: 'EnergizedWork'})-[:COVERS]->(t)
     } AS hasPermit,
     coalesce(a.requiredArcCat, 2) AS requiredCat,
     [c IN [(t)<-[:ASSIGNED_TO]-(w)-[:WEARS]->(ppe:PPE) | ppe.arcCat] | c] AS workerCats
RETURN 
    t.id AS taskId,
    t.description AS description,
    t.startDate AS startDate,
    a.id AS assetId,
    a.type AS assetType,
    hasPermit,
    requiredCat,
    CASE WHEN SIZE(workerCats) > 0 THEN max(workerCats) ELSE 0 END AS maxWorkerCat,
    CASE
        WHEN NOT hasPermit AND SIZE(workerCats) = 0 THEN 'NO_PERMIT_NO_PPE'
        WHEN NOT hasPermit THEN 'NO_PERMIT'
        WHEN SIZE(workerCats) = 0 THEN 'NO_PPE'
        ELSE 'INADEQUATE_PPE'
    END AS violation,
    CASE
        WHEN NOT hasPermit AND SIZE(workerCats) = 0 THEN 'CRITICAL'
        WHEN NOT hasPermit OR SIZE(workerCats) = 0 THEN 'HIGH'
        ELSE 'MEDIUM'
    END AS riskLevel
ORDER BY riskLevel, t.startDate
📊 Exemple de Résultat / Result Example
{
  "taskId": "TASK-EW-2024-1147",
  "description": "Remplacement disjoncteur 600V sous tension / Energized 600V breaker replacement",
  "startDate": "2024-11-04T09:00:00Z",
  "assetId": "PANEL-LV-B23",
  "assetType": "Switchgear 600V",
  "hasPermit": false,  // Pas de permis!
  "requiredCat": 3,  // CAT 3 requis (25 cal/cm²)
  "maxWorkerCat": 1,  // Travailleur porte seulement CAT 1 (4 cal/cm²)
  "violation": "NO_PERMIT_NO_PPE",  // Double violation!
  "riskLevel": "CRITICAL",
  "criticalityLevel": "🔴 CRITIQUE / CRITICAL",
  "requiredAction": "Arrêt immédiat + consignation équipement / Immediate stop + equipment lockout"
}
🔌 Requête #3 - Circuits Temporaires sans GFCI
🇫🇷 Objectif: Identifier les circuits électriques temporaires sans dispositif GFCI (disjoncteur différentiel) de protection.
🇬🇧 Objective: Identify temporary electrical circuits without GFCI (Ground Fault Circuit Interrupter) protection device.
💻 Requête Cypher Neo4j
// 🔌 Détection: Circuits temporaires sans protection GFCI (différentiel)
// Detection: Temporary circuits without GFCI (differential) protection

MATCH (c:Circuit {type: 'Temporary'})-[:PART_OF]->(p {id: $projectId})
WHERE coalesce(c.gfci, false) = false
WITH c,
     duration.between(c.installDate, date()) AS ageInService
RETURN 
    c.id AS circuitId,
    c.description AS description,
    c.location AS location,
    c.voltage AS voltageV,
    c.amperage AS amperageA,
    c.installDate AS installDate,
    ageInService.days AS daysInService,
    c.gfci AS hasGFCI,
    'NO_GFCI_PROTECTION' AS violation,
    CASE
        WHEN c.location CONTAINS 'extérieur' OR c.location CONTAINS 'outdoor' THEN 'CRITICAL'
        WHEN c.voltage >= 240 THEN 'HIGH'
        ELSE 'MEDIUM'
    END AS riskLevel,
    CASE
        WHEN ageInService.days > 90 THEN true
        ELSE false
    END AS exceedsTemporaryThreshold
ORDER BY riskLevel, daysInService DESC
📊 Exemple de Résultat / Result Example
{
  "circuitId": "CIRCUIT-TEMP-2024-047",
  "description": "Circuit temporaire chantier extérieur / Temporary outdoor construction circuit",
  "location": "Zone construction extérieure - Phase 2",
  "voltageV": 120,
  "amperageA": 20,
  "installDate": "2024-07-15",
  "daysInService": 112,  // Plus de 3 mois!
  "hasGFCI": false,  // Pas de GFCI!
  "violation": "NO_GFCI_PROTECTION",
  "riskLevel": "CRITICAL",  // Extérieur = CRITIQUE
  "exceedsTemporaryThreshold": true,  // Dépasse 90 jours - n'est plus "temporaire"
  "criticalityLevel": "🔴 CRITIQUE / CRITICAL",
  "requiredAction": "Installation GFCI immédiate + inspection / Immediate GFCI installation + inspection"
}
🔒 Requête #4 - Stocks Dispositifs LOTO Isolateurs
🇫🇷 Objectif: Identifier les dispositifs d'isolement électrique sans stock de dispositifs LOTO (cadenas, étiquettes) associés.
🇬🇧 Objective: Identify electrical isolation devices without associated LOTO device inventory (locks, tags).
💻 Requête Cypher Neo4j
// 🔒 Détection: Dispositifs d'isolement sans stock LOTO disponible
// Detection: Isolation devices without available LOTO inventory

MATCH (iso:Asset {class: 'Isolator'})-[:PART_OF]->(p {id: $projectId})
WHERE SIZE(
    [(iso)<-[:FOR]-(inv:Inventory {item: 'LockoutDevice'}) | inv]
) = 0
WITH iso,
     SIZE(
         [(iso)<-[:REQUIRES]-(t:Task {status: 'Active'}) | t]
     ) AS activeTasksCount
RETURN 
    iso.id AS isolatorId,
    iso.type AS isolatorType,
    iso.location AS location,
    iso.voltage AS voltageKV,
    iso.lockoutPoints AS lockoutPoints,
    activeTasksCount,
    'NO_LOTO_INVENTORY' AS violation,
    CASE
        WHEN activeTasksCount > 0 THEN 'CRITICAL'
        WHEN iso.voltage >= 600 THEN 'HIGH'
        ELSE 'MEDIUM'
    END AS riskLevel,
    CASE
        WHEN iso.lockoutPoints IS NOT NULL 
        THEN iso.lockoutPoints * 2  // Besoin: 2 dispositifs par point
        ELSE 4  // Par défaut: 4 dispositifs minimum
    END AS recommendedQuantity
ORDER BY riskLevel, activeTasksCount DESC
📊 Exemple de Résultat / Result Example
{
  "isolatorId": "ISO-MV-2024-B14",
  "isolatorType": "Sectionneur moyenne tension / MV Disconnector",
  "location": "Poste électrique principal",
  "voltageKV": 13.8,
  "lockoutPoints": 3,  // 3 points de verrouillage
  "activeTasksCount": 2,  // 2 tâches actives nécessitant consignation!
  "violation": "NO_LOTO_INVENTORY",
  "riskLevel": "CRITICAL",
  "recommendedQuantity": 6,  // 6 dispositifs requis (3 points × 2)
  "criticalityLevel": "🔴 CRITIQUE / CRITICAL",
  "requiredAction": "Approvisionnement urgent dispositifs LOTO / Urgent LOTO devices procurement"
}
🔌 Requête #5 - Rallonges Électriques > Longueur Max
🇫🇷 Objectif: Identifier les rallonges électriques dépassant la longueur maximale réglementaire (risque chute tension, surchauffe).
🇬🇧 Objective: Identify extension cords exceeding maximum regulatory length (voltage drop, overheating risk).
💻 Requête Cypher Neo4j
// 🔌 Détection: Rallonges électriques dépassant longueur maximale
// Detection: Extension cords exceeding maximum length

MATCH (cord:Asset {class: 'ExtensionCord'})-[:PART_OF]->(p {id: $projectId})
WHERE cord.lengthM > $maxLen  // Longueur max règlementaire (ex: 30m / 100ft)
WITH cord,
     cord.lengthM - $maxLen AS excessLength,
     EXISTS {
         MATCH (cord)<-[:USES]-(:Task {status: 'Active'})
     } AS currentlyInUse
RETURN 
    cord.id AS cordId,
    cord.type AS cordType,
    cord.gauge AS wireGaugeAWG,
    cord.lengthM AS lengthMeters,
    $maxLen AS maxLengthMeters,
    round(excessLength, 1) AS excessLengthMeters,
    cord.amperage AS ratedAmperageA,
    cord.lastInspection AS lastInspection,
    currentlyInUse,
    'EXCESSIVE_LENGTH' AS violation,
    CASE
        WHEN currentlyInUse AND cord.amperage >= 20 THEN 'CRITICAL'
        WHEN currentlyInUse THEN 'HIGH'
        WHEN cord.amperage >= 20 THEN 'MEDIUM'
        ELSE 'LOW'
    END AS riskLevel
ORDER BY riskLevel, excessLength DESC
📊 Exemple de Résultat / Result Example
{
  "cordId": "CORD-2024-EXT-0847",
  "cordType": "Heavy-duty extension cord / Rallonge industrielle",
  "wireGaugeAWG": 12,  // Calibre 12 AWG
  "lengthMeters": 48.0,  // 48 mètres!
  "maxLengthMeters": 30.0,  // Maximum: 30 mètres (100 pieds)
  "excessLengthMeters": 18.0,  // Excès de 18 mètres
  "ratedAmperageA": 20,
  "lastInspection": "2024-09-15",
  "currentlyInUse": true,  // Actuellement utilisée!
  "violation": "EXCESSIVE_LENGTH",
  "riskLevel": "CRITICAL",  // En utilisation + haute intensité
  "criticalityLevel": "🔴 CRITIQUE / CRITICAL",
  "requiredAction": "Remplacement immédiat + circuit permanent / Immediate replacement + permanent circuit"
}
⚠️ Matrice de Criticité & Actions / Criticality Matrix & Actions
🔴 CRITIQUE / CRITICAL
Violations:
• Tableau ≥ 600V sans étude
• Travail tension sans permis + ÉPI
• Circuit ext. sans GFCI
• Isolateur avec tâches actives
• Rallonge > 30m en utilisation

Actions:
• Arrêt immédiat travaux
• Consignation / Lockout
• Intervention < 15 min
🟠 ÉLEVÉ / HIGH
Violations:
• Tableau 240-600V sans étude
• Travail tension sans permis OU ÉPI
• Circuit int. ≥ 240V sans GFCI
• Isolateur ≥ 600V sans stock
• Rallonge > max en utilisation

Actions:
• Évaluation risques / Risk assessment
• Correction < 24h
• Formation équipes
🟡 MOYEN / MEDIUM
Violations:
• Tableau < 240V sans étude
• ÉPI arc-flash inadéquat
• Circuit int. < 240V sans GFCI
• Isolateur basse tension
• Rallonge > max (inactive)

Actions:
• Planification corrections
• Surveillance renforcée
• Correction < 7 jours
🟢 FAIBLE / LOW
Conformité:
• Études arc-flash à jour
• Permis + ÉPI appropriés
• GFCI sur tous circuits temp.
• Stock LOTO complet
• Rallonges conformes

Actions:
• Maintenance préventive
• Audits périodiques
📚 Normes & Références / Standards & References
⚡ NFPA 70E
🇨🇦 CSA Z462
⚠️ OSHA 1910.333
⚡ IEEE 1584
🇨🇦 CEC 2024
📋 NFPA 70 (NEC)
🌍 IEC 61482
🔒 ANSI Z244.1
⚡ ASTM F1506
🇨🇦 CNESST Art. 185-187
📖 NFPA 70E - Standard for Electrical Safety in the Workplace: Études arc-flash obligatoires tous les 5 ans ou lors modifications majeures. Catégories ÉPI (CAT 1-4) basées sur énergie incidente. GFCI requis sur circuits temporaires et extérieurs. / Arc-flash studies required every 5 years or upon major modifications. PPE categories (CAT 1-4) based on incident energy. GFCI required on temporary and outdoor circuits.
🤖 Agents AgenticX5 / AI Agents
ArcFlashAI
FR: Gestion intelligente études arc-flash, calculs énergie incidente, alertes expiration, recommandations étiquetage.

EN: Intelligent arc-flash study management, incident energy calculations, expiration alerts, labeling recommendations.
🔧
EnergizedWorkAI
FR: Surveillance travail sous tension temps réel, validation permis + ÉPI, scoring conformité électriciens.

EN: Real-time energized work monitoring, permit + PPE validation, electrician compliance scoring.
🔌
CircuitAI
FR: Monitoring circuits temporaires, détection absence GFCI, tracking âge installations temporaires.

EN: Temporary circuit monitoring, missing GFCI detection, temporary installation age tracking.
🔒
LOTOAI
FR: Gestion stocks dispositifs LOTO, alertes ruptures, optimisation allocation par équipe/site.

EN: LOTO device inventory management, stock-out alerts, team/site allocation optimization.
📏
CordAI
FR: Inspection automatisée rallonges, calculs chute tension, recommandations remplacement circuits permanents.

EN: Automated extension cord inspection, voltage drop calculations, permanent circuit replacement recommendations.
🧤
PPEAI
FR: Validation catégories ÉPI arc-flash, tracking dates expiration, alertes équipements endommagés ou périmés.

EN: Arc-flash PPE category validation, expiration date tracking, damaged or expired equipment alerts.