JSON <-> Blockly

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
Benutzeravatar
binderj1
Beiträge: 27
Registriert: 11. Dez 2021 09:43
Answers: 0
Wohnort: Windigsteig

JSON <-> Blockly

Beitrag 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
openHAB 4.2.0 auf einem Raspberry Pi 4 Model B+

Harka
Beiträge: 489
Registriert: 30. Apr 2021 13:13
Answers: 19

Re: JSON <-> Blockly

Beitrag 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.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Benutzeravatar
udo1toni
Beiträge: 15243
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: JSON <-> Blockly

Beitrag 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

Code: Alles auswählen

JSONPATH:$.params.events[0].event
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.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Benutzeravatar
binderj1
Beiträge: 27
Registriert: 11. Dez 2021 09:43
Answers: 0
Wohnort: Windigsteig

Re: JSON <-> Blockly

Beitrag von binderj1 »

Der Urlaub ist vorbei :(
Vielen Dank für eure Rückmeldungen.
@udo1toni Dank deine Hilfe habe ich es geschafft Triggerchannel anzulegen.
Bild
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.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
openHAB 4.2.0 auf einem Raspberry Pi 4 Model B+

Benutzeravatar
udo1toni
Beiträge: 15243
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: JSON <-> Blockly

Beitrag 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.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Benutzeravatar
binderj1
Beiträge: 27
Registriert: 11. Dez 2021 09:43
Answers: 0
Wohnort: Windigsteig

Re: JSON <-> Blockly

Beitrag 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?
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
openHAB 4.2.0 auf einem Raspberry Pi 4 Model B+

Benutzeravatar
udo1toni
Beiträge: 15243
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: JSON <-> Blockly

Beitrag 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.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Antworten