Hallo liebe Leserinnen und Leser!
Heute möchte ich euch an einem Praxisbeispiel zeigen, wie ihr Funkthermometer mittels SDR am PC auslesen könnt. Ich halte diese Anleitung so allgemein wie möglich, damit ihr eure eigenen Thermometer auch decodieren könnt und ihr nicht die gleichen Sensoren wie ich haben müsst. Trotzdem kann an der einen oder anderen Stelle (insb. der Software-Decodierung) noch einiges an Selbstarbeit notwendig sein. Das liegt daran, dass Funkthermometer fast alle ihre Daten anders codieren und oft auch unterschiedliche Modulationsarten und/oder Frequenzen nutzen. Daher ist diese Anleitung nur als ein erster Anhaltspunkt gedacht.
Hier noch ein kleines Foto vom „Innenleben“ meines Sensors:
Zur benötigten Hardware:
- Funk-Sensoren in gewünschter Anzahl (inkl. Batterien natürlich)
- Einen DVB-T-Stick, der sich für SDR eignet (Übersicht siehe hier)
- Stift und Zettel ;)
- Einen handelsüblichen PC
1. Aufnehmen des Signals eines Funksenders mittels SDR
Um das Signal in einem späteren Zeitpunkt decodieren zu können, müsst ihr es natürlich erst einmal aufnehmen. Das geht mittels SDR ziemlich einfach. Zuerst braucht ihr natürlich die Frequenz eures Funksenders. Meist senden diese auf 433MHz oder 868MHz. Welche Frequenz euer Sender genau besitzt, könnt ihr i.d.R. der Verpackung, dem Datenblatt (falls vorhanden) oder der Bedienungsanleitung entnehmen. Oft wird diese auch auf der Homepage des Online-Shops (falls ihr eure Sender online bezieht) angegeben.
Nun braucht ihr einen PC, auf dem ein SDR läuft. Für meine Beispiele nehme ich Gqrx, da dieses auch auf Linux und Mac OSX läuft. Für Windows könnt ihr ein anderes SDR nehmen, wie z.B. SDR#. Die Bedienung ist für unseren Anwendungsfall sehr ähnlich und somit solltet ihr die nachfolgenden Schritte auch auf einem Windows-PC ohne größere Probleme nachvollziehen können.
Falls also noch nicht geschehen, installiert ein SDR eurer Wahl auf einem OS eurer Wahl J Außerdem sollten natürlich die entsprechenden Treiber für den DVB-T-Stick, um SDR nutzen zu können, installiert werden. Eine geeignete Anleitung für Ubuntu findet ihr z.B. hier. Ihr könnt ganz einfach testen, ob eure Installation erfolgreich war, indem ihr im Terminal rtl_test -t aufruft. Alternativ oder ergänzend könnt ihr auch einfach einen Radiosender eurer Wahl über das Terminal abspielen, z.B. via rtl_fm -f 95.5M -W -s 200000 -r 48000 - | aplay -r 48k S16_LE.
Nun kommen wir zur Aufnahme des Signals, das vom Funksender gesendet wird. Stellt zuerst die Frequenz ein, auf der euer Sender arbeitet, also meist 433MHz oder 868MHz.
Bei der Modulationsart wird bei den meisten Sensoren, die ich kenne AM verwendet, also solltet ihr in einem ersten Versuch die Modulationsart auf AM stellen. Sollte kein decodierbares Signal dabei rauskommen (dazu später mehr), solltet ihr auf FM switchen und schauen, ob das Signal dann besser aussieht.
Wenn ihr Gqrx nutzt, könnt ihr nun auf den „An/Aus-Button“ oben links klicken.
Damit startet ihr das SDR und ihr seht, wenn Pakete gesendet werden.
Legt nun die Batterien in euren Funksensor und schaut, ob ihr auf der eingestellten oder einer benachbarten Frequenz Datenpakete finden könnt, die dann übertragen werden. Die Pakete erkennt ihr an der rot-orangen (je nach Stärke des Signals) Verfärbung in der Wasserfall-Ansicht (die untere, die wie ein Wasserfall mit der Zeit nach unten hin abfällt). Habt ihr die Frequenz noch nicht genau getroffen, stellt nun die genau Frequenz ein, indem ihr den roten Strich auf die Frequenz zieht, auf der das Signal gesendet wurde. Dieser Strich ist das Äquivalent zu dem Balken, den es auf (meist älteren) Radios gibt, mit dem ihr auch beim Radio die genaue Frequenz einstellen könnt. Ist das geschehen, testet eure Einstellungen nochmals, indem ihr die Batterien aus dem Sender nehmt und wieder einsetzt. Habt ihr die genaue Frequenz getroffen (und auch Lautsprecher am PC angeschlossen) sollte nun eine Tonabfolge erklingen. Das ist dann genau das Datenpaket, das uns interessiert.
Wenn alles soweit passt, könnt ihr nun dieses Signal aufnehmen, damit wir es später decodieren können. Gqrx bietet dazu einen kleinen Audio-Recorder, den ihr in der rechten unteren Ecke findet. Klickt dazu erst einmal auf das Werkzeugsymbol, um einen Ausgabeordner auszuwählen.
Anschließend solltet ihr nochmals die Batterien aus dem Funksender nehmen. Dann klickt ihr einfach auf das Recorder-Symbol (der rote Kreis) und legt die Batterien wieder ein. Wartet bis das Datenpaket aufgenommen wurde und klickt dann nochmals auf das Recorder-Symbol, um die Aufnahme wieder zu beenden.
Um zu überprüfen, ob das Aufgenommene Signal unseren Anforderungen entspricht, solltet ihr euch nun ein Audio-Bearbeitungswerkzeug installieren. Ich werde in den nachfolgenden Beispielen audacity nutzen, da es auf allen wichtigen Plattformen verfügbar ist und kostenlos genutzt werden kann. Öffnet nun die aufgenommene .wav-Datei mit audacity. Das sollte dann erst einmal ungefähr so aussehen:
Um das Rauschen am Anfang und Ende der Aufnahme zu entfernen, bedienen wir uns der Standardwerkzeuge von audacity:
Markiert nun das Rauschen am Anfang des Signals und entfernt es (mittels Entf-Taste)
Nun solltet ihr nur noch das eigentliche Datenpaket haben. Zoomt auf das Paket. Es sollte so ähnlich wie meinem Aussehen:
Was hier wichtig ist, ist, dass hier ein saubereres Signal mit nur binärem Inhalt vorliegt. Sind also auch Werte vorhanden, die zwischen oben und unten liegen, habt ihr wahrscheinlich die falsche Modulationsart für euren Funksensor verwendet. Wiederholt die Schritte bis hierhin dann nochmals mit FM-Modulation.
2. Decodieren des Signals
Liegt euer Signal nun in einer decodierbaren Form vor, könnt ihr euch an die eigentliche Arbeit machen. Hierzu ist ein Stift und Zettel sowie das ausgedruckte Signal von audacity hilfreich.
Ich hatte anfangs mit meinem Signal größere Probleme, bis ich festgestellt habe, dass ich es erst horizontal spiegeln muss, um es Decodieren zu können. Das liegt an der Endianess meines DVB-T-Sticks. Solltet ihr auch die „Zacken“ (also die Bits) nach unten haben, solltet ihr es mir gleichtun.
Dann ist erst einmal Handarbeit notwendig – und Geduld. Die Art der Codierung kann je nach Sensor anders sein. Bei meinem Sensor bedeutet ein hoher Zacken eine 1, einer, der unten ist, eine 0. Das Gezacke am Anfang ist also 10101010 10101010 10101010 (24 bit). Ich habe also ein Präambel mit 24 bit. Darauf würden in meinem Beispiel 00 folgen usw..
Eine andere Möglichkeit der Codierung wäre z.B. dass man einen kurzen Ausschlag als 0 deutet, einen langen als 1. Das wurde bereits von Norbert in seinem Blog gezeigt.
Habt ihr die 0en und 1en auf einem Blatt stehen, könnt ihr euch daran machen, Temperatur und evtl. Luftfeuchtigkeit daraus zu lesen. Bei meinem Sensor war das relativ einfach, da das letzte Byte in Dezimalschreibweise die Feuchtigkeit darstellt und das vorletzte Byte die Temperatur * 10. Leider macht das aber jeder Hersteller anders, sodass ihr an dieser Stelle etwas rumprobieren müsst. In dem oben bereits verlinkten Blogartikel wird beschrieben, wie es bei manchen anderen Herstellern gehandhabt wird. Ich habe auch gelesen, dass man bei manchen Herstellern pauschal 40 von dem Temperaturwert subtrahieren muss, um auf das richtige Ergebnis zu kommen. Dadurch versuchen wohl einige Hersteller Minusgrade zu kompensieren.
Das Ergebnis meiner Analyse seht ihr oben veranschaulicht. Das letzte Byte steht für die Luftfeuchtigkeit und das vorletzte Byte für die Temperatur. Der Kanal (blau) wird hier immer mit Kanalnummer -1 übertragen. Also hier 0, da Kanal 1 verwendet wurde. Bei Kanal 2 würden hier binär 001 übertragen werden, also dezimal 1 usw. Die Werte im Beispiel waren also konkret 23,1°C, 40% Luftfeuchtigkeit, Kanal 1.
3. Implementierung der Decodierung in ein Script
Nun ist es natürlich sinnvoll, eure Erkenntnisse in ein Script zu packen, damit der PC die Rechenarbeit übernehmen kann. Für meinen Einsatzzweck habe ich pydemod gefunden. Dieses basiert auf Python und setzt die Pakete numpy und scipy voraus.
Das Beispielscript für meinen Topcom-Sensor (nur zur Auswertung über SDR [also –raw]) findet ihr hier. Das Script setzt pydemod voraus und ist unter /pydemod/src abzulegen. Hier eine beispielhafte Testausgabe des Scripts:
Ich habe bereits funktionen zum Speichern der Daten in einer .csv-Datei oder in einer sqlite-Datenbank integriert. Hier müsst ihr nur noch die Pfade ändern und die entsprechenden Dateien anlegen.
Ich habe euch auch noch eine kleine Beispiel-wav erstellt, mit der ihr die Auswertung nachvollziehen könne, diese könnt ihr hier (test_wav) finden.
Solltet ihr andere Thermometer mit dieser Methode auslesen können, könnt ihr mir gerne die entsprechenden Scripte schicken, die ich auch gerne hier veröffentlichen kann.
Hier noch ein paar Ideen, was man damit noch anstellen könnte:
- Transformation des Scripts, um es auf den Raspberry Pi laufbar zu machen (leider ist pydemod hier noch nicht performant genug)
- Speichern der Werte in einer Round-Robin-Datenbank
- Basteln eines kleinen Webinterfaces, um die Daten zu visualisieren
Und nun viel Spaß und Erfolg beim Decodieren eurer Funk-Sender!
Wow, wenn das jetzt noch auf dem Raspberry Pi laufen würde…
der sich für SDR eignet (Übersicht siehe hier)
da fehlt ein link :-)
Vielen Dank für den Hinweis @morob65! Habs ergänzt.
Hi habe mir rtl_433 diese daten bei kommen
https://github.com/merbanan/rtl_433
Sensor temperature event:
protocol = Prologue
button = 0
battery = Ok
temp = 22.6
humidity = 54
channel = 2
id = 5
rid = 246
hrid = f6
5f 69 0e 23 60
Sensor temperature event:
protocol = Prologue
button = 0
battery = Ok
temp = 21.0
humidity = 54
channel = 1
id = 5
rid = 203
hrid = cb
5c b8 0d 23 60
Sensor temperature event:
protocol = Rubicson/Auriol
rid = 61
temp = 27.6
61 81 14 f0 00
Sensor temperature event:
protocol = Rubicson/Auriol
rid = c8
temp = 28.3
c8 81 1b f0 00
kann mir jemand helfen das ich die Daten so hätte wie Alex auf seiner seite gruss
mike
Hi Mike,
ich fürchte, ich verstehe deine Frage nicht ganz ;)
Meinst du die Augabe im Terminal? Dazu müsstest du den Quellcode von rtl_433 umschreiben, genauer gesagt die fprintf`s ab Zeile 214 in rtl_433.c.
Ich hätte gerne wie du versucht es auszugeben auf ner webseite aber habe vier sensoren weiss leider nicht wie
OK, ich verstehe.
Wenn du das von mir vorgestellte Webinterface nutzen willst, müssen die Daten in einem bestimmten Format gespeichert werden. Da es einface .csv-Dateien sind, sollte das auch unter C kein Problem darstellen.
In der ersten Spalte habe ich immer die aktuelle Uhrzeit in einem JavaScript-Timestamp gespeichert, das ist eine Zahl, die die ms seit 1.1.1970 0 Uhr angeben. In der zweiten Spalte habe ich die Nummer des Sensors – sprich seine ID gespeichert. Da ich auch 4 Sensoren habe, sind es bei mir ebenfalls 4 mögliche Nummern. In der dritten Spalte kommt dann die gemessene Temperatur * 10, da meine Sensoren immer Ganzzahlenwerte liefern, die entsprechende Umrechnung in rtl_433 sollte simpel sein. In der 4te und letzten Spalte kommt die Luftfeuchtigkeit in %.
Eine Zeile sieht dann z.B. so aus:
1408045859159.092,1,233,52
Um mein Webinterface verwenden zu können, werden die Werte dann einfach in der Struktur /Sensor-ID/log-dd-m-yyyy.csv gespeichert.
Damit solltest du den Code von rtl_433 entsprechend anpassen können.
Sorry habe nicht so den Plan von Programmieren..
Bräuchte hilfe
ist möglich das mit deinen Script die
protocol = Prologue
protocol = Rubicson/Auriol
auslesen …
gruss
mike
Leider weiß ich nicht, wie die Protokolle genau aussehen, aber das dürfte auf jeden Fall mehr Arbeit und komplizierter sein, als bei einem fertigen Decodierungs-Programm die Ausgabe der Werte in eine Datei zu realisieren ;)
Hi!
Welche Funksensoren hast denn genommen? Vielleicht gibt diese noch in HongKong. Welche andere Sonsoren könnte man noch nehmen? Reicht es wenn da „FUNK“ dabei steht?
Danke für die Antwort!
Gruß, Keule
Hey Keule!
Meine Thermometer waren National Geographic 283ne, in meinem anderen Artikel zu diesem Thema findet sich auch noch ein Foto zu dem Sensor. Zumindest Sensoren mit dem gleichen Gehäuse habe ich auch von anderen Herstellern gefunden, ob die aber das gleiche Protokoll nutzen, weiß ich nicht.
Ansonsten kann man eigentlich jeden Funksensor nehmen, allerdings muss man diesen dann ggf. selbst decodieren, da jeder Hersteller ein anderes Protokoll verwendet.
Hallo,
können mir die Treiberinformationen, die zu den DVB-T Sticks angegeben werden, egal sein? (Arbeite unter OS X, möchte es am Raspberry Pi 3 betreiben).
———-
ach und noch etwas…
Ich möchte ungefähr genau das bauen, was du hier gemacht hast. Noch habe ich allerdings keinen Funksender (bzw. kein Thermometer). Worauf sollte ich bei der Anschaffung eines Thermometers besonders achten?
———-
Wäre zum Beispiel solch ein Transmitter Ausreichend?
http://www.amazon.de/Transmitter-Froggit-FT0073-Wireless-Thermo-Hytrometer/dp/B00GHJHBIM/ref=pd_bxgy_86_img_2?ie=UTF8&refRID=1SB2TYJ7EZNZATZZKDGT
Hallo Martin,
die 433 MHz Frequenz ist i.d.R. stark belegt – ich würde für die SDR-Lösung daher eher zu einem Thermometer mit 868 MHz greifen.
Danke für die Info! :)
Aber so ein einfacher Trasmitter wäre ausreichend?
Hi Martin,
ja, meine sind auch einfache Funkthermometer, die ich im Abverkauf günstig bekommen habe.
Man muss sich bei unbekannteren Sensoren nur evtl. die Arbeit mit der manuellen Dekodierung machen.
Hallo,
Kann ich denn mit rtl_433gleichzeitig zwei sensoren Auslesen? Einer ist auf channel 1 und einer auf Channel 2 eingestellt.
Ich bekomme immer nur Daten vom Sensor 1 empfangen!
Hallo,
wo finde ich das „Terminal“? Bisher konnte ich den Test nicht ausführen.
Eine geeignete Anleitung für Ubuntu findet ihr z.B. hier. Ihr könnt ganz einfach testen, ob eure Installation erfolgreich war, indem ihr im Terminal rtl_test -t aufruft.
Der hier angegebene Link funktioniert nicht.Bitte korrigieren.Danke.