소스 정보
- 저장소
- JohnNuwan/EVA_CORE
- 최근 소스 활동
- 2026년 7월 18일 08:30
- 감지된 SKILL.md 언어
- 프랑스어
- 스타
- 0
- 포크
- 0
설치 방법
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
소스 파일 검토
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
메뉴
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
직접 명령은 검토 Prompt를 거치지 않습니다. 실행하기 전에 소스를 확인하세요.
npx skills add https://github.com/JohnNuwan/EVA_CORE --skill sparkplug-b명령은 한 줄로 유지됩니다. 복사하기 전에 가로로 스크롤해 전체 내용을 확인하세요.
로컬 사본을 원하시나요? SkillsMP에서 현재 제공할 수 있는 파일을 다운로드하세요.
Concevoir et maintenir un watchdog auto-correcteur pour services HTTP — checks de santé, auto-restart, état persistant, rapports et pièges bash.
Serveur de messagerie sécurisé auto-hébergé (Signal-like) avec Flask + WebSocket + AES-256-GCM + pont EVA
ADAM-SENTINEL — Veilleur technologique 24h/24h. Scanne 10 domaines, cree des rapports, met a jour les skills, alerte sur les CVE et breaking changes.
SOC 직업 분류 기준
SKILL.md 표시 중
| name | sparkplug-b |
| description | Implémenter et configurer des architectures Sparkplug B. |
| version | 2.0.0 |
| author | EVA |
| license | Privée EVA St-Étienne |
| platforms | ["linux","macos","windows"] |
| metadata | {"EVA":{"tags":["mqtt","sparkplug-b","uns","iiot","industrial-automation","protobuf","edge-computing","tahu","scada","mqtt-sparkplug"],"related_skills":["industrial-protocols","industrial-uns","industrial-edge","opc-ua-scanner","plc-diagnostic"]}} |
Le protocole MQTT Sparkplug B est une spécification ouverte (développée par Cirrus Link Solutions, désormais sous l'égide de l'Eclipse Foundation) qui définit un format de données standardisé et un mécanisme robuste de gestion d'état pour les architectures IIoT (Industrial Internet of Things).
Contrairement au MQTT vanilla qui est neutre vis-à-vis du format du payload, Sparkplug B impose :
spBv1.0/group_id/message_type/edge_node_id/[device_id].NBIRTH, NDEATH, DBIRTH, DDEATH.seq) garantissant l'intégrité de l'ordre des messages (compteur 0–255, rollover).STATE) pour restaurer l'historique après une coupure réseau.Cette standardisation est la clé de voûte pour l'alimentation dynamique d'un Unified Namespace (UNS) en contexte industriel.
[PLC / Capteurs] → [Edge Gateway (Passerelle)]
│
▼
[Broker MQTT (ex: Mosquitto, HiveMQ)]
│
▼
[SCADA / Historien / Cloud (Primary Host)]
L'Edge Gateway publie les données des équipements en suivant strictement le format Sparkplug B. Le Primary Host (SCADA) s'abonne et garantit la cohérence des données.
À utiliser lorsque l'utilisateur demande de :
Chaque message Sparkplug B doit suivre exactement la structure suivante :
spBv1.0 / group_id / message_type / edge_node_id / [device_id]
| Segment | Obligatoire | Description | Exemple |
|---|---|---|---|
spBv1.0 | Oui | Version du protocole (fixe, ne pas modifier) | spBv1.0 |
group_id | Oui | Identifiant logique d'un groupe d'équipements | Usine_Lyon, Site_01 |
message_type | Oui | Type de message Sparkplug | NBIRTH, NDATA, NCMD |
edge_node_id | Oui | Identifiant unique de la passerelle Edge | Gateway_IQAN_01 |
device_id | Non | Identifiant de l'équipement connecté | Automate_Filtre, Vanne_01 |
| Message | Sens | Description |
|---|---|---|
| NBIRTH | Edge → Broker | Envoyé par la passerelle Edge lors de sa connexion pour s'enregistrer et lister toutes ses variables/métriques. |
| NDEATH | Broker → Subscribers | Publié par le broker via le testament MQTT (Last Will) si la passerelle perd la connexion de manière inattendue. |
| DBIRTH | Edge → Broker | Annonce la présence et les variables d'un équipement (ex: PLC) raccordé à la passerelle. |
| DDEATH | Broker → Subscribers | Testament pour un équipement spécifique perdu. |
| NDATA | Edge → Broker | Envoi régulier des valeurs de la passerelle (sur variation/deadband). |
| DDATA | Edge → Broker | Envoi régulier des valeurs d'un équipement (sur variation/deadband). |
| NCMD | SCADA → Edge | Commande destinée à la passerelle (ex: redémarrage). |
| DCMD | SCADA → Edge | Commande destinée à un équipement (ex: activation vanne). |
spBv1.0/Usine_Lyon/NBIRTH/Gateway_IQAN_01
spBv1.0/Usine_Lyon/DBIRTH/Gateway_IQAN_01/Automate_Filtre
spBv1.0/Usine_Lyon/DDATA/Gateway_IQAN_01/Automate_Filtre
spBv1.0/Usine_Lyon/DCMD/Gateway_IQAN_01/Automate_Filtre
Le payload Sparkplug B est encodé en Protocol Buffers (Protobuf) en utilisant le schéma officiel de l'Eclipse Tahu project.
// Extrait du schéma Sparkplug B (tahu.proto)
message Payload {
uint64 timestamp = 1; // Timestamp UNIX en millisecondes
repeated Metric metrics = 2; // Liste des métriques
uint64 seq = 3; // Numéro de séquence 0-255
string uuid = 8; // Identifiant unique du message
bytes body = 9; // Corps optionnel
}
message Metric {
string name = 1; // Nom complet de la métrique
uint64 alias = 2; // Alias numérique (optimisation bande passante)
uint64 timestamp = 3; // Timestamp de la mesure
DataType datatype = 4; // Type de données (Int32, Float, Boolean, String...)
bool is_historical = 15; // Flag données historiques
oneof value {
uint64 int_value = 7;
uint64 long_value = 8;
float float_value = 9;
double double_value = 10;
bool boolean_value = 11;
string string_value = 12;
bytes bytes_value = 13;
}
}
| Alias Type | Nom | Protobuf Type |
|---|---|---|
| 0 | Int8 | int_value (uint64) |
| 1 | Int16 | int_value (uint64) |
| 2 | Int32 | int_value (uint64) |
| 3 | Int64 | long_value |
| 4 | UInt8 | int_value (uint64) |
| 5 | UInt16 | int_value (uint64) |
| 6 | UInt32 | int_value (uint64) |
| 7 | UInt64 | long_value |
| 8 | Float | float_value |
| 9 | Double | double_value |
| 10 | Boolean | boolean_value |
| 11 | String | string_value |
| 12 | DateTime | long_value (epoch ms) |
| 13 | Text | string_value |
| 14 | UUID | string_value |
| 15 | DataSet | bytes_value |
| 16 | Bytes | bytes_value |
| 17 | File | bytes_value |
| 18 | Template | bytes_value |
Le script sparkplug_client.py implémente un client Sparkplug B complet capable de publier des messages NBIRTH, DBIRTH et NDATA/DDATA.
import subprocess
import json
# Métriques à envoyer avec leurs types officiels Sparkplug
metrics = {
"Convoyeur/Vitesse": {"value": 145.2, "type": "Float"},
"Convoyeur/Etat_Marche": {"value": True, "type": "Boolean"},
"Cuve/Niveau": {"value": 2.35, "type": "Float"},
"Cuve/Alarme_Haute": {"value": 0, "type": "Int32"},
"Cuve/Commentaire_Op": {"value": "Cycle standard", "type": "String"}
}
cmd = [
".venv/Scripts/python.exe",
"skills/industrial/automation/sparkplug-b/scripts/sparkplug_client.py",
"--broker", "localhost",
"--port", "1883",
"--group-id", "Usine_Lyon",
"--node-id", "Gateway_Passerelle_01",
"--action", "birth",
"--metrics", json.dumps(metrics),
"--debug", # Activer le mode verbose
]
print("Publication NBIRTH...")
result = subprocess.run(cmd, capture_output=True, text=True)
print(result.stdout)
result.stderr:
(, result.stderr)
import subprocess
import json
new_metrics = {
"Convoyeur/Vitesse": {"value": 148.7, "type": "Float"},
"Cuve/Niveau": {"value": 2.41, "type": "Float"},
}
cmd = [
".venv/Scripts/python.exe",
"skills/industrial/automation/sparkplug-b/scripts/sparkplug_client.py",
"--broker", "localhost",
"--port", "1883",
"--group-id", "Usine_Lyon",
"--node-id", "Gateway_Passerelle_01",
"--action", "data",
"--metrics", json.dumps(new_metrics),
]
print("Publication NDATA...")
result = subprocess.run(cmd, capture_output=True, text=True)
print(result.stdout)
# S'abonner à tous les topics Sparkplug B
mosquitto_sub -h localhost -t "spBv1.0/#" -v
seq)seq commence à 0 lors d'un message NBIRTH ou DBIRTH.NDATA, DDATA, NCMD, DCMD suivant.seq hors séquence doit rejeter le message et demander un nouveau Birth.bdSeqLe message NBIRTH doit contenir la métrique bdSeq (Birth/Death Sequence Number). Cette métrique permet au Primary Host de savoir :
bdSeq a changé depuis la dernière connexion).{
"name": "bdSeq",
"type": "Int64",
"value": 15
}
Le Primary Host (souvent un SCADA comme Ignition) maintient un topic STATE :
spBv1.0/Usine_Lyon/STATE/Gateway_Passerelle_01
Ce message est publié avec le flag RETAIN pour indiquer quel client est l'hôte primaire actif. Si le Primary Host tombe, un nouveau host peut reprendre en publiant un message STATE avec ses propres identifiants.
Mauvaise gestion du compteur de séquence (seq) :
NDATA/DDATA consécutif, ou ne pas le réinitialiser à 0 lors d'un NBIRTH. Le client primaire (SCADA) rejette tous les messages hors séquence.Utilisation du flag RETAIN sur les messages de données :
retain=True sur les messages NDATA/DDATA. Cela provoque la relecture de données périmées au redémarrage d'un client.STATE) utilisent le flag RETAIN. Les messages de données utilisent QoS 1 sans RETAIN.Absence de la métrique bdSeq dans NBIRTH :
bdSeq. Le Primary Host ne peut pas déterminer si l'Edge a redémarré ou si des données historiques sont perdues.bdSeq dans le NBIRTH. Incrémenter bdSeq à chaque redémarrage de l'Edge.Non-respect de l'ordre Birth → Data :
NDATA avant d'avoir envoyé le NBIRTH. Le Primary Host ignore tous les messages de données sans Birth préalable.Confusion entre Node et Device dans le topic :
DBIRTH avec un topic qui n'inclut pas le device_id : spBv1.0/group/DBIRTH/node/ (manque le dernier segment).spBv1.0/group_id/DBIRTH/edge_node_id/device_id.spBv1.0/group_id/message_type/edge_node_id/device_id.seq) commence à 0 lors de NBIRTH/DBIRTH et s'incrémente à chaque message suivant.bdSeq est incluse dans le message NBIRTH.sparkplug-python ou tahu est installée dans l'environnement.