Neuigkeiten:

Am Sonntag den 8.12.2024 kann es ab ca. 8:00 Uhr zu kurzzeitigen Einschränkungen / Ausfällen bei den Diensten des FHEM Vereines kommen.
Die Server müssen mal gewartet und dabei neu gestartet werden ;)

Hauptmenü

RTL-433 + MQTT - einzelne Readings auslesen

Begonnen von 1.fhemtester, 22 August 2022, 16:11:26

Vorheriges Thema - Nächstes Thema

1.fhemtester

Ich habe einen RTL-433 SDR mit MQTT laufen. MQTT2_SERVER und MQTT2_DEVICE ist installiert und läuft problemlos.
AttrTemplate MQTT2_CLIENT_general_bridge wurde gesetzt.

Readlinglist zeigt:

rtl_433_b362ffff:rtl_433/r4-64/events:.* { json2nameValue($EVENT) }
rtl_433_b362ffff:rtl_433/r4-64/devices/AlectoV1-Wind/1/36/time:.* 1_36_time
rtl_433_b362ffff:rtl_433/r4-64/devices/AlectoV1-Wind/1/36/id:.* 1_36_id
rtl_433_b362ffff:rtl_433/r4-64/devices/AlectoV1-Wind/1/36/channel:.* 1_36_channel
rtl_433_b362ffff:rtl_433/r4-64/devices/AlectoV1-Wind/1/36/battery_ok:.* 1_36_battery_ok
rtl_433_b362ffff:rtl_433/r4-64/devices/AlectoV1-Wind/1/36/wind_avg_m_s:.* 1_36_wind_avg_m_s
rtl_433_b362ffff:rtl_433/r4-64/devices/AlectoV1-Wind/1/36/wind_max_m_s:.* 1_36_wind_max_m_s
rtl_433_b362ffff:rtl_433/r4-64/devices/AlectoV1-Wind/1/36/wind_dir_deg:.* 1_36_wind_dir_deg
rtl_433_b362ffff:rtl_433/r4-64/devices/AlectoV1-Wind/1/36/mic:.* 1_36_mic
rtl_433_b362ffff:rtl_433/r4-64/devices/AmbientWeather-TX8300/1/108/time:.* 1_108_time
rtl_433_b362ffff:rtl_433/r4-64/devices/AmbientWeather-TX8300/1/108/id:.* 1_108_id
rtl_433_b362ffff:rtl_433/r4-64/devices/AmbientWeather-TX8300/1/108/channel:.* 1_108_channel
rtl_433_b362ffff:rtl_433/r4-64/devices/AmbientWeather-TX8300/1/108/battery:.* 1_108_battery
rtl_433_b362ffff:rtl_433/r4-64/devices/AmbientWeather-TX8300/1/108/temperature_C:.* 1_108_temperature_C
rtl_433_b362ffff:rtl_433/r4-64/devices/AmbientWeather-TX8300/1/108/mic:.* 1_108_mic
...
(gekürzt, da zahlreiche weitere Einträge vorhanden)

Readings werden aktualisiert.

Wie kann ich am einfachsten die zahlreichen devices in einzelne Geräte aufsplitten und "Fremdgeräte" ausblenden ?

Otto123

#1
Hi,

schau mal hier als Einstieg
https://wiki.fhem.de/wiki/MQTT2-Module_-_Praxisbeispiele#bridgeRegexp
https://forum.fhem.de/index.php/topic,116480.msg1107818.html#msg1107818
Also bridgeRegexp ist das Mittel um Geräte aufzusplitten.
Das hier verwirrt mich
AttrTemplate MQTT2_CLIENT_general_bridge wurde gesetzt.
Ich denke damit warst Du falsch? Du hast doch keinen MQTT2_CLIENT ?


Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

1.fhemtester

Hallo Otto,

automatisch wurde ein MQTT2_DEVICE MQTT2_rtl_433_b362ffff angelegt.
Dort hab ich dann attrTemplate MQTT2_CLIENT_general_bridge gesetzt.

Manuell konnte ich

