Funkstrom

Crystal Clear action run.png
Funkstrom

Status: stable

Funkstrom preview.jpg
Beschreibung Funksteckdosen schaltbar über eine REST-API
Autor: schinken, krisha
Version 2
PayPal Spenden für Funkstrom

Schaltsteckdosen

Bei den Funksteckdosen handelt es sich um das Auslaufmodell ELRO AB440S :: Funk-Steckdosen, 3-er Set bei Reichelt. Eine kompatible Variante ist mittlerweile bei Pollin als 3er Packung verfügbar. Die Fernbedienung hat eine Reichweite von ca. 15 Metern, und die Steckdosen können bis zu 1000 Watt schalten.

Die Fernbedienung kann durch wenige Schrauben auf der Rückseite auseinandergenommen werden. Zum Vorschein kommt eine Platine mit Kontakten, die durch die Gummitastenmatte geschalten wird.

Diese Schaltung enthält pro Funktion jeweils 3 Leiterbahnen: Masse, ON/OFF, Steckdose.

Auf der Platine ist ein HX2262-Chip verbaut. Das Äquivalent zu diesen Chip ist der PT2262 (Datenblatt).

Übertragung

Die Frequenz zur Übertragung der Signale ist 433,92 MHz (ISM-Band). Als Modulation wird eine einfache Amplitudenumtastung mit On-Off-Keying verwendet. Eine Sequenz besteht aus 13 Codes, davon 10 für die Kodierung von System- und Unitcode sowie 2 Codes für die Schaltrichtung und 1 Code als Stopsignal. Es gibt 3 Arten von Codes. Die Sequenz muss mindestens 3x gesendet werden. Um eine gewisse Zuverlässigkeit zu erreichen, empfiehlt es sich die Sequenz wesentlich öfter zu senden. Weitere Details findet man bei avr.börke.de.

Die Übertragung besteht aus einem System- und Unit-Code sowie dem "Stop-Bit" und dauert 2,64ms. Der Systemcode besteht aus 5 DIP-Schaltern welche mit 1-5 nummeriert sind, sowie dem Unitcode mit ebensovielen Schaltern von A-E.

Mit dem Systemcode sind uns 2^5 Kombinationen möglich. Da wir entgegen der normalen Funkfernbedienung auch den Unitcode kombinieren (z.B. A und E zusammen) können und nicht nur einen Schalter zum Kodieren der Steckdose verwenden müssen, sind hier auch 2^5 Kombinationen möglich.

Mit dem jetzigen Aufbau können wir bis zu 1024 Steckdosen schalten.

Finale Version

Platine

Nach mehreren Prototypen haben wir uns dazu entschlossen eine eigene Platine zum Aussenden der Funksteckdosen-Signale zu entwerfen. Unser Modul ist per USB an einen RaspberryPI angeschlossen, welcher auch für unsere Stereoanlage zuständig ist.

Als Funkchip verwenden wir das ZSD-T3 433MHz ASK High Power RF Transmitter Module von dx.com.

Die Codes unserer Funksteckdosen sind nicht-öffentlich in dem Pad Funksteckdosen dokumentiert.

Platine

Eagle brd

Als Microcontroller verwenden wir den AT90USB162, welcher für die USB-Kommunkation sowie für die Ansteuerung des Funkmoduls zuständig ist. Die Platine ist mit USB verbunden und wird darüber auch mit 5V+ versorgt. Außerdem ist ein Sockel verbaut, um verschiedene Funkmodule zu testen.

Da das Funkmodul mit 12V betrieben werden kann und dadurch eine größere Sendeleistung sowie eine höhere Zuverlässigkeit in unserem Räumen erreicht wird, besitzt unsere Platine auch einen Step-Up Wandler. Der DC-DC Converter ist ein MC33063ADG, welcher mit einer Standardbeschaltung aus unserer 5V-Versorgungsspannung 12V macht.

Der C-Code liegt auf GitHub und verwendet die LUFA-Library für die CDC-Serial-Kommunikation. Leider beherrscht der Atmel eine simple Serial-Kommunikation über USB nicht nativ.

API-Server

Der Server läuft dem Host "garlic" im Hackcenter an dem auch unser Funkmodul angeschlossen ist. Als HTTP-Server verwenden wir nginx welcher mit der Applikation über uwsgi bzw. uwsgi-python kommuniziert.

Die Configs für nginx, uwsgi sowie udev finden sich im GitHub-Repository unter configs/.

Da die python-flask applikation eine Serial-Verbindung aufbaut, wurde in der uwsgi-config festgelegt, das nur ein process gestartet werden kann. Flask selbst ist per Thread von der Kommunikation zu unserer Platine entkoppelt, weshalb wir enable-threads verwenden.

API

Frontend

Die API ist komplett REST. Die Steckdosen lassen sich per POST/DELETE schalten, sowie deren Status per GET abfragen. Eine Beispielantwort von funkstrom/socket/hc_licht_regal sieht wiefolgt aus:

