In einem Kommentar unter einem meiner YouTube-Videos wurde ich gefragt, wie man den JSON-Response eines Shelly-Geräts im Shelly Script verarbeiten kann. Eine sehr gute Frage – denn Shelly-Geräte arbeiten intern oft mit JSON-Daten, sei es bei HTTP-Abfragen, Webhooks oder MQTT-Nachrichten.
Da dieses Thema ideal zu meiner Reihe „Shelly Scripting – JavaScript-Grundlagen für Einsteiger„ passt, widme ich diesem Kommentar nun einen eigenen Blogbeitrag. Ich zeige dir Schritt für Schritt, wie du einen JSON-String parst, auf einzelne Werte zugreifst und die Informationen direkt im Script verwenden kannst – z. B. um ein Relais zu schalten oder eine LED zu steuern.
Inhaltsverzeichnis
Was ist ein JSON-Dokument?
JSON steht für JavaScript Object Notation und ist ein leichtgewichtiges, textbasiertes Datenformat, das sich hervorragend für den Austausch von Informationen eignet – z. B. zwischen zwei Geräten oder zwischen einem Server und einem Mikrocontroller wie einem Shelly.
Ein JSON-Dokument besteht im Grunde aus Schlüssel-Wert-Paaren, ähnlich wie ein Wörterbuch. Diese Daten sind in einer klaren und standardisierten Struktur gespeichert. Ein JSON-String sieht beispielsweise so aus:
{
"device": "shellyplus1pm",
"temperature": 42.5,
"is_on": true,
"timestamp": "2025-06-29T10:15:00Z"
}
In diesem Beispiel:
"device"ist der Schlüssel (Key),"shellyplus1pm"ist der dazugehörige Wert (Value)."temperature"enthält eine Zahl (float)."is_on"speichert einen booleschen Wert (trueoderfalse)."timestamp"ist ein Textwert (String) im ISO-Format.
JSON-Daten lassen sich hierarchisch verschachteln, also auch Objekte in Objekten oder Listen (Arrays) enthalten:
{
"device": "shellyplus1pm",
"measurements": {
"voltage": 230.1,
"power": 12.3
},
"history": [42.1, 42.5, 43.0]
}
Diese einfache, aber flexible Struktur macht JSON zum perfekten Format für viele IoT-Projekte – auch auf den Shelly-Geräten. Du wirst JSON vor allem dann begegnen, wenn du per HTTP-Request Informationen abrufst oder auf Ereignisse im Shelly reagierst.
JSON-Daten vom Shelly abrufen und parsen
In der Praxis möchtest du vielleicht den aktuellen Status eines Shelly-Geräts abrufen – z. B. um Informationen wie den Gerätenamen, den Stromverbrauch oder den Schaltzustand auszulesen.
Dazu kannst du im Shelly Script eine HTTP-GET-Anfrage an das Gerät senden. In folgendem Beispiel wird per Shelly.call() die Methode http.get aufgerufen, um den Status eines Shelly Plus 1PM unter der IP-Adresse 192.168.178.104 abzufragen:
let params = {
method: "GET", // Wir wollen Daten abrufen (GET-Anfrage)
url: "http://192.168.178.104/rpc/Shelly.GetStatus" // IP-Adresse des Shelly-Geräts
};
Shelly.call("http.get", params, function(result, error_code, error_message) {
if (error_code != 0) {
print("Fehler beim Senden der Daten: " + error_message);
print(params); // Ausgabe der Parameter zur Fehleranalyse
} else {
print("Daten erfolgreich empfangen.");
// JSON-Antwort parsen
let json = JSON.parse(result.body);
// Auf ein verschachteltes Element zugreifen
print("Gerätename: " + json.sys.alt.S1PMG4ZB.name);
}
});

Erklärung:
Shelly.call("http.get", ...)führt einen HTTP-Request direkt im Script aus.result.bodyenthält die Antwort vom Shelly – als JSON-String.- Mit
JSON.parse(result.body)wird dieser String in ein nutzbares JavaScript-Objekt umgewandelt. - Über Punktnotation (
json.sys.alt.S1PMG4ZB.name) greifst du auf verschachtelte Werte zu.
Hinweis:
Welche Felder dein JSON-Dokument enthält, hängt vom Gerät und der verwendeten RPC-Methode ab. Da die Konsole im Shelly-Webinterface nur maximal 10 Zeilen ausgibt, ist die vollständige Anzeige eines größeren JSON-Objekts dort nicht möglich.
💡 Tipp:
Kopiere die URL aus dem params.url-Feld (z. B. http://192.168.178.104/rpc/Shelly.GetStatus) und rufe sie im Webbrowser oder mit einem Tool wie Postman auf. Du erhältst dann die vollständige JSON-Antwort als formatierten Text und kannst gezielt die Felder identifizieren, die du im Script verwenden möchtest.
Letzte Aktualisierung am: 29. Juni 2025
servus aus Österreich. Ich verfolge deine Blogs und Videos schon längere Zeit und möchte dir dafür ein Kompliment aussprechen. Alles gut und verständlich erklärt.
Leider lässt mich mein fortgeschrittenes Alter aktuell beim Java kapitulieren. Ich versuche seit geraumer Zeit ein Script aus deinen Vorlagen zu basteln, scheitere aber grandios. Vielleicht hast du so ein Script fertig herumliegen:
ich habe eine SonnenBatterie mit 20kWh Kapazität. Nun möchte ich den Shelly, der die Steckdose meines Handtuchtrockners per Zeitplan ein und ausschaltet um die Funktion erweitern, dass er die Steckdose nur einschaltet, wenn die Batterie mind. 20% SoC hat.
unter
http://192.168.31.72:8080/api/v1/status
bekomme ich folgende Daten von der Sonnenbatterie:
{
„BackupBuffer“: „0“,
„BatteryCharging“: false,
„BatteryDischarging“: true,
„Consumption_Avg“: 340,
„Consumption_W“: 337,
„Fac“: 49.9930000305176,
„FlowConsumptionBattery“: true,
„FlowConsumptionGrid“: false,
„FlowConsumptionProduction“: false,
„FlowGridBattery“: true,
„FlowProductionBattery“: false,
„FlowProductionGrid“: false,
„GridFeedIn_W“: 0,
„IsSystemInstalled“: 1,
„OperatingMode“: „2“,
„Pac_total_W“: 384,
„Production_W“: 0,
„RSOC“: 71,
„RemainingCapacity_Wh“: 29604,
„SystemStatus“: „OnGrid“,
„Timestamp“: „2025-11-16 00:02:56“,
„USOC“: 68,
„Uac“: 226,
„Ubat“: 212,
„dischargeNotAllowed“: false,
„generator_autostart“: false,
„NVM_REINIT_STATUS“: 0
}
der entscheidende Wert ist „USOC“: – diese Angabe entspricht dem Füllstand der Batterie in %.
Der Grund dafür ist, dass ein warmes Handtuch zwar angenehm ist, aber nicht zwingend notwendig. Wenn die Batterie weniger Inhalt hat, dann brauche ich den Strom lieber für die Wärmepumpe oder essentiellere Dinge.
Ist so etwas überhaupt möglich bzw. kann man das mit einem Script umsetzen?
lg