Nouveau : le pare-feu IA surveille chaque module et explique chaque incident en termes simples. Découvrez comment ça marche

API HTTP des appareils

Tous les points de terminaison des appareils sur HTTPS – télémétrie, attributs, interrogation longue des commandes et réponses, requêtes des appareils et provisionnement – avec exemples et codes d'état.

Utilisez HTTPS lorsqu’un appareil ne peut pas maintenir une connexion MQTT : appareils sur batterie qui se réveillent, envoient et se rendorment, ou réseaux qui bloquent MQTT. Les messages HTTP sont traités exactement comme les messages MQTT : les mêmes formes de charge utile, les mêmes règles de clés, les mêmes limites de débit, le même nombre mensuel de messages. Cette page répertorie chaque point de terminaison qu’un appareil peut appeler.

Bases

ÉlémentValeur
Adresse de baseL’adresse HTTPS telemetry de la carte Connection details de l’appareil : l’hôte d’appareils de la plateforme sur le port 443
ConnexionAuthorization: Bearer <device access token>
Type de contenuapplication/json; charset=utf-8
Taille du corpsJusqu’à 64 KiB (la limite de charge utile du profil)
HTTP simpleLe port 80 fonctionne là où votre installation le propose, mais les commandes sont alors limitées (voir ci-dessous). Utilisez HTTPS.

Le jeton ne figure jamais dans l’URL, sauf sur les profils qui activent Token in the URL (voir ci-dessous). Les certificats client ne sont pas utilisés avec l’API HTTP : les appareils qui se connectent avec X.509 utilisent MQTT. Tout chemin non listé ici répond 404.

Points de terminaison

MéthodeCheminIdentique à MQTTCorps ou requêteRéponse
POST/api/v1/telemetryv1/telemetryune charge utile de télémétrie200
POST/api/v1/attributesv1/attributesun objet d’attributs client200
GET/api/v1/rpc?timeout=20000v1/rpc/req/{id}interrogation longue, jusqu’à 60 sune commande {"id":n,"method":…,"params":…}
POST/api/v1/rpc/{id}v1/rpc/res/{id}la réponse à la commande200
POST/api/v1/rpcv1/rpc/up/req/{id}{"method":…,"params":…}la réponse du cloud
POST/api/v1/provisionv1/provision/requne demande de provisionnement, sans en-tête bearerla réponse de provisionnement
POST/api/v1/hellov1/hellola description de l’appareilutilisé par le firmware des appareils sous licence

Non disponible via HTTP : lecture des attributs (GET /api/v1/attributes), attente de changements d’attributs partagés, ouverture de la fenêtre de revendication et demande de firmware. Ces chemins répondent 404. Les appareils qui en ont besoin utilisent MQTT.

La télémétrie utilise les mêmes formes de charge utile que MQTT. Voir MQTT topics and payload reference. Un corps de POST /api/v1/telemetry qui n’est pas du JSON est stocké sous une seule clé raw (jusqu’à la taille raw du profil, 4 KB par défaut).

Détails des points de terminaison

POST/api/v1/telemetry

Envoyez la télémétrie. Utilisez n’importe quelle forme de charge utile : un objet plat, un objet avec ts et values, ou un tableau des deux. Envoyez Authorization: Bearer <device access token>. La réponse 200 n’arrive qu’après que le message est sûrement mis en file d’attente ; son corps est vide.

Corps de la requête application/json

{
    "ts": 1759572000000,
    "values": {
        "temperature": 21.5,
        "humidity": 40
    }
}

Exemple curl

curl -X POST 'https://<your-host>/api/v1/telemetry' \
  -H 'Content-Type: application/json' \
  -d '{"ts":1759572000000,"values":{"temperature":21.5,"humidity":40}}'

Réponses

200OK

Pas de corps de réponse.

400Bad Request
{
    "error": "invalid_payload"
}
401Unauthorized

