Somfy RTS-Storen von einem PC aus steuern

Vor einiger Zeit hat mir ein Bekannter mit Elektriker-Ausbildung gezeigt, dass unsere Wandschalter zum Steuern der Fensterstoren (Lamellen) mit einem Schraubenzieher ganz einfach aus der Fassung zu hebeln sind. Im Grunde ist es nur eine Platine, gespiesen von einer Flachbatterie, mit drei Knöpfen, die über Funksignale die Motoren unserer Lamellen steuern.

Dem Schalter ist zu entnehmen, dass es sich um ein Produkt des französischen Herstellers Somfy handelt.

Nachdem ich den Schalter von der Wand entfernt hatte, konnte ich auf dem Rücken der Platine die genaue Typenbezeichnung unserer Storen lesen: Somfy Centralis RTS (Handbuch).

Daraufhin machte ich mich auf die Suche nach Handbüchern und Steuerungen.

Rasch war nach der Lektüre des Handbuchs klar, dass sich die Motoren der Storen mit weiteren (offiziellen) Schaltern paaren lassen. Hierzu dient der Knopf „PROG“ auf der Rückseite bereits verbundener Schalter, die einen Motor in den „Paarungsmodus“ setzen.

Auf Ricardo ersteigerte ich mir deshalb kurzerhand zwei weitere solche Schalter mit der Idee, einen davon auf dem Nachttisch zu platzieren, und den anderen portabel zu belassen.

Doch das ist heutzutage, im Zeitalter der Heimautomation, nur die halbe Miete: Diese Dinger muss man von einem PC aus steuern können, denn dann kann man nämlich nette Automationen bauen. Beispielsweise die Storen bei Sonnenaufgang hochfahren, bei Sonnenuntergang herunterfahren, oder wenn es zu heiss wird (bedingt Temperatursensoren auf dem Fenstersims) herunterfahren, damit sich die Zimmer nicht unnötig aufheizen.

USB-Fernbedienung eines Drittherstellers

Nach etwa einer Stunde Google stiess ich auf das Gerät RFXtrx433XL USB HA controller des Herstellers RFXCOM, welche auf dem auch von Somfy verwendeten Frequenzband 433 MHz sendet und empfängt.

Ohne lange zu überlegen habe ich mir dann über den Schweizer Online-Shop Swiss Domotique ein Exemplar dieses Geräts geleistet; heute Dienstag ist es nun per Paketpost angekommen.

USB-Fernbedienung mit den Somfy Motoren verbinden

Hierzu ist leider ein Windows-PC nötig, auf welchem man die offizielle Software RFXmngr installiert (Download). Sobald das geschehen ist, verbindet man die USB-Fernbedienung mit dem Computer, startet das Programm und verbindet sich auf die Fernbedienung.

Im besten Fall füllt sich das Log im gelben Bereich des Tools bereits jetzt von alleine, wenn der Empfänger Signale in der Luft auffängt. Bei mir war dies der Fall; jemand in der Nachbarschaft scheint einen Oregon Scientific Temperatursensor zu betreiben:

16.07.2019 07:44:06:777
Packettype = TEMP_HUM
subtype = TH1 - THGN122/123/132,THGR122/228/238/268
channel 1
Sequence nbr = 0
ID = D401 decimal:54273
Temperature = 23.8 °C
Humidity = 22
Status = Dry
Signal level = 5 -80dBm
Battery = Low

Um die drei Motoren in unserer Mietwohnung zu paaren, bin ich der französischen, bebilderten Anleitung auf einem Blog gefolgt. Ich habe die Storen jeweils ganz hochgefahren, denn würde mit dem Paaren etwas komplett schief laufen und der bestehende Schalter auch die Verbindung zum Motor verlieren, würde jedenfalls immer noch Tageslicht in den Raum fallen. Anschliessend habe ich mit einem flachen Schraubenzieher den Schalter aus der Fassung rausgehebelt, damit ich Zugang zum jeweiligen PROG-Knopf besass. Als nächstes wechselte ich in der Software auf das Tab RFY, stellte dort eine frei gewählte fünfstellige ID sowie den einstelligen Unit Code ein (diese Zahlen unbedingt aufschreiben, mitsamt dem zugewiesenen Motor), setzte das Dropdown auf Program. Nun drückte ich den PROG-Knopf, bis sich die Storen kurz bewegten — das Signal, dass der Motor nun für die Paarung mit einer zusätzlichen Fernbedienung bereit ist. Anschliessend drückte ich in der Software auf Transmit, worauf sich die Storen noch einmal kurz bewegten. Die Paarung war somit abgeschlossen, und ab sofort konnte ich über das Dropdown in der Software Kommandos an die Store übermitteln.

