maltepöggel.de

USB Funk

Steuerung von 433MHz Funksteckdosen mit dem PC

Bild: Funksteckdose

Nachdem ich im Baumarkt einen ganzen Einkaufswagen voll Funksteckdosen Sets günstig gekauft hatte, stellte sich schnell heraus wie komfortabel es ist den Laserdrucker oder die Weihnachtsbeleuchtung per Funk zu schalten.

Noch besser wäre es allerdings, die Schaltvorgänge per PC zu automatisieren, und diese zu scripten oder via Internet fernsteuern zu können. Also musste ein USB Interface her!

Die Idee mit den Funksteckdosen ist nicht ganz neu; der Code stammt teils vom sprechenden Wecker 2 und wurde dort eingesetzt um auf Wunsch zur Alarmzeit noch die Nachttischlampe mit einzuschalten.

Bei der Implementierung des Funk-Protokolls stieß ich auch auf das EtherSex Projekt, wo eine ähnliche Idee in Kombination mit einem Netzwerkbaustein das Schalten aus dem LAN möglich macht. Betreibt man allerdings sowieso einen Homeserver, ist diese Lösung eher überdimensioniert. Ziele meines USB Interface waren deshalb auch der einfache Aufbau, kleine Abmessungen sowie niedrige Bauteilkosten.

Bild: USB Funk Interface
Bild: Platinenunterseite

Um den Bauteileaufwand für die USB Schnittstelle so gering wie möglich zu halten kommt ein ATMega48 mit AVR V-USB (einem Software USB Stack) zum Einsatz. Der Controller bekommt per USB Control Message den Hauscode, Code (per DIP an der Steckdose einstellbar) sowie Schaltstatus (ein/aus) und wandelt diese Informationen in den Funkcode der Originalfernbedienung um. Gesendet wird mittels eines billigen amplitudenmodulierten Sendemoduls auf 433,92MHz. Diese sind einbaufertig incl. Postzulassung bei RS Components und diversen anderen Händlern zu beziehen. Ich verwende das QAM-TX1. Als 433MHz Antenne wird ein Draht in Lambda/4 verwendet. Er muss also ziemlich genau 17,3cm lang sein.

Die Schaltung ist wie schon gesagt sehr simpel. Drei Widerstände und zwei Z-Dioden für die USB Schnittstelle, ein Quarz für den Controller und das 433MHz Sendemodul. Die blaue Leuchtdiode zeigt den Betriebsstatus an. Leuchten = Standby, kurzes Blinken = Paket gesendet.

Bild: Schaltplan

Bild: Dipschalter

Die Steckdosen werden mit einem 10 Bit Dipschalter Adressiert. Dabei entsprechen die Ziffern 0...5 dem Hauscode und die Buchstaben A...E dem Code der jeweiligen Funksteckdose. Den Hauscode rechne ich binär um, ordne die Schalter also der Wertigkeit 1, 2, 4, 8 und 16 zu. Im Bild sind Schalter 1 und 5 aktiv, es ergibt sich der Hauscode 1 + 16 = 17. Bei dem Code darf immer nur ein Schalter aktiv sein. Er dient dazu die Steckdosen den einzelnen Tasten auf der Fernbedienung zuzuordnen. Ist "A" aktiv, reagiert die Steckdose auf die Tasten "A" (on/off) auf der Originalfernbedienung mit entsprechend identischem Hauscode. "E" ist dort als Taste nicht vorhanden, kann aber mit dem USB Interface auch angesprochen werden sofern man hier auf Benutzen der Fernbedienung verzichten kann.

Ich möchte nun noch mal etwas genauer auf die Firmware eingehen. Als Vorlage bei der Entwicklung diente das PowerSwitch Beispielprojekt des V-USB Treibers, da es eine ähnliche Funktionalität bietet. Hostrechner und Controller kommunizieren dabei mittels des sogenannten Control Endpoint 0. Eine Control Message ist laut Spezifikationen dazu vorgesehen, USB Geräte zu identifizieren oder zu konfigurieren. Der Endpoint 0 muss bei jedem USB Gerät vorhanden sein. Er kann abgesehen von den eben genannten Informationen natürlich auch andere kurze herstellerspezifische Daten übertragen - wie hier drei Byte die zur Funksteckdose gesendet werden sollen.

Die Datenstruktur des Control Endpoint 0 hat eine Länge von 8 Bytes. Wichtig dabei sind für uns bRequest, wValue und wIndex. bRequest ist ein unsigned char. Er beinhaltet welche Aktion das usbfunk Interface ausführen soll. (Siehe requests.h) Die anderen beiden Werte sind jeweils 16 Bit Variablen (word) und somit nutze ich das untere Byte von wValue für den Hauscode und das obere Byte für den Code. wIndex ist je nachdem ob ein- oder ausgeschaltet werden soll 1 oder 2. Die entsprechenden Strukturen und libusb Befehle sind auf der Driver API Seite im Wiki des V-USB Treibers beschrieben.

Ein Request vom Typ FUNK_RQ_TX ruft die Funktion void wireless_switch( uint8_t housecode, uint8_t code, uint8_t state ); auf, welche die Dezimalzahlen in den passenden Funkcode umwandelt und den Sender aktiviert.