define K1 MQTT2_DEVICE 1_36
attr K1 autocreate 1
attr K1 event-on-change-reading .*
attr K1 readingList rtl_433_b362ffff:rtl_433/r4-64/devices/AmbientWeather-TX8300/1/108/battery:.* 1_36_battery\
rtl_433_b362ffff:rtl_433/r4-64/devices/AlectoV1-Wind/1/36/wind_avg_m_s:.* 1_36_wind_avg_m_s\
rtl_433_b362ffff:rtl_433/r4-64/devices/AlectoV1-Wind/1/36/wind_max_m_s:.* 1_36_wind_max_m_s\
rtl_433_b362ffff:rtl_433/r4-64/devices/AlectoV1-Wind/1/36/wind_dir_deg:.* 1_36_wind_dir_deg\
rtl_433_b362ffff:rtl_433/r4-64/devices/AlectoV1-Temperature/1/36/temperature_C:.* 1_36_temperature_C\
rtl_433_b362ffff:rtl_433/r4-64/devices/AlectoV1-Temperature/1/36/humidity:.* 1_36_humidity
attr K1 room MQTT2_DEVICE
attr K1 stateFormat T: 1_36_temperature_C H: 1_36_humidity W: 1_36_wind_avg_m_s max 1_36_wind_max_m_s

anlegen.

Weil ich aber viele Geräte empfange, suche ich nach einen (halb)automatischen Lösung.

Die Wiki Artikel und viele Postings zu MQTT hab ich gelesen aber wohl nicht vollständig verstanden.

Auch bridgeRegexp hab ich gesehen, aber wo und wie genau muss ich das setzen ?

Otto123

#3
Zitat von: 1.fhemtester am 22 August 2022, 21:09:14
Dort hab ich dann attrTemplate MQTT2_CLIENT_general_bridge gesetzt.
Ok ich revidiere meine Aussage: Mit Abstand betrachtet ist der Template Name unglücklich gewählt? kannst Du jetzt nix für.

Allerdings nützt Dir das Template noch nichts, denn das dort gesetzte Attribute bridgeRegexp passt nicht für Dich.

In dem Beitrag https://forum.fhem.de/index.php/topic,116480.msg1107818.html#msg1107818 habe ich eigentlich Schritt für Schritt erklärt wie man vorgehen muss. Versuch Dich doch mal wenigstens vorzutasten. Ich weiß leider nicht mehr ob es da noch einen umfassenderen Beitrag gab. ::)

Hier mal Vorschlag erarbeitet https://regex101.com/r/vw2vHn/1

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

1.fhemtester

O.k. Danke versuch ich mal.
Erstaunlich, dass da noch niemand eine fertige Lösung hat.
SDRs sind verbreitet und RTL_433 ist doch schon einige Monate alt und eine FHEM Anbindung über MQTT biete sich an um sich mal in der Umgebung umzusehen was da so alles sendet.
Aussensensor brauch ich mir keinen kaufen, da gibt es einige.  :)

DetlefR

Mal nicht ganz zum Thema passend.

Wie bekommt man den SDR dazu, all das zu empfangen und zu senden.
Ich habe auch noch so ein Ding rumliegen. Aber so richtig beschäftigt.. dazu hat es bisher nicht gereicht.

Gruß
Detlef

1.fhemtester

Senden kann der RTL nicht, nur empfangen.

Hier eine Schnellinstallation für Linux:

sudo apt-get install libtool libusb-1.0-0-dev librtlsdr-dev rtl-sdr build-essential cmake pkg-config
git clone https://github.com/merbanan/rtl_433.git
    cd rtl_433/
    mkdir build
    cd build
    cmake ..
    make
    make install
rtl_433
Damit wird die default Einstellung mit 433.92 gesetzt.

Dann sollten Meldungen ähnlich

_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
time      : 2022-08-23 10:19:16
model     : AlectoV1-Wind House Code: 36
Channel   : 1            Battery   : 1             Wind speed: 0.00 m/s
Wind gust : 0.00 m/s     Wind Direction: 315       Integrity : CHECKSUM

erscheinen.

Wenn erfolgreich dann in FHEM den MQTT Server aktivieren

define MQTTR2 MQTT2_SERVER 1883

und den RTL mit

rtl_433 -F mqtt://localhost:1883 &

