Neu: Die KI-Firewall überwacht jedes Modul und erklärt jeden Vorfall in einfachen Worten. So funktioniert es

Geräte-HTTP-API

Jeder Geräte-Endpunkt über HTTPS – Telemetrie, Attribute, Befehls-Long-Poll und Antworten, Geräteanfragen und Provisionierung – mit Beispielen und Statuscodes.

Verwenden Sie HTTPS, wenn ein Gerät keine MQTT-Verbindung halten kann: Batteriegeräte, die aufwachen, senden und wieder schlafen, oder Netze, die MQTT blockieren. HTTP-Nachrichten werden genauso verarbeitet wie MQTT-Nachrichten: dieselben Payload-Formen, dieselben Schlüsselregeln, dieselben Ratenlimits und dieselbe monatliche Nachrichtenanzahl. Diese Seite listet jeden Endpunkt auf, den ein Gerät aufrufen kann.

Grundlagen

ElementWert
BasisadresseDie HTTPS-Telemetrie-Adresse auf der Karte Verbindungsdetails des Geräts: der Geräte-Host der Plattform auf Port 443
AnmeldungAuthorization: Bearer <device access token>
Inhaltstypapplication/json; charset=utf-8
Body-GrößeBis zu 64 KiB (das Payload-Limit des Profils)
Klartext-HTTPPort 80 funktioniert, wo Ihre Installation ihn anbietet; dann sind Befehle jedoch eingeschränkt (siehe unten). Verwenden Sie HTTPS.

Das Token wird nie in die URL gesetzt, außer bei Profilen, die Token in der URL aktivieren (siehe unten). Client-Zertifikate werden in der HTTP-API nicht verwendet: Geräte, die sich mit X.509 anmelden, nutzen MQTT. Jeder hier nicht aufgeführte Pfad antwortet mit 404.

Endpunkte

MethodePfadWie bei MQTTBody oder QueryAntwort
POST/api/v1/telemetryv1/telemetryeine Telemetrie-Nutzlast200
POST/api/v1/attributesv1/attributesein Objekt mit Client-Attributen200
GET/api/v1/rpc?timeout=20000v1/rpc/req/{id}Long Poll, bis zu 60 sein Befehl {"id":n,"method":…,"params":…}
POST/api/v1/rpc/{id}v1/rpc/res/{id}die Antwort auf den Befehl200
POST/api/v1/rpcv1/rpc/up/req/{id}{"method":…,"params":…}die Antwort der Cloud
POST/api/v1/provisionv1/provision/reqeine Provisionierungsanfrage ohne Bearer-Headerdie Provisionierungsantwort
POST/api/v1/hellov1/hellodie Selbstbeschreibung des Gerätswird von der Firmware lizenzierter Geräte verwendet

Über HTTP nicht verfügbar: Attribute lesen (GET /api/v1/attributes), auf Änderungen gemeinsamer Attribute warten, das Claim-Fenster öffnen und Firmware anfragen. Diese Pfade antworten mit 404. Geräte, die sie benötigen, verwenden MQTT.

Telemetrie verwendet dieselben Payload-Formen wie MQTT. Siehe MQTT-Topics und Payload-Referenz. Ein Body bei POST /api/v1/telemetry, der kein JSON ist, wird als ein einzelner raw-Schlüssel gespeichert (bis zur Raw-Größe des Profils, standardmäßig 4 KB).

Endpunkt-Details

POST/api/v1/telemetry

Telemetrie senden. Verwenden Sie eine beliebige Payload-Form: ein flaches Objekt, ein Objekt mit ts und values oder ein Array aus beidem. Senden Sie Authorization: Bearer <device access token>. Die Antwort 200 kommt erst, wenn die Nachricht sicher in der Warteschlange liegt; ihr Body ist leer.

Request-Body application/json

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

Beispiel curl

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

Antworten

200OK

Kein Antwort-Body.

400Ungültige Anfrage
{
    "error": "invalid_payload"
}
401Nicht autorisiert

Kein Antwort-Body.

413Nutzlast zu groß
{
    "error": "payload_too_large"
}
429Zu viele Anfragen
{
    "error": "rate_limited"
}
503Dienst nicht verfügbar

Kein Antwort-Body.

POST/api/v1/attributes

Client-Attribute senden. Nur die gesendeten Schlüssel ändern sich.

Request-Body application/json

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

Beispiel 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"}'

Antworten

200OK

Kein Antwort-Body.

400Ungültige Anfrage
{
    "error": "invalid_payload"
}
401Nicht autorisiert

Kein Antwort-Body.

429Zu viele Anfragen
{
    "error": "rate_limited"
}

GET/api/v1/rpc?timeout=20000

Auf den nächsten Befehl für dieses Gerät warten (Long Poll, höchstens 60 Sekunden). Pro Gerät darf nur eine Abfrage gleichzeitig offen sein. Über eine Verbindung ohne TLS antwortet ein Profil, das ohne TLS keinen Befehl erlaubt, mit 403.

