Seite 1 von 1

Openhab3 JSON per MQTT empfangen und verarbeiten

Verfasst: 31. Jan 2022 18:23
von HappyDexter
Hallo zusammen,
bisher bin ich mit lesen im Forum und googlen eigentlich immer zur Lösung gekommen, aber jetzt fehlt mir so die Letzte Idee um mein aktuelles Vorhaben zu lösen. Ich habe bisher noch nicht mit MQTT gearbeitet, daher bin ich auf dem Gebiet absoluter Anfänger.
Ich habe mir ein ESP32 gebaut, der mir alle 10 Sekunden alle MAC-Adressen und die dazugehörigen Signalstärke der in der Nähe befindlichen Bluetooth Geräte liefert. Auf meinem Openhab3 ist Mosquitto installiert und läuft. Ich habe den Broker in Openhab3 drin und er läuft. Ich habe mir ein Generic MQTT Thing gebaut und es läuft. Ich habe mir ein Channel gebaut, der nur die JASON von meinem einen Gerät empfangen soll und es läuft. Ich habe mit ein Text-Item gebaut, da den Jason aufnimmt.
2022-01-31 18_17_52-openHAB.jpg
Bis hier hin läuft alles und ich bin happy. Aber wie bekomme ich jetzt den JSON auseinander gedröselt, so dass ich zu einer bestimmten MAC-Adresse auch weiß, wie stark die Signalstärke ist? Kann ich eventuell schon den Channel auf eine Mac-Adresse einschränken und dem Item dann nur noch die Signalstärke zuweisen? Dann könnte ich für die drei interessanten MAC-Adressen feste Channels bauen!

Hintergrund meiner Idee: Ich baue mir mehrere solcher Sender im Haus auf und wenn die Signalstärker eines bestimmten BT-Geräts bei einem Sender stark genug ist, schalte ich z.B. in dem Raum das Licht an! Würde so also feststellen können, in welchem Raum ich mich gerade befinde und darauf entsprechend reagieren.

Ich würde mich über eine kleine Info freuen, wie ich nun mein letzten Step noch hinbekommen kann.

Vielen Dank im voraus
Gruß
Markus

Re: Openhab3 JSON per MQTT empfangen und verarbeiten

Verfasst: 31. Jan 2022 19:15
von udo1toni
Sehr nette Idee. Das Problem ist hier das Ausgangsmaterial.
Du solltest versuchen, das JSON so umzubauen, dass es für jede gefundene MAC einen Knoten gibt, mit zwei benannten Einträgen, von denen der eine dann z.B. mac heißt, und der andere z.B. rssi (received signal strength indicator). Dann kannst Du per JSONPath gezielt Knoten auswählen (per Selection auf @.mac) und Dir die rssi ausgeben lassen. So:
JSON:

Code: Alles auswählen

{
  "data": [
        {
            "mac": "44:f2:11:29:59:6f",
            "rssi": -81
        },
        {
            "mac": "47:42:1e:db:2c:71",
            "rssi": -81
        },
        {
            "mac": "54:d2:72:0b:7a:1d",
            "rssi": -83
        },
        {
            "mac": "5a:d5:92:0e:eb:db",
            "rssi": -87
        },
        {
            "mac": "5a:ff:1b:d2:3e:de",
            "rssi": -74
        },
        {
            "mac": "7b:79:fc:c2:49:95",
            "rssi": -86
        },
        {
            "mac": "c2:fa:7d:61:dd:83",
            "rssi": -60
        }
    ]
}
Formatierung nur der Übersichtlichkeit wegen... könnte auch so aussehen:

Code: Alles auswählen

{"data": [{"mac": "44:f2:11:29:59:6f","rssi": -81},{"mac": "47:42:1e:db:2c:71","rssi": -81},{"mac": "54:d2:72:0b:7a:1d","rssi": -83},{"mac": "5a:d5:92:0e:eb:db","rssi": -87},{"mac": "5a:ff:1b:d2:3e:de","rssi": -74},{"mac": "7b:79:fc:c2:49:95","rssi": -86},{"mac": "c2:fa:7d:61:dd:83","rssi": -60}]}

Code: Alles auswählen

JSONPATH:$.data[?(@.mac=='54:d2:72:0b:7a:1d')].rssi
liefert dann -83
Du kannst alternativ auch mit dem unveränderten Format arbeiten, sähe dann so aus:

Code: Alles auswählen

JSONPATH:$.data[54:d2:72:0b:7a:1d']
Ich bin mir aber nicht sicher, was JSONPATH macht, wenn eines der Geräte nicht erreichbar ist. Im ersten Fall wird dann auf jeden Fall eine leere Antwort geliefert, weil durch die Abfrage schon ein leerer Wert zurückgeliefert wird. Im zweiten Fall kann es aber sein, dass es zu einer Exception kommt. Ich bin kein Experte, was die Verhaltensweise von JSONPath betrifft ;)

Re: Openhab3 JSON per MQTT empfangen und verarbeiten

Verfasst: 1. Feb 2022 08:25
von HappyDexter
Danke für die Hilfe, mit etwas Veränderung hat es nun geklappt. Da es im JSON kein Data Block gibt, sieht er jetzt so aus:

Code: Alles auswählen

JSONPATH:$.['c2:fa:7d:61:dd:83']
Wenn das BT-Gerät nicht erreichbar ist, gibt es keinen Fehler, das Item bleibt einfach beim letzten gelieferten Wert stehen. Da ich die Werte alle 5 Sekunden neu schicke, könnte ich hier, wenn nach 15 oder 30 Sekunden kein neuer Wert kommt, das Item auf 0 setzen.

Ich werde aber die Tage auch nochmal versuchen den ESP32 Sketch anzupassen und den JSON wie DU es beschrieben hast umbauen. Vielleicht geht es so dann einfach, wenn das Gerät nicht mehr erreichbar ist.

Aber trotzdem erstmal vielen Dank für Deine Hilfe.

Re: Openhab3 JSON per MQTT empfangen und verarbeiten

Verfasst: 1. Feb 2022 17:11
von udo1toni
Super! ja, data war noch übrig, ich hatte einfach aus Bequemlichkeit von oben kopiert...

Was den hängenden Wert betrifft, so wird sich das durch die Änderung der Payload leider nicht bessern, das ist systembedingt. Du kannst aber pro Item in den Metadaten ein expire setzen. Nach einem Timeout (also z.B. Deine 15 Sekunden) lässt Du dann einfach einen default Value eintragen, z.B. NULL oder auch -150 (ein NULL müsstest Du in der anschließenden Berechnung ausfiltern)