ソース情報
- リポジトリ
- 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コマンドは1行のまま表示されます。コピー前に横へスクロールして全体を確認してください。
ローカルで確認しますか?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.