Funksteckdosen schalten mit der Harmony und dem Arduino (IR/RF Konverter)

Hallo,
ich möchte euch zeigen, wie ihr eure Funksteckdosen mit der Harmony steuern könnt (oder jeder anderen Infrarotfernbedienung). Die Harmony kann bekanntlich nur Infrarot Signale senden, jedoch keine 433MHz Signale. Hier kommt der Arduino Leonardo ins Spiel der, das Infrarotsignal in ein 433MHz Signal “umwandelt”. Der Arduino Leonardo funktioniert als IR/RF Konverter

Was wird gebraucht?
Da ich gerne den Laden Segor unterstützen möchte, hier Links zu den Bauteilen bei Segor.de (Amazon Links sind ganz unten.)

Arduino Leonardo (26,18€)
Kabel Andere Kabel gehen natürlich auch (2,60€)
Mini Breadboard (2,70€)
433MHz Sender/Empfänger (3,90€)
IR Receiver TSOP31236 (1,30€)

Gesamt: ca. 37€

Hardware:
Es weren Funksteckdosen mit einstellbaren DIP Schaltern benötigt. (z.B. diese hier). Wichtig ist, dass man die Funksteckdosen mittels DIP-Schalters kodieren kann.
Als erstes solltet ihr die Hardware an den Arduino Leonardo anschließen, folgt dazu einfach dem Bild unten. Ich habe das Mini Breadboard einfach in der Mitte auf den Arduino Leonardo geklebt, so habe ich nur eine “Platine” wo sämtliche benötigte Hardware drauf ist

Hier noch der Schaltplan:

Software:
Nun kommen wir zur Software. Dazu habe ich 4 kleine Programme vorbereitet.