{"status": false, "unitcode": "00011", "name": "HC Licht Regal", "syscode": "10000"}

Ausserdem unterstützt die API auch Gruppen. Hiermit lassen sich mehrere Steckdosen auf einmal ein- und ausschalten. Dies ist vorallem für unseren Space-Shutdown nützlich.

Prototype v0.2

Für die zweite Version des Funkstrom-Projektes wird nur noch das Funkmodul der Platine verwendet. Der HX2262-Chip wird hierbei komplett ignoriert. Dadurch ist es möglich alle Kombinationen der Funksteckdosen mit einer Platine zu schalten.

Arduino

Der erste Versuchsaufbau besteht aus einem Arduino Leonardo sowie 2 Drähten zur Funkfernbedienung. Der PIN2 des Arduinos wurde mit der Signaleingangsleitung des Funkmoduls verbunden. Der zweite Draht ist GND.

Im Normalbetrieb wird die Funkfernbedienung mit 3,3 Volt versorgt, durch unseren Leonardo aber auch ohne Probleme mit 5V. Die Platine wird mit einem 7,5 Volt Schaltnetzteil versorgt.

Der Code für den Versuchsaufbau befindet sich auf github.

Seriell direkt

Um den Arduino einzusparen haben wir versucht den ASK Sender direkt an einem USB-to-serial Konverter zu betreiben. Das Problem dabei ist, dass UART high-aktiv ist. Dies lässt sich mit einer simplen Transistorschaltung invertieren. Allerdings kann man nicht ohne weiteres die Start- und Stop-Bits des seriellen Protokolls deaktivieren und die Pausen zwischen den Bytes sind nicht einstellbar. Daher scheidet diese Möglichkeit leider aus.

ATTiny2313

Hotglue!

Um die Kosten dennoch gering zu halten, haben wir einen ATTiny2313 in DIP Bauform programmiert und direkt auf die Fernbedienung inklusive einem 78L05 Spannungswandler geklebt. Dieser bekommt die Daten nun von einem USB-to-serial Wandler und sendet sie dann über einen Timer-Interrupt an den ASK Sender.(le code).

Während des Aussenden der Funksignale werden alle seriellen Daten verworfen. Nach der Sendung wird ein ACK Byte (0x12) gesendet. Eine serielle Sendung ist mit Header- (0xAA 0x55) und Tailbytes (0x55 0xAA) umschlossen. Die Übertragungsrate beträgt 57600 Baud. Der Code 0x55 darf nicht am Ende einer Sendung, vor den Tailbytes verwendet werden.

Prototyp v0.1

Ansteuerung

HX2262

Um eine Steckdose schalten zu können, muss der Chip zuerst wissen, ob es sich um eine Einschalt- oder Ausschaltoperation handelt. Hierzu muss ON (Pin 12) oder OFF (Pin 13) gegen Masse (Vss) geschalten werden.

Darauf folgendend muss A (Pin 6), B (Pin 7) oder C (Pin 8) gegen Masse geschalten werden, um die Steckdose zu schalten.

Schaltung

Da die Fernbedienung auf 12V, und der Prozessor (AtMega32) auf 5V läuft, werden die Pins über Transistoren zu Masse (Vss) geschalten. Hierzu wurde die Masse des AtMega32 und des HX2262 zusammengeführt.

Als Transistor wurde ein BC337-16 verwendet.

Die Transistorschaltung sieht wie folgt aus:

                          +------ HX2262 Pin
            _____       |/
AtMega ----[_____] -----|
             4k7        |>
                          \------ Vss


Die Transistoren (BC337-16), welche zum schalten der Fernbedienung verwendet wurden, werden über das AVR-Net-IO angesteuert.

Dieser Aufbau soll später miniaturisiert werden. Hierzu soll ein kleinerer Prozessor mit mindestens 8 I/O-Pins, UART und 5V Spannungsversorgung verwendet werden.

Kommunikation

Die Ansteuerung des AVR-Net-IO wird über Netzwerk realisiert. Hierbei werden die vorgegebenen Steuerbefehle verwendet. Die IP-Adresse und Netzmaske muss zuvor über die serielle Verbindung konfiguriert werden.

Um die Steckdose "A" einzuschalten, werden folgende Befehle an den AVR gesendet:

 SETPORT 1.1  // ON-Mode
 SETPORT 3.1  // Steckdose A

danach müssen die PINs wieder zurückgesetzt werden:

 SETPORT 1.0
 SETPORT 3.0

Projektbilder

Antennenvergleich

Die Antenne wurde in verschiedenen Variationsmöglichkeiten getestet und die Empfangsstärke in ca. 3m Entfernung mit einem RTL2832/E4000 SDR und einer Skyscan Mag 1300 Scanner Antenne aufgenommen. Wir haben uns für Variante 1 entschieden (vermutlich war es auch so vom Hersteller vorgesehen).