starten.

Wenn alles klappt erscheint dann eine Readinglist ähnlich dem ersten Posting.

RTL_433 kennt eine große  Anzahl von Optionen u.a. zur Auswahl von Protokollen und auch zum Frequenz setzten z.b für 868.3 MHz.
Wenn auf 433.92 nichts empfangen wird kann man es auch auf  868.3  versuchen.

DetlefR


1.fhemtester

Hallo Otto,
Danke für den Hinweis

attr MQTT2_rtl_433_b362ffff bridgeRegexp rtl_433\/([^\/:]+)\/([^\/:]+)\/([^\/:]+)\-([^\/:]+)\/([^\/:]+)\/([^\/:]+).* "$3_$4_$5"

tut für mich was es soll.

Da aber RTL_433 viele Geräte kennt, muss die  bridgeRegexp nicht unbedingt für jedes Gerät passen.
Optimierungen sind also gerne gesehen

kpwg

#9
Ich muss dieses alte Thema nochmal aufwärmen, da mir die Auflösung des bridgeRegexp nicht ganz klar ist.
Prinzipiell bekomme ich die Daten sauber, kann also händisch aus der readingList die Sensoren austragen und in einem neuen Device anlegen. Die Daten werden dann sauber in das passende Device einsortiert. Die Überlegung ist aber eher: kann ich nicht mit einem passenden bridgeRegexp für eine Weile alles per autocreate anlegen und mir dann die neuen Sensoren passend bearbeiten bzw. löschen?

Meine Ausgangslage:
Vom OpenMQTTGateway bekommme ich zum Gerät selbst alles passend rein, das Device wird entsprechend bedient
rtl433:home/rtl433/RFtoMQTT:.* { json2nameValue($EVENT) }
rtl433:home/rtl433/SYStoMQTT:.* { json2nameValue($EVENT) }
rtl433:home/rtl433/SSD1306toMQTT:.* { json2nameValue($EVENT) }
rtl433:home/rtl433/WebUItoMQTT:.* { json2nameValue($EVENT) }

Die Sensordaten selbst sehen dann zum Beipiel so aus
rtl433:home/rtl433/RTL_433toMQTT/Rubicson-Temperature/1/244:.* { json2nameValue($EVENT) }
rtl433:home/rtl433/RTL_433toMQTT/Nexus-TH/1/9:.* { json2nameValue($EVENT) }
rtl433:home/rtl433/RTL_433toMQTT/WT450-TH/1/1:.* { json2nameValue($EVENT) }
rtl433:home/rtl433/RTL_433toMQTT/Secplus-v1/0:.* { json2nameValue($EVENT) }
rtl433:home/rtl433/RTL_433toMQTT/Interlogix-Security/motion/485865:.* { json2nameValue($EVENT) }

Ziel ist es, automatisch subDevices zu erstellen, welche Gerätetyp, Kanalnummer und Device-ID im Name haben, um eindeutig zu sein. Das im vorangegangenen Beitrag benannte bridgeRegexp triggert bei mir nicht, ich sehe da auch keinen Ansatz.

Als Beispiel nehme ich gleich mal den ersten Sensor aus meiner Liste her
rtl433:home/rtl433/RTL_433toMQTT/Rubicson-Temperature/1/244:.* { json2nameValue($EVENT) }
Dabei ist rtl433:home/rtl433/RTL_433toMQTT/ der feste Teil des bridgeRegexp, gefolgt von drei Strings, danach die Daten.
Wie könnten diese drei Strings ausgewertet werden, wenn der Name in Form von "Rubicson-Temperature_1_244" erzeugt werden soll?

Ein
bridgeRegexp rtl433:home/rtl433/RTL_433toMQTT/([A-Za-z0-9._]+)[/]?.*:.* "$1_$2_$3" erzeugt schon mal Sensoren wie MQTT2_Rubicson__
Wie übergebe ich denn $2 und $3 ?

EDIT: Ich bin ein Stück weiter! https://regex101.com/r/XGxHVF/1
Ein Problem bleibt noch, Geräte zu unterscheiden, welche mit einem Match weniger daher kommen.

TomLee

