Z-Wave er en protokol til trådløs kommunikation med f.eks lamper og sensorer i hjemmet. Z-Wave kan bruges til at tænde, slukke, aflæse osv.
Det er muligt at lære mere om Z-Wave ved at læse en af de tidligere artikler eller gå ind på siden Z-Waves.dk.
Det er enkelt at komme i gang med at programmere til Z-Wave, man skal dog være opmærksom på, at specifikationerne ikke er offentlig tilgængelige. Eksemplet i denne artikel kan tænde eller slukke for f.eks. en lampe.
Til dette eksempel anvendes en Z-Wave USB stick fra Aeon Labs, som kan købes hos HOMEe.dk.
Driveren præsenterer Z-Wave enheden som en seriel port. Den kommunikation, der sker over seriel porten er specificeret af Zensys. Der findes en del andre Z-Wave USB sticks, som anvender samme princip. Enheder fra andre producenter kan i de fleste tilfælde også anvendes. Vær iøvrigt opmærksom på, at denne Z-Wave USB stick er den samme enhed som den, der kommer med MiCasaVerde masteren.
Ud over selve Z-Wave USB stick’en skal der også anvendes en tænd/sluk enhed eller en dimmer. Det kan f.eks. være en Innovus SmartPower, men en hvilken som helst tænd/sluk enhed bør kunne anvendes.
Der er en række forudsætninger, der skal være opfyldt, for at følge eksemplet i denne artikel.
-
Z-Wave USB stick’en skal være installeret og COM porten, som den er installeret på, skal være kendt.
-
Tænd/sluk enhedens node id skal være kendt.
-
Tænd/sluk enheden skal være meldt ind på Z-Wave USB stick controller’en.
-
Kendskab til programmering i C#.
I nedenstående eksempel er Z-Wave USB stick’en installeret på ‘COM4′ porten og tænd/sluk enheden har node id ‘6′.
Det først, der skal ske, er at åbne seriel porten med de korrekte parametre.
SerialPort sp = new SerialPort(); sp.PortName = "COM4"; sp.BaudRate = 115200; sp.Parity = Parity.None; sp.DataBits = 8; sp.StopBits = StopBits.One; sp.Handshake = Handshake.None; sp.DtrEnable = true; sp.RtsEnable = true; sp.NewLine = System.Environment.NewLine; sp.Open();
Det skal sendes 12 bytes til Z-Wave USB Stick’en for enten at tænde eller slukke for enheden.
/*
0x01, 0x09, 0x00, 0x13, nodeId, 0x03, 0x20, 0x01, state, 0x05, checksum
*/Hvor ‘nodeId’ angiver noden, der skal kommunikeres med. ’state’ definerer, hvilken tilstand (tænd/sluk) enheden skal sættes i. ‘checksum’ er en beregning baseret på de data, der sendes.
I dette tilfælde er node id ‘6′ og enheden skal tændes, hvorfor state skal være 0xFF.
byte nodeId = 0x06; // Set state to 0xFF to turn the device on and 0x00 to turn it off byte state = 0xFF; // On
Checksummen beregnes ved at lave en XOR af alle bytes undtagen den første og derefter en NOT på resultatet.
private static byte GenerateChecksum(byte[] data) { int offset = 1; byte ret = data[offset]; for (int i = offset + 1; i < data.Length - 1; i++) { // Xor bytes ret ^= data[i]; } // Not result ret = (byte)(~ret); return ret; }
Nu kan beskeden opbygges.
byte[] message = new byte[] { 0x01, 0x09, 0x00, 0x13, nodeId, 0x03, 0x20, 0x01, state, 0x05, 0x00 }; message[message.Length - 1] = GenerateChecksum(message);
Beskeden sendes til enheden gennem Z-Wave USB stick’en med følgende kommando og seriel porten lukkes.
sp.Write(message, 0, message.Length); sp.Close();
Som ovenstående eksempel viser, så er det relativt enkelt, at komme igang med Z-Wave programmering i C#. Der findes selvfølgelig alternativer til at udvikle det hele fra bunden f.eks. Zensys‘ egen udviklingsplatform eller det SDK, der kan købes fra ControlThink.
I næste artikel om Z-Wave programmering i C# vil programmet kunne tænde og derefter slukke den samme enhed. Dette eksempel vil gør bruge af den viden om Z-Wave protokollen, som præsenteres i artiklen ‘En introduktion til Z-Wave protokollen‘.
Kildekoden i sin helhed kan hentes via dette link. Der er ingen begrænsninger på anvendelsen af kildekoden.

