Seite 1 von 1
JSON <-> Blockly
Verfasst: 14. Aug 2024 13:32
von binderj1
Hallo Leute,
Ich benötige eure Hilfe.
Ein Shelly plus I4 sendet bei Tastendruck per MQTT folgende JSON
Code: Alles auswählen
{
"src": "shellyplusi4-90380c35e7f4",
"dst": "shellyplusi4-90380c35e7f4/events",
"method": "NotifyEvent",
"params": {
"ts": 1723560806.52,
"events": [
{
"component": "input:0",
"id": 0,
"event": "single_push",
"ts": 1723560806.52
}
]
}
}
Mit diesem JSONPath „$.params.events[0]“ bleibt nur mehr ein Teil
Code: Alles auswählen
[
{
"component": "input:0",
"id": 0,
"event": "single_push",
"ts": 1723560806.52
}
]
vom JSON übrig.
Meine Frage ist nun wie bekomme ich diesen Teil bei den RULES ins Blockly zum weiter verarbeiten?
vielen Dank schon mal
LG Hannes
Re: JSON <-> Blockly
Verfasst: 14. Aug 2024 17:00
von Harka
Moin,
irgend wie läuft was falsch. Die Formatierung hier im Forum ist etwas zerschossen und die eckigen Klammern dürften auch nicht mehr da sein. Wenn ich da richtig liege sollte es mit diesen 2 Varianten gehen
ForumJson2408.png
parse stammt aus der
Json_Tools Block Libraries
Ich würde aber den direkten Weg mit
$.params.events[0].event vorziehen.
Re: JSON <-> Blockly
Verfasst: 14. Aug 2024 17:25
von udo1toni
Ich bin mir nicht sicher, ob das so funktionieren wird. openHAB kann meines Wissens keine Objekte aus JSON herauslösen, die dann später wieder mittels JSONPATH weiterverarbeitet werden könnten. Es ist aber ohnehin die Frage, warum Du das so machen willst. Interessant sind nur zwei Elemente, nämlich event und ts, wobei ts eigentlich auch nicht interessant ist, denn openHAB kann seinen eigenen Zeitstempel nutzen. Du könntest also einfach mittels
direkt auf das Event zugreifen und dieses als String weiterverarbeiten.
Ich nutze keine Shelly (mit Originalfirmware), falls es also eine Rolle spielt, welcher Input gemeldet wird, kannst Du auch das direkt im JSONPATH angeben:
Code: Alles auswählen
JSONPATH:$.params.events[?(@.component=="input:0")].event
Du kannst vier Trigger Channel anlegen und dort jeweils das selbe stateTopic, aber individuelle JSONPATHs angeben (eben input 0 bis 3). Der Trigger Channel wird dann nicht mit einem Item verknüpft, sondern direkt als Channel Trigger verwendet.
Re: JSON <-> Blockly
Verfasst: 18. Aug 2024 18:41
von binderj1
Der Urlaub ist vorbei
Vielen Dank für eure Rückmeldungen.
@udo1toni Dank deine Hilfe habe ich es geschafft Triggerchannel anzulegen.

momentan weiß ich noch nicht wie ich die drei Meldungen "single_push", "double_push" und "long_push"
in Blockly auswerten und die jeweiligen Aktoren z.B. (MQTT-Topic: shellyplus2pm-30c92286ad08/command/cover:0) mit den Befehlen "open", "close" und "stop" steuere.
Re: JSON <-> Blockly
Verfasst: 18. Aug 2024 19:55
von udo1toni
Na, Du legst eine Rule mit dem Trigger "Channel xxx triggered" an und wertest anschließend im Code die implizite Variable receivedEvent aus. Diese Variable steht in jeder Rule zur Verfügung, die per Channel xxx triggered ausgeführt wird und enthält den aktuellen Trigger als String, hier also single_push, double_push oder long_push. Die Auswertung machst Du einfach über einen Vergleich mit dem jeweiligen String.
Re: JSON <-> Blockly
Verfasst: 1. Sep 2024 19:32
von binderj1
Hallo udo1toni
Danke für den Hinweis mit der Variable
receivedEvent, das funktioniert, im Log steht folgender Eintrag
Trigger_Log.png
Meine Frage nun, Wie frage ich nach "single_push", "double_push" und "long_push"
Ich mir eine Regel zurecht geschnitzt
rules.png
die funktioniert nur bei ungleich (receivedEvent
≠ single_push)
Warum ist das eigentlich so? Sollte es mit "=" funktionieren?
Was muss ich ändern damit ich (receivedEvent = single_push), (receivedEvent = double_push) und (receivedEvent = long_push) dem entsprechende Aktionen bekomme?
Re: JSON <-> Blockly
Verfasst: 1. Sep 2024 20:32
von udo1toni
Wie ist der Channel nun definiert? Bitte keine Screenshots! Du kannst den Text einfach per Zwischenablage kopieren und hier im Forum , als Code markiert, wieder aus der Zwischenablage einfügen. Das ist wesentlich besser lesbar und verbraucht wesentlich weniger Platz.
Bei den Rules (egal welche Engine man verwendet) gibt es für jede Rule die Code Ansicht. Bitte auch dort einfach den Text in die Zwischenablage übernehmen und als Code markiert hier einfügen. Die Code Markierung kann man entweder manuell mit den Tags code und /code (in [] Klammern) hinschreiben, oder man nutzt den vollständigen Editor und dort den Button mit dem </> drauf (der schreibt dann halt auch die Tags hin).
Falls als receivedEvent tatsächlich exakt single_push zurück kommt, muss die Rule auch mit dem Vergleich auf Gleichheit funktionieren. Mit Ungleichheit würde ja jeder Zweig auslösen, bis auf den, der dem Trigger entspricht.
Was aber sein kann, ist, dass Du einen Fehler im Code hast und deshalb receivedEvent gar nicht die gesuchte Zeichenkette enthält.
Tipp: Du kannst auch in Blockly dezidiert Logs schreiben, also auch über den log-Befehl den Inhalt der impliziten Variablen receivedEvent ausgeben lassen, dann hast Du schnell Klarheit.