Du bist hier:Start»Wissen»Smarthome»433 MHz

Smarthome-Geräte mit 433 MHz

02.04.2017

Fernbedienung mit 433 MHz

Seit April 2017 gibt es DVB-T2 HD in Deutschland. Aber werft eure USB-Sticks für DVB-T nicht weg ! Einige dieser DVB-T-Sticks lassen sich für Software Defined Radio (SDR) benutzen. Das bedeutet, dass die USB-Sticks Funkdaten zum Beispiel auf der Frequenz 433 MHz empfangen können. Genauer 433,92 MHz. Das ist die Frequenz, die einige günstige Funk-Schalter wie Lichtschalter, Fernbedienungen oder Bewegungsmelder für die Heimautomatisierung benutzen.

Hardware

Im Internet gibt es viele Anleitungen zum Empfangen von 433 MHz Geräten am Raspberry Pi mittels spezieller Platine. Leider haben diese Empänger keine große Reichweite. Mit bestimmten DVB-T-Sticks lassen sich die Daten ebenfalls empfangen und das über eine größere Reichweite. Den USB-Stick "LogiLink VG0002A" habe ich gebraucht für 10 Euro gekauft. Da LogiLink den Stick "VG0002A" nicht mehr vertreibt, kann ich den baugleichen CSL - DVB-T USB Stick für 20 Euro empfehlen. Er hat ebenfalls die USB-ID 1d19:1101. Mit den Sticks der Firma NooElec habe ich für 433 MHz leider schlechte Erfahrungen gemacht. Es funktionieren jedoch auch andere Sticks. Wichtig ist, dass der USB-Stick den Chip "Realtek RTL2832U" enthält (RTL SDR). Dieser Chip kann Frequenzen bis mindestens 900 MHz empfangen. Bei einer Suche nach den Schlagwörtern "USB SDR" sollten sich kostengünstige Sticks um die 10 bis 20 Euro finden lassen. Diese Sticks können zum Beispiel an den Raspberry Pi angeschlossen werden. Somit kann der Raspberry Pi über die Fernbedienung gesteuert werden oder als Gateway andere Smarthome-Geräte steuern.

Raspberry Pi mit DVB-T-Stick und 433 MHz Fernbedienung

Raspberry Pi mit DVB-T-Stick und 433 MHz Fernbedienung (zum Vergrößern klicken)

Die Auswahl an Smarthome-Geräten, die auf der Frequenz 433,92 MHz funken, ist relativ groß. Ich habe hier eine kleine Auswahl fotografiert:

verschiedene Geräte, die auf 433 MHz funken

verschiedene Geräte, die auf 433 MHz funken (zum Vergrößern klicken)

Im Vergleich zu Geräten mit den Funkprotokollen Z-Wave oder Zigbee sind die 433-MHz-Geräte aufgrund ihres einfachen Protokolls meistens günstiger. Leider gibt es bei der einfachen Funkübertragung keinerlei Sicherheitsmechanismen, so dass theoretisch der Nachbar bzw. die Nachbarin ebenfalls in die eigene Wohnung funken kann. Wie hoch dieses Risiko ist, muss jeder / jede für sich selbst entscheiden.

Software

Die Daten auf der Frequenz 433,92 MHz werden mittels Amplitude-Shift Keying (ASK) beziehungsweise On-Off-Keying (OOK) kodiert. Das bedeutet, dass auf der Frequenz normalerweise Ruhe ist - nur beim Senden wird die Amplitude (Signalstärke) angehoben. Die einzelnen Bits werden durch die Länge der Amplitude kodiert. Beispiele dazu folgen weiter unten. Die Daten auf 433,92 MHz lassen sich durch Software dekodieren. Bei der Software habe ich auf dem OOK-Dekoder von Jim Studt aufgesetzt - aber die Software fast komplett umgeschrieben.

# become root
sudo bash

# remove driver / kernel module for television
rmmod dvb_usb_rtl28xxu

# download the software
wget http://torsten-traenkner.de/wissen/smarthome/ook-decoder.tgz
tar xzvf ook-decoder.tgz

