Domotique minimale - Partie 8 : Domotique et Z-Wave - Goufablog
Goufablog

Geek, nouvelles technologies, société et jeux vidéos!
Aucune information sur l'auteur !
14
mars
2015
Domotique minimale - Partie 8 : Domotique et Z-Wave
Technique - par Goufalite - 5155 hits

Maintenant que tout est configuré dans notre maison on ne va pas s'arrêter en milieu de chemin ! Il est temps de prendre quelques petits modules Z-Wave pour les faire s'interfacer avec notre installation. Pour ma part j'ai récupéré un contrôleur Aeontec Z-Stick 2 et deux détecteurs de porte dont un qui fait aussi température et luminance.

Z-Wave ?

Rassurez-vous, la température est en °F
Rassurez-vous, la température est en °F

C'est une norme de communication entre différents appareils connectés. L'avantage de cette technologie est que les appareils peuvent construire des noeuds de transfert, réduisant la consommation de courant et les ondes propagées.

La communication utilise un système de "command classes" ayant chacune un identifiant que l'appareil présente au contrôleur :

  • batterie (généralement 128)
  • température
  • intervalle de réveil
  • alarme et niveau (113)
  • tamper (bidouillage) de l'appareil

La communication Z-Wave est très étrange : elle part du principe que les périphériques sont inactifs par défaut et attendent leur réveil. C'est pour cela qu'on n'a pas d'informations directement et qu'il faut attendre un peu. Pour un appareil normal vous aurez :

- Bonjour Appareil1 ! - Bonjour ! - Qui êtes-vous ? - Je suis une clef USB ! - OK je vais chercher un pilote générique de lecteur de disque !

Alors que pour le ZWave, j'exagère à peine mais c'est vraiment ce qu'il y a dans les logs :

- Bonjour Appareil1 ! - 127 - Euh... Bonjour ? - 127 - Qui êtes-vous ? - 127 - Non mais c'est quoi votre capacité ? - 127 - Mais... - Je ne me réveille pas souvent. - Ah ! Enfin ! Alors je... - 127 - Mais je ne sais pas ce que c'est 127 ! - 127 - RHAAAA ! - Bonjour ! Je suis un détecteur de porte, voilà mes caractéristiques et ce que veut dire 127 !

Logiciels existants

Après avoir branché mon contrôleur et associé mes éléments, je veux voir si mon système est opérationnel. Pour cela j'ai jeté un petit coup d'oeil aux solutions déjà codées pour ensuite pouvoir passer à OpenZwave et coder moi-même mon système.

HomeGenie

Téléchargement

C'est pour moi la solution la plus complète et qui marche le mieux. Cependant l'IHM, le paramétrage et surtout la programmation sont un charabia incompréhensible. Il m'a fallu beaucoup de temps rien que pour trouver comment afficher la température sur mon capteur (jusqu'à ce que je comprenne qu'il fallait attendre que le soft "apprenne" à communiquer avec les composants.

Une fois que ça fonctionne, je peux faire de la programmation python mais la documentation est très floue ! En gros c'est "allez-y, codez!".

Attention toutefois car un service se lance au démarrage de l'ordinateur et monopolise votre port 80 et garde la main sur le contrôleur empêchant les autres application d'y accéder.

HomiDom

Téléchargement

Solution opensource que je n'ai pas réussi à faire fonctionner.

HomeSeer

Téléchargement

Version d'évaluation mais je n'ai pas pu tester car le module Z-Wave était expérimental et buggué.

Incontrol

Téléchargement

La version d'évaluation ne permet pas d'ajouter de capteurs ce qui est pourtant la base de la domotique !

OpenZWave

C'est ce qui m'a motivé à essayer de toucher au Z-Wave, il s'agit d'une librairie C++/C# pour s'interfacer avec les accessoires Z-Wave grâce à un contrôleur. J'ai eu beaucoup de mal à le mettre en place car il n'y a pas beaucoup de documentation d'exemple, mais je vais pouvoir vous aider à faire au moins les premiers pas.

Installation

Téléchargement

Pour ma part la version 1.2 ne compilait pas du tout, j'ai pris la version 1.0 mais il a quand fallu bidouiller un petit peu.

Dans un premier temps dézippez la solution dans une arborescence sans espace. Ensuite repérez le port COM sur lequel votre adaptateur est branché, dans le gestionnaire des périphériques :

Repérez le répertoire "config" à la racine du zip. Isolez-le et à l'avenir appelez le chemin à travers une variable de réglage (.ini, ressource,...), faites de même pour le port COM.

Voici ensuite pêle-mêle les problèmes que j'ai rencontré :

  • enlevez les "extern" avant les uint* quand vous aurez l'erreur de compilation.
  • dans OpenZWaveDotNet ouvrez les propriétés du projet et ajoutez le répertoire d'inclusion des sources en C++ dans le linker.
  • quand vous déploierez votre projet sur un autre poste, genre le serveur, pensez à TOUT recompiler en Release.

Compilation et première application

N'hésitez pas à vous inspirer du projet OZWForm et surtout du code présent dans le fichier MainForm.cs. Lancez-le et regardez la fenêtre de sortie du programme pour voir les interactions avec les composants. Je vous recommande de décommenter les lignes présentes dans le gestionnaire de notifications qui gèrent le ValueChanged dans la fonction "onNotification":

