So ein Software defined radio ist eine feine, aber im Alltag leider oft unbeachtetes Werkzeug. Ich beschäftigte mich damit etwas genauer und logge damit die Daten meiner Wetterstation direkt von der 868MHz Funkstrecke.
Ich hatte ja schon mal beschrieben, dass ich eine recht einfache Wetterstation mit einem RPI auslese. Das funktioniert recht zuverlässig, hat aber auch den unschönen Nachteil, dass die Basisstation in der Wohnstube ein seitliches USB-Kabel für den RPI herausführt. Ist ok, aber wirklich nicht schön, da man mehrmals täglich ja draufschaut. Plus, dass gelegentlich der Empfang auch nicht optimal ist, wenn zum Beispiel die Rolläden unten sind.
Software Defined Radio
Ich muss leider zugeben, das Funk- und Radiotechnik für mich immer etwas mysteriöses war, weit außerhalb meines Software-Wohlfühlbereichs. Zu viele Erinnerungen an Spulen wickeln und verstimmte Schwingkreise 😉
Vermutlich aus dem Grund habe ich das Thema auch ignoriert, obwohl es mir in den letzten Jahren öfters begegnete. Schade, denn man kommt bei SDR auch sehr weit, ohne sich mit den klassischen Funk-Problemen beschäftigen muss, wie es bei CB-Funk, Selbstbau-WLAN-Routern, oder SAT-Anlagen früher manchmal der Fall war.
Software Defined Radio ist nämlich ein sehr schöner Paradigmenwechsel, welcher die normale Bindung eines Empängers an eine bestimmte Frequenz und Modulation dadurch aufbricht, dass all dies per digitaler Signalverarbeitung stattfindet. Es verbleiben nur die notwendigsten analogen Komponenten und danach wird nur noch extrem schnell abgetastet und digital in Echtzeit verarbeitet. Dadurch ist man extrem flexibel und kann mit vielen Freiheitsgraden im Äther lauschen.
Das Ganze ist ca. 2013 aufgeplopt, als passende Module in DVB-T Receivern sich entsprechend steuern und mittels rtl-sdr seither zweckentfremden lassen. In den folgenden Jahren ist eine breite Auswahl an Software entstanden, die sowohl Windows-Nutzer mit einfacheren Oberflächen, als auch Linux-Nutzer abholen und verschiedenste Möglichkeiten bieten. Neben der Aufnahme des Signals, natürlich die Demodulation, als auch die Interpretation von Signal-Pegeln und Rekonstruktion von Informationen einzelner spezifischer Funk-Protokollen. All die (teilweise überfordernden) Möglichkeiten, zeigt etwa die GNUradio Suite sehr eindrucksvoll.
Hardware Dongle
Die Voraussetzung für so ein Projekt sind relativ einfach. Man benötigt einen passenden USB-Stick für DVB-T Empfang, den man für ~20Eur bei eBay und auch Elektronik-Versendern problemlos bekommt. Die Hardware ist dabei weitestgehend identisch, oft unterscheidet sich nur der Tuner, so dass einige Frequenzen nicht empfangen werden können. So hat der FC012 in meinem blauen No-Name Stick einige Lücken über 900MHz, was aber für unsere Aufgabe die Wetterstation zu empfangen, egal ist.
Einrichtung
Wenn man den Stick ansteckt, sollte er erkannt werden, egal ob RPI oder Laptop. Eventuell muss man vorher noch das rtl-sdr Packet installieren, welches die passenden Treiber, aber auch Werkzeuge enthält. Eines davon hilft, um die prinzipielle Funktion zu testen
rtl_test
Found 1 device(s):
0: Realtek, RTL2838UHIDIR, SN: 00000001
Using device 0: Generic RTL2832U OEM
Found Fitipower FC0012 tuner
Supported gain values (5): -9.9 -4.0 7.1 17.9 19.2
Sampling at 2048000 S/s.
Info: This tool will continuously read from the device, and report if
samples get lost. If you observe no further output, everything is fine.
Reading samples in async mode...
Allocating 15 zero-copy buffers
lost at least 24 bytes
Sollte das nicht hinhauen, muss man sich auf die Spurensuche begeben. Wird der Stick überhaupt erkannt?
dmesg
[11767.435543] usb 2-1.2: new high-speed USB device number 4 using ehci-pci
[11767.563593] usb 2-1.2: New USB device found, idVendor=0bda, idProduct=2838, bcdDevice= 1.00
[11767.563597] usb 2-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[11767.563599] usb 2-1.2: Product: RTL2838UHIDIR
[11767.563601] usb 2-1.2: Manufacturer: Realtek
[11767.563603] usb 2-1.2: SerialNumber: 00000001
Dabei helfem einem natürlich aus lsusb und lsmod weiter, um zu sehen, ob sich evtl. doch ein orginal DVB-T Treiber für den Empfang von TV vorgedrängelt hat. Der sollte natürlich geblacklistet werden.
Anybody out there?
Nun wollen wir natürlich schauen, ob wir auch Signale empfangen können. Die beiliegenen Antennen sind natürlich nicht für alle Frequenzen super, aber für das meiste erst einmal ok und eben das was man hat. Was damit aber in jedem Fall funktionieren sollte ist (analoger) Radioempfang!
Eine sehr schöne Anwendung dafür ist GQRX, welches einem auch einen schönen Blick in das Spektrum ermöglicht, so dass man nicht ausversehend immer das Rauschen neben dem Sender empfängt.
Nach der Installation und dem Start muss man hier nur den passenden Dongle in den Optionen auswählen und bei Input den Hardware AGC aktivieren, sowie bei Receiver Options den WFM(stereo wählen). Dann in der Digitalanzeige die passende Frequenz eines starken lokalen Senders wählen und den Start-Button links oben drücken.
Wettersensoren mit rtl_433
Keine Angst, es wird jetzt nicht wirklich fummelig 🙂 Eines der Kommandozeilen Werkzeuge, welches zu rtl-sdr gehören, ist rtl_433. Es ermöglicht Sender im sehr beliebten offenen ISM / SRD Band zu entdecken und deren Informationen anzuzapfen. Das sind Sensoren aller Art, oft aus den Anfangstagen der Heimautomatisierung, noch bevor IoT cool und dank WLAN möglich war. Dort funkt nicht nur der Öltank, oder die Türklingel, sondern eben auch die meisten Außen-Sensoren von Wetterstationen und Thermometern. Das Ganze erfährt regelmäßige updates und beherrscht in der neuesten Version 190 Protokolle von verschiedensten Herstellern und nutzt dazu nicht nur 433MHz, sondern auch 868MHz und einige mehr.
Also los, wir schauen mal, was es hier alles so gibt:
rtl_433 -f 868M
rtl_433 version unknown inputs file rtl_tcp RTL-SDR SoapySDR
Use -h for usage help and see https://triq.org/ for documentation.
Trying conf file at "rtl_433.conf"...
Trying conf file at "/home/matthias/.config/rtl_433/rtl_433.conf"...
Trying conf file at "/usr/local/etc/rtl_433/rtl_433.conf"...
Trying conf file at "/etc/rtl_433/rtl_433.conf"...
New defaults active, use "-Y classic -s 250k" for the old defaults!
Registered 122 out of 149 device decoding protocols [ 1-4 8 11-12 15-17 19-21 23 25-26 29-36 38-60 63 67-71 73-100 102-105 108-116 119 121 124-128 130-149 ]
Found Fitipower FC0012 tuner
Exact sample rate is: 1000000.026491 Hz
Sample rate set to 1000000 S/s.
Tuner gain set to Auto.
Tuned to 868.000MHz.
Allocating 15 zero-copy buffers
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
time : 2021-08-08 13:14:03 brand : LaCrosse
model : LaCrosse-TX29IT id : 58
Battery : 1 NewBattery: 0 Temperature: 71.0 C Humidity : 125 % Integrity : CRC
So sieht bei mir ein Scan in unserem Mehrfamilienhaus mit der Standard-Antenne indoor aus. Die Werte aktualisieren sich alle 30 bzw. 60 Sekunden. Auf unserem Hof taucht dann auch die Wetterstation mit den meisten Sensoren auf, also alles was wir benötigen!
Einbindung mit weewx-sdr
Das Schöne ist nun, dass der Zugriff auf die Wetterdaten und Analysen weiterhin per Weewx erfolgen kann, so wie ich es bereits für den direkten Anschluss damals eingerichtet hatte.
Die Brücke in die Wetter-Suite nennt sich hier ebenfalls „Treiber“-Modul, was aber lediglich ein Python-Skript ist. Mit weewx-sdr wird nämlich wie oben rtl_433 aufgerufen und die Werte entsprechend für weewx gemappt und transformiert. Ein sehr schöner Wrapper also!
Die Einrichtung erfolgt mittels Download des .zip Paketes und Installation über das weewx eigene Paket-Management. Danach kann man testweise das sdr.py Hilfsskript aufrufen, um das Auslesen und Übergeben von Informationen einmal zu testen. Klappt das, geht es an die eigene Konfiguration.
Dazu wird der Treiber user.sdr mittels wee_config eingetragen und anschließend der Abschnitt [SDR] in der weewx.config angepasst. Für meine Wetterstation passte der folgende angepasste Block aus der readme.md
[SDR]
driver = user.sdr
[[sensor_map]]
windGust = wind_gust.0097.FOWH1080Packet
outBatteryStatus = battery.0097.FOWH1080Packet
rain_total = rain_total.0097.FOWH1080Packet
windSpeed = wind_speed.0097.FOWH1080Packet
windDir = wind_dir.0097.FOWH1080Packet
outHumidity = humidity.0097.FOWH1080Packet
outTemp = temperature.0097.FOWH1080Packet
Vorher hatte ich bereits die orginal-Verbindung auskommentiert und ein Datenbank-Backup gemacht. Da sich das Ganze aber über Tage bewährt hat, ist es genau so geblieben und plottet nun fröhlich Wetterdaten und übermittelt diese an verschiedene Wetter-Netzwerke für citizen science und so 😉
Noch mehr Spaß am Gerät
Man muss natürlich sagen, dass die USB-Sticks / dongles auch einige Probleme haben. Insbesondere sind sie nicht justiert und driften z.B. je nach Temperatur etc. Mit kalibrate-sdr kann man das zumindest in einem gewissen Rahmen korrigieren, indem man die Frequenzen von Handymasten als Abgleich nutzt. Hier ist das sehr schön beschrieben, wie das en detail funktioniert. Das so ermittelt p lag bei mir je nach Szenario und Laufdauer zwischen 20,076 … 27,099 … 21,4. Mein Stick hat aber wie gesagt auch ein kleines „Funkloch“ und ist für dies Verfahren nur so semi gut geeignet.
Tja, was kann man noch so alles damit anstellen? Hier oben an der Küste ist natürlich AIS, also 162MHz Transponder-Funk der Schiffe ein sehr spannendes Thema. Dasselbe gibt es natürlich auch für die Luft, da heißt es ADS-B auf 1090MHz und lässt sich mit diverser Software auswerten und verwerten. Wahrscheinlich alles andere von Wettersattelit über GPS/GNSS bis zur kabellosen Tastatur, findet man als Gnuradio Blocks (siehe github) oder eben über eine Suchmaschine. Oder ihr stellt das Ganze auch mal anderen zu Verfügung und streamt den Äther per WebSDR ins Netz. Am besten schaut ihr mal bei media.ccc.de nach SDR und lasst euch selbst inspirieren 🙂
Und wer kabellos und Outdoor langsam cool findet, kann ja mal bei der Freifunk Community (WLAN) oder TheThingsNetwork (LoraWAN für stromsparende IoT-Sensorknoten) schauen, ob das nicht auch ein schönes Betätigungsfeld wäre?
hallo gibt es eine möglichkeit, die daten direkt auf ein oled display zu senden?
lg
Also spontan kann ich nur sagen, dass Weewx sowohl den Transfer der Grafiken (https://weewx.com/docs/usersguide.htm#integrating_with_webserver), als auch den Export von Werten per API / MQTT https://github.com/matthewwall/weewx-mqtt unterstützt damit könnte man das dann sowohl in Smarthome / homeassist darstellen, sowie auch auf ePaper Displays https://github.com/G6EJD/ESP32-e-Paper-Weather-Display
Aber klar könntest du auch direkt auf dem RPI ein OLED anschließen und dich in Weewx hooken um Daten neu zu rendern?
Danke für deine antwort Matthias!
mein Problem ist nur das ich gern die Realtime daten auf den oled sehen möchte sprich die daten die im terminal angezeigt werden und ich bin irgendwie zu blöd das zu realisieren 😀 ich hoffe du verstehst was ich meine. (wenn ich jtz meinen raspi zerio mit oled „portable“ mache damit ich in der Umgebung die Wetter Daten wo ich halt gerade bin, „abfangen“ kann.)
lg
Naja so ein Oled machst du ja mit I2C oder einem anderen Bus an den RPI und steuerst das dann mit einer Bibliothek o.Ä. an. Die Wetterdaten kannst du per MQTT in deinem Netzwerk / WLAN etc. verbreiten und dann diese zum darstellen nutzen. Du kannst mit rtl_433 aber auch die Daten direkt als .CSV Datei ablegen lassen und mit einem kleinen Programm diese z.B. alle 30sec. auslesen.
Oder du nimmst gleich ein fertiges Modul wie ESP32 mit Display, was tatsächlich auch für SDR genügend Rechenleistung hast und hast gleich alles in einem kleinen kompakten Gerät 😉 https://github.com/NorthernMan54/rtl_433_ESP