Handschlag drauf (Linux-Magazin, Februar 2016)

Ob Lampen per Fernsteuerung übers Internet angehen, oder eine Pumpe täglich die Topfpflanzen wässert: Home-Automation erobert die Heime der Bastler. Die Z-Wave-Technologie bietet preiswerte Geräte, die zuverlässig steuern und regeln.

Mit dem Einzug von preiswerten Mini-Rechnern wie dem Raspberry Pi schießen mir die Ideen zur Heim-Automatisierung gleich dutzendweise durch den Kopf: Wie kann ich auf meinem Mobiltelefon von unterwegs aus sehen, ob daheim der Trockner für meinen Surfanzug noch an ist und ihn notfalls ausstellen? Ist die Wohnungstür zu? Steht irgendetwas unter Wasser? Dergleichen treibt mich schon seit geraumer Zeit um, und treue Leser werden sich vielleicht an die in die Jahre gekommenen Artikel zum Internet-gesteuerten Lampenschalter und der wettergesteuerten Pflanzenbewässerung ([2] und [3]) erinnern.

Letztlich ergibt sich bei diesen und ähnlichen Anwendungen immer der gleiche Ablauf, dass nämlich ein Sensor einen Wert wie etwa Helligkeit oder Feuchtigkeit an einen Controller meldet, der wiederum einen Aktor anwirft, wie ein Relais, das eine Lampe oder Pumpe anschaltet. Dort stellt sich dann oft Problem, dass die Steuereinheit weit weg ist und das Signal drahtlos zum Aktor gelangen muss, denn wer hat den steuernden Rechner schon direkt am Blumentopf stehen?

Standart-Wirrwarr

Eine ganze Reihe mehr oder weniger standartisierter Technologien widmet sich diesem Thema ([4]). Nach Jahren des Verdrusses mit dem in den USA gängigen X10-Verfahren, das unzuverlässig über die Stromleitung kommuniziert, fand ich neulich heraus, dass die sogenannte Z-Wave-Technik sowohl in Europa als auch Amerika weit verbreitet ist und mittels eines drahtlosen Handshake-Protokolls nicht nur tadellos zuverlässig funktioniert, sondern auch noch relativ preiswert ist.

Abbildung 1: Der Controller Aeon Labs DSA02203-ZWUS Z-Wave Z-Stick zum Einstöpseln in den USB-Port eines PCs.

Zum Einstieg erwarb ich einen Z-Wave-zertifizierten Mini-Controller namens "Z-Stick" der Firma Aeon Labs ([5], Abbildung 1) für 35 Dollar und einen "Smart Energy Switch" zum Anschalten von elektrischen Verbrauchern für 24 Dollar ([6], Abbildung 2). Der "Z-Stick" ist ein USB-Dongle, den man in den USB-Port eines PCs steckt, der dann über den Stick drahtlos Werte von Sensoren empfängt und Signale an Aktoren aussendet.

Abbildung 2: Der Z-Wave Smart Energy Switch (Aeon Labs DSC06106-ZWUS) empfängt drahtlose Signale und schaltet elektrische Verbraucher ein und aus.

Installation auf Ubuntu

Die Installation des USB-Dongles ging praktisch geräuschlos vonstatten, denn Ubuntu 14.04 erkannte ihn sofort, und legte, wie aus dem Syslog-Eintrag in Abbildung 3 ersichtlich, ein neues Device unter /dev/ttyUSB0 an. Da der Device-Eintrag dem User root und der Gruppe dialout gehört und die Zugriffsrechte crw-rw---- hat, muss ein darauf zugreifendes Skript unter einem User laufen, der zur Gruppe dialout gehört. Wer sich nicht darum schert, welcher User damit Geräte ein und ausschaltet, darf die Zugriffsrechte auch mit sudo chmod a+rw /dev/ttyUSB0 lockern.

Abbildung 3: Ubuntu erkennt den ZWave-USB-Stick sofort nach dem Einstöpseln.

Erste Schritte