Bild: Zustände der Pins

Alle Dipschalter schalten auf logisch 0 (GND). Ein geöffneter Schalter bedeutet floating (f), der dritte Zustand logisch 1 (VCC) bleibt ungenutzt. Die Funktion wireless_switch() konvertiert nun die übergebenen Dezimalzahlen in Binäre 2 Bit folgen; da ja nur 0 und f vorkommen, werden je 5 Bit Hauscode, 5 Bit Code sowie 2 Bit Status in ihre entsprechenden Pulse direkt umgewandelt.

Im Sendepuffer bedeutet eine 0 einen kurzen Impuls mit langer Pause und eine 1 einen langen Impuls mit kurzer Pause. Es werden die Bytes 00 (GND = Schalter geschlossen, Eingabewert 1) und 01 (floating, Schalter offen, Eingabewert 0) abgelegt. Das invertiert zwar die eigentliche Logik, aber es ist einfacher geschlossene Schalter als eine logische 1 zu betrachten. Dieses ist bei der Übergabe bzw. Umrechnung der Variablen housecode, code und state zu beachten.

Hier der Mitschnitt meines Logic Analyzers am TTL Ausgang eines Empfängers. Dieser Code schaltet die Steckdose mit dem Hauscode 17 und dem Code A aus dem vorherigen Beispiel:

Bild: Datenpaket

Die Ausgabe der Daten auf den Port erfolgt in einem Timer Interrupt. Dieser wird mit entsprechenden Werten vorgeladen, um genau zur nächsten Flanke abzulaufen. Dort Triggert er und schaltet den Sender ein oder aus. Der Sync Impuls wird nach 48 Flanken (12 bit x 2 Pulse, je eine steigende und eine fallende) erzeugt. Preloadwerte sind in der wireless.h definiert und halten die Timings der originalen Fernbedienung hinreichend ein. Die Impulsfolge muss mindestens zwei Mal wiederholt werden damit der Empfänger schaltet. Aus diesem Grund wird sie zur Sicherheit gleich 5 Mal gesendet.

Die Firmware ist im Archiv in Form des Sourcecodes sowie eines Hexfiles enthalten. Wer den Code selbst compilieren möchte kann dies wie gewohnt mit dem avr-gcc durch Eingabe von "make" sowie "make program" (zum flashen) erledigen. Avrdude setzt dabei auch gleich die korrekten Fusebits.

Das PC Konsolentool befindet sich im Ordner "cli". Es lässt sich unter Linux auch wie gewohnt mit "make" compilieren. Sollte dies fehlschlagen fehlt unter Umständen das libusb-devel Paket.

Eine Übersicht der möglichen Befehle wird bei Aufruf von "usbfunk" ohne oder mit falschen Parametern angezeigt.

Bild: Screenshot

Um die auf der vorherigen Seite beispielhaft gezeigte Funksteckdose zu schalten wird das Tool folgendermaßen aufgerufen:

sudo ./usbfunk pt2 17 A on

Wichtig: Es ist unter Linux nötig das Programm als root auszuführen, da sonst kein Zugriff auf den USB Port möglich ist. Wer root Rechte vermeiden möchte kann auch eine udev Regel anlegen.

USBFunk 2

Aufgrund der Nachfrage wurde außerdem eine etwas größere Platine entworfen, welche ohne SMD Bauteile auskommt. Diese lässt sich bedeutend einfacher nachbauen. Statt dem ATMega48 kommt nun ein ATMega88 zum Einsatz. Per Bootloader sind Firmwareupdates problemlos möglich.

Bild: USBFunk II

Kompatibilität
Hersteller Art Modell Chipsatz Ab Firmware
Kangtai Funksteckdose - PT2272A-L2 v1.0
Elro Funksteckdose/Dimmer AB-4xx (Home Control) HX2272 v1.0
Elro Funksteckdose AB-600S SC5272S-L4 v1.1
HIG Funksteckdose - SC5272S-L4 v1.1
Düwi / Intertechno Funksteckdose PAR-1500 o.ä. SC5272S-L4 v1.1
Düwi / Intertechno Funkdimmer ITR-300 o.ä. SC5272S-L4 v1.1
Intertechno Funkgong ITR-7000 SC5272S-L4 v1.1
Heidemann Funkgong HX Serie Unbekannt v1.1
Elro Funksteckdose HE-874 (Home Easy UK) Unbekannt v1.2

In Version 1.2 wird ein Bug in der USB Kommunikation behoben! Es sollte unbedingt die neuste Firmware auf das Interface geflashed werden!

Software mit grafischer Bedienoberfläche

Um die Benutzung zu vereinfachen, wurde auch eine Software für Windows entwickelt.

Bild: USBFunk GUI Screenshot

Hinweis zur Treiberinstallation

Der beiliegende Treiber funktioniert bis einschließlich Windows 7. Für Windows 8/8.1/10 muss dieser mit dem Tool Zadig installiert werden. Die Vorgehensweise ist identisch, wie ich sie auch für meine LED Laufschrift auf Seite 2 im PDF beschrieben habe.

Treiber
Downloads
Grafikoberfläche
Datenblätter
Vorherige Versionen
Weiterführende Links und Informationen