ZitatEin Problem bleibt noch, Geräte zu unterscheiden, welche mit einem Match weniger daher kommen.

Morgen,

Eine weitere Zeile in bridgeRegexp ergänzen mit nur diesen zwei Matches ? Geht das ? Evtl. muss die über der mit drei Matches definiert werden ?

Bloss so meine Gedanken zu der Fragestellung, kann auch daneben liegen / die Frage falsch verstanden haben.

Gruß

Thomas

kpwg

#11
Ja, das funktioniert prinzipiell, nur frage ich mich: Wird nach Reihenfolge abgearbeitet?
Der aktuelle Stand:
rtl433:home/rtl433/RTL_433toMQTT\/([^\/:]+)\/([^\/:]+)\/([A-Za-z0-9._]+)[/]?.*:.* "$1_$2_$3"
rtl433:home/rtl433/RTL_433toMQTT\/([^\/:]+)\/([^\/:]+)[\/]?.*:.* "$1_$2"
rtl433:home/rtl433/RTL_433toMQTT\/([^\/:]+)\/?.*:.* "$1"

Die Praxis sieht nun so aus, das Sensoren mit drei matches auch von der zweiten und dritten Zeile gematcht werden und entsprechend angelegt werden. Dann erhalte ich den Zustand, das wieder mehrere Sensoren in einem device landen. Das passiert nicht, wenn das "Drei-match-Device" zum Zeitpunkt angelegt wurde, als nur die erste Zeile existierte.

TomLee

ZitatWird nach Reihenfolge abgearbeitet?

Sowas hab ich zumindest im Kopf, darum die Bemerkung:
ZitatEvtl. muss die über der mit drei Matches definiert werden ?

Probiers halt aus. Wie gesagt kann auch daneben liegen.

kpwg

#13
Die Reihenfolge spielt keine Rolle, es matcht beliebig. Ich muss also jeweils die anderen Zeilen ausschließen.

Im Log erscheint z.B. der Eintrag "MULTIPLE MATCH in bridgeRegexp for rtl433:home/rtl433/RTL_433toMQTT/Acurite-609TXC/128"

TomLee

ZitatDie Praxis sieht nun so aus, das Sensoren mit drei matches auch von der zweiten und dritten Zeile gematcht werden und entsprechend angelegt werden.
In der zweiten Zeile lässt Du mit [/]?.* ja auch einen optionalen dritten "Unterordner" zu, meine Erklärung.
Warum das bei der dritten so sein soll hab ich keine Erklärung dafür.

Vermute das ich es immer noch nicht gänzlich verstanden habe, kannst Du trotzdem mal nachvollziehen ob das mit diesen zwei Zeilen so klappt wie gewünscht ?

home/rtl433/RTL_433toMQTT/([^/]+)/([^/]+)/([^/]+):.* "oMQTTgw_$1_$2_$3"
home/rtl433/RTL_433toMQTT/([^/]+)/([^/]+):.* "oMQTTgw_$1_$2"



kpwg

#15
Hallo Thomas,

danke für den Denkanstoß! Mit ein wenig Spielerei bei Regex101 bin ich ans Ziel gekommen:
rtl433:home/rtl433/RTL_433toMQTT\/([^\/:]+)\/([^\/:]+)\/([A-Za-z0-9._]+)[/]?:.* "$1_$2_$3"
rtl433:home/rtl433/RTL_433toMQTT\/([^\/:]+)\/([^\/:]+)[\/]?:.* "$1_$2"
rtl433:home/rtl433/RTL_433toMQTT\/([^\/:]+)\/?:.* "$1"
Die Lösung matcht nun passend ohne multiple-match, was bekanntlich schief geht. Ich teste noch ein wenig, aber der erste praktische Durchlauf sieht schon sehr gut aus.
Viele Grüße,

Ricardo

TomLee

#16
Was ich nicht verstehe (ich hab aber auch nicht wirklich Ahnung von der Sache, sorge bloss für Knabberspass, Nebeneffekt ist das ich evtl. dabei selbst was mitnehme), warum siehst Du in jeder Zeile am Ende einen optionalen Schrägstrich vor ?
Warum matchst du im dritten "Unterordner" explizit  auf Buchstaben und numerische Werte ?

