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.
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
Openhab3 JSON per MQTT empfangen und verarbeiten
-
- Beiträge: 36
- Registriert: 17. Sep 2020 15:03
Openhab3 JSON per MQTT empfangen und verarbeiten
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
- udo1toni
- Beiträge: 15249
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Openhab3 JSON per MQTT empfangen und verarbeiten
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:Formatierung nur der Übersichtlichkeit wegen... könnte auch so aussehen:
liefert dann -83
Du kannst alternativ auch mit dem unveränderten Format arbeiten, sähe dann so aus:
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 
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
}
]
}
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
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']

openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet
-
- Beiträge: 36
- Registriert: 17. Sep 2020 15:03
Re: Openhab3 JSON per MQTT empfangen und verarbeiten
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:
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.
Code: Alles auswählen
JSONPATH:$.['c2:fa:7d:61:dd:83']
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.
- udo1toni
- Beiträge: 15249
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Openhab3 JSON per MQTT empfangen und verarbeiten
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)
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)
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet