N8N, OpenClaw & Prometheus¶
Ces trois modules forment le triangle d'intelligence de la solution Essensys : l'automatisation des workflows (N8N), l'intelligence artificielle (OpenClaw) et l'observabilité (Prometheus). Tous trois gravitent autour du MCP qui reste le service central.
Vue d'ensemble¶
graph TB
subgraph Triangle d'intelligence
OpenClaw[OpenClaw<br/>Agent IA<br/>Décisions intelligentes]
N8N[N8N<br/>Workflow Automation<br/>Orchestration user + IA]
Prometheus[Prometheus<br/>Métriques + Alertes<br/>Observabilité]
end
MCP[MCP Essensys<br/>Service Central<br/>:8083]
OpenClaw <-->|webhooks<br/>notifications| N8N
Prometheus -->|alertmanager<br/>webhooks| N8N
Prometheus -->|alertmanager<br/>webhooks| OpenClaw
OpenClaw -->|SSE + JSON-RPC<br/>tools MCP| MCP
N8N -->|SSE + JSON-RPC<br/>tools MCP| MCP
MCP -->|/metrics| Prometheus
subgraph Essensys Core
Backend[Backend]
Redis[(Redis)]
Mosquitto[Mosquitto]
end
MCP --> Redis
MCP --> Backend
MCP --> Mosquitto
style MCP fill:#fff3e0,stroke:#e65100,stroke-width:4px
style OpenClaw fill:#fce4ec,stroke:#c62828,stroke-width:3px
style N8N fill:#e8f5e9,stroke:#2e7d32,stroke-width:3px
style Prometheus fill:#fff8e1,stroke:#f57f17,stroke-width:3px OpenClaw - Agent IA¶
Rôle¶
OpenClaw est l'agent IA qui pilote Essensys de manière intelligente. Il se connecte au MCP via SSE et utilise les outils MCP pour :
- Piloter les équipements (lumières, volets, scénarios) par commande naturelle
- Diagnostiquer les problèmes (via
run_self_diagnostic,list_service_status) - Réagir aux alertes Prometheus (auto-réparation)
- Apprendre les habitudes utilisateur pour suggérer des automatisations
Architecture¶
graph LR
subgraph OpenClaw
LLM[LLM Engine<br/>Claude / GPT]
MCPClient[MCP Client<br/>SSE + JSON-RPC]
AlertReceiver[Alert Receiver<br/>Webhook endpoint]
SkillPack[Essensys Skill Pack<br/>Contexte domotique]
end
User[Utilisateur] -->|voix / texte| LLM
LLM -->|tool calls| MCPClient
MCPClient -->|SSE| MCP[MCP :8083]
Prometheus[Prometheus<br/>Alertmanager] -->|webhook| AlertReceiver
AlertReceiver --> LLM
LLM -->|notification| N8N[N8N webhook]
style OpenClaw fill:#fce4ec,stroke:#c62828,stroke-width:2px
style MCP fill:#fff3e0,stroke:#e65100,stroke-width:2px Outils MCP utilisés par OpenClaw¶
| Outil MCP | Usage OpenClaw |
|---|---|
find_device_index | Trouver un équipement par nom naturel |
send_order | Exécuter une commande (allumer, éteindre, ouvrir, fermer) |
read_exchange_table | Lire l'état de tous les équipements |
read_exchange_value | Vérifier l'état d'un équipement spécifique |
list_service_status | Vérifier la santé de l'infrastructure |
run_self_diagnostic | Diagnostiquer et réparer automatiquement |
read_service_logs | Analyser les logs pour trouver la cause d'un problème |
download_essensys_skill | Charger le contexte domotique complet |
Cas d'usage¶
| Scénario | Déclencheur | Action OpenClaw |
|---|---|---|
| "Éteins les lumières du salon" | Commande utilisateur | find_device_index → send_order |
| Service backend down | Alerte Prometheus | run_self_diagnostic(auto_repair=true) |
| CPU > 90% depuis 5 min | Alerte Prometheus | get_system_metrics → analyse → recommandation |
| "Qu'est-ce qui ne marche pas ?" | Commande utilisateur | list_service_status + read_service_logs → résumé |
Configuration¶
# openclaw/config.yaml
mcp:
url: http://essensys-mcp:8083
token_file: /data/mcp.token
alerts:
webhook_port: 3100
webhook_path: /alerts
n8n:
webhook_url: http://n8n:5678/webhook/openclaw-events
llm:
provider: anthropic # ou openai
model: claude-sonnet-4-20250514
# api_key via env: ANTHROPIC_API_KEY
N8N - Workflow Automation¶
Rôle¶
N8N est le chef d'orchestre qui automatise les interactions entre l'utilisateur, l'IA et les services Essensys. Il remplace les scripts bash et les crons par des workflows visuels.
Pourquoi N8N ?¶
| Critère | N8N | Scripts bash | Home Assistant |
|---|---|---|---|
| Interface visuelle | Oui (drag & drop) | Non | Oui |
| Self-hosted | Oui | N/A | Oui |
| Intégration MCP | Via HTTP/webhook | curl | Non natif |
| Intégration IA | Nodes LLM natifs | Non | Limité |
| Notifications multi-canal | 400+ intégrations | Manuel | Limité |
| Coût | Gratuit (self-hosted) | Gratuit | Gratuit |
| RAM | ~200 Mo | ~0 | ~500 Mo |
Workflows essentiels¶
1. Notification d'alerte Prometheus¶
graph LR
A[Prometheus Alert<br/>webhook] --> B[N8N Trigger]
B --> C{Sévérité?}
C -->|Warning| D[Email admin]
C -->|Critical| E[WhatsApp + Signal + Telegram]
C -->|Critical| F[OpenClaw<br/>auto-diagnostic]
F --> G{Résolu?}
G -->|Oui| H[Notification OK]
G -->|Non| I[Escalade humain]
style B fill:#e8f5e9,stroke:#2e7d32 2. Mise à jour automatique¶
graph LR
A[Cron<br/>toutes les heures] --> B[N8N: Check registry]
B --> C{Nouvelle version?}
C -->|Non| D[Fin]
C -->|Oui| E[Notification admin<br/>WhatsApp / Signal / Telegram]
E --> F{Admin approuve?}
F -->|Oui| G[N8N: Call Control Plane<br/>POST /api/update/apply]
G --> H[Health check]
H --> I{OK?}
I -->|Oui| J[Notification succès]
I -->|Non| K[Rollback + Alerte]
style B fill:#e8f5e9,stroke:#2e7d32 3. Interaction utilisateur → IA → Essensys¶
graph LR
A[Utilisateur<br/>WhatsApp / Signal / Telegram] --> B[N8N Trigger<br/>message reçu]
B --> C[N8N: Forward à<br/>OpenClaw]
C --> D[OpenClaw:<br/>Interprète commande]
D --> E[MCP:<br/>Exécute action]
E --> F[N8N: Réponse<br/>à l'utilisateur]
style B fill:#e8f5e9,stroke:#2e7d32
style D fill:#fce4ec,stroke:#c62828
style E fill:#fff3e0,stroke:#e65100 4. Rapport quotidien¶
graph LR
A[Cron 08:00] --> B[N8N: Query Prometheus<br/>métriques 24h]
B --> C[N8N: Query MCP<br/>events 24h]
C --> D[N8N: Générer rapport<br/>via OpenClaw/LLM]
D --> E[Email rapport<br/>admin]
style B fill:#e8f5e9,stroke:#2e7d32 Exemples de workflows N8N supplémentaires¶
| Workflow | Trigger | Actions |
|---|---|---|
| Backup quotidien | Cron 02:00 | Export Redis → fichier → upload S3/NAS |
| Détection intrusion | Alerte Prometheus (port scan) | Notification immédiate + log |
| Température Pi élevée | Alerte Prometheus (> 70°C) | Throttle services + notification |
| Nouveau device connecté | Event MQTT | Notification + ajout dans registre |
| Résumé hebdo | Cron lundi 09:00 | Agrégation métriques → rapport PDF → email |
Prometheus - Métriques & Alertes¶
Rôle¶
Prometheus collecte les métriques de tous les services, les stocke en time series, et déclenche des alertes via Alertmanager vers N8N et OpenClaw.
Configuration¶
prometheus.yml¶
global:
scrape_interval: 15s
evaluation_interval: 15s
rule_files:
- /etc/prometheus/alert-rules.yml
alerting:
alertmanagers:
- static_configs:
- targets:
- alertmanager:9093
scrape_configs:
# ─── Essensys Core ───
- job_name: essensys-backend
static_configs:
- targets: ['essensys-backend:7070']
metrics_path: /metrics
- job_name: essensys-mcp
static_configs:
- targets: ['essensys-mcp:8083']
metrics_path: /metrics
# ─── IA & Automation ───
- job_name: n8n
static_configs:
- targets: ['n8n:5678']
metrics_path: /metrics
- job_name: openclaw
static_configs:
- targets: ['openclaw:3100']
metrics_path: /metrics
# ─── Infrastructure ───
- job_name: control-plane
static_configs:
- targets: ['control-plane:9100']
metrics_path: /metrics
- job_name: traefik
static_configs:
- targets: ['traefik:8080']
metrics_path: /metrics
- job_name: redis
static_configs:
- targets: ['redis-exporter:9121']
# ─── System (Raspberry Pi) ───
- job_name: node
static_configs:
- targets: ['node-exporter:9100']
Règles d'alerte (alert-rules.yml)¶
groups:
- name: essensys-services
rules:
# Service down
- alert: ServiceDown
expr: up == 0
for: 1m
labels:
severity: critical
annotations:
summary: "Service {{ $labels.job }} is down"
description: "{{ $labels.job }} n'est plus joignable depuis 1 minute."
# MCP : aucune connexion SSE active
- alert: MCPNoActiveConnections
expr: essensys_mcp_active_sse_connections == 0
for: 5m
labels:
severity: warning
annotations:
summary: "Aucun agent connecté au MCP"
# MCP : erreurs send_order
- alert: MCPOrderErrors
expr: rate(essensys_mcp_send_order_errors_total[5m]) > 0.1
for: 2m
labels:
severity: critical
annotations:
summary: "Erreurs d'envoi d'ordres MCP"
- name: raspberry-system
rules:
# CPU élevé
- alert: HighCPU
expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
for: 5m
labels:
severity: warning
annotations:
summary: "CPU > 80% depuis 5 minutes"
# Température élevée
- alert: HighTemperature
expr: node_hwmon_temp_celsius > 70
for: 2m
labels:
severity: warning
annotations:
summary: "Température Pi > 70°C"
# Disque plein
- alert: DiskSpaceLow
expr: (node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"}) < 0.15
for: 5m
labels:
severity: warning
annotations:
summary: "Moins de 15% d'espace disque libre"
# RAM élevée
- alert: HighMemory
expr: (1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) > 0.85
for: 5m
labels:
severity: warning
annotations:
summary: "RAM > 85% utilisée"
- name: n8n-workflows
rules:
- alert: N8NWorkflowErrors
expr: rate(n8n_workflow_execution_errors_total[10m]) > 0.05
for: 5m
labels:
severity: warning
annotations:
summary: "Erreurs dans les workflows N8N"
Alertmanager → N8N + OpenClaw¶
# alertmanager.yml
global:
resolve_timeout: 5m
route:
receiver: default
group_by: ['alertname', 'job']
group_wait: 30s
group_interval: 5m
repeat_interval: 1h
routes:
# Alertes critiques → OpenClaw (auto-repair) + N8N (notification)
- match:
severity: critical
receiver: critical-alerts
# Warnings → N8N uniquement (notification admin)
- match:
severity: warning
receiver: warning-alerts
receivers:
- name: default
webhook_configs:
- url: http://n8n:5678/webhook/prometheus-alerts
- name: critical-alerts
webhook_configs:
- url: http://n8n:5678/webhook/prometheus-alerts
- url: http://openclaw:3100/alerts
- name: warning-alerts
webhook_configs:
- url: http://n8n:5678/webhook/prometheus-alerts
Métriques exposées par le MCP (endpoint /metrics)¶
Le MCP doit exposer des métriques Prometheus. Voici les métriques recommandées :
# ─── Connexions ───
essensys_mcp_active_sse_connections # Nombre de sessions SSE actives
essensys_mcp_total_connections # Total connexions depuis le démarrage
# ─── Outils appelés ───
essensys_mcp_tool_calls_total{tool="find_device_index"}
essensys_mcp_tool_calls_total{tool="send_order"}
essensys_mcp_tool_calls_total{tool="read_exchange_table"}
essensys_mcp_tool_calls_total{tool="run_self_diagnostic"}
essensys_mcp_tool_duration_seconds{tool="send_order"}
# ─── Ordres ───
essensys_mcp_orders_sent_total # Ordres envoyés avec succès
essensys_mcp_send_order_errors_total # Erreurs d'envoi
# ─── Redis ───
essensys_mcp_redis_latency_seconds # Latence Redis
essensys_mcp_redis_errors_total # Erreurs Redis
# ─── Système ───
essensys_mcp_uptime_seconds # Uptime du service
essensys_mcp_version_info{version="V.1.2.2", commit="abc123"} # Info version
Impact mémoire sur Raspberry Pi¶
| Service | RAM estimée | Justification |
|---|---|---|
| Prometheus | ~150-300 Mo | Dépend du nombre de métriques et de la rétention |
| N8N | ~200-400 Mo | Node.js, dépend du nombre de workflows actifs |
| OpenClaw | ~100-200 Mo | Go/Python, dépend du LLM (API externe, pas local) |
| Total ajouté | ~450-900 Mo | Sur un Pi 4 Go: serré. Pi 8 Go recommandé |
Recommandation mémoire
Avec l'ajout de N8N, OpenClaw et Prometheus, un Raspberry Pi 4 avec 8 Go de RAM est fortement recommandé. Sur un Pi 4 Go, il faudra tuner les limites mémoire Docker et la rétention Prometheus.
Flux de données global¶
sequenceDiagram
participant User as Utilisateur (WhatsApp / Signal / Telegram)
participant N8N as N8N
participant OC as OpenClaw
participant MCP as MCP :8083
participant Redis as Redis
participant Backend as Backend
participant Client as Client Legacy
participant Prom as Prometheus
Note over User,Prom: Scénario : commande vocale + monitoring
User->>N8N: "Éteins les lumières du salon"
N8N->>OC: Forward message
OC->>MCP: find_device_index(name="salon", action="eteindre")
MCP->>Redis: Lookup table d'échange
Redis-->>MCP: index=613, value=64
MCP-->>OC: {index: 613, value: "64"}
OC->>MCP: send_order(params=[{k:613, v:"64"}])
MCP->>Redis: Write essensys:global:actions
Redis-->>Backend: Consommation file
Backend->>Client: Exécution commande
MCP-->>OC: Ordre envoyé OK
OC-->>N8N: "Lumières du salon éteintes"
N8N-->>User: "Lumières du salon éteintes ✓"
Note over Prom: En parallèle : monitoring continu
Prom->>MCP: GET /metrics
MCP-->>Prom: essensys_mcp_orders_sent_total++
Prom->>Prom: Évaluation règles d'alerte