Funk Baumarkt-Steckdosen mit Homematic und Arduino steuern

Veröffentlicht von

Dieser Artikel beschäftigt sich damit, wie man mit einem Arduino Signale an eine 433 MHz Baumarkt-Steckdose über Homematic sendet. In diesem Beitrag werden die Baumarkt-Steckdosen in Homematic integriert um z.B. einfache Beleuchtungen damit zu schalten.

Meine Frau und ich hatten uns für unsere passive Wohnzimmerbeleuchtung, welche aus 4 Stehlampen besteht, diese Baumarkt-Steckdosen bei Amazon bestellt. Die Steckdosen können mit einem DIP-Schalter auf 4 Kanäle eingestellt und mit der mitgelieferten Fernbedienung geschalten werden. So weit, so gut.

Nun entstand der Wunsch (ich sag nicht von wem *zwinker*), die Lampen einzeln und gemeinsam über das Handy (wir steuern alles über Apple´s Homekit) zu bedienen.

Bei der Recherche nach einer „fertigen“ Lösung bin ich immer wieder auf das Thema „Simulation des Tastendrucks auf der Fernbedienung via Signal“ gestoßen. Ich persönlich empfand das als keinen guten Lösungsansatz, da wir unsere Fernbedienung weiterhin verwenden wollten.  Meine Recherchen führten mich zu dem GitHub-Projekt von Thomas Dietrich. Seine Lösung beschreibt die Anbindung eines Arduino Nano an ein Homematic HM-Mod-RE-8 Modul. Jedoch ist die Dokumentation für meinen Geschmack etwas zu mager, deswegen habe ich das Ganze hier noch einmal ausführlicher niedergeschrieben.

Komponentenliste

Hardware-Aufbau

Die offizielle Dokumentation zum PIN-Belegungsplan des Arduino Nano ist auf Ardunio.cc (PDF) zu finden.

Der VCC-Pin des 433 MHz Transmitter wird mit +5V des Arduino verkabelt. GND wird mit GND verbunden. Der Data-Pin des Transmitters mit Pin D13 des Arduino. Die Antennenlänge des Transmitters sollte für einen optimalen Wirkungsgrad 17 cm betragen.

Der Anschluss des HM-Mod-RE-8 Moduls der Homematic ist ganz einfach.

Die Pins D2 – D5 des Arduino werden mit den Eingängen OUT 1 – 4 des HM-Mod-RE-8 verbunden. Über diese Leitungen fließen die Schaltsignale.

Die Stromversorgung erfolgt über den 3,3V-Ausgang des Arduino.

Software

Als Basis für die Steuersoftware für den Microcontroller auf dem Arduino verwende ich den rcswitch-adapter von Thomas Dietrich.

Bei den Baumarkt-Steckdosen hatte ich leider weniger Glück. Der oben genannte Software-Adapter unterstützt nur die „ABCDE“-Pin-Steckdosen. Meine Steckdosen haben im Vergleich jedoch nur einen 1-4 PIN Switch mit fest eingestellter Kanalgruppe. Da die Dosen auf 433 MHz funken, müssen noch die entsprechenden Sende- und Empfangsbits ausgelesen werden. Hierzu habe ich mir einen kleinen 433 MHz-Sniffer gebaut, welcher das Funkspektrum überwacht und die Signale im Dezimal-Format ausgibt.

In meinem Fall ergab das Schaltmuster folgende Konstellation:

Pin Zustand Dezimal Binär
4 0 21588 000000000101010001010100
4 1 21589 000000000101010001010101
3 0 70740 000000010001010001010100
3 1 70741 000000010001010001010101
2 0 86100 000000010101000001010100
2 1 86101 000000010101000001010101
1 0 83028 000000010100010001010100
1 1 83029 000000010100010001010100

In diesem Fall konnte ich die vorbereiteten Methoden switchOn() und switchOff() aus dem Codebeispiel leider nicht verwenden. Ich musste direkt auf die send()-Methode von RCSwitch zurückgreifen und hierzu einige kleine Modifikationen an Thomas´s Code vornehmen.

Den Code habe ich hierzu wie folgt verändert (Änderungen grün markiert):

#define DEBUG
#ifdef DEBUG
 #define DEBUG_PRINT(x) Serial.print (x)
 #define DEBUG_PRINTDEC(x) Serial.print (x, DEC)
 #define DEBUG_PRINTLN(x) Serial.println (x)
#else
 #define DEBUG_PRINT(x)
 #define DEBUG_PRINTDEC(x)
 #define DEBUG_PRINTLN(x) 
#endif


// HM-MOD-Re-8 HomeMatic 8-Kanal-Empfangsmodul 
// http://www.elv.de/homematic-8-kanal-empfangsmodul.html
const int OUT1pin = 2; //first OUT pin, others following 
const int channelCount = 8;
int channelStates[channelCount] = {-1, -1, -1, -1, -1, -1, -1, -1}; 
// invalid value (neither HIGH nor LOW), will force full update on startup


// operate remote radio controlled devices with 433MHz AM transmitter
// http://code.google.com/p/rc-switch
#include <RCSwitch.h>
RCSwitch rfModule = RCSwitch();
const int rfModulePin = 13;
char group[2] = "1";
char sockets[4][25]={
//Channels 1-4 OFF-States
 "000000000101010001010100",
 "000000010001010001010100",
 "000000010101000001010100",
 "000000010100010001010100"
};

//temporary variable
int newState;


void setup() {
 #ifdef DEBUG
 Serial.begin(9600);
 #endif
 
 for (int pin=OUT1pin; pin < OUT1pin + channelCount; pin++){
 pinMode(pin, INPUT_PULLUP);
 }
 
 rfModule.enableTransmit(rfModulePin);
}


void loop() {
 for (int i=0; i < channelCount; i++){
 newState = !digitalRead(OUT1pin + i);
 if (newState != channelStates[i]) {
 channelStates[i] = newState;
 
 DEBUG_PRINT("Homematic Channel "); DEBUG_PRINT(i + 1);
 DEBUG_PRINT(" new State "); DEBUG_PRINT(newState);
 DEBUG_PRINT(" -> "); DEBUG_PRINT(sockets[i]);
 
 if (newState == HIGH) {
 //set last Bit to 1
 sockets[i][23]='1';
 //send whole Bit-Structure with fixed length 24 Bit
 rfModule.send(sockets[i]);
 DEBUG_PRINT(" switchOn");
 } else {
 //set last Bit to 0
 sockets[i][23]='0';
 //send whole Bit-Structure with fixed length 24 Bit
 rfModule.send(sockets[i]);
 DEBUG_PRINT(" switchOff");
 }
 DEBUG_PRINT("\n");
 }
 }
}

Das fertige Sketch-File steht hier zum Download bereit: 433mhz_tranceiver

Konfiguration

Zum Schluss habe ich den Homematic-Adapter noch an der CCU angelernt. Die Kanäle werden zur Erhöhung der Übersichtlichkeit noch ordentlich beschriftet. Damit können dann die einzelnen Baumarkt-Steckdosen des Sets angesteuert werden.

Jetzt können die Steckdosen schlussendlich mit Hilfe von Homematic angesteuert werden. Die Einbindung in das Apple Homekit erfolgt automatisch über die Gruppenzuordnung in Homematic. Zum Aufbau dieser Schnittstelle gibts einen separaten Beitrag 😉

Ein Kommentar

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.