# enter the directory
cd ook-decoder/

# edit the gain of your stick - depends on your USB stick
sed -i 's|int gain = .*|int gain = 40;|g' ookd.cpp

# install dependencies
apt-get install librtlsdr0 librtlsdr-dev gnuplot

# build the software
make

# run the ook decoder and press the remote
./ookd -d /dev/shm/dump -v 2>test.txt

# press Control + C to stop ookd

# display the received data:
gnuplot -e "plot \"/dev/shm/dump_recorded.txt\" with lines; pause -1;"

# run the ook decoder without debug data
./ookd

Sollte die Signalstärke des USB-Sticks zu gering sein, dann kann in der Datei ookd.cpp der Parameter gain erhöht werden. Wichtig ist aber, dass das Signal-Rausch-Verhältnis des USB-Sticks stimmt, so dass die Signale noch erkannt werden können.

Fernbedienung von Pollin

Die Fernbedienung von Pollin hat 8 Tasten und läßt sich über die Stellung von 5 DIP-Schaltern so einstellen, dass die Funkdaten nicht mit der Fernbedienung des Nachbarn kollidieren.

Fernbedienung von Pollin mit DIP Schalter

Fernbedienung von Pollin mit DIP Schalter

OOK-Dekoder kann die Amplitude der Funkdaten aufzeichnen. Die gespeicherten Daten können mit dem Programm Gnuplot sichtbar gemacht werden. In folgendem Bild sind die hohen Amplituden deutlich zu sehen. Mit der rechten Maustaste läßt sich in Gnuplot in die Daten hineinzoomen.

Gnuplot von Funkdaten der Pollin-Fernbedienung

Gnuplot von Funkdaten der Pollin-Fernbedienung

Gnuplot von Funkdaten mit 8 Frames

Gnuplot von Funkdaten mit 8 Frames

Nach dem Zoomen werden 8 "Frames" sichtbar. Die ersten 4 Frames enthalten die relevanten Daten über die gedrückte Taste. Die letzten 4 Frames sind unabhängig vom Tastendruck immer gleich und scheinen das Ende eines Tastendrucks zu signalisieren. Bei gedrückter Taste werden kontinuierlich Frames hintereinander gesendet.

Gnuplot von Funkdaten, Pulse

Gnuplot von Funkdaten, Pulse

Die einzelnen Pulse der Frames enthalten hohe Frequenz-Anteile (in oberem Bild rot eingekreist). Diese Frequenzen könnten mit einem Tiefpass-Filter weggefiltert werden. Allerdings verursacht der Tiefpassfilter aus meiner Sicht unnötig Prozessorlast. Ein Schwellwert bei zum Beispiel der Hälfte der höchsten Amplitude und das Ignorieren kurzer Zacken nach unten sollten reichen. Im oberen Beispiel wäre die höchste Amplitude bei dem Wert 2, so dass die Schwelle für High und Low bei 1,0 liegt.

Die Pollin-Fernbedienung benutzt kurze und lange Amplituden-Pulse, um die Bits 0 und 1 zu kodieren. Einen kurzen Puls und eine lange Pause habe ich als Bit "1" dekodiert. Einen langen Puls und eine kurze Pause habe ich als Bit "0" dekodiert.

Die ersten 2 x 5 Bits kodieren die DIP-Schalter aus dem Batteriefach der Fernbedienung. Danach kommen die Tasten A, B, C und D und schließlich die Tasten links und rechts für "on" und "off".

          DIP-Switch Taste Links/Rechts
           D D D D D
Taste      1 2 3 4 5 A B C D   L R
A links : 101111101011101010101110
A rechts: 101111101011101010101011
B links : 101111101010111010101110
B rechts: 101111101010111010101011
C links : 101111101010101110101110
C rechts: 101111101010101110101011
D links : 101111101010101011101110
D rechts: 101111101010101011101011

Die Pollin-Fernbedienung sendet keine Seriennummer mit, so dass nur die 5 Stellungen des DIP-Schalters zum Unterscheiden benutzt werden können.

Fernbedienung von Conrad (RSL)

