NEWS
[Gelöst] MQTT SENSOR String in einzelne Werte zerlegen
-
Hallo zusammen,
ich möchte einen MQTT Sensor Wert eines Tasmota Zählers, der folgenden String enthält, in 3 einzelne Objekte trennen:{ "Time": "2024-01-18T18:03:52", "": { "Total_in": 25856.6, "Total_out": 61.91, "Power_curr": 1534 } }
Ich habe auch schon ähnliche Beiträge dazu gefunden, doch leider funktioniert es noch nicht ganz.
Der MQTT-Sensor Wert sieht so aus:{ "_id": "mqtt.1.tele.Strom_Zaehler.SENSOR", "common": { "name": "tele/Strom_Zaehler/SENSOR", "write": true, "read": true, "role": "variable", "desc": "mqtt client variable", "type": "string" }, "native": { "topic": "tele/Strom_Zaehler/SENSOR" }, "type": "state", "from": "system.adapter.mqtt.1", "user": "system.user.admin", "ts": 1705481190584, "acl": { "object": 1636, "state": 1636 } }
Ich habe bisher ein Script das so aussieht, um die Werte auszulesen:
const idJson = 'mqtt.1.tele.Strom_Zaehler.SENSOR'; const path = 'javascript.0.'; on(idJson, function(dp) { var obj = JSON.parse(dp.state.val) ; let id = path + 'Total_in'; if(existsState(id)) setState(id, (obj.Total_in), true); else createState(id, obj.Total_in.Total_in, {type: 'number', name: 'Total_in', role: 'value', unit: 'kWh'}); id = path + 'Total_out'; if(existsState(id)) setState(id, obj.Total_out, true); else createState(id, obj.Total_out.Total_out, {type: 'number', name: 'Total_out', role: 'value', unit: 'kWh'}); id = path + 'Power_curr'; if(existsState(id)) setState(id, obj.Power_curr, true); else createState(id, obj.Power_curr.Power_curr, {type: 'number', name: 'Power_curr', role: 'value', unit: 'W'}); // usw. für weitere Datenpunkte });
Die angelegten Objekte dazu werden auch regelmässig aktualisiert, nur nicht mit den richtigen Werten. Die Werte darin sehen so Aus:
Ich bin leider nicht so tief drin in der Programmierung, ich finde den Fehler einfach nichtGruss, Sascha
-
@magicfriend-0
Hallo
versuchs mal mit dem Alias Adaptermfg
-
@ag
Hallo,
wie soll ich das in den Alias Adapter rein bekommen. Da kann ich doch auch nur den ganzen SENSOR-String auswählen?!
Gruss, Sascha -
@magicfriend-0
Ändere Zeile 5:var obj = JSON.parse(dp.state.val)[''] ;
-
@paul53
Hallo paul53,genau das wars, jetzt sind die Werte da - DANKE!!!!
-
hier ein Beispiel tasmota Temperatur und Feuchte Sensor
In diesem Fall die Temperatur
-
Und der Sonoff Adapter ist nicht die Lösung?
Für Tasmota Geräte ist der nämlich die erste Wahl, weil er die Strings schon aufbereitet liefert.
Da musste nix mit Skript oder dergleichen machen. -
@haselchen Hat nicht die gleiche Flexibiliät. In dem Fall, dass es ein Tasmota-Gerät ist, passt es meistens. Bei mir ist es ein zigbee2mqtt Server, dessen Baum komplett eingebunden ist, und da weiß man ja nie vorher, was sich da noch an Zigbee-Geräten materialisiert, und da man sich dann entscheiden muss, ob der zigbee2mqtt Server sich mit dem mqtt Adapter, oder dem Sonoff Adapter verbinden, bin ich den offeneren Weg gegangen ...
-
Da hier erkennbar ist, dass es ein Tasmota Gerät ist, würde ich immer den Weg über den Sonoff Adapter gehen.
Ansonsten würde ich diesen Ratschlag auch nicht geben.
Andere Geräte, wie bei Dir , binde ich auch über andere MQTT Möglichkeiten ein.
Aber wenn ich hier sehe, was für ein Aufwand betrieben wird, um an die Werte zu kommen, die vermutlich der Sonoff Adapter schon fertig liefert, dann muss man den Hinweis geben -
@haselchen
Ich hatte das vorher auch über den Tasmota adapter. Momentan habe ich aber den MQTT-Broker auf einer anderen virtuellen Maschine laufen, da ich die Daten auch noch wo anders brauche. Deswegen bin ich diesen weg gegangen.
Gruss, Sascha -
Alles klar.
Danke fürs Feedback.
Dann ist der Weg natürlich logisch