En introduktion til Z-Wave programmering i C#

23. november, 2009 af Henrik Leidecker Jørgensen Skriv en kommentar »

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.

zwaves-logo-new2

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.

AeonZStick

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.

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

Annoncer

Kommentarer er lukket.