Die Fernbedienung von Conrad (RSL) hat ebenfalls 8 Tasten. Im Gegensatz zur Fernbedienung von Pollin befindet sich der DIP-Schalter außen auf der Fernbedienung, wodurch ein komfortables Umschalten und mehr Sendekombinationen möglich sind als bei der Pollin-Fernbedienung.

Fernbedienung von Conrad (RSL)

Fernbedienung von Conrad (RSL)

Die Fernbedienung von Conrad sendet ebenfalls 8 Frames. Im Unterschied zu Pollin sind alle 8 Frames identisch.

Gnuplot von Conrad Funkdaten mit 8 Frames

Gnuplot von Conrad Funkdaten mit 8 Frames

Gnuplot von Conrad Funkdaten, Pulse

Gnuplot von Conrad Funkdaten, Pulse

Die Pulse der Fernbedienung von Conrad (RSL) sind etwas länger als die von Pollin. Einen langen Puls und eine kurze Pause habe ich als Bit "1" dekodiert. Einen kurzen Puls und eine lange Pause habe ich als Bit "0" dekodiert. Ob Bit 0 und 1 anders herum definiert werden ist egal. Wichtig ist, dass die Bits unterschieden werden können.

Die Conrad-Fernbedienung überträgt eine individuelle Seriennummer, so dass zufälliges Schalten beim Nachbarn deutlich unwahrscheinlicher ist als bei Pollin. In den folgenden Bits steht "ssss..." für die individuellen Bits der Fernbedienung. Die Frames starten immer mit den beiden Bits "10". "A" bedeutet "All" und wiederholt sich bei den verschiedenen Stellungen des DIP-Schalters, so dass insgesamt 26 Sendekommandos möglich sind.

DIP-Schalter I:
1 links : 10 001110 ssssssssssssssssssssssss
1 rechts: 10 000001 ssssssssssssssssssssssss
2 links : 10 100110 ssssssssssssssssssssssss
2 rechts: 10 101110 ssssssssssssssssssssssss
3 links : 10 010110 ssssssssssssssssssssssss
3 rechts: 10 011110 ssssssssssssssssssssssss
A links : 10 010011 ssssssssssssssssssssssss
A rechts: 10 100011 ssssssssssssssssssssssss

DIP-Schalter II:
1 links : 10 000101 ssssssssssssssssssssssss
1 rechts: 10 001101 ssssssssssssssssssssssss
2 links : 10 101001 ssssssssssssssssssssssss
2 rechts: 10 100101 ssssssssssssssssssssssss
3 links : 10 011001 ssssssssssssssssssssssss
3 rechts: 10 010101 ssssssssssssssssssssssss
A links : 10 010011 ssssssssssssssssssssssss
A rechts: 10 100011 ssssssssssssssssssssssss

DIP-Schalter III:
1 links : 10 001000 ssssssssssssssssssssssss
1 rechts: 10 000100 ssssssssssssssssssssssss
2 links : 10 100000 ssssssssssssssssssssssss
2 rechts: 10 101000 ssssssssssssssssssssssss
3 links : 10 010000 ssssssssssssssssssssssss
3 rechts: 10 011000 ssssssssssssssssssssssss
A links : 10 010011 ssssssssssssssssssssssss
A rechts: 10 100011 ssssssssssssssssssssssss

DIP-Schalter IV:
1 links : 10 000010 ssssssssssssssssssssssss
1 rechts: 10 001010 ssssssssssssssssssssssss
2 links : 10 101100 ssssssssssssssssssssssss
2 rechts: 10 100010 ssssssssssssssssssssssss
3 links : 10 011100 ssssssssssssssssssssssss
3 rechts: 10 010010 ssssssssssssssssssssssss
A links : 10 010011 ssssssssssssssssssssssss
A rechts: 10 100011 ssssssssssssssssssssssss

Minifernbedienung von Conrad (RSL)

