Une commande (aussi appelée RPC) demande à un appareil d’effectuer une action : redémarrage, commutation d’une sortie, lancement d’un test. Chaque commande est enregistrée comme une requête, et vous pouvez en suivre l’état jusqu’à ce que l’appareil réponde. Les commandes ne sont envoyées que par des sessions TLS (sauf si le profil autorise une commande en clair), jamais par les flux qui traitent la télémétrie, et chacune est vérifiée par rapport aux permissions de l’expéditeur.
Le catalogue des commandes
Chaque profil d’appareil dispose d’un onglet Commands : « Les commandes que les opérateurs peuvent envoyer aux appareils de ce profil ; chaque niveau nécessite sa propre permission. » Sa modification nécessite la permission de gérer les commandes (administrateurs).
Sélectionnez Add command et renseignez :
| Champ | Signification |
|---|---|
| Method | Le nom sur le réseau, namespace.verb, par exemple sys.info. Lettres, chiffres, _ et .. |
| Label, Description | Ce que voient les opérateurs. |
| Tier | Basic, Privileged ou Critical : qui peut l’envoyer (voir ci-dessous). |
| High impact (asks for a confirmation) | L’expéditeur doit confirmer ; la commande est envoyée au plus une fois et tracée dans l’audit. |
| Typed confirmation phrase | Facultatif, uniquement pour les commandes à fort impact : l’opérateur la saisit pour envoyer (par exemple REBOOT). |
| One-way (no answer) | L’appareil ne répond pas. |
| Long-running (the answer only says it started) | L’appareil répond immédiatement et signale le résultat plus tard. |
| Default timeout (ms) | 1 000 à 600 000. Vide : la valeur de Default RPC timeout du profil. |
| Persistent by default (delivered when the device comes back) | Met la commande en file d’attente pendant que l’appareil est hors ligne. |
| Parameters | Construits avec Fields (nom, libellé, type Text, Number, Yes / no, Choice ou Any value (JSON), obligatoire, min, max, choices) ou sous forme de Advanced (JSON). Jusqu’à 50 paramètres. |
| Masked parameters | Noms de paramètres dont les valeurs n’apparaissent jamais dans l’historique. |
From a template pré-remplit le formulaire à partir d’une commande que la plateforme envoie déjà (comme une commande de carte de contrôle). Import remplace tout le catalogue par un export ({"commands": [ … ]}) ; Export affiche le catalogue au format JSON. Un profil contient jusqu’à 200 commandes.
Niveaux
| Niveau | Qui peut l’envoyer (par défaut) |
|---|---|
| Basic | Utilisateurs |
| Privileged | Administrateurs |
| Critical | Administrateurs |
| Brute (une méthode absente du catalogue) | Propriétaires |
Remarque
Certaines commandes ne sont jamais envoyées, quel que soit le demandeur : réinitialisation d’usine, appairage, oubli du Wi-Fi et cloud.forget. Certaines familles de méthodes appartiennent à un module, et seul ce module les envoie (par exemple tunnel.* pour l’accès à distance et esim.*). Les profils qui n’utilisent que le schéma de topics Legacy compatible ne comportent aucune commande : « Le RPC n’est pas disponible pour les appareils en schéma Legacy compatible ; utilisez les attributs partagés (onglet Attributes) pour envoyer des réglages. »
Envoyer une commande
- Ouvrez l’appareil et son onglet Commands.
- Choisissez une commande sous Choose a command (ou Other method (raw), réservé aux propriétaires) et renseignez ses Parameters.
- Définissez les options si besoin :
| Option | Signification | Par défaut |
|---|---|---|
| Do not wait for an answer (one-way) | L’appareil ne répond pas. | Désactivé (aller-retour) |
| Answer timeout (seconds) | Durée d’attente de la réponse, de 1 à 600 secondes. | La valeur par défaut de la commande, sinon 10 secondes |
| Deliver when the device comes back (persistent) | Garde la commande en file d’attente pendant que l’appareil est hors ligne. | La valeur par défaut de la commande |
| Give up after (minutes) | Délai au terme duquel une commande en attente est abandonnée. | 24 heures ; 7 jours au maximum |
- Sélectionnez Send. Une commande à fort impact demande Send {method}? (« Cette commande a un impact sur l’appareil (il peut redémarrer ou perdre sa session). ») et, si elle comporte une phrase, Type {phrase} to confirm.
Si l’appareil est hors ligne, l’onglet affiche : « L’appareil est hors ligne : sans « persistent », la commande échoue immédiatement. »
Les tableaux de bord, les symboles SCADA, les règles et les flux peuvent également envoyer des commandes. Une carte de contrôle n’envoie que des commandes de niveau basic. Voir Control cards.
États des commandes
| État | Affiché comme | Signification |
|---|---|---|
QUEUED | Queued | Enregistrée, en attente de l’appareil. |
SENT | Sent | Envoyée à l’appareil. |
DELIVERED | Delivered | L’appareil l’a reçue. |
SUCCESSFUL | Successful | L’appareil a répondu avec succès. |
FAILED | Failed | L’appareil a répondu par une erreur. |
TIMEOUT | Timed out | Aucune réponse à temps. Cela signifie « aucune réponse n’est arrivée », et non « elle ne s’est pas exécutée ». |
EXPIRED | Expired | Elle a expiré avant de pouvoir être remise. |
CANCELLED | Cancelled | Annulée par un utilisateur. |
Une commande longue affiche Running on the device jusqu’à l’arrivée de son résultat ; une commande expirée affiche No answer: the outcome is unknown ; une réponse arrivée après la fin affiche Answered after the end.
L’historique
L’History de l’onglet Commands liste Method, Status, Sent by (Console, API, A flow, Firmware update, An alarm action, A dashboard control), Created, Completed et Duration. Ouvrez une commande pour voir sa Request, sa Response et sa Progress, pour Cancel command tant qu’elle est en attente ou envoyée, ou pour Send again. Les paramètres secrets sont masqués.
Limites par défaut : 10 commandes par appareil et par minute, et 600 par organisation et par minute ; paramètres jusqu’à 16 Kio de JSON ; réponse jusqu’à 64 Kio. L’historique est conservé 90 jours.
Sur l’appareil
L’appareil s’abonne à v1/rpc/req/+ et reçoit :
PUBLISH v1/rpc/req/42
{"method": "sys.ping", "params": {"host": "8.8.8.8", "count": 3}}
Pour une commande à aller-retour, il répond avec le même identifiant :
PUBLISH v1/rpc/res/42
{"ok": true, "result": {"sent": 3, "received": 3, "avg_ms": 18.2}}
Règles pour l’appareil :
- Une commande peut arriver deux fois. Mémorisez au moins les 32 derniers identifiants de requête pendant 10 minutes et n’exécutez jamais deux fois le même identifiant.
- Si la requête contient
expirationTimeet qu’elle est dépassée, ne l’exécutez pas ; répondez{"ok": false, "error": "expired"}. - Si la requête est plus grande que ce que l’appareil peut traiter, ne l’exécutez pas ; répondez
{"ok": false, "error": "payload_too_large"}. - Les commandes ne sont livrées qu’après que l’appareil s’est abonné à
v1/rpc/req/+sur cette connexion.
Les appareils HTTP attendent les commandes avec GET /api/v1/rpc et répondent avec POST /api/v1/rpc/{id}. Voir Device HTTP API.
Commandes longues
PUBLISH v1/rpc/res/43
{"ok": true, "accepted": true, "job_id": "43"}
PUBLISH v1/attributes
{"rpc_result": {"job_id": "43", "method": "sys.traceroute", "ok": true, "result": {...}, "ts": 1759572042000}}
Requêtes émises par l’appareil
Un appareil peut aussi interroger le cloud : il publie sur v1/rpc/up/req/{id} avec {"method": …, "params": …} et lit la réponse sur v1/rpc/up/res/{id}. Vos flux reçoivent et traitent ces requêtes.
LoRaWAN et enfants de passerelle
- Les appareils LoRaWAN reçoivent des downlinks bruts avec la commande
lora.downlink. Voir Sending downlinks. - Les commandes vers les appareils derrière une passerelle sont en cours de développement. Voir Commands to devices behind a gateway.
Par API
POST/tenant/{tenantId}/api/iot/devices/{deviceId}/rpc
Envoyer une commande à un appareil. Champs du corps : method (obligatoire), params, oneway, persistent, timeoutMs (1 000 à 600 000), expiresInS (1 à 604 800), wait, confirm, confirmText, source (console, api ou dashboard_control). params est limité à 16 Kio de JSON. Un appel bidirectionnel, non persistant, avec un délai d’au plus 30 secondes attend la fin et répond 200. Tout autre appel répond 202 immédiatement. Une commande à fort impact nécessite "confirm": true.
Corps de la requête application/json
{
"method": "sys.ping",
"params": {
"host": "8.8.8.8",
"count": 3
},
"timeoutMs": 10000
}
Exemple curl
curl -X POST 'https://<your-host>/tenant/{tenantId}/api/iot/devices/{deviceId}/rpc' \
-H 'Content-Type: application/json' \
-d '{"method":"sys.ping","params":{"host":"8.8.8.8","count":3},"timeoutMs":10000}'
Réponses
200OK
{
"rpc": {
"rpcId": "…",
"deviceId": "…",
"method": "sys.ping",
"status": "SUCCESSFUL",
"outcome": null,
"response": {
"ok": true,
"result": {
"sent": 3,
"received": 3,
"avg_ms": 18.2
}
},
"tier": "basic",
"highImpact": false,
"source": "api",
"…": "…"
}
}
202Accepted
{
"rpc": {
"rpcId": "…",
"deviceId": "…",
"method": "sys.reboot",
"status": "QUEUED",
"…": "…"
}
}
400Bad Request
{
"message": "This command needs confirm: true.",
"code": "VALIDATION_ERROR",
"details": {
"reason": "confirm_required"
}
}
403Forbidden
Aucun corps de réponse.
404Not Found
{
"message": "Device not found.",
"code": "NOT_FOUND"
}
429Too Many Requests
Aucun corps de réponse.
Lisez une commande avec GET /tenant/{tenantId}/api/iot/rpc/{rpcId} et annulez-la avec POST …/rpc/{rpcId}/cancel (uniquement pendant QUEUED ou SENT ; action journalisée). Le champ outcome affiche running, unknown ou late, comme décrit ci-dessus. Voir Commands API.
Les événements webhook rpc.completed et rpc.failed informent les autres systèmes du résultat. Les commandes à fort impact et les commandes brutes sont inscrites dans le journal d’audit à leur création et à leur fin.