Beispiel curl

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

Antworten

200OK
{
    "id": 42,
    "method": "sys.ping",
    "params": {
        "host": "8.8.8.8",
        "count": 3
    }
}
403Verboten
{
    "error": "tls_required"
}
408Zeitüberschreitung der Anfrage
{
    "error": "timeout"
}
409Konflikt
{
    "error": "poll_in_progress"
}

POST/api/v1/rpc/{id}

Den Befehl mit dieser ID beantworten. Verwenden Sie denselben Body wie bei MQTT v1/rpc/res/{id}.

Request-Body application/json

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

Beispiel 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}}'

Antworten

200OK

Kein Antwort-Body.

413Nutzlast zu groß
{
    "error": "payload_too_large"
}

POST/api/v1/rpc

Eine Anfrage vom Gerät an die Cloud senden, mit method und params. Ihre Flows beantworten sie; die Antwort ist der Antwort-Body. Kommt innerhalb von 10 Sekunden keine Antwort, antwortet der Aufruf mit 408. Ein Body ohne method antwortet mit 400.

Request-Body application/json

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

Beispiel curl

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

Antworten

200OK

Kein Antwort-Body.

400Ungültige Anfrage

Kein Antwort-Body.

408Zeitüberschreitung der Anfrage
{
    "error": "timeout"
}

POST/api/v1/provision

Ein Gerät mit dem Provisionierungsschlüssel und Secret des Profils registrieren. Keinen Bearer-Header senden. Der Aufruf antwortet mit 200 und der Provisionierungsantwort; auch eine Ablehnung antwortet mit 200, mit "status": "FAILURE" und dem Grund in hermetry.error (zum Beispiel {"status": "FAILURE", "hermetry": {"error": "rate_limited"}}). Siehe Geräte hinzufügen und beanspruchen.

Request-Body application/json

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

Beispiel 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"}'

Antworten

200OK
{
    "status": "SUCCESS",
    "credentialsType": "ACCESS_TOKEN",
    "credentialsValue": "aZ3…"
}
413Nutzlast zu groß
{
    "error": "payload_too_large"
}
503Dienst nicht verfügbar

Kein Antwort-Body.

Beispiele

Einen Messwert senden, vom Server mit Zeitstempel versehen:

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}'

Gepufferte Messwerte mit ihren eigenen Zeiten senden (Millisekunden seit 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}}]'

Auf einen Befehl warten und ihn beantworten:

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}}'

Statuscodes

CodeBedeutung
200Angenommen. Erst gesendet, wenn die Nachricht sicher in der Warteschlange liegt.
400Ungültige Nutzlast.
401Token fehlt oder ist unbekannt.
403Gerät deaktiviert, Organisation gesperrt, Adresse außerhalb der erlaubten Netze des Profils oder eine Befehlsabfrage über Klartext-HTTP, die das Profil nicht erlaubt (tls_required).
404Unbekannter Pfad oder ein URL-Token bei einem Profil ohne Token in der URL.
408Long Poll ohne Daten beendet oder eine Geräteanfrage ohne Antwort nach 10 Sekunden.
409Eine weitere Befehlsabfrage dieses Geräts ist bereits offen.
413Body zu groß.
429Ratenlimit oder zu viele Anfragen bzw. fehlgeschlagene Anmeldungen von Ihrer Adresse. Warten Sie die Sekunden in Retry-After.
503Überlastung. Warten Sie die Sekunden in Retry-After.

Online-Status für HTTP-Geräte

HTTP-Geräte halten keine Verbindung, daher zeigt ein Profil mit Live-Verbindung sie nie als online an. Geben Sie HTTP-Geräten ein Profil mit Letzte Nachricht (online, solange die letzte Nachricht jünger ist als das erwartete Intervall mal dem Faktor) oder Nur zuletzt gesehen. Siehe Verbindungsstatus und Aktivität.

Geräte, die keine Header senden können

Einige Geräte können keinen Authorization-Header setzen. Aktivieren Sie für diese in dem Profil auf dem Tab Transport & auth die Option Token in the URL. Die Geräte können dann Folgendes verwenden:

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

Warnung

Ein Token in einer URL kann über Proxy-Protokolle und den Browserverlauf offengelegt werden. Ein Profil mit aktivierter Option ist nur für HTTP vorgesehen: Seine Geräte können sich nicht über MQTT anmelden und erhalten niemals Befehle. Geben Sie Geräten, die Header senden können, ein Profil ohne diese Option.

Befehle über einfaches HTTP

Ein Long Poll, der Hermetry nicht über TLS erreicht, erhält nur die Befehle, die das Profil unter Commands allowed without TLS auflistet. Alle anderen Befehle warten auf eine TLS-Verbindung oder bis sie ablaufen. Ist die Liste leer, antwortet ein einfacher Poll mit 403 tls_required.

Verwandte Themen