Die Minifernbedienung von Conrad (RSL) hat zwei Tasten und paßt in die Hosentasche. Leider besitzt die Fernbedienung keine Abdeckung der Tasten, so dass theoretisch in der Hosentasche beim Bewegen eine Taste aus Versehen gedrückt werden könnte. Da nur zwei Tasten vorhanden sind, können mehrere unterschiedliche Befehle an den Raspberry Pi nur durch zum Beispiel mehrmaliges Drücken einer Taste programmiert werden.

Minifernbedienung von Conrad (RSL)

Minifernbedienung von Conrad (RSL)

Die Pulse der Minifernbedienung von Conrad (RSL) sind mit der größeren Fernbedienung identisch. Die Minifernbedienung könnte ein kostengünstige Alternative zum "Flic" Bluetooth Smart Button sein. In den folgenden Bits steht "ssss..." wieder für die individuellen Bits der Seriennummer der Fernbedienung.

oben : 10 111001 ssssssssssssssssssssssss
unten: 10 110101 ssssssssssssssssssssssss

Funk Doppelwandschalter von Smartwares

Der Funk-Doppelwandschalter von Smartwares kann an die Wand geschraubt oder genagelt werden. Wer nicht in Betonwände bohren möchte, kann auch einen Klebestreifen benutzen (z.B. tesa Powerstrip). Er hat 4 Tasten beziehungsweise zwei Kipptasten und könnte zum Beispiel als Lichtschalter benutzt werden.

Wandschalter von Smartwares

Wandschalter von Smartwares

Der Wandschalter scheint wie bei Conrad eine individuelle Seriennnummer zu besitzen. Diese Nummer schickt er in den ersten Bits mit - hier wieder mit "ssss..." gekennzeichnet.

Smartwares:
1 oben  links : ssssssssssssssssssssssssssssssssssssssssssssssssssssss 0110101001
1 oben  rechts: ssssssssssssssssssssssssssssssssssssssssssssssssssssss 0110100110
0 unten links : ssssssssssssssssssssssssssssssssssssssssssssssssssssss 1010101001
0 unten rechts: ssssssssssssssssssssssssssssssssssssssssssssssssssssss 1010100110

Der Wandschalter von Smartwares sendet 8 identische Frames.

Gnuplot von Smartwares Funkdaten, 8 Frames

Gnuplot von Smartwares Funkdaten, 8 Frames

Gnuplot von Smartwares Funkdaten, Pulse

Gnuplot von Smartwares Funkdaten, Pulse

Die Pulse des Wandschalters von Smartwares sehen anders aus als die von Pollin oder Conrad. Bei Smartwares gibt es keine kurzen und langen Pulse sondern nur kurze und lange Pausen zwischen den kurzen Pulsen. Die Pause nach dem ersten Puls ist etwas länger als die anderen Pausen (im Bild als "Start" bezeichnet). Eine kurze Pause nach einem Puls habe ich als Bit "1" dekodiert. Eine lange Pause habe ich als Bit "0" dekodiert.

Bewegungsmelder von Multi Kon Trade

Der Bewegungsmelder von Multi Kon Trade für 15 Euro eignet sich sehr gut für den Wohnungsflur, um das Licht von Funk-LEDs bei Bewegung einzuschalten. Er sendet ähnliche Pulse wie Conrad RSL.

Bewegungsmelder von Multi Kon Trade

Bewegungsmelder von Multi Kon Trade

Leider läßt sich bei dem Bewegungsmelder ohne Löten die Häufigkeit des Sendens nicht einstellen. Die Häufigkeit der Meldung muss über Software auf dem Rasspberry Pi kompensiert werden.

Allgemeine Hinweise zur Signalstärke beim Empfang

Die empfangene Signalstärke hängt von einigen Faktoren ab. Über den Parameter "gain" im Quellcode läßt sich die Signalstärke per Software erhöhen. Wichtiger ist jedoch der Signal-Rausch-Abstand. Dabei ist es wichtig, den Raspberry Pi und die Antenne möglichst zentral in der Wohnung zu platzieren, so dass das Signal - egal an welchem Punkt - nur durch wenige Wände hindurch muss. Das "gerade" Senden durch eine Wand liefert bessere Signale als ein "schräger" Winkel durch eine Betonwand. Außerdem spielt auch der benutzte USB-Stick eine Rolle. Mit den Sticks von NooElec habe ich keine gute Erfahrung gemacht. Die Sticks von NooElec liefern zwar einen klaren Peak beim Signal - jedoch ist das Signal-Rausch-Verhältnis zu schlecht. Dadurch kann bei wenigen Metern Abstand kein klares Signal erkannt werden.

