Herstellerunabhängiger Empfang/Aufzeichnung von Funksensoren an USB  (Gelesen 60 mal)

Offline Alloc

    • Männlich
  • Registriert:
    05.08.2012, 20:13:33
  • Beiträge: 48
  • Ort:
    Darmstadt
Hi,

ich hatte die Tage mal wieder nach einer einfachen fertigen Lösung gesucht, mit der man Funksensoren an den PC bekommt um die Daten aufzuzeichnen. Natürlich nur wieder komplette Wetterstationen gefunden, tendentiell auch in einer höheren Preisklasse, bei denen die Basisstation dann USB/WLAN unterstützt. Das Hauptproblem: Es braucht meist proprietäre Treiber/Software oder geht sogar nur direkt "in die Cloud".

Ich bin dann aber auf eine (zumindest für mich) wesentlich praktischere Lösung gestoßen (Google hatte mich auf diese Seite geführt): Es gibt ein Projekt RTL-SDR welches USB-DAB/DVB Empfänger mit dem verbreiteten Realtek RTL2832U als allgemeines SDR nutzbar macht. Darauf ausetzend gibt es das Projekt rtl_433, das darauf ausgelegt ist, verschiedene Funkprotokolle im 433 / 868 MHz Band zu dekodieren. Enthalten sind bereits viele Dekoder für verschiedene Funksensoren von Wetterstationen.


Langer Rede kurzer Sinn (aka TLDR):
Ich habe mir nun mal folgende Komponenten geholt:

Die andere Antenne hilft deutlich für besseren Empfang der Signale im 433 MHz Band, ist aber je nach Empfangssituation nicht unbedingt nötig. Natürlich sind alle Komponenten austauschbar, es dürfte wohl nahezu jeder DVB/DAB Stick mit RTL2832U Chipsatz zu funktionieren. Ebenso fiel meine Wahl auch nur auf diesen Sensor, weil er eine relativ gut ablesbare direkte Anzeige hat und in der Liste der unterstützten Protokoll von rtl_433 auch Einträge von Bresser erscheinen. Ich vermute es wird nahezu jeder Sensor mit 433 / 868 MHz funktionieren.
Gelistet hab ich hier meine genaue Auswahl nur, damit man mal was Konkretes zur Hand hat, was schon erfolgreich getestet wurde :)


Unter Linux rtl_433 mittels rtl_433 -R 112 -F json:weather.log aufgerufen schreibt das Programm jedes empfangene Paket das den Dekoder 112 passiert ("[112]  Ambient Weather TX-8300 Temperature/Humidity Sensor") in eine JSON Datei, Beispielauszug sieht so aus:
{"time" : "2019-08-02 16:37:25", "model" : "AmbientWeather-TX8300", "id" : 81, "channel" : 3, "battery" : 2, "temperature_C" : 26.600, "humidity" : 48, "mic" : "CHECKSUM"}
{"time" : "2019-08-02 16:37:38", "model" : "AmbientWeather-TX8300", "id" : 81, "channel" : 1, "battery" : 2, "temperature_C" : 24.600, "humidity" : 49, "mic" : "CHECKSUM"}
{"time" : "2019-08-02 16:38:25", "model" : "AmbientWeather-TX8300", "id" : 81, "channel" : 3, "battery" : 2, "temperature_C" : 26.600, "humidity" : 48, "mic" : "CHECKSUM"}
{"time" : "2019-08-02 16:38:38", "model" : "AmbientWeather-TX8300", "id" : 81, "channel" : 1, "battery" : 2, "temperature_C" : 24.600, "humidity" : 50, "mic" : "CHECKSUM"}
{"time" : "2019-08-02 16:39:25", "model" : "AmbientWeather-TX8300", "id" : 81, "channel" : 3, "battery" : 2, "temperature_C" : 26.600, "humidity" : 48, "mic" : "CHECKSUM"}
{"time" : "2019-08-02 16:39:38", "model" : "AmbientWeather-TX8300", "id" : 81, "channel" : 1, "battery" : 2, "temperature_C" : 24.600, "humidity" : 50, "mic" : "CHECKSUM"}
{"time" : "2019-08-02 16:40:11", "model" : "AmbientWeather-TX8300", "id" : 48, "channel" : 2, "battery" : 2, "temperature_C" : 24.200, "mic" : "CHECKSUM"}
{"time" : "2019-08-02 16:40:25", "model" : "AmbientWeather-TX8300", "id" : 81, "channel" : 3, "battery" : 2, "temperature_C" : 26.600, "humidity" : 48, "mic" : "CHECKSUM"}

Channel 1 und 3 sind meine beiden Bresser-Sensoren (leider kann man die sonst nicht unterscheiden), Channel 2 ist irgendein Sensor in der Nachbarschaft. Ohne auf das Protokoll 112 zu filtern wird die Liste deutlich umfangreicher, da man dann diverse andere Dinge mitschneidet, bis hin zu den Drucksensoren in Autoreifen ;)


Ich nutze zur Zeit erstmal nur ein schnell zusammengeschustertes Skript, um die Daten in GnuPlot anzuzeigen:
#!/bin/bash
updatedata() {
        while true; do
                cat weather.log | jq -r '. | select(.channel == 1) | "\"\(.time)\"\t\(.temperature_C)\t\(.humidity)\t\(.channel)"' > graph1.dat
                cat weather.log | jq -r '. | select(.channel == 3) | "\"\(.time)\"\t\(.temperature_C)\t\(.humidity)\t\(.channel)"' > graph3.dat
                sleep 31
                echo "done"
        done
}

updatedata &
sleep 0.5
gnuplot liveplot.gnu

Und passend dazu die liveplot.gnu:
reset
stats "graph1.dat" using (lastTemp1=$2) nooutput
stats "graph3.dat" using (lastTemp3=$2) nooutput


#set xrange [0:20]
set xdata time
set timefmt '"%Y-%m-%d %H:%M:%S"'
set format x "%H:%M\n%d.%m.%Y"

set style data lines

set ylabel "Temperature (°C)"
set yrange [-10:50]
set mytics 10

set ytics nomirror

set y2range [20:80]
set y2label "Humidity (%)"
set y2tics 0, 10
set my2tics 10

set style line 101 linetype 1 linewidth 1 linecolor rgb "#aaaaaa"
set style line 102 linetype 0 linewidth 1 linecolor rgb "#bbbbbb"

set grid xtics mxtics linestyle 101, linestyle 102
set grid ytics mytics linestyle 101, linestyle 102

plot \
        "graph1.dat" using 1:2 title sprintf("Temp 1, %0.1f °C", lastTemp1) axis x1y1,\
        "graph1.dat" using 1:3 title "Humid 1" axis x1y2,\
        "graph3.dat" using 1:2 title sprintf("Temp 3, %0.1f °C", lastTemp3) axis x1y1,\
        "graph3.dat" using 1:3 title "Humid 3" axis x1y2

pause 60
reread

Damit bekomme ich dann ein GnuPlot-Fenster mit den stets aktuellen Daten: siehe Anhang.

Später (Zeit und so ;) ) kommt dann mal das Einfügen der Daten in eine SQL-Datenbank oder RRD und eine kleine Webseite, für jetzt muss es das erstmal so tun.


Vielleicht ist der Ansatz ja noch für den ein oder andren Interessant.


Grüße,
Chris


PS: War mir nicht sicher ob das eher Bastlerforum oder hier richtig ist. Gebastelt hab ich ja eigentlich nicht, nur zwei Geräte gekauft und angeschlossen :D Verschieben wäre aber natürlich auch ok.

Wetterstationen.info Forum