Programm 1:
Mit der Hilfe dieses Programms könnt ihr den Infrarotempfänger auslesen. Um den Infrarotempfänger auszulesen, gibt es eine fertige Library, die ihr hier (https://codeload.github.com/shirriff/Arduino-IRremote/legacy.zip/master) laden könnt. Um die Library mit dem Arduino bekannt zu machen, müsst ihr diese ins Arduino Programm importieren. Geht dazu auf [Sketch->Inculde Libary-> ADD .ZIP Library]. Dazu müsst ihr das Programm als erstes mit dem Pfeil auf den Arduino Leonardo laden und dann mittels des Hakens ausführen. Nachdem das geschehen ist, führt der Leonardo dieses Programm aus, sobald er mit Strom verbunden ist.
(Quelle: http://majsterkowo.pl/en/how-to-control-any-home-appliance-using-a-tv-remote-and-an-arduino/)

 #include <IRremote.h>
#define irPin 11
IRrecv irrecv(irPin);
decode_results results;
 
void setup() {
   Serial.begin(9600);
   irrecv.enableIRIn();
}
 
void loop() {
   if (irrecv.decode(&results)) {
      Serial.print("0x");
      Serial.println(results.value, HEX);
      delay(250);
      irrecv.resume();
      }
}

Gesagt getan aber man sieht nichts, der Arduino tut jedoch bestimmt seine Arbeit. Um zu sehen, was der Arduino macht, gibt es in dem Arduino Program auf dem Rechner unter [Tools->Serial Monitor] den Serial Monitor, der dem Arduino ermöglicht mit uns zu kommunizieren. Nun zeigt der Arduino Leonardo in dem Serial Monitor den Infrarot Code an, sobald man eine Fernbedienung vor den Arduino hält und eine beliebige Taste drückt. Den dort angezeigten Code solltet ihr euch notieren. Den brauchen wir noch!
Ihr solltet die Taste eventuell mehrmals drücken, da bei der AN/AUS Taste meist unterschiedliche Signale gesendet werden. (Eins zum Einschalten und eins zum Ausschalten). Falls ihr keine Infrarot Codes angezeigt bekommt, überprüft noch einmal die Schaltung.

Programm 2:
Als nächstes testen wir unseren 433 MHz Sender. Das tuen wir mit diesem Code. Bevor wir ihn jedoch auf den Arduino Leonardo laden, müssen wir erneut eine Library hinzufügen. Die passende Library mit dem Namen RCSwitch könnt ihr euch hier downloaden und wie oben beschrieben, dem Arduino Programm beifügen.
(Quelle: http://physudo.blogspot.de/2013/08/home-automation-mit-dem-arduino-und-433_12.html)

 #include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();

void setup() {

  //Sender ist mit Pin 8 verbunden  
  mySwitch.enableTransmit(8);
  
}

void loop() {

  //Einschalten
  //der erste Parameter ist die Stellung der ersten fünf DIP-Schalter, 
  //der zweite Parameter die Stellung der restlichen fünf
  mySwitch.switchOn("10101", "00010");

  //Warte...
  delay(1000);
  
  //Ausschalten
  mySwitch.switchOff("10101", "00010");
  
  //Warte...
  delay(1000);
  
}

Hier müsst ihr jeweils den Hauscode und den Unitcode ändern. Nun ladet ihr das Programm wieder auf den Arduino Leonardo und führt es mittels des Hakens aus. Die Funksteckdose sollte nun immer wieder An- und Ausgehen. Ich empfehle die Funksteckdose vor eine Lampe zu stecken, damit man besser kontrollieren kann, ob sich die Steckdose eingeschaltet hat. Auch hier gilt wieder, sollte etwas nicht funktionieren, überprüft eure Schaltung.

Zwischenfazit:
Wir können mittels des Infrarotempfängers Infrarotcodes von beliebigen Fernbedienungen auslesen. Wir können eine an eine Funksteckdose angeschlossene Lampe blinken lassen.

Programm 3:
Als nächstes kombinieren wir beide Programme und testen sie über den Serial Monitor.
Dazu erstellen wir ein neues Programm mit folgendem Code:

 #include <IRremote.h>
#define irPin 11
IRrecv irrecv(irPin);
decode_results results;

void setup() {
   Serial.begin(9600);
   irrecv.enableIRIn();
}

void loop() {
   if (irrecv.decode(&results)) {

      switch (results.value) {
         case 0x17B4A228: //Hier müsst ihr euren notierten Infrarotcode einfügen
            Serial.println("SteckdoseOn");
            break;
         }

         switch (results.value) {
         case 0x530DB67C: //Hier müsst ihr euren notierten Infrarotcode einfügen
            Serial.println("SteckdoseOff");
            break;
         }

   irrecv.resume();
   }
}

Hat alles funktioniert, sollte im Serial Monitor abwechselnd “SteckdoseOn” und “SteckdoseOff” angezeigt werden.

Programm 4:
Soweit so gut, jetzt kommen wir zum fertigen Programm, das unseren IR/RF Converter voll funktionsfähig macht.

 #include <IRremote.h>
#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();

#define irPin 11
IRrecv irrecv(irPin);
decode_results results;


void setup() {
   Serial.begin(9600);
   irrecv.enableIRIn();
   //Sender ist mit Pin 8 verbunden  
   mySwitch.enableTransmit(8);
}

void loop() {
   if (irrecv.decode(&results)) {

      switch (results.value) {
         case 0x17B4A228: //Hier müsst ihr euren notierten Infrarot code einfügen
            Serial.println("SteckdoseOn");
            mySwitch.switchOn("10101", "10000");
            break;
         }

      switch (results.value) {
         case 0x530DB67C: //Hier müsst ihr euren notierten Infrarot code einfügen
            Serial.println("SteckdoseOff");
            mySwitch.switchOff("10101", "100000");
            break;
         }

   irrecv.resume();
   }
}

Taadaa! Wir können mit der Harmony oder jeder anderen Infrarotfernbedienung Funksteckdosen schalten.

Amazon Einkaufsliste:
Arduino Leonardo (22€)
Kabel Andere Kabel gehen natürlich auch (2,50€)
[Mini Breadboard](http://www.amazon.de/gp/product/B00D8XY73M/ref=as_li_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=B00D8XY73M&linkCode=as2&tag=forumde-21&linkId=Y6HSNPARC2VJ6ATX">Mini Breadboard<img) (3,10€)
[433MHz Sender/Empfänger](http://www.amazon.de/gp/product/B00OLI93IC/ref=as_li_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=B00OLI93IC&linkCode=as2&tag=forumde-21&linkId=RHTIZRP2R2V4R5ZD">433 MHz Funk- Sende und Empfänger<img) (5,00€)
IR Receiver TSOP31236 (1,30€)

Gesamt: ca. 34€

Es ist meine erste Anleitung also habt bitte etwas nachsehen mit mir!

janmarvin: Es ist meine erste Anleitung also habt bitte etwas nachsehen mit mir!

Hallo, willkommen im Forum! Ich gratuliere Dir zu dem Mut, etwas veröffentlich zu haben! Mein erster Eindruck: super! Also 99% Lob!

Nun zu den 1%: "... mit der Harmony ..." Muß man diese Fernbedienung kennen, wo gibt es die zu kaufen? Ich habe mit einem UNO und einem anderen Sensor die Fernbedienungen im Haushalt getestet und dabei festgestellt, daß manche problemlos funktionierten, manche nicht. Wie man auch bei segor.de sehen kann, gibt es bei den IR-Empfängern unterschiedliche Frequenzen, die zur Fernbedienung passen müssen. Würde ich Dein Projekt nachbauen wollen, würde ich eventuell genau Deine Fernbedienung kaufen wollen, um eine Fehlerquelle weniger zu haben.

Die Einstellung des Hauscodes ist womöglich etwas kurz ausgefallen. Ich habe diese Funksteckdosen nicht, daher auch keine Vorstellung, wie Hauscode und "10101", "00010" zusammenhängen. Wäre eventuell ein Foto oder eine Zeichnung hinsichtlich der Reihenfolge hilfreich?

Bei den Funksteckdoesen gibt es auch Dimmer, können diese auch angesteuert werden?

hi,

Nun zu den 1%: "... mit der Harmony ..." Muß man diese Fernbedienung kennen

logitech harmony, ist eigentlich sehr bekannt. kann alles schalten.

gruß stefan

Du wohnst halt in einer Weltstadt, da gehört so eine schicke Fernbedienung, die sogar Bluetooth kann, zum Wohnungsstyle. Ich habe halt nur Grundig und Samsung :sob:

hi,

ach gott, seit berlin wieder “eins” ist, habt Ihr ja auch eine weltstadt.

ich hab’ die harmony one, da gibt’s kein bluetooth.

gruß stefan

ich sehe da mal gleich ein Problem eine Breadbord für ein Produktives System zu verwenden. Die sind nicht zuverlässig genug. Die Schaltung muß gelotet werden. Grüße Uwe

Hallo zusammen.

Erstmal ein Lob für die gute Anleitung.

Es läuft auch soweit alles bei mir, allerdings möchte ich auf der IR Fernbedienung nur eine Taste nutzen, um die Steckdose ein- bzw aus zu schalten.

Kann mir jemand den Sketch dementsprechend umschreiben? Das bekomme ich einfach nicht hin.

Danke im Vorraus!

Vielleicht so? (ungetested)

#include <IRremote.h>
#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();

#define irPin 11
IRrecv irrecv(irPin);
decode_results results;


void setup() {
  Serial.begin(9600);
  irrecv.enableIRIn();
  //Sender ist mit Pin 8 verbunden
  mySwitch.enableTransmit(8);
}

bool SteckdoseOn = false;

void loop() {
  if (irrecv.decode(&results)) {
    switch (results.value) {
      case 0x17B4A228: //Hier müsst ihr euren notierten Infrarot code einfügen
      case 0x530DB67C: //Hier müsst ihr euren notierten Infrarot code einfügen
        if (SteckdoseOn) {
          SteckdoseOn = false;
          Serial.println(F("SteckdoseOff"));
          mySwitch.switchOff((char*)"10101", (char*)"100000");
        } else {
          SteckdoseOn = true;
          Serial.println(F("SteckdoseOn"));
          mySwitch.switchOn((char*)"10101", (char*)"10000");
        }
    }
    irrecv.resume();
  }
}

Danke für die schnelle Antwort.

Was ich aber immer noch nicht verstehe ist, das ich ja nur einen FB Code habe.

Soll ich den zweimal eintragen?

Wenn du nur eine Taste mit der Funktion haben willst könntest du ein case entfernen/auskommentieren.
Oder in ein if verwandeln, gibt ja nur eine Möglichkeit und kein Defaultverhalten.

#include <IRremote.h>
#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();

#define irPin 11
IRrecv irrecv(irPin);
decode_results results;


void setup() {
  Serial.begin(9600);
  irrecv.enableIRIn();
  //Sender ist mit Pin 8 verbunden
  mySwitch.enableTransmit(8);
}

bool SteckdoseOn = false;

void loop() {
  if (irrecv.decode(&results)) {
    if (results.value == 0x17B4A228) { //Hier müsst ihr euren notierten Infrarot code einfügen
      if (SteckdoseOn) {
        SteckdoseOn = false;
        Serial.println(F("SteckdoseOff"));
        mySwitch.switchOff((char*)"10101", (char*)"100000");
      } else {
        SteckdoseOn = true;
        Serial.println(F("SteckdoseOn"));
        mySwitch.switchOn((char*)"10101", (char*)"10000");
      }
    }
    irrecv.resume();
  }
}

Jetzt kommt grad der Moment wo ichs kapiere :-)

Dankeschön!

Kein Problem, gern geschehen.

Guten Morgen zusammen,

Irgendwie werden der Arduino und ich noch nicht so richtig warm...

Eins vorweg, die Schaltung läuft einwandfrei.

Möchte jetzt nur doch gerne noch ne zweite Taste hinzufügen,was aber schon wieder zu Fehlern beim kompilieren führt.

Meine Harmony sendet beim ausschalten immer noch einen separaten Befehl mit, sozusagen "Alles Aus".

Diesen Befehl möchte ich nutzen, um, unabhängig vom Schaltzustand der Steckdose, dieser Steckdose ein "Ausschalt- Signal" zu senden.

Ich hatte gedacht das könnte ich über eine wettere "else" Variable einfügen, klappt aber nicht...

Wäre nochmal jemand bereit mir den nötigen Denkanstoß zu geben?

So sollte es gehen

#include <IRremote.h>
#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();

#define irPin 11
IRrecv irrecv(irPin);
decode_results results;


void setup() {
  Serial.begin(9600);
  irrecv.enableIRIn();
  //Sender ist mit Pin 8 verbunden
  mySwitch.enableTransmit(8);
}

bool SteckdoseOn = false;

void loop() {
  if (irrecv.decode(&results)) {
    if (results.value == 0x17B4A228) { //Hier müsst ihr euren notierten Infrarot code einfügen
      if (SteckdoseOn) {
        SteckdoseOn = false;
        Serial.println(F("SteckdoseOff"));
        mySwitch.switchOff((char*)"10101", (char*)"100000");
      } else {
        SteckdoseOn = true;
        Serial.println(F("SteckdoseOn"));
        mySwitch.switchOn((char*)"10101", (char*)"10000");
      }
    } else if  (results.value == 0x17B4A228) { //alles-aus code
      SteckdoseOn = false;
      Serial.println(F("SteckdoseOff"));
      mySwitch.switchOff((char*)"10101", (char*)"100000");
    }
    irrecv.resume();
  }
}

Ich danke dir!

Oh man, da muss ich noch viel lernen, hab mir grad erstmal ein Buch bestellt :-)

Der Raspberry und ich sind ja schon Freunde, aber der Arduino und ich wir lernen uns grad kennen ;-)

Hallo zusammen.

Ich bin recht neu hier wollte mich an dieser Schaltung zum Steuern von Funksteckdosen versuchen. Leider werden bei mir die Bilder vom Schaltplan nicht angezeigt... Kann mir jemand die Bilder per Email schicken? Oder irgendwie zukommen lassen? Wie gesagt bin recht neu und ohne die Vorgeschriebenen Programme mit Schaltplan und der guten Erklärung wird das wohl nichts...

Vielen danke schon mal für euer Hilfe

thommyB: Hallo zusammen.

Ich bin recht neu hier wollte mich an dieser Schaltung zum Steuern von Funksteckdosen versuchen. Leider werden bei mir die Bilder vom Schaltplan nicht angezeigt... Kann mir jemand die Bilder per Email schicken? Oder irgendwie zukommen lassen? Wie gesagt bin recht neu und ohne die Vorgeschriebenen Programme mit Schaltplan und der guten Erklärung wird das wohl nichts...

Vielen danke schon mal für euer Hilfe

Die hat der TO wohl schon wieder entfernt, sind keine mehr da.

Edit:

Beschreibe doch mal genauer, was du machen möchtest.

Okay schade trotzdem danke für die schnelle Antwort :)

Ich habe mir einen Arduino UNO gekauft und alle Teile die ich laut dieser Anleitung brauche um mit meiner Logitech Fernbedienung die Funksteckdosen zu steuern.

Leider bekomme ich es Ohne den Schaltplan nicht wirklich hin. Und um alles alleine zu Programmieren und es richtig zu machen kenne ich mich leider zu schlecht mit der Ganzen Materie aus...

Um es mal ein bisschen genauer zu beschreiben:

Ich habe hier zwei Funksteckdosen die mein Komplettes TV-System steuern Ps4/Xbox/Pioneer Receiver usw.

Im moment muss ich immer alles mit der Kleinen weisen Fernbedienung steuern die bei den Steckdosen dabei war. Mein Wunsch währe es das alles über die Logitech zu steuern und beim Ausschalten eine Verzögerung von 10 bis 15 sec zu haben. Werden die Steckdosen nämlich zu Früh ausgeschalten verliert der Audio Receiver alle gespeichertetn Einstellungen, ziemlich nervig :)

Das ist doch kein Problem. Es gibt genug Anleitungen und Tutorials im Netz. Die Software kannst du teilweise von hier nehmen.