Kombination mit anderen Smarthome Geräten

Wer mit dem Lichtschalter von Smartwares oder mit der Fernbedienung von Conrad das Rollo runter- und hochfahren lassen möchte, kann die folgenden einfachen Expect-Skript benutzen. Die Skripte sind so geschrieben, dass sie sich auch für mehrere Rollos benutzen lassen.

wget http://torsten-traenkner.de/wissen/smarthome/blinds_control.tgz
tar xzvf blinds_control.tgz

wget http://torsten-traenkner.de/wissen/smarthome/ook-decoder.tgz
tar xzvf ook-decoder.tgz

cd ook-decoder

# edit the gain of your stick - depends on your USB stick
sed -i 's|int gain = .*|int gain = 40;|g' ookd.cpp

make
cd ../blinds_control

# edit start.sh and receive_433_mhz.exp with
# the data of your remote and your bluetooth addresses


# become root
sudo bash

# start the scripts
./start.sh

Das folgende Bild zeigt die Verbindungen der Skripte untereinander.

Expect-Skripte auf dem Raspberry Pi, Architektur

Expect-Skripte auf dem Raspberry Pi, Architektur

Das Shell-Skript start.sh erstellt die FIFOs (first in first out) /tmp/blinds_11.fifo bis /tmp/blinds_13.fifo zur Kommunikation zwischen empfangenen Daten der Fernbedienung und der Rollo-Steuerung. Im Quellcode sieht das in etwa so aus:

# make fifo
mkfifo /tmp/blinds_11.fifo

# map file descriptor 11 to the fifo
# to make the file descriptor non-blocking
exec 11<>/tmp/blinds_11.fifo

Danach startet start.sh die Skripte blinds.sh für jedes Rollo und das Expect-Skript receive_433_mhz.exp zum Empfang der Funkdaten der Fernbedienung. Das Skript receive_433_mhz.exp startet den OOK-Dekoder und wertet dessen Daten aus. Sowohl in start.sh als auch in receive_433_mhz.exp müssen die speziellen Funkdaten der eigenen Fernbedienung und die Bluetooth-Adressen der Rollos eingetragen werden.

Nach dem Drücken der Fernbedienung wertet receive_433_mhz.exp die Funkdaten aus und gibt über das FIFO die Befehle "up" oder "down" an das Shell-Skript blinds.sh weiter. blinds.sh fragt über Expect-Skript blindsControl.exp und das gatttool die Höhe des Rollos ab und entscheidet dann, ob das Rollo hoch- oder runtergefahren werden kann. Damit das Skript während der Rollo-Fahrt nicht blockiert, wird der Lese-Versuch des FIFOs nach einer Wartezeit von 2,5 Sekunden abgebrochen und die Höhe des Rollos abgefragt.

# read the fifo and wait 2.5 seconds for input
read -t 2.5 -u $FIFO_NUMBER command

Bei mehreren Rollos müssen die Bluetooth-Aufrufe des gatttool synchronisiert werden. Dazu gibt es das Shell-Skript synchronize.sh, das jeweils nur einen Aufruf des gatttool zur selben Zeit zuläßt.

# synchronize the call to gatttool
(
  # wait for lock on /var/lock/.synchronize.exclusivelock (fd 200)
  flock -e 200

  eval "$@"

) 200>/var/lock/.synchronize.exclusivelock

Für noch mehr Details empfiehlt sich ein Blick in den Quellcode der kleinen Skripte.

Weiterführende Artikel

Rollo fürs Fenster mit dem Raspberry Pi 2 steuern

Falls noch etwas unklar sein sollte, dann schreib einen Kommentar:

Kommentar schreiben