Ich entschied mich, für jeden Motor eine eigenständige ID sowie einen Unit Code auszuwählen — denn, so denke ich mir, mit einem Script kann ich ja problemlos alle Storen in Serie herunter- oder hochfahren. Mindestens einen der Original Somfy-Schalter, welche ich auf Ricardo ersteigert habe, werde ich hingegen mit allen drei Motoren gleichzeitig paaren und so mittels eines Knopfdrucks alle Storen in der Wohnung hoch- oder herunterfahren.

Programmierung

Um meine Storen zu steuern möchte ich aber a) keinen Windows-PC in meinem Netzwerk am Laufen haben und b) auch nicht ein Win32-Software-GUI von RFXCOM verwenden — denn ein GUI ist nicht scriptbar. Somit machte ich mich auf die Suche nach einer Möglichkeit, das USB-Gerät an einen Linux-PC anzuschliessen und dann mit einer Programmiersprache zu steuern.

Fündig wurde ich bei der offiziellen nodejs-Bibliothek des Herstellers selber, freundlicherweise auf Github gehostet: rfxcom/node-rfxcom.

Installiert wird dies — ein funktionierendes nodejs vorausgesetzt — mittels …

# npm install rfxcom

Folgende Minimalvariante eines nodejs-Scripts lässt die Motoren bewegen:

var rfxcom = require('rfxcom');
var rfxtrx = new rfxcom.RfxCom('/dev/ttyUSB1', {debug: true});
var rfy = new rfxcom.Rfy(rfxtrx, rfxcom.rfy.RFY);
rfxtrx.initialise(function () {
rfy.doCommand('0x00000/0', 'up', function(err, res, sequenceNumber) {
if (!err) {
console.log('Action succeeded');
process.exit(0);
}
else {
console.log('ERROR[' + res + ']: ' + err + ' with sequenceNumber=' + sequenceNumber);
process.exit(1);
}
});
});

Erläuterungen:

/dev/ttyUSB1: An welchem USB-Port hängt der RFXtrx433XL? Vgl. auch nachfolgende Erläuterungen mit dmesg

0x00000/0: Die ID und Unit des Motors, getrennt mit einem Slash. Entspricht der ID und der Unit, welche man im Software-GUI bei der Initialisierung eingegeben hat. Bei mir war keine Umrechnung in Hex nötig; einfach so eingeben, wie die Nummer im GUI ausgewählt wurde.

up: Das zu sendende Kommando. Im Software-GUI sind alle Kommandos aufgeführt; ich persönlich brauche aber derzeit nur „up“ sowie „down“. In der nodejs-Bibliothek sind die verfügbaren Befehle auch erwähnt (siehe „RfyCommands“).

Um herauszufinden, auf welchem USB-Port das Gerät lauscht, reicht ein Blick in die Ausgabe des Befehls dmesg:

...
[74849.641113] usb 1-1.2: new full-speed USB device number 7 using ehci-pci
[74849.756549] usb 1-1.2: New USB device found, idVendor=0403, idProduct=6015, bcdDevice=10.00
[74849.756556] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[74849.756560] usb 1-1.2: Product: RFXtrx433XL
[74849.756564] usb 1-1.2: Manufacturer: RFXCOM
[74849.756567] usb 1-1.2: SerialNumber: 00000000
[74849.788659] usbcore: registered new interface driver ftdi_sio
[74849.788692] usbserial: USB Serial support registered for FTDI USB Serial Device
[74849.788949] ftdi_sio 1-1.2:1.0: FTDI USB Serial Device converter detected
[74849.789022] usb 1-1.2: Detected FT-X
[74849.790248] usb 1-1.2: FTDI USB Serial Device converter now attached to ttyUSB1

Für Nicht-root-Benutzer ausführbar machen

Damit das finale Script auch normale Linux-Benutzer ausführen können, muss man den gewünschten Benutzer noch der Benutzergruppe dialout zuweisen, damit er auf die USB-Schnittstelle zugreifen kann:

# adduser santa dialout

Nächste Schritte

Ein Web-Interface bauen, über welches man — bspw. im Bett liegend — die Storen betätigen kann

Das Script mit anderen Scripts koppeln, die bspw. bei erhöhter Temperatur am Fenstersims reagieren