Wozu die dritte Zeile ? Ist es so gedacht das Daten nur unter dem ersten "Unterordner" (Gerätetyp) reinkommen können ?
Die Zeile ist hinten dann doch aber Käse ?

Generell, kann es auch Daten geben die in einem vierten oder fünften "Unterordner" reinkommen ?

kpwg

Zitat von: TomLee am 31 Juli 2024, 13:02:38Was ich nicht verstehe (ich hab aber auch nicht wirklich Ahnung von der Sache, sorge bloss für Knabberspass, Nebeneffekt ist das ich evtl. dabei selbst was mitnehme), warum siehst Du in jeder Zeile am Ende einen optionalen Schrägstrich vor ?
Warum matchst du im dritten "Unterordner" explizit  auf Buchstaben und numerische Werte ?
copy-paste aus bereits funktionierenden regEx'en :)
Ich habe davon auch keine Ahnung, aber an dieser Stelle viel dazu gelernt. Am Ende ist der Nutzen ja sowieso fragwürdig, aber die Lösung funktioniert.
ZitatWozu die dritte Zeile ? Ist es so gedacht das Daten nur unter dem ersten "Unterordner" (Gerätetyp) reinkommen können ?
Die Zeile ist hinten dann doch aber Käse ?

Generell, kann es auch Daten geben die in einem vierten oder fünften "Unterordner" reinkommen ?
Nein, ich kenne zumindest Keine.

Der RTL_433toMQTT liefert vier Arten von Sensordaten:

1. die von sich selbst, bestehend aus
rtl433:home/rtl433/RFtoMQTT:.* { json2nameValue($EVENT) }
rtl433:home/rtl433/SYStoMQTT:.* { json2nameValue($EVENT) }
rtl433:home/rtl433/SSD1306toMQTT:.* { json2nameValue($EVENT) }
rtl433:home/rtl433/WebUItoMQTT:.* { json2nameValue($EVENT) }
(Um perspektivisch ein Template zu erstellen, müssten die noch für bridgeRegexp erfasst werden)

2. Sensordaten mit drei Parametern, z.B.
home/rtl433/RTL_433toMQTT/Rubicson-Temperature/1/244:.* { json2nameValue($EVENT) }
3. Sensordaten mit zwei Parametern, z.B.
home/rtl433/RTL_433toMQTT/Govee-Water/0:.* { json2nameValue($EVENT) }
4. Sensordaten mit nur einem Parameter, z.B.
home/rtl433/RTL_433toMQTT/Generic-Motion:.* { json2nameValue($EVENT) }
Mir ging es vor allem um die vollautomatische Sortierung in einzelne SubDevices, im MainDevice sollen keine Sensordaten erscheinen, welche sich nicht zuordnen lassen. Es soll auch jedes SubDevice nur einen Sensor beinhalten. Das funktioniert natürlich nicht bei (4), den Sensordaten mit nur einem Parameter, da werden die verschiedenen Sensoren offenbar über die Nutzdaten unterschieden. Ich benötige das nicht, die Sortierung ist damit aber vollständig.

TomLee

#18
rtl433:home/rtl433/RTL_433toMQTT\/([^\/:]+)\/?:.*:.* "$1"passt so aber nicht für nur einen Unterordner
home/rtl433/RTL_433toMQTT/Generic-Motion:.* { json2nameValue($EVENT) }
Versuchs mal genau so wie ich zeige.
Die CID (rtl433:) weglassen und das escapen in dem Attribut kann man machen muss man aber nicht:
home/rtl433/RTL_433toMQTT/([^/]+)/([^/]+)/([^/]+):.* "oMQTTgw_$1_$2_$3"
home/rtl433/RTL_433toMQTT/([^/]+)/([^/]+):.* "oMQTTgw_$1_$2"
home/rtl433/RTL_433toMQTT/([^/]+):.* "oMQTTgw_$1"

kpwg

#19
Du hast recht, ich habs korrigiert.
https://regex101.com/r/yV34Sq/1
So matcht es, Deine Version aber hat ein Problem mit dem Zeilenumbruch, wenn ich das richtig deute.