Und nirgendwo steht, dass man zum Fernbedienen ausschließlich die Fernbedienung nutzen darf. ;-)
1. Schritt: Bedienungsanleitung lesen
Sie gibt z.B. Auskunft über die Konfigurierbarkeit der Steckdosen.
Auf der Rückseite der Fernbedienung befindet sich unterhalb des Batteriefachs ein 5-fach DIP-Schalter, mit dem der Systemcode eingestellt werden kann.
Der Systemcode kann aus 32 Werten beliebig ausgewählt werden. Falls die eigenen Steckdosen auch auf die Fernbedienung des Nachbarn reagieren, kann hier durch Wahl eines anderen Codes Abhilfe geschaffen werden.
Auf der Rückseite jeder Funksteckdose verbirgt sich hinter einer zugeschraubten Klappe ein 10-fach DIP-Schalter. Mit den Schaltern 1-5 wird wieder der (eigene) Systemcode eingestellt. Die Schalter A-E legen fest, mit welchen Tasten auf der Fernbedienung diese Steckdose gesteuert werden kann.
2. Schritt: Was wird per Funk übertragen?
Sie gibt z.B. Auskunft über die Konfigurierbarkeit der Steckdosen.
Auf der Rückseite der Fernbedienung befindet sich unterhalb des Batteriefachs ein 5-fach DIP-Schalter, mit dem der Systemcode eingestellt werden kann.
Der Systemcode kann aus 32 Werten beliebig ausgewählt werden. Falls die eigenen Steckdosen auch auf die Fernbedienung des Nachbarn reagieren, kann hier durch Wahl eines anderen Codes Abhilfe geschaffen werden.
Auf der Rückseite jeder Funksteckdose verbirgt sich hinter einer zugeschraubten Klappe ein 10-fach DIP-Schalter. Mit den Schaltern 1-5 wird wieder der (eigene) Systemcode eingestellt. Die Schalter A-E legen fest, mit welchen Tasten auf der Fernbedienung diese Steckdose gesteuert werden kann.
2. Schritt: Was wird per Funk übertragen?
Das Werkzeug der Wahl ist ein DVB-T USB-Dongle (VG0002A) von LogiLink, der mit der richtigen Software zum Spektrumanalyser wird. Mein Lieblingsprogramm ist in diesem Fall die Open Source Software SDR#.
Beim Druck auf eine Taste der Fernbedienung ist das Sendesignal schnell gefunden. Per Recording Plugin habe ich den Audio-Output aufgezeichnet, um auszuwerten, was auf der 433,92 MHz Trägerfrequenz aufmoduliert ist:
Zum Auswerten nutzte ich das Open Source Programm Audacity. Hier die Gesamtansicht eines zweimaligen Tastendrucks:
Durch Zoomen der Zeitachse werden Details erkennbar:
Es ist im Signal ein Bitstrom erkennbar.
3. Schritt: Die Auswertung
Ich habe alle Tastendrücke aufgezeichnet, die Sequenzen ermittelt und die Ergebnisse korreliert:
Die Bits 12, 14, 16 und 18 ändern sich abhängig von den gedrückten Tasten A-D, während gleichzeitig Bit 22 abhängig davon ist, ob man die ON-Taste oder die OFF-Taste betätigt.
Beim Ändern des Systemcodes ergaben sich Änderungen bei den Bits 2, 4, 6, 8 und 10, entsprechend den Schaltern 1-5.
Hält man eine Taste längere Zeit gedrückt ändert sich jegliche Sequenz in
Die Funktion dieser Sequenz konnte ich nicht ermitteln. Ich vermute, dass sie eine Art "neutrales Kommando" ohne Funktion ist, um Fehlinterpretationen durch Übertragungsfehler zu minimieren.
Bei der Übermittlung des Systemcodes ist mir aufgefallen, dass die relevanten Bits als "0 = kein Signal" übertragen werden, wenn der entsprechende Schalter auf Schalterstellung 1 steht.
Ich habe daher die Zuordnung getroffen:
1-Signal = logisch 0
0-Signal = logisch 1
Das Übertragungsformat kann dann wie folgt zusammengefasst werden:
E*: Es gibt an der Fernbedienung zwar keine E-Tasten, die Steckdosen haben am DIP-Schalter jedoch die Möglichkeit als E konfiguriert zu werden. Von der Logik her vermute ich deshalb, dass Bit 20 nicht zwangsläufig zum EIN-AUS Kommando gehört, sondern für die E-Tasten vorgesehen war.
Soweit die Theorie. Ob diese Auswertungen stimmen, musste die Praxis zeigen.
4. Schritt: Wie kann man die Übertragung nachbilden?
Als Sender benutzte ich ein Modul, dass mit der Bezeichnung XY-FST bei diversen Händlern günstig zu finden ist.
Das Modulationssignal habe ich mit einem Arduino Uno generiert. Ein Testaufbau auf einem Breadboard ist schnell erledigt.
Der zeitliche Signalaufbau der Bits ergab sich aus der Auswertung und musste im Programm nachgebildet werden:
Der dazu passende Arduino-Code:
int sigTX = 7;
int LEDpin = 13;
int aOnFrame[] = {1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,0,1,1,1,0,1,1,1,0,1}; // sys=11111, D, EIN
int aOffFrame[] = {1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,0,1,1,1,0,1,0,1,1,1}; // sys=11111, D, AUS
void setup() {
pinMode( sigTX, OUTPUT );
pinMode( LEDpin, OUTPUT );
}
void loop() {
sendOnFrame(); // 2 Sekunden ON
delay( 2000 );
sendOffFrame(); // 2 Sekunden OFF
delay( 2000 );
}
void sendOnFrame() {
int j = 0;
int i = 0;
digitalWrite( LEDpin, HIGH );
for( j=0; j<20; j++ ){ // 10x ON Sequenz senden
for( i=0; i<25; i++ ){ // 25 bit Frame erzeugen
if( aOnFrame[i] == 1 ) { sendHighLevel(); }
if( aOnFrame[i] == 0 ) { sendLowLevel(); }
}
delay( 10 );
}
digitalWrite( LEDpin, LOW );
}
void sendOffFrame() {
int j = 0;
int i = 0;
digitalWrite( LEDpin, HIGH );
for( j=0; j<20; j++ ){ // 10x OFF Sequenz senden
for( i=0; i<25; i++ ){ // 25 bit Frame erzeugen
if( aOffFrame[i] == 1 ) { sendHighLevel(); }
if( aOffFrame[i] == 0 ) { sendLowLevel(); }
}
delay( 10 );
}
digitalWrite( LEDpin, LOW );
}
// Logisch 1 Signal generieren
void sendHighLevel() {
digitalWrite( sigTX, HIGH );
delayMicroseconds( 300 );
digitalWrite( sigTX, LOW );
delayMicroseconds( 950 );
}
// Logisch 0 Signal generieren
void sendLowLevel() {
digitalWrite( sigTX, HIGH );
delayMicroseconds( 930 );
digitalWrite( sigTX, LOW );
delayMicroseconds( 320 );
}
Beim Druck auf eine Taste der Fernbedienung ist das Sendesignal schnell gefunden. Per Recording Plugin habe ich den Audio-Output aufgezeichnet, um auszuwerten, was auf der 433,92 MHz Trägerfrequenz aufmoduliert ist:
Zum Auswerten nutzte ich das Open Source Programm Audacity. Hier die Gesamtansicht eines zweimaligen Tastendrucks:
Durch Zoomen der Zeitachse werden Details erkennbar:
Es ist im Signal ein Bitstrom erkennbar.
Beim Drücken der verschiedenen Tasten ergaben sich unterschiedliche Bitströme mit 25 bit Länge und einer Periodendauer von 25x1,25 ms. Während des Tastendrucks wird der Bitstrom ständig wiederholt, mit einer Pause von 10 ms zwischen den Sequenzen.
3. Schritt: Die Auswertung
Ich habe alle Tastendrücke aufgezeichnet, die Sequenzen ermittelt und die Ergebnisse korreliert:
Die Bits 12, 14, 16 und 18 ändern sich abhängig von den gedrückten Tasten A-D, während gleichzeitig Bit 22 abhängig davon ist, ob man die ON-Taste oder die OFF-Taste betätigt.
Beim Ändern des Systemcodes ergaben sich Änderungen bei den Bits 2, 4, 6, 8 und 10, entsprechend den Schaltern 1-5.
Hält man eine Taste längere Zeit gedrückt ändert sich jegliche Sequenz in
Die Funktion dieser Sequenz konnte ich nicht ermitteln. Ich vermute, dass sie eine Art "neutrales Kommando" ohne Funktion ist, um Fehlinterpretationen durch Übertragungsfehler zu minimieren.
Bei der Übermittlung des Systemcodes ist mir aufgefallen, dass die relevanten Bits als "0 = kein Signal" übertragen werden, wenn der entsprechende Schalter auf Schalterstellung 1 steht.
Ich habe daher die Zuordnung getroffen:
1-Signal = logisch 0
0-Signal = logisch 1
Das Übertragungsformat kann dann wie folgt zusammengefasst werden:
E*: Es gibt an der Fernbedienung zwar keine E-Tasten, die Steckdosen haben am DIP-Schalter jedoch die Möglichkeit als E konfiguriert zu werden. Von der Logik her vermute ich deshalb, dass Bit 20 nicht zwangsläufig zum EIN-AUS Kommando gehört, sondern für die E-Tasten vorgesehen war.
Soweit die Theorie. Ob diese Auswertungen stimmen, musste die Praxis zeigen.
4. Schritt: Wie kann man die Übertragung nachbilden?
Als Sender benutzte ich ein Modul, dass mit der Bezeichnung XY-FST bei diversen Händlern günstig zu finden ist.
Technische Daten XY-FST:
- Betriebsspannung: 3,5 - 12V DC
- Reichweite: 20 - 200m (Abhängig von der Betriebsspannung)
- Betriebsart: AM
- Übertragungsrate: 4KB / s
- Sendeleistung: 10mW
- Sendefrequenz: 433Mhz
- Abmessungen: 19 x 19mm
- Pinbelegung: Data, VCC, Masse (von links nach rechts)
Das Modulationssignal habe ich mit einem Arduino Uno generiert. Ein Testaufbau auf einem Breadboard ist schnell erledigt.
Der zeitliche Signalaufbau der Bits ergab sich aus der Auswertung und musste im Programm nachgebildet werden:
Der dazu passende Arduino-Code:
int sigTX = 7;
int LEDpin = 13;
int aOnFrame[] = {1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,0,1,1,1,0,1,1,1,0,1}; // sys=11111, D, EIN
int aOffFrame[] = {1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,0,1,1,1,0,1,0,1,1,1}; // sys=11111, D, AUS
void setup() {
pinMode( sigTX, OUTPUT );
pinMode( LEDpin, OUTPUT );
}
void loop() {
sendOnFrame(); // 2 Sekunden ON
delay( 2000 );
sendOffFrame(); // 2 Sekunden OFF
delay( 2000 );
}
void sendOnFrame() {
int j = 0;
int i = 0;
digitalWrite( LEDpin, HIGH );
for( j=0; j<20; j++ ){ // 10x ON Sequenz senden
for( i=0; i<25; i++ ){ // 25 bit Frame erzeugen
if( aOnFrame[i] == 1 ) { sendHighLevel(); }
if( aOnFrame[i] == 0 ) { sendLowLevel(); }
}
delay( 10 );
}
digitalWrite( LEDpin, LOW );
}
void sendOffFrame() {
int j = 0;
int i = 0;
digitalWrite( LEDpin, HIGH );
for( j=0; j<20; j++ ){ // 10x OFF Sequenz senden
for( i=0; i<25; i++ ){ // 25 bit Frame erzeugen
if( aOffFrame[i] == 1 ) { sendHighLevel(); }
if( aOffFrame[i] == 0 ) { sendLowLevel(); }
}
delay( 10 );
}
digitalWrite( LEDpin, LOW );
}
// Logisch 1 Signal generieren
void sendHighLevel() {
digitalWrite( sigTX, HIGH );
delayMicroseconds( 300 );
digitalWrite( sigTX, LOW );
delayMicroseconds( 950 );
}
// Logisch 0 Signal generieren
void sendLowLevel() {
digitalWrite( sigTX, HIGH );
delayMicroseconds( 930 );
digitalWrite( sigTX, LOW );
delayMicroseconds( 320 );
}
4. Uuuuuuund Action!