NEWS
Payload String zerlegen
-
Hallo und schönen Sonntag.
Nochmals Danke für Deine bisherige Unterstützung.
Das Gelernte konnte ich inzwischen auf weitere Gerätetypen umsetzen. Soweit so gut.
Doch nun scheitere ich an einem Gerät mit 4 Kanälen, der JSON ist entsprechend umfangreicher:
{"ble":{},"cloud":{"connected":false},"eth":{"ip":null},"input:0":{"id":0,"state":false},"input:1":{"id":1,"state":false},"input:2":{"id":2,"state":false},"input:3":{"id":3,"state":false},"mqtt":{"connected":true},"switch:0":{"id": 0, "source": "UI", "output": false, "apower": 0.000, "voltage": 237.237,"aenergy": {"total":0.021,"by_minute":[0.000,0.000,0.000],"minute_ts":1633241652},"temperature":{"tC":null, "tF":null}},"switch:1":{"id": 1, "source": "init", "output": false, "apower": 0.000, "voltage": 237.292,"aenergy": {"total":0.000,"by_minute":[0.000,0.000,0.000],"minute_ts":1633241652},"temperature":{"tC":null, "tF":null}},"switch:2":{"id": 2, "source": "init", "output": false, "apower": 0.000, "voltage": 238.268,"aenergy": {"total":0.000,"by_minute":[0.000,0.000,0.000],"minute_ts":1633241652},"temperature":{"tC":null, "tF":null}},"switch:3":{"id": 3, "source": "init", "output": false, "apower": 0.000, "voltage": 238.230,"aenergy": {"total":0.000,"by_minute":[0.000,0.000,0.000],"minute_ts":1633241651},"temperature":{"tC":null, "tF":null}},"sys":{"mac":"95CCA87E43AC","restart_required":false,"time":"08:14","unixtime":1633241653,"uptime":741,"ram_size":236340,"ram_free":147172,"fs_size":474641,"fs_free":317515,"available_updates":{"beta":{"version":"0.9.0-beta1"}}},"wifi":{"sta_ip":"192.168.1.182","status":"got ip","ssid":"IoT","rssi":-58}}
Wie bekomme ich da die 4 Werte "output" sauber raus? Obwohl ich nach Deiner Vorlage auch hier vorgegangen bin, kommen am Debug-Node auch Meldungen der anderen Kanäle raus.
Bin für Deine Unterstützung sehr dankbar.
Edit:
So sieht mein aktuelles Ergebnis aus:Auch die von Dir gezeigte Pfadübernahme aus dem DEBUG bringt mir leider nicht das gewünschte Ergebnis.
-
Gefühlt 1000 Versuche später:
Geschafft und erledigt.
(Freu' mich, denn am Besten bleibt es haften, wenn man selbst drauf gekommen ist. )Die einzelnen Kanäle habe ich nun mittels eines "Switch" mit 4 Bedingungen gefiltert. Der restliche Ablauf funktioniert dann unverändert.
-
@66er Ehrlich gesagt verstehe ich das Problem nicht. Man kann auch diese Werte ganz normal über den Pfad selektieren (Pfad kopieren):
Verstehe nicht warum man da irgendwas filtern muss - klappt ganz normal:
-
Danke für's Feedback.
Vielleicht hatte sich auch bei mir ein Fehler eingeschlichen!?
Stehe ja erst am Anfang mit MQTT und NodeRed.
Da heißt es schon mal hinfallen, aufstehen und weitermachen.
Danke nochmal.
(PS: Werde es nochmal gegenchecken. Sollte dann ja auch bei mir laufen.)
-
@66er Du kannst auch jedes Switch Objekt nur auf die Objektebene herauslösen und dann die Eigenschaften eines Switches in einem 2. Schritt bearbeiten. Deiner Fantasie sind keine Grenzen gesetzt:
-
@mickym
Sieht ja fast aus, wie mein Ergebnis.So bin ich zu Erfolg gekommen:
-
@66er Falls Du das nur in eigene DP wegschreiben willst, dann kannst Dir ja mal meinen Subflow anschauen:
https://forum.iobroker.net/topic/43856/json-string-oder-java-object-in-iobroker-struktur
Seit Admin 5 musst Du dann zwar noch etwas nacharbeiten, in dem Du mit einem Skript die fehlenden Objekte noch erzeugst. Aber falls Du ihn nutzen willst, bekommst Du so alles in DP zerlegt.
IN meinen Augen ist das zwar nicht sinnvoll, aber ich sehe ja, dass Du mit Deinem Flow nichts anderes machst.
Oder Du nimmst den mqtt-Adapter im iobroker - dann hast Du ebenfalls alles als einzelne Datenpunkte.
-
@mickym sagte in Payload String zerlegen:
...
IN meinen Augen ist das zwar nicht sinnvoll, aber ich sehe ja, dass Du mit Deinem Flow nichts anderes machst.
Schau mir den anderen Link natürlich noch an.
Warum ist das nicht sinnvoll? (Ich lerne mich ja gerade erst ein und wenn ich hier was falsch mache, sollte ich verstehen warum.)
Versuchsweise schreibe ich die Werte da rein und visualisiere sie dann.
Leider geben die Geräte nur einen "Sammelstring" nach MQTT und keine einzelnen, direkt verwertbare Datenpunkte.
-
@66er OK zum Visualisieren hängt davon ab, was Du halt nutzt. Für VIS ja.
Wenn Du das Node-Red Dashborad nutzt, dann fütterst Du ja den switch mit der payload und der Switch behält ja den Status.
Aber Du hast Recht für VIS ist es sinnvoll.Ansonsten ist zwar schön alles in eigene Datenpunkte zu schreiben, aber gibt Dir ja keinen Mehrwert, weil die Info letztlich in dem JSON String enthalten ist. Wie gesagt für VIS ist es sinnvoll.
-
Ja, ich nutze VIS.
Hier noch ein Screenshot von MQTT:
Im RPC-String unter events steht alles drin.
-
@66er Ja wie gesagt, wenn Du nur das wieder in DP speicherst, was Du visualisierst - passt das schon!!!
-
Prima,
und ja: alle anderen Datenpunkt bleiben im JSON ohne das ich die anpacke.
Danke, wieder mein Wissen und Verständnis für MQTT erweitert.
-
Hallo
Ich versuche gerade mein Stromzähler String zu zerlegen.
Eine Verbindung zum mqtt-Broker besteht, die Daten werden auch im Debug angezeigt.Ich habe schon einiges Versuch, ich bekomme einfach nicht die Werte einzeln angezeigt.
Smartmeter_Garten/tele/SENSOR : msg.payload : string[643]
"{"Time":"2023-01-13T12:54:35","SDM630":{"1":178,"Voltage_P1":231.88,"Voltage_P2":231.5,"Voltage_P3":232.49,"Current_P1":0,"Current_P2":0.1,"Current_P3":0,"Power_P1":0,"Power_P2":22.35,"Power_P3":0,"Frequenz":50.01,"Total":534.694,"phase_angle":-9.73,"Import_nres":186.145,"Export_nres":348.549,"Export_P1":13.568,"Export_P2":334.981,"Export_P3":0,"Import_P1":19.409,"Import_P2":131.003,"Import_P3":35.733,"L1_total_kwh":32.977,"L2_total_kwh":465.984,"L3_total_kwh":35.733,"Blindleistung_L1":0,"Blindleistung_L2":-7.734,"Blindleistung_L3":0,"Scheinleistung_L1":0,"Scheinleistung_L2":22.627,"Scheinleistung_L3":0,"VAh_since_last_reset":565.815}}"Ich hoffe jemand kann mir weiter helfen.
Grüße André
-
@rieders Am besten ist es aus dem Debugfenster einfach den Pfad kopieren. Sprich du schaust, was aus debug2 rauskommt und kopierst den Pfad, des Wertes den Du anzeigen willst.
Wenn ich also Dein Objekt nehme (Dein Flow lässt sich nicht importieren, da Du keine CodeTags verwendest) und möchte den Total Wert in der Text Node anzeigen, gehe ich mit dem Cursor dahin und kopieren den Pfad:
Dann kommt folgendes raus:
payload.SDM630.Total
Das kannst Du nun direkt in der text node verwenden oder die payload verändern um es dann in einer gauge anzuzeigen.
In der Text-Node:
Mit der Change-Node:
Hier mal mein Flow richtig exportiert in CodeTags:
-
Vielen Dank für die Hilfe.
Das Auslesen funktioniert super.
Ich weiß nur nicht wie du aus dem debug2 den Pfad ausgelesen hast, bei mir sieht das ganz anders aus.Jetzt kann ich die Daten an Venus OS übergeben und hoffentlich als virtualen Zähler sehen.
-
@rieders Hab ich gar nicht, da ich deinen Flow ja nicht importieren konnte (nicht in CodeTags), aber Du hast ja die Daten zum Glück bzw. das Objekt gepostet und so habe ich es einfach in die Inject Node geschrieben. Du kannst übrigens direkt in ein Objekt wandeln lassen, dann kannst du das direkt nach der mqtt-In Node machen, in dem Du Dir ein analysiertes Objekt ausgeben lässt.
Dann brauchst nach der mqtt-In auch nichts mehr konvertieren.
-
@mickym
Sorry, das ich mich hier mit ranhänge. Mein Problem ist denk mal ähnlich.
Ich möchte relatives Dimmen von KNX auf Zigbee umsetzen.
Dazu müßte wohl auch der Payload zerlegt werdenHier die Ausgaben vom KNX.
Taster ist gedrückt und soll runterdimmen:
{"topic":"1/4/26","devicename":"","payload":{"decr_incr":0,"data":1},"payloadmeasureunit":"unknown","payloadsubtypevalue":"unknown","knx":{"event":"GroupValue_Write","dpt":"3.007","dptdesc":"Dimming control","source":"1.1.4","destination":"1/4/26","rawValue":[1]},"previouspayload":{"decr_incr":0,"data":0},"_msgid":"34735868e6770bd1"}
Taster losgelassen, dimmen soll stoppen:
{"topic":"1/4/26","devicename":"","payload":{"decr_incr":0,"data":0},"payloadmeasureunit":"unknown","payloadsubtypevalue":"unknown","knx":{"event":"GroupValue_Write","dpt":"3.007","dptdesc":"Dimming control","source":"1.1.4","destination":"1/4/26","rawValue":[0]},"previouspayload":{"decr_incr":0,"data":1},"_msgid":"a4982ca3e5461702"}
Taster ist gedrückt und soll hochdimmen:
{"topic":"1/4/26","devicename":"","payload":{"decr_incr":1,"data":1},"payloadmeasureunit":"unknown","payloadsubtypevalue":"unknown","knx":{"event":"GroupValue_Write","dpt":"3.007","dptdesc":"Dimming control","source":"1.1.4","destination":"1/4/26","rawValue":[9]},"previouspayload":{"decr_incr":0,"data":0},"_msgid":"12ada754ecbda05f"}
Taster losgelassen, dimmen soll stoppen:
{"topic":"1/4/26","devicename":"","payload":{"decr_incr":0,"data":0},"payloadmeasureunit":"unknown","payloadsubtypevalue":"unknown","knx":{"event":"GroupValue_Write","dpt":"3.007","dptdesc":"Dimming control","source":"1.1.4","destination":"1/4/26","rawValue":[0]},"previouspayload":{"decr_incr":1,"data":1},"_msgid":"dabb632a5c74b60d"}
Änderungen sehe ich hier jeweils bei :
{"decr_incr":x,"data":x}Die Befehle für die Zigbee Leuchtmittel hab ich getestet, bei direktem schicken auf den DP funktionieren die schonmal.
z.B.
hochdimmen={"brightness_move": 40}
runterdimmen={"brightness_move": -40}
stoppen={"brightness_move": 0}Hab schon etliche Stunden mit der "Change" Node rumprobiert, allerdings ohne Erfolg
Wie muß ich vorgehen, um die KNX Befehle auf Zigbee umzusetzen?
-
@frankthegreat Na ja - da ist noch etwas mehr Logik im Spiel und das muss man sich trotz aller Flows genau überlegen. Ich hab ja mal einen softdimmer ähnlich mit einem vis Widget erstellt.
das mit dem hoch und runter Dimmen - kann man grundsätzlich mit mehreren Arten machen wahrscheinlich gibts den brightness Datenpunkt im Zigbee auch als absolute Werte. Move geht auch und vereinfacht das Ganze wohl eher.
Im Prinzip, wenn es sich so darstellt, dann wäre
data: 1 immer gedrückt = dimmen
data: 0 immer losgelassen = stoppendecr_incr: 1 bei data 1 = hochdimmen
decr_incr: 0 bei data 1 = runterdimmen.Da wir immer stoppen egal wie gerade gedimmt wurde, ist uns egal welchen Zustand das Teil vorher hatte. Auf dieser Basis probieren wird das mal - kleinen Moment.
So müsste das jetzt mal quick & dirty funktionieren:
Statt der Inject Node halt Deine KNX Nodes dran machen und hinten halt in den brightness_move Datenpunkt ausgeben.
Das geht auch mit einer switch Node - nur dann muss man halt JSONATA verwenden und bei der ersten Übereinstimmung stoppen - dafür schaut der Flow übersichtlicher aus.
-
@mickym
Jepp...und läuft auf AnhiebSupi, danke dir. Abend gerettet.
Ich hatte hauptsächlich versucht in diesen DP zu schreiben. Da hatt's aber mit der Umwandlung nicht geklappt.
Aber so geht's natürlich auch.
Nochmal DANKE
-