case ZWNotification.Type.ValueChanged: { Console.WriteLine("Value Changed"); ZWValueID v = m_notification.GetValueID(); Console.WriteLine(" Node : " + v.GetNodeId().ToString()); Console.WriteLine(" CC : " + v.GetCommandClassId().ToString()); Console.WriteLine(" Type : " + v.GetType().ToString()); Console.WriteLine(" Index: " + v.GetIndex().ToString()); Console.WriteLine(" Inst : " + v.GetInstance().ToString()); Console.WriteLine(" Value: " + GetValue(v).ToString()); Console.WriteLine(" Label: " + m_manager.GetValueLabel(v)); Console.WriteLine(" Help : " + m_manager.GetValueHelp(v)); Console.WriteLine(" Units: " + m_manager.GetValueUnits(v)); break; }

Ensuite l'algorithme à appliquer est le suivant :

  • Instancier un objet "options" avec le répertoire de config décrit plus haut
  • Instancier un manager
  • Connecter la clef avec un AddDriver suivi du port COM
  • Attendre la notification DriverReady pour enfin interagir avec les composants
public Form1() { InitializeComponent(); System.Resources.ResourceManager RM = new System.Resources.ResourceManager("GoufazwaveWin.Resource", this.GetType().Assembly); // Create the Options m_options = new ZWOptions(); m_options.Create(settings.getData("paths","configPath"), @"", @""); // Add any app specific options here... m_options.AddOptionInt("SaveLogLevel", (int)ZWLogLevel.Detail); // ordinarily, just write "Detail" level messages to the log m_options.AddOptionInt("QueueLogLevel", (int)ZWLogLevel.Debug); // save recent messages with "Debug" level messages to be dumped if an error occurs m_options.AddOptionInt("DumpTriggerLevel", (int)ZWLogLevel.Error); // only "dump" Debug to the log emessages when an error-level message is logged // Lock the options m_options.Lock(); // Create the OpenZWave Manager m_manager = new ZWManager(); m_manager.Create(); m_manager.OnNotification += new ManagedNotificationsHandler(NotificationHandler); // Add a driver m_driverPort = RM.GetString("driverPath"); //m_driverPort = @"\COM3"; m_manager.AddDriver(m_driverPort); this.log("Loaded"); }

Manipulez un peu vos appareils ou laisser votre application tourner 5 minutes. Dès que voyez que les informations sont plus précises (température,...) appelez WriteConfig sur le manager en utilisant un bouton par exemple. Ainsi le système n'aura pas à "découvrir" les composants. Cette action crée un fichier de configuration à la racine de l'exécutable, qui peut être réutilisé à travers les programmes.

Gestion des codes

En manipulant les appareils vous allez voir ce genre d'information :

<Node id="2" name="" location="" basic="4" generic="7" specific="1" type="Routing Slave" listening="false" frequentListening="false" beaming="true" routing="true" max_baud_rate="40000" version="4" query_stage="Complete"> <Manufacturer id="0109" name="Vision"> <Product type="2001" id="0105" name="Unknown: type=2001, id=0105" /> </Manufacturer> <CommandClasses> <CommandClass id="112" name="COMMAND_CLASS_CONFIGURATION" version="1" request_flags="4"> <Instance index="1" /> </CommandClass> <CommandClass id="113" name="COMMAND_CLASS_ALARM" version="4"> <Instance index="1" /> <Value type="byte" genre="user" instance="1" index="0" label="Alarm Type" units="" read_only="true" write_only="false" verify_changes="false" poll_intensity="0" min="0" max="255" value="6" /> <Value type="byte" genre="user" instance="1" index="1" label="Alarm Level" units="" read_only="true" write_only="false" verify_changes="false" poll_intensity="0" min="0" max="255" value="0" /> </CommandClass> <CommandClass id="114" name="COMMAND_CLASS_MANUFACTURER_SPECIFIC" version="1" request_flags="4"> <Instance index="1" /> </CommandClass>

Si vous regardez le fichier de configuration créé ci-dessus vous allez voir la définition des "command classes" en fonction les éléments. A vous d'interfacer ce programme (ou un autre) avec ces éléments pour agir, par exemple stocker les valeurs en base de données !

Attention cependant : un de mes capteurs de porte envoie deux signaux l'un après l'autre qui sont le type d'alarme et son niveau. A vous de voir comment récupérer cette information.

Vous pouvez jouer avec les scènes (si vous comprenez comment ça marche, moi pas) ou interroger ponctuellement une base de données et faire des requêtes REST sur votre super serveur PHP.

Et ensuite ?

Rien à faire pour le moment, vous avez tout ! Si vous êtes vraiment acharné(e), essayez les badgeuses pour chats et les caméras à reconnaissance faciale, ou pire, un moyen de savoir où votre chien a fait ses besoins !

+ Sources des images


Vous pouvez aussi lire :

CC-BY-SACet article est protégé par une licence CC-BY-SA.


Tags : domotique, zwave
Delicious   Facebook   Commentaires(0) | Permalink
Sans commentaires!
Votre avis?
(Obligatoire)

Site et style réalisé par Goufalite
Reproduction interdite sans l'accord de l'auteur.