SomfyDuino: USB-zu-Somfy-IO-Adapter für Arduino Nano
Komponenten und Zubehör
| Komponente | Menge |
|---|---|
| Arduino Nano R3 | 1 |
| Flachbandkabel (7-adrig) | 1 |
| Somfy IO Handsender (z. B. GX037, 1-Kanal) | 1 |
Benötigte Werkzeuge
- Lötkolben (Standard)
Über dieses Projekt
Idee
Ich wollte meine Rollläden (Somfy IO) in meine private Hausautomation einbinden, ohne Cloud-Hardware des Herstellers zu nutzen. Lösung: Ein Arduino Nano simuliert die Tastendrücke des Original-Handsenders per USB-Befehl. Es funktioniert!
Benötigtes Material
- Somfy IO Handsender (ich nutzte GX037, 1-Kanal)
- Fast jeder Arduino mit USB-Anschluss (SoftSerial geht auch)
- 7-adriges Flachbandkabel + Schrumpfschlauch für saubere Verlegung
Verkabelung gemäß Schaltplan. Der Handsender wird vom Arduino mit Strom versorgt (ca. 20 mA beim Senden) – Batterie unbedingt entfernen!
Zur Software
Für die Anbindung an z. B. einen Raspberry Pi empfiehlt es sich, alle Serial.print-Ausgaben zu entfernen – der Arduino soll nur zuhören und Befehle ausführen.
Die Befehlssyntax ist im Code erklärt.
Viel Spaß – Kommentare willkommen!
Cheers, Björn
P.S.: Der SELECT-Knopf ändert bei meinem 1-Kanal-Sender nicht den Kanal, stört aber auch nicht.
Code: Serial-zu-Somfy-Adapter
// SomfyDuino
// by Björn Foldenauer, 05/2017
int progPin = 8;
int upPin = 12;
int downPin = 10;
int myPin = 11;
int selectPin = 9;
int ledPin = 13;
bool upPress = false, downPress = false, myPress = false;
bool progPress = false, selectPress = false;
unsigned long holdTime = 0;
int repeatSend = 0;
char incomingChar;
void setup() {
Serial.begin(9600);
Serial.println("SomfyDuino 0.71");
Serial.println("Bjoern Foldenauer");
Serial.println("-----");
Serial.println("Empfängt einzelne Serial-Zeichen:");
Serial.println("u - UP vorbereiten");
Serial.println("d - DOWN vorbereiten");
Serial.println("m - MY vorbereiten");
Serial.println("p - PROG vorbereiten");
Serial.println("s - SELECT vorbereiten");
Serial.println("r - Wiederholungszähler +1");
Serial.println("Ziffer X - Haltezeit + X*100 ms");
Serial.println("e - EXECUTE: definierten Tastendruck ausführen");
Serial.println("");
Serial.println("Beispiel: normales UP: u5e");
Serial.println(" 3 Sek. UP/DOWN: ud9993e");
Serial.println(" 5 Sek. PROG: p999995e");
pinMode(progPin, OUTPUT);
pinMode(upPin, OUTPUT);
pinMode(downPin, OUTPUT);
pinMode(myPin, OUTPUT);
pinMode(ledPin, OUTPUT);
pinMode(selectPin, OUTPUT);
// Alle Ausgänge HIGH (inaktiv, da Taster gegen GND schalten)
digitalWrite(progPin, HIGH);
digitalWrite(upPin, HIGH);
digitalWrite(downPin, HIGH);
digitalWrite(myPin, HIGH);
digitalWrite(selectPin, HIGH);
digitalWrite(ledPin, LOW);
}
void loop() {
while (Serial.available() == 0) delay(50);
if (Serial.available() > 0) {
incomingChar = Serial.read();
Serial.println(incomingChar);
switch (incomingChar) {
case 'u': upPress = true; break;
case 'd': downPress = true; break;
case 'm': myPress = true; break;
case 'p': progPress = true; break;
case 's': selectPress = true; break;
case '1': holdTime += 100; break;
case '2': holdTime += 200; break;
case '3': holdTime += 300; break;
case '4': holdTime += 400; break;
case '5': holdTime += 500; break;
case '6': holdTime += 600; break;
case '7': holdTime += 700; break;
case '8': holdTime += 800; break;
case '9': holdTime += 900; break;
case 'r': repeatSend++; break;
case 'e': somSend(); break;
}
}
}
void somSend() {
Serial.print("Drücke: ");
for (int i = 0; i <= repeatSend; i++) {
if (upPress) { digitalWrite(upPin, LOW); Serial.print("up "); }
if (downPress) { digitalWrite(downPin, LOW); Serial.print("down "); }
if (myPress) { digitalWrite(myPin, LOW); Serial.print("my "); }
if (progPress) { digitalWrite(progPin, LOW); Serial.print("prog "); }
if (selectPress) { digitalWrite(selectPin, LOW); Serial.print("select "); }
digitalWrite(ledPin, HIGH);
Serial.print("für ");
Serial.print(holdTime);
Serial.println(" ms");
delay(holdTime);
// Alle Tasten loslassen
digitalWrite(progPin, HIGH);
digitalWrite(upPin, HIGH);
digitalWrite(downPin, HIGH);
digitalWrite(myPin, HIGH);
digitalWrite(selectPin, HIGH);
digitalWrite(ledPin, LOW);
delay(holdTime); // Pause zwischen Wiederholungen
}
// Zurücksetzen
upPress = downPress = myPress = progPress = selectPress = false;
holdTime = 0;
repeatSend = 0;
Serial.println("fertig.");
}
Schaltpläne



Herstellungsprozess
- Remote-Wetterüberwachung mit Raspberry Pi 3 & PubNub
- Professionelle Raspberry Pi Universalfernbedienung mit LIRC bauen
- IR-Fernbedienungsbefehle auf Raspberry Pi ohne LIRC erfassen: Python UART-Ansatz
- Fern-Herzfrequenz-Überwachung mit AWS IoT Alarmen
- SMS-gesteuerter Smart AC Power Switch mit Raspberry Pi & Hologram
- ROObockey: Präzisionsunterstützter ferngesteuerter Street-Hockey-Roboter
- Cloud Monitoring: Fernsteuerungssystem für Echtzeit-Asset-Management
- 5 Schlüsselvorteile der ferngesteuerten Produktionskontrolle für die moderne Industrie
- Sicheren Remote-gRPC-Zugriff mit grpcurl auf PLCnext-Geräten
- Top 3 Vorteile von Fernüberwachung für Fertigungseffizienz