NEWS
Shelly per Blockly auslesen / parsen
-
Moin zusammen,
ich habe mal wieder eine Frage / ein Anliegen:
Meine Shelly-Geräte übermitteln ihre Werte alle per MQTT an meinen zentralen MQTT Server (EMQX). Den Shelly-Adapter möchte ich eigentlich nicht nutzen, da ich alles auf dem MQTT Server halten möchte.
Meine Shellys schreiben ihre Informationen also alle in Richtung des MQTT Server, den habe ich im ioBroker abonniert und die Werte stehen dann in den entsprechenden Datenpunkt, hier also der Datenpunkt:
mqqt/0/Waermepumpe1/status/switch:0:In dem Datenpunkt stehen dann folgende Informationen:
{"id":0, "source":"init", "output":true, "apower":1072.6, "voltage":231.4, "current":4.870, "aenergy":{"total":4145268.729,"by_minute":[17865.943,17855.005,17845.969],"minute_ts":1758697440},"temperature":{"tC":45.3, "tF":113.5}}Nun würde ich gerne den Wert apower und total auslesen. Den Wert "apower" kann ich nun mit dem untenstehenden Blockly auslesen, den Wert aenergy/total leider nicht.
Und eine Frage: Ist mein Vorgehen so "logisch" okay oder komplett falsch abgebogen?
Hier mein Blockly-Segment (das ist quasi nur eine Herleitung, bin schon froh, dass überhaupt apower kommt):
schedule("*/5 * * * * *", async () => { console.info((() => { try { return JSON.parse(getState('mqtt.0.Waermepumpe1.status.switch:0').val); } catch (e) { return {}; }})()); console.info(getAttr((() => { try { return JSON.parse(getState('mqtt.0.Waermepumpe1.status.switch:0').val); } catch (e) { return {}; }})(), 'apower')); console.info(getAttr((() => { try { return JSON.parse(getState('mqtt.0.Waermepumpe1.status.switch:0').val); } catch (e) { return {}; }})(), 'total')); });Für den Wert "aenergy/total" bekomme ich aber nur "undefined" zurück, ich glaube weil der verschachtelt unter aenergy hängt?
Mag mir da mal jemand helfen?
Ich kann leider keine weiteren Screenshots hochladen, ich weiß nicht warum

Danke,
Moritz -
@dasmoritz die Funktion getAttr kenn ich nicht, aber:
JSON.parse("dein Payload").aenergy.total sollte deinen Wert beinhalten.
Wenn du dir sorgen machst das er nicht existiert, dann:
const jsonObj = JSON.parse(obj.val); const total = jsonObj.aenergy ? jsonObj.aenergy.total ? 'no energy'; const power = jsonObj.apower;Ansonsten:
- warum zum Teufel ein Heartbeat ?
- warum liest du den gleichen State im Heartbeat 3 mal ein ?
- warum parsed du den gleichen String im Heartbeat 3 mal ?
- Du willst blockly - warum postest du dann JS Code ?
A.
-
@dasmoritz sagte: Für den Wert "aenergy/total" bekomme ich aber nur "undefined" zurück
Das trennt man mit einem Punkt:

-
@paul53 danke erstmal für den Hinweis den ich hier gefunden habe, um mit einem Blockly Werte aus einem MQTT Wert zu extrahieren.
Leider will es bei mir allerdings nicht funktionieren und nach zig-maligem überprüfen, dann doch hier die Frage, was ich da evtl. falsch mache
Mein DP mit dem MQTT-String enthält folgendes:
{"GPSData":{"GPSData":{"latitude":xx.036424,"longitude":xx.261328,"altitude":176.600000,"speed":0.000000,"date_iso_8601":"2025-11-09T19:09:39+0100"}}MOD-EDIT: Code in code-tags gesetzt!
(DP aus einen Teltronix Router)Ich habe folgendes Blockly nachgebaut:

Der MQTT-DP wird alle 3 Minuten aktualisiert und der Trigger wird entsprechend ausgelöst.
Leider bekomme ich allerdings keinerlei Werte im Debug des Blocklys und auch in meinem manuell angelegten Datenpunkt 'Breitengrad' kommt nur folgendes an: {"ack":true}.
Das 'DP' im Block 'setze' ist eine lokale Variable im Script.
Auch im MQTT-Debug/Protokoll (steht auf Info) kommen nur die 'reconnected' und 'subscribe' Meldungen. -
@pedder007 sagt: Mein DP mit dem MQTT-String enthält folgendes:
Dann sind die Attribute "GPSData.GPSData.latitude" und "GPSData.GPSData.longitude"
EDIT: Oder so:

Ist JSON korrekt? Am Ende sehe ich nur 2 schließende Klammern. Es müssten aber 3 sein, wenn "GPSData" zweimal enthalten ist.
-
@paul53 super das war's, vor allem auch noch der Hinweis bzgl. der fehlenden Klammer.
Ich hatte das JSON eben über die Copy-Funktion aus dem Objektbaum geholt. Schaut man sich aber wirklich den Zustand an, dann steht da auch nur ein 'GPSData'.Entsprechend im Attribut also nur 'GPSData.latitude' und dann geht's
Mir war aus dem Beispiel nicht klar geworden, dass man das auch noch mitnehmen muss 
... und dann ist das Ganze auch sehr zäh, da ich da aktuell nur über eine Al-Talk Standard SIMkarte zugreife mit mittelmäßigem Empfang. Deshalb aber auch die Überwachung der Koordinaten

1000-Dank!