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
| Element | Wert |
|---|---|
| Basisadresse | Die HTTPS-Telemetrie-Adresse auf der Karte Verbindungsdetails des Geräts: der Geräte-Host der Plattform auf Port 443 |
| Anmeldung | Authorization: Bearer <device access token> |
| Inhaltstyp | application/json; charset=utf-8 |
| Body-Größe | Bis zu 64 KiB (das Payload-Limit des Profils) |
| Klartext-HTTP | Port 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
| Methode | Pfad | Wie bei MQTT | Body oder Query | Antwort |
|---|---|---|---|---|
| POST | /api/v1/telemetry | v1/telemetry | eine Telemetrie-Nutzlast | 200 |
| POST | /api/v1/attributes | v1/attributes | ein Objekt mit Client-Attributen | 200 |
| GET | /api/v1/rpc?timeout=20000 | v1/rpc/req/{id} | Long Poll, bis zu 60 s | ein Befehl {"id":n,"method":…,"params":…} |
| POST | /api/v1/rpc/{id} | v1/rpc/res/{id} | die Antwort auf den Befehl | 200 |
| POST | /api/v1/rpc | v1/rpc/up/req/{id} | {"method":…,"params":…} | die Antwort der Cloud |
| POST | /api/v1/provision | v1/provision/req | eine Provisionierungsanfrage ohne Bearer-Header | die Provisionierungsantwort |
| POST | /api/v1/hello | v1/hello | die Selbstbeschreibung des Geräts | wird 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
| Code | Bedeutung |
|---|---|
| 200 | Angenommen. Erst gesendet, wenn die Nachricht sicher in der Warteschlange liegt. |
| 400 | Ungültige Nutzlast. |
| 401 | Token fehlt oder ist unbekannt. |
| 403 | Gerä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). |
| 404 | Unbekannter Pfad oder ein URL-Token bei einem Profil ohne Token in der URL. |
| 408 | Long Poll ohne Daten beendet oder eine Geräteanfrage ohne Antwort nach 10 Sekunden. |
| 409 | Eine weitere Befehlsabfrage dieses Geräts ist bereits offen. |
| 413 | Body zu groß. |
| 429 | Ratenlimit 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.

