Sonntag, 18. Mai 2014

Hacking Intertec Funksteckdosen

Sie hingen im Baumarkt, zu viert mit einer Fernbedienung, und haben mich mit einem Preis unter 15 € angelacht: Funksteckdosen. Schaltleistung bis 1000 W (4,35 A), eine 12 V Batterie Typ A23 für die Fernbedienung ist dabei, und der Hersteller verspricht 15 m Reichweite bei einer Frequenz von 433,92 MHz.






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?

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. 

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!