Aus Linux-Magazin 02/2016

Mit dem Z-Wave-Protokoll auf dem Weg zum Smarthome

© Dennis van de Water, 123RF

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

Online PLUS

Im Screencast demonstriert Michael Schilli das Beispiel: https://www.linux-magazin.de/Ausgaben/2016/02/plus

Mit dem Einzug preiswerter Mini-Rechner 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 sehen, ob daheim der Trockner für meinen Surfanzug noch an ist, und ihn notfalls abschalten? Ist die Wohnungstür zu? Dergleichen treibt mich schon seit geraumer Zeit um. Treue Leser werden sich vielleicht an die in die Jahre gekommenen Artikel zum Internet-gesteuerten Lampenschalter [2] und über die wettergesteuerte Pflanzenbewässerung [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, zum Beispiel ein Relais, das eine Lampe oder Pumpe anschaltet. Dort stellt sich dann oft das 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?

Standard-Wirrwarr

Eine ganze Reihe mehr oder weniger standardisierter 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 so genannte Z-Wave-Technik sowohl in Europa als auch in Amerika weit verbreitet ist und mit Hilfe eines drahtlosen Handshake-Protokolls nicht nur tadellos zuverlässig funktioniert, sondern auch noch relativ preiswert ist.

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).

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

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

Abbildung 2: Der Z-Wave-Smart-Energy-Switch empfängt drahtlose Signale und schaltet elektrische Verbraucher ein und aus.

Abbildung 2: Der Z-Wave-Smart-Energy-Switch empfängt drahtlose Signale und schaltet elektrische Verbraucher ein und aus.

Der Z-Stick ist ein USB-Dongle, der in den USB-Port eines PC passt. Der empfängt dann über den Stick drahtlos Werte von Sensoren und sendet Signale an Aktoren aus. Anzumerken ist, dass Z-Wave in den USA auf dem ISM-Frequenzband sendet, was in Deutschland der Bundesnetzagentur missfällt. Es empfiehlt sich, auf eine europäische Version der Aeon-Labs-Geräte zu achten.

Installation auf Ubuntu

Die Installation des USB-Dongle 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 Z-Wave-USB-Stick sofort nach dem Einstöpseln.

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

Erste Schritte

Als ersten Schritt in die Welt der Z-Wave-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. Anschließend gibt es eine Meldung aus, wonach der User einen Knopf auf dem anzusteuernden Gerät, in diesem Fall dem Energy-Switch, zu drücken hat.

Abbildung 4: Das Skript »zwave_s« initialisiert den Energy-Switch und besorgt dann das Ein- und Ausschalten.

Abbildung 4: Das Skript »zwave_s« initialisiert den Energy-Switch und besorgt dann das Ein- und Ausschalten.

Das tat ich – und »zwave_s« wies, wie die Ausgabe zeigt, dem Schalter die Nummer 3 zu. Auf das danach aufgerufene Kommando »zwave_s switch 3 on« schickte der USB-Controller ein drahtloses Signal an den Switch, der wie von Geisterhand den im anderen Zimmer angesteckten elektrischen Verbraucher einschaltete. Die Reichweite des Sticks beträgt angeblich 30 Meter, bei dicken Wänden wohl weniger. Dann schaltete »zwave_s switch 3 off« den Verbraucher wieder 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” einzuordnen ist. Stattdessen klopfte ich schnell ein neues CPAN-Modul namens ZWave::Protocol zusammen und lud es kurz vor Redaktionsschluss dort hoch. Das Listing 1 zeigt eine praktische Anwendung mit dem Modul, die den oben vorgestellten Energy-Switch von Aeon erst ein- und dann wieder ausschaltet.

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 }

Ein und aus

Zum Einschalten des Energy-Switch schickt Listing 1 als Payload die Byte-Sequenz »0x00 0x13« , gefolgt von der Node-Nummer des gewünschten Geräts, an den seriellen Port des PC. 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« respektive »0xc1« in Abbildung 5). Letztere errechnet sich gemäß des Z-Wave-Protokolls aus der XOR-Verknüpfung aller Bytes des Pakets, doch exklusive des allerersten Header-Byte.

Abbildung 5: Das Skript in <a href="#article_l1" class="listing" title=

