Hauptmenü

MQTT JSON auslesen

Begonnen von lkllnd, 14 Juli 2017, 20:13:11

Vorheriges Thema - Nächstes Thema

lkllnd

Hallo

Ich bin neu im Umgang mit FHEM. Ich habe einen sogenannten HappyBubbles Detektor, der Präsenzerkennung betreibt. Der published MQTT Nachrichten, die so aussehen:

{"id":"e2c56db5dffb48d2b060d0f5a71096e0_0000_0000","name":"iBeacon","distance":14.584888311962393}

Jetzt möchte ich gerne nur den Wert unter dem Namen "distance" haben und damit was machen. Ich habe schon das Modul expandJSON gefunden, aber komme damit nicht zu recht. In der Doku steht folgendes:
Zitatdefine <name> expandJSON <source_regex> [<target_regex>]

<name>
A name of your choice.

<source_regex>
Regexp that must match your devices, readings and values that contain the JSON strings. Regexp syntax is the same as used by notify and must not contain spaces.

<target_regex>
Optional: This regexp is used to determine whether the target reading is converted or not at all. If not set then all readings will be used. If set then only matching readings will be used. Regexp syntax is the same as used by notify and must not contain spaces.

Leider kenne ich mich überhaupt nicht mit Regex aus und weiß nicht so recht, was ich unter source_regex schreiben muss.

Ich habe schon ein MQTT device angelegt, das die MQTT message in seinem state stehen hat.

NAME
sw_Light
NR
27
STATE
{"id":"e2c56db5dffb48d2b060d0f5a71096e0_0000_0000","name":"iBeacon","distance":26.764554390207138}
TYPE
dummy


Was muss ich jetzt in die source_regex schreiben?

Kann mir da jemand helfen?

LG

Reinhart

#1
versuche es mal so:

define ej3 expandJSON sw_Light.*:.*:.{.*} (name|distance)

Jeder Device dessen Name mit "sw_light" beginnt wird nach "name" und "distance" im Jsonstring gefiltert und diese beiden dann als Reading angelegt.

LG
FHEM auf Raspy4 mit Bullseye + SSD, Homematic, ESP8266, ESP32, Sonoff, eBus, NanoCUL, MapleCUL, , MQTT2, Alexa

dev0

Fast richtig, das Reading state hat in FHEM eine Sonderstellung.


define ej3 expandJSON sw_Light.*:{.*} (name|distance)

lkllnd

Zitat von: dev0 am 14 Juli 2017, 21:30:06
Fast richtig, das Reading state hat in FHEM eine Sonderstellung.


define ej3 expandJSON sw_Light.*:{.*} (name|distance)


Vielen Dank, das funktioniert.

Als nächstes möchte ich eine notify schreiben, die einen dummy auf on oder off setzt, je nachdem ob die distance größer oder kleiner als 1 ist.
Ich habe das folgende probiert, aber es funktioniert nicht. Liegt das an der Überprüfung mit dem größer Zeichen?

sw_Light {
if(Value("sw_Light:distance") > 1){
fhem "set test_dummy on"
}
else {
fhem "set test_dummy off"
}
}


Außerdem: Wie kann man sich so etwas wie ein echo oder print ausgeben lassen, um seinen Code zu debuggen? Gibt es da eine einfache Möglichkeit?

MfG

dev0

ReadingsVal statt Value verwenden. Siehe: https://fhem.de/commandref.html#perl
Zum Debuggen kannst Du den Debug Befehl verwenden.

Stekru13

Hallo zusammen,

ich bin neu hier und habe eine, sehr wahrscheinlich doofe, Frage....

Ich bin gerade dabei, Temperatur und Luftfeuchtigkeit über MQTT und JSON in FHEM darzustellen. Die Werte bekomme ich schon als Readings herein, würde sie aber gern als ReadingsGroup auslesen und auf der Oberfläche einzeln darstellen.
Dabei bekomme ich dann immer nur die Angaben in geschweiften Klammern.

Ich weiß, dass ich das Modul expandJSON benutzen muss, um zu filtern, irgendwie klappt es aber nicht:

define expand_mqtt_klima_zimmer2 expandJSON mqtt_klima.*:.*:.{.*}

Daher ist das der aktuelle Stand:

define mosquitto MQTT localhost:1883
define mqtt_klima_zimmer2 MQTT_DEVICE
attr mqtt_klima_zimmer2 subscribeReading_json devices/tfa/30.3180.it/0a70/json
attr mqtt_klima_zimmer2 room zimmer

Könnt ihr mir einen Tipp geben oder ein Beispiel-Script nennen, um eine Idee zu bekommen, wie ich die Werte als einzelne Readings sichtbar machen kann.

Würde mich über eine Antwort freuen...


dev0

Zeig je ein list vom mqtt und expandJSON Device. Bitte Code Tags verwenden. Wenn Dir nicht klar ist was ich benötige/möchte, dann lies die angepinnten Beiträge im Anfängerbereich vorher.