Als ersten Schritt in die Welt der ZWave-Kommunikation wählte ich das Perl-Skript zwave_s, das eine Firma namens bigsister.ch ([7]) zum Download anbietet, und das nach der Installation eines CPAN-Moduls zur Kommunikation auf dem USB-Port mit cpanm Device::SerialPort tadellos funktionierte. Abbildung 4 zeigt, wie das Kommando zwave_s add erst den USB-Dongle initialisiert und anschließend eine Meldung ausgibt, nach der der User einen Knopf auf dem anzusteuernden Gerät, in diesem Fall dem Energy Switch, zu drücken hat. Das tat ich, und zwave_s wies, wie aus der Ausgabe ersichtlich, dem Schalter die Nummer 3 zu. Auf das anschließend aufgerufene Kommando zwave_s switch 3 on schickte der USB-Controller ein drahtloses Signal an den Switch, der tatsächlich wie von Geisterhand den in einem anderen Zimmer angesteckten elektrischen Verbraucher einschaltete. Die Reichweite des Sticks beträgt angeblich 30 Meter, bei dicken Wänden eventuell weniger. Anschließend schaltete zwave_s switch 3 off den Verbraucher wieder aus.

Abbildung 4: Das Skript zwave_s initialisiert den Energy Switch und schaltet ihn anschließend ein und aus.

Auf Github existiert ein Perl-Projekt namens p5-ZWave-Controller, das allerdings auf dem Zahnfleisch daherkommt, weil es anscheinend seit Jahren nicht gewartet wurde, und daher in die Kategorie "Abandonware" eingeordnet werden muss. Statt dessen klopfte ich schnell ein neues CPAN-Modul namens ZWave::Protocol zusammen und lud es kurz vor Redaktionsschluss dort hoch. Listing 1 zeigt eine praktische Anwendung mit dem Modul, die den oben vorgestellen Aeon Energy Switch erst ein- und dann wieder ausschaltet.

Ein und Aus

Zum Einschalten des Energy Switches schickt Listing 1 als Payload die Byte-Sequenz 0x00 0x13 gefolgt von der Node-Nummer des gewünschten Gerätes an den seriellen Port des PCs. Anschließend verlangt das Protokoll 0x03, 0x20, 0x01, gefolgt vom Dimmer-Sollwert des Schalters (0=aus, 255=ein), gefolgt von einem Byte mit dem Wert 0x05.

Wie die Ausgabe des Ein- und Abschaltvorgangs in Abbildung 5 zeigt, schnürt das CPAN-Modul aus der Payload ein Paket, indem es einen Header mit dem Wert 0x01 voranstellt, gefolgt von der Länge der nachfolgenden Bytes, sowie einer nachgestellten Prüfsumme (0x3e bzw. 0xc1 in Abbildung 5). Letztere errechnet sich gemäß des ZWave-Protokolls aus der XOR-Verknüpfung aller Bytes des Pakets, exklusive dem allerersten Header-Byte. Anschließend wird die Prüfsumme noch negiert und wandert dann ans Ende des Pakets, sodass der Empfänger den Inhalt der Nachricht auf eventuell auf dem drahtlosen Übertragungsweg umgeflippte Bits prüfen kann. Die Prüfsumme ist eine der Schwachstellen des Protokolls, denn manche Fehler werden bei nur 255 verschiedenen Prüfwerten und dem simplen Verknüpfungsverfahren einfach nicht entdeckt. Das Skript in Listing 1 hat Log4perl auf den Loglevel $DEBUG initialisiert, darum druckt es die hin- und herflitzenden Bytes mit aus, falls dies unterbleibt, tut es schweigend seinen Gang.

Listing 1: zwave-test

    01 #!/usr/local/bin/perl -w
    02 use strict;
    03 use ZWave::Protocol;
    04 use Log::Log4perl qw(:easy);
    05 
    06 Log::Log4perl->easy_init($DEBUG);
    07 
    08 my $zwave = ZWave::Protocol->new( 
    09   device => "/dev/ttyUSB0" );
    10 
    11 $zwave->connect or 
    12   die "Failed to connect to " . 
    13      $zwave->device;
    14 
    15 my $node_id = 3;
    16 
    17 for my $state ( 255, 0 ) {
    18 
    19   $zwave->payload_transmit(
    20     0, 0x13, 
    21     $node_id, 0x03, 0x20, 0x01, 
    22     $state, 0x05 );
    23 
    24    sleep 1;
    25 }

Abbildung 5: Listing 1 schaltet einen ZWave-Verbraucher ein und aus und druckt die hin- und herflitzenden Bytes.

Per Handschlag sicher

Als Pluspunkt des ZWaves-Protokolls gilt das Handshake-Verfahren, bei dem der Empfänger einer Nachricht immer gleich ein ACK-Paket zum Sender zurückschickt, damit dieser weiß, dass seine Anfrage angekommen ist und eine entsprechende Aktion ausgelöst hat. Wenn der Controller eine Wasserpumpe einschaltet, möchte er vielleicht auch gerne wissen, ob nun die Schleusen offen sind, oder ob etwas schiefgelaufen ist.