Listing 1 kann einen Z-Wave-Verbraucher steuern (Ein/Aus) und druckt die hin und her flitzenden Bytes mit aus.” width=”300″ height=”245″ /> Abbildung 5: Das Skript in Listing 1 kann einen Z-Wave-Verbraucher steuern (Ein/Aus) und druckt die hin und her flitzenden Bytes mit aus.

Dann wird die Prüfsumme noch negiert und wandert ans Ende des Pakets, sodass der Empfänger den Inhalt der Nachricht auf eventuell bei der drahtlosen Übertragung ausgeflippte Bits prüfen kann. Die Prüfsumme ist eine der Schwachstellen des Protokolls, denn manche Fehler vermag es bei nur 255 verschiedenen Prüfwerten und dem simplen Verknüpfungsverfahren nicht zu entdecken.

Das Skript in Listing 1 hat Log4perl auf den Loglevel »$DEBUG« initialisiert, darum druckt es die hin und her flitzenden Bytes mit aus. Falls dies unterbleibt, geht es schweigend seinen Gang.

Per Handschlag sicher

Als Pluspunkt des Z-Waves-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 wohl gerne wissen, ob nun die Schleusen offen sind oder ob etwas schiefgelaufen ist.

Z-Wave kann aber viel mehr als nur Verbraucher ein- und ausschalten. Der Energy-Switch lässt sich auch so konfigurieren, dass er regelmäßig Pakete schickt, die anzeigen, wie viel Strom gerade durch die Leitung fließt. Die Steuersoftware kann also Aktionen auslösen, Buch darüber führen, welche Stromkosten entstehen, und notfalls Alarm schlagen, wenn der Schalter manuell ausgestöpselt wurde, weil er keine Reports mehr sendet.

Riegel vor

Zudem kommen Z-Wave-Aktoren auch ohne Netzstromquelle aus, so gibt es etwa drahtlos verriegelbare Türschlösser. 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 und nachsieht, ob überhaupt ein Signal in der Luft liegt, und sich sofort wieder schlafen legt, falls im Äther nichts los ist. Findet es aber ein Signal, fängt die Elektronik an, es zu untersuchen. 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 er es aufschnappen kann.

Als begleitende Lektüre kann ich den englischsprachigen Titel “Z-Wave Basics: Remote Control in Smart Homes” 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. Die Kindle-Ausgabe ist jünger und enthält einige überarbeitete Kapitel, die auch in der verlinkten deutschen Ausgabe [8] enthalten sein dürften.

Das Buch beschreibt die historische Entwicklung des Protokolls und stellt Vor- und Nachteile konkurrierender Ansätze gegenüber. Spezialisten finden genaue Ausführungen zu den technischen Details des Protokolls, obwohl das Buch nicht auf die einzelnen Bytefolgen eingeht. Die muss der Anwender über das von Z-Wave-Vertreiber Sigma-Designs verkauften SDK einholen oder über das freie Projekt Openzwave [9].

Infos

  1. Listings zu diesem Artikel: ftp://www.linux-magazin.de/pub/listings/magazin/2016/02/Perl
  2. Michael Schilli, “Heimschaltwarte”: Linux-Magazin 04/07, S. 98, https://www.linux-magazin.de/Ausgaben/2007/04/Heimschaltwarte
  3. Michael Schilli, “Der Mörder ist nimmer der Gärtner – Bewässerungsanlage mit Perl-Steuerung im Eigenbau”: Linux-Magazin 03/07, S. 110
  4. Sebastian Mogilowski , Markus Feilner, “Intelligenz im Hause”: Linux-Magazin 01/14, S. 24, https://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-Dongle mit Perl: http://www.bigsister.ch/zwave/zwave_s
  8. Dr. Christian Paetz, “Z-Wave: Die Funktechnologie für das Smart Home”: http://www.amazon.de/Christian-P%C3%A4tz/e/B00PSPPBJW
  9. Openzwave-Projekt: http://www.openzwave.com

Der Autor

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 mailto:mschilli@perlmeister.com beantwortet er gerne Fragen.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 3 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
LINUX-MAGAZIN KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Readly Logo
E-Mail Benachrichtigung
Benachrichtige mich zu:
0 Kommentare
Älteste
Neuste Beste Bewertung
Nach oben