Pas de corps de réponse.

413Payload Too Large
{
    "error": "payload_too_large"
}
429Too Many Requests
{
    "error": "rate_limited"
}
503Service Unavailable

Pas de corps de réponse.

POST/api/v1/attributes

Envoyez les attributs client. Seules les clés que vous envoyez sont modifiées.

Corps de la requête application/json

{
    "current_fw_title": "boiler-fw",
    "current_fw_version": "26.10.2",
    "lan.ip": "192.168.1.1"
}

Exemple curl

curl -X POST 'https://<your-host>/api/v1/attributes' \
  -H 'Content-Type: application/json' \
  -d '{"current_fw_title":"boiler-fw","current_fw_version":"26.10.2","lan.ip":"192.168.1.1"}'

Réponses

200OK

Pas de corps de réponse.

400Bad Request
{
    "error": "invalid_payload"
}
401Unauthorized

Pas de corps de réponse.

429Too Many Requests
{
    "error": "rate_limited"
}

GET/api/v1/rpc?timeout=20000

Attendez la prochaine commande de cet appareil (interrogation longue, 60 secondes au maximum). Une seule interrogation par appareil peut être ouverte à la fois. Sur une connexion sans TLS, un profil qui n’autorise aucune commande sans TLS répond 403.

Exemple curl

curl -X GET 'https://<your-host>/api/v1/rpc?timeout=20000'

Réponses

200OK
{
    "id": 42,
    "method": "sys.ping",
    "params": {
        "host": "8.8.8.8",
        "count": 3
    }
}
403Forbidden
{
    "error": "tls_required"
}
408Request Timeout
{
    "error": "timeout"
}
409Conflict
{
    "error": "poll_in_progress"
}

POST/api/v1/rpc/{id}

Répondez à la commande ayant cet id. Utilisez le même corps que sur MQTT v1/rpc/res/{id}.

Corps de la requête application/json

{
    "ok": true,
    "result": {
        "sent": 3,
        "received": 3,
        "avg_ms": 18.2
    }
}

Exemple curl

curl -X POST 'https://<your-host>/api/v1/rpc/{id}' \
  -H 'Content-Type: application/json' \
  -d '{"ok":true,"result":{"sent":3,"received":3,"avg_ms":18.2}}'

Réponses

200OK

Pas de corps de réponse.

413Payload Too Large
{
    "error": "payload_too_large"
}

POST/api/v1/rpc

Envoyez une requête de l’appareil vers le cloud, avec method et params. Vos flux y répondent ; la réponse est le corps de la réponse. Si aucune réponse n’arrive dans les 10 secondes, l’appel répond 408. Un corps sans method répond 400.

Corps de la requête application/json

{
    "method": "app.request",
    "params": {}
}

Exemple curl

curl -X POST 'https://<your-host>/api/v1/rpc' \
  -H 'Content-Type: application/json' \
  -d '{"method":"app.request","params":{}}'

Réponses

200OK

Pas de corps de réponse.

400Bad Request

Pas de corps de réponse.

408Request Timeout
{
    "error": "timeout"
}

POST/api/v1/provision

Enregistrez un appareil avec la clé et le secret de provisionnement de son profil. N’envoyez pas d’en-tête bearer. L’appel répond 200 avec la réponse de provisionnement ; un refus répond aussi 200, avec "status": "FAILURE" et la raison dans hermetry.error (par exemple {"status": "FAILURE", "hermetry": {"error": "rate_limited"}}). Voir Adding and claiming devices.

Corps de la requête application/json

{
    "deviceName": "boiler-07",
    "provisionDeviceKey": "pk_8f3b2c1e9d4a7b60",
    "provisionDeviceSecret": "ps_1c9e7f2a4b6d8e03"
}

Exemple curl

curl -X POST 'https://<your-host>/api/v1/provision' \
  -H 'Content-Type: application/json' \
  -d '{"deviceName":"boiler-07","provisionDeviceKey":"pk_8f3b2c1e9d4a7b60","provisionDeviceSecret":"ps_1c9e7f2a4b6d8e03"}'

Réponses

200OK
{
    "status": "SUCCESS",
    "credentialsType": "ACCESS_TOKEN",
    "credentialsValue": "aZ3…"
}
413Payload Too Large
{
    "error": "payload_too_large"
}
503Service Unavailable

Pas de corps de réponse.

Exemples

Envoyez une mesure, horodatée par le serveur :

curl -X POST "https://<device host>/api/v1/telemetry" \
  -H "Authorization: Bearer <ACCESS_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"temperature": 21.5, "humidity": 40}'

Envoyez des mesures mises en mémoire tampon avec leurs propres heures (millisecondes depuis 1970, UTC) :

curl -X POST "https://<device host>/api/v1/telemetry" \
  -H "Authorization: Bearer <ACCESS_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '[{"ts":1759572000000,"values":{"temperature":21.5}},{"ts":1759572060000,"values":{"temperature":21.7}}]'

Attendez une commande et répondez-y :

curl -s "https://<device host>/api/v1/rpc?timeout=30000" -H "Authorization: Bearer <ACCESS_TOKEN>"
# → {"id": 42, "method": "sys.ping", "params": {...}}
curl -X POST "https://<device host>/api/v1/rpc/42" \
  -H "Authorization: Bearer <ACCESS_TOKEN>" -H "Content-Type: application/json" \
  -d '{"ok": true, "result": {"sent": 3, "received": 3}}'

Codes de statut

CodeSignification
200Accepté. Envoyé seulement après que le message est sûrement mis en file d’attente.
400Charge utile invalide.
401Jeton absent ou inconnu.
403Appareil désactivé, organisation suspendue, adresse hors des réseaux autorisés par le profil, ou interrogation de commande en HTTP simple que le profil n’autorise pas (tls_required).
404Chemin inconnu, ou jeton dans l’URL sur un profil sans Token in the URL.
408Interrogation longue terminée sans données, ou requête de l’appareil sans réponse dans les 10 secondes.
409Une autre interrogation de commande de cet appareil est déjà ouverte.
413Corps trop volumineux.
429Limite de débit, ou trop de requêtes ou d’échecs de connexion depuis votre adresse. Attendez le nombre de secondes indiqué dans Retry-After.
503Surcharge. Attendez le nombre de secondes indiqué dans Retry-After.

Statut en ligne des appareils HTTP

Les appareils HTTP ne maintiennent aucune connexion ; un profil avec Live connection ne les affiche donc jamais en ligne. Donnez aux appareils HTTP un profil avec Recent message (en ligne tant que le dernier message est plus récent que l’intervalle attendu multiplié par le facteur) ou Last seen only. Voir Connection status and activity.

Appareils incapables d’envoyer des en-têtes

Certains appareils ne peuvent pas définir un en-tête Authorization. Pour ceux-ci, activez Jeton dans l’URL dans l’onglet Transport & auth du profil. Les appareils peuvent alors utiliser :

POST /api/v1/{token}/telemetry
POST /api/v1/{token}/attributes

Avertissement

Un jeton placé dans une URL peut fuir via les journaux du proxy et l’historique du navigateur. Un profil avec cette option activée est réservé à HTTP : ses appareils ne peuvent pas se connecter via MQTT et ne reçoivent jamais de commandes. Donnez aux appareils capables d’envoyer des en-têtes un profil sans cette option.

Commandes via HTTP non chiffré

Une interrogation longue qui n’atteint pas Hermetry via TLS ne reçoit que les commandes listées dans le profil sous Commandes autorisées sans TLS. Toutes les autres commandes attendent une connexion TLS ou leur expiration. Si la liste est vide, une interrogation simple répond 403 tls_required.

Voir aussi