ZWave kann aber noch viel mehr als nur Verbraucher ein- und auszuschalten. Der Energy-Switch lässt sich zum Beispiel so konfigurieren, dass er regelmäßig Pakete schickt, die anzeigen, wieviel Strom gerade durch die Leitung fließt. Das ist sehr nützlich und die Steuerungssoftware kann so nicht nur Aktionen auslösen, sondern auch noch Buch darüber führen, welche Stromkosten entstehen und Alarm schlagen, wenn der Schalter eventuell manuell ausgestöpselt wurde, weil er dann keine Reports mehr sendet.

Weiter kommen Z-Wave-Aktoren auch ohne Netzstromquelle aus, so gibt es zum Beispiel drahtlos verriegelbare Türschlösser, und damit der dort installierten Batterie nicht frühzeitig der Saft ausgeht, muss das Z-Wave-Protokoll dafür sorgen, dass das Schloss immer wieder kurz aufwacht, nachsieht, ob überhaupt ein Signal in der Luft liegt, und sich sofort wieder schlafen legt, falls im Äther nichts los ist. Findet es hingegen ein Signal, fängt die Elektronik an, es zu untersuchen und falls es von einem Controller kommt, dem es traut, reagiert es auf die gesendeten Befehle. Auch erweitert Z-Wave die Reichweite eines Controllers mit einem Routing-Protokoll, bei dem andere Z-Wave-Komponenten dessen Signal weiterleiten, bis es in Reichweite des angesprochenen Aktors kommt und dieser es aufschnappen kann.

Als begleitende Lektüre kann ich den englischsprachigen Titel "Z-Wave Basics: Remote Control in Smart Homes" [8] empfehlen, der von einem deutschen Autor stammt, was man unter anderem daran ablesen kann, dass wohl sonst niemand seinen Doktortitel auf den Buchrücken schriebe und sich einige amerikanische Amazon-Rezensenten über den etwas teutonische Grammatikstil beschwerten, ein Korrekturleser wäre eine gute Investition gewesen. Die Kindle-Ausgabe kam erst kürzlich heraus und enthält einige überarbeitete Kapitel. Das Buch geht ausführlich auf die historische Entwicklung des Protokolls ein und stellt die Vor- und Nachteile konkurrierender Ansätze gegenüber. Spezialisten dürften auch die detaillierten Ausführungen zu den technischen Details des Protokolls zu schätzen wissen, obwohl das Buch nicht auf die einzelnen Bytefolgen eingeht, die der geneigte Anwender entweder über den von ZWave-Vertreiber Sigma-Designs verkauften SDK einholen muss oder über das freie Projekt openzwave.com.

Abbildung 6: Z-Wave Basics E-Book

Infos

[1]

Listings zu diesem Artikel: ftp://www.linux-magazin.de/pub/listings/magazin/2016/02/Perl

[2]

"Heimschaltwarte", Michael Schilli, Linux-Magazin 04/2007, http://www.linux-magazin.de/Ausgaben/2007/04/Heimschaltwarte

[3]

"Der Mörder ist nimmer der Gärtner", Bewässerungsanlage mit Perl-Steuerung im Eigenbau, Michael Schilli, Linux-Magazin 03/2007, http://www.linux-magazin.de/Ausgaben/2007/03/Der-Moerder-ist-nimmer-der-Gaertner

[4]

"Intelligenz im Hause", Sebastian Mogilowski , Markus Feilner, http://www.linux-magazin.de/Ausgaben/2014/01/Home-Automation/

[5]

Aeon Labs DSA02203-ZWUS Z-Wave Z-Stick Series 2 USB Dongle, http://www.amazon.com/gp/product/B003MWQ30E

[6]

Aeon Labs DSC06106-ZWUS - Z-Wave Smart Energy Switch, http://www.amazon.com/gp/product/B007UZH7B8

[7]

Testskript zur Ansteuerung des Z-Wave USB-Dongles mit Perl: http://www.bigsister.ch/zwave/zwave_s

[8]

"Z-Wave Basics: Remote Control in Smart Homes", Dr. Christian Paetz, 2013, http://www.amazon.com/dp/1490537368

Michael Schilli

arbeitet als Software-Engineer in der San Francisco Bay Area in Kalifornien. In seiner seit 1997 laufenden Kolumne forscht er jeden Monat nach praktischen Anwendungen der Skriptsprache Perl. Unter mschilli@perlmeister.com beantwortet er gerne Ihre Fragen.