Concours Z-UNO – Projet de totoff974

Concours ZUNO : les réalisations

Planète Domotique a lancé en septembre dernier un concours autour de la carte de développement Z-UNO. Suite à un appel de candidatures, trois projets ont été retenus et les lauréats ont gagné leur propre carte de développement. Il est désormais temps de découvrir chaque jour sur ce blog un des projets concrétisés avec le Z-UNO. À la fin de la semaine, vous pourrez voter pour le projet qui vous aura le plus plu, et permettre ainsi au gagnant de remporter un bon d’achat de 100 € !

Aujourd’hui nous vous proposons de découvrir le projet de totoff974 alias Christophe C.

Le projet

Suite au concours Z-UNO lancé le 14 septembre dernier étant lauréat pour participer à la deuxième phase de ce concours, ci-après la présentation de celui-ci.

La carte Z-UNO sera ainsi au cœur du système permettant une intégration au système domotique d’équipements ne le permettant pas à la base (ex : vidéoprojecteur).

Tout d’abord le Z-UNO possède de nombreux avantages pour un tel projet – le principal étant la fiabilité qu’offre le protocole Z-Wave et la facilité d’intégration des dispositifs dans des scénarios en fonction de la box domotique.

Le projet consiste donc à créer une interface entre Domoticz et les nombreux périphériques qui utilisent l’infrarouge pour être pilotés sans avoir actuellement de retour d’état. Le module va donc piloter les équipements via LED IR après avoir enregistré les commandes via récepteur IR.

De plus, le module aura une entrée afin de déterminer l’état actuel du périphérique à commander (vidéoprojecteur = sortie 12V du trigger | un ampli = via un Capteur de courant Grove pour détection du courant).

À l’origine j’avais souhaité intégrer la led IR en émission sur le Z-UNO. Mais après de nombreuses recherches et du temps passé à essayer de contourner la limitation du Z-UNO (il faut savoir que les « timers » sont cadencés à 16Mhz et servent à créer une onde porteuse pour le signal infrarouge – or pour l’onde porteuse de la transmission Infrarouge du protocole NEC, utilisé par mon vidéoprojecteur, il faut osciller à 38Mhz), afin de continuer le projet, la partie infrarouge sera déportée sur la box domotique via LIRC.

Le Z-UNO sera donc en charge de :

  • Donner l’état actuel du vidéoprojecteur (via son trigger – sortie 12 volts).
  • Faire remonter la température ambiante.
  • Récupérer la luminance ambiante.
  • Piloter un éclairage d’appoint.

Ci-dessous le schéma de principe :
concours_zuno_chris_1

La programmation

L’ensemble du programme est libre d’utilisation et modifiable par tous. Quelques explications ci-après.

Les premières parties servent à définir les différentes entrées et sorties pour le Z-UNO. A savoir :

  • PIN 8 en entrée pour le retour de l’état du vidéoprojecteur
  • A0 (PIN 3) en entrée analogique pour la lecture de la luminance
  • PIN 11 en sortie pour la commande du relais pour la lampe
  • PIN 12 en entrée pour la lecture du BUS ON-WIRE concernant la température

Paramétrage du Z-UNO

On initialise le Z-UNO afin qu’il crée les différents canaux de communication avec la BOX domotique, pour ma part, 4 canaux correspondants aux 4 fonctions ci-dessus :

// **************************************
 // INIT PARTIE Z-UNO
 // **************************************
 ZUNO_SETUP_CHANNELS(
 ZUNO_SENSOR_BINARY(ZUNO_SENSOR_BINARY_TYPE_GENERAL_PURPOSE,
 getterVideoProjecteur),
 ZUNO_SENSOR_MULTILEVEL(ZUNO_SENSOR_MULTILEVEL_TYPE_TEMPERATURE,
 SENSOR_MULTILEVEL_SCALE_CELSIUS,
 SENSOR_MULTILEVEL_SIZE_TWO_BYTES,
 SENSOR_MULTILEVEL_PRECISION_ONE_DECIMAL,
 getterTemp),
 ZUNO_SENSOR_MULTILEVEL(ZUNO_SENSOR_MULTILEVEL_TYPE_LUMINANCE,
 SENSOR_MULTILEVEL_SCALE_PERCENTAGE_VALUE,
 SENSOR_MULTILEVEL_SIZE_TWO_BYTES,
 SENSOR_MULTILEVEL_PRECISION_ONE_DECIMAL,
 getterLum),
 ZUNO_SWITCH_BINARY(getterLampe, setterLampe)
 );

Nous avons donc 1 capteur TOR (ZUNO_SENSOR_BINARY), 2 capteurs variables (ZUNO_SENSOR_MULTILEVEL) et 1 commande TOR (ZUNO_SWITCH_BINARY). Chaque déclaration renvoie vers un « getter » et/ou « setter » qui servent à appeler des fonctions pour transmettre ou recevoir depuis le protocole Z-Wave.

Optimisation des transmissions

Pour chaque entrée variable (luminance, température et état du vidéoprojecteur) une comparaison est faite pour savoir si la valeur a changé depuis la dernière lecture par le Z-UNO (réglée ici toutes les 2 secondes), si oui on transmet les données via « zunoSendReport() ». Ainsi la transmission des données vers la box domotique et donc via Z-Wave ne se fera que si la donnée a changé, ne limitant la communication qu’au besoin. (cf. partie du programme suivant) :

 // PARTIE VIDEOPROJECTEUR
 // **************************************
 actValVid = digitalRead(RET_VID);
 if (actValVid != derValVid) {
      // save the value
      derValVid = actValVid;
      Serial.print("etat vid : ");
      Serial.println(derValVid);
      // send report to the controller
      zunoSendReport(1);
 }

Le reste de la programmation coté Z-UNO ne nécessite pas de commentaire particulier, mais je reste disponible dans les commentaires pour d’éventuelles précisions.

Le câblage

Photo du montage général avec légende des différentes parties (les différentes fonctions ont été réparties sur le breadboard pour faciliter la lecture).

concours_zuno_chris_2

Partie Vidéoprojecteur

Le vidéoprojecteur possède une sortie trigger 12volts (comme de nombreux équipements), le but étant de récupérer cette tension qui est à 0 volt si le vidéoprojecteur est éteint et passe à 12 volts si allumé. Pour ce faire, il suffit d’un simple pont diviseur de tension afin de ramener à 5 volts qui pourra être branché sur le Z-UNO sans risque (un opto-coupleur étant le mieux). Les valeurs des résistances sont données ci-après (permet d’éviter que cela ne chauffe et dissipe trop d’énergie) :

concours_zuno_chris_3

Une troisième résistance de  10kOhm entre Vout et Gnd du Z-UNO sert de pull-down. En effet, elle forcera la valeur 0 en entrée si la tension est libre. Cela permet d’éviter les faux-positifs. Penser également à relier les masses entre elles pour avoir la même référence.

N.B : Cette entrée peut également servir pour une pince ampèremétrique avec sortie 0-10 volts. Afin de connaitre l’état d’un équipement ne possédant pas de sortie TRIGGER. L’image de l’intensité circulant dans le câble d’alimentation sera lue par la pince et commutera l’entrée PIN 8 du Z-UNO via le pont diviseur de tension.

Ci-dessous photo du montage – le fil rouge et blanc vont sur le TRIGGER derrière le vidéoprojecteur. Vout sur la PIN 8 en entrée sur le Z-UNO (fil rouge qui part vers la droite).

concours_zuno_chris_4

Partie Capteur de luminance et température

Les capteurs sont alimentés en 5 volts et ce depuis le Z-UNO la sortie du capteur de luminance va sur la PIN A0 analogique du Z-UNO pour la lecture de la valeur. Celle de la température va sur la PIN 11 du Z-UNO, la résistance est de 4,7kOhm entre la borne + et data du capteur DS18S20 (cf. documentation).

concours_zuno_chris_5

Partie Relais de puissance

Le relais de puissance est également alimenté en 5 volts et permet de commuter une charge de 10A pour 250volts libre de potentiel. La borne data est reliée à la sortie 10 du Z-UNO pour permettre de piloter la charge. Ce relais servira à piloter une lampe.

concours_zuno_chris_6

Association du Z-UNO vers la box domotique

Après être passé en mode inclusion depuis la box domotique (ici Domoticz – via Matériel -> Réglages -> Gestion de nœud -> Inclure le nœud), il suffit de mettre sous tension le Z-UNO et d’appuyer trois fois rapidement sur BTN. Ici le module Z-UNO porte l’ID 029 (0x1d).

concours_zuno_chris_7

Il faut ensuite se rendre dans réglages -> Dispositifs, un tri par idx et l’ensemble de nos déclarations précédentes apparaissent. Nous avons donc 4 équipements nouveaux (948 à 951) avec notre remontée de température (951), notre remontée de luminance (950), la remontée de l’état du vidéoprojecteur (949) et enfin le pilotage du relais (948).

concours_zuno_chris_8

A partir de cet écran nous allons ajouter les dispositifs du Z-UNO en cliquant sur chaque flèche verte, les dispositifs seront alors rangés dans les différentes catégories de Domoticz  (interrupteurs, température, météo, mesures, …). Concernant les capteurs température et luminance nous pourrons même avoir un graphe d’historique (ci-dessous celui de la luminance)

concours_zuno_chris_9

Les scénarios domoticz

Maintenant que le Z-UNO nous donne la possibilité de recevoir l’état du vidéoprojecteur nous allons définir quelques règles afin de permettre de commander notre vidéoprojecteur en toute sécurité (sans devoir se demander s’il est allumé ou éteint).

Comme expliqué en introduction, le pilotage par LED IR directement sur le Z-UNO n’est pas encore possible (du moins cela est possible en théorie en ajoutant un résonateur 38Mhz sur une entrée PWM afin de pouvoir créer un signal pour notre onde porteuse, mais je ne possède pas ce type résonateur et les délais étant courts je n’ai pas pu commander le nécessaire et je n’ai ni les compétences pour le faire en si peu de temps – évolution prochaine).

J’ai donc décidé de relayer la partie infrarouge à la box domotique, j’utilise pour cela un USB-UIRT sur la box domotique avec LIRC qui fait très bien le boulot (je pourrai m’étendre sur le sujet au besoin). Il également possible de passer par une simple LED IR branché sur une PIN out d’un arduino UNO ou d’un RPI (je voulais le faire avec un attiny85 mais même limitation que le Z-UNO pour l’émission de signaux IR).

Création du scénario

Dans les « événements » de Domoticz, il faut alors créer un nouveau « event » en device :

-- Permettre la mise en fonctionnement du videoprojecteur
 ------------------------------
 -- Définition des variables --
 ------------------------------
 local videoprojecteur = "Vidéoprojecteur"
 local check_vid = "Z-UNO - retour videoprojecteur"
 ---------------------
 -- Début du script --
 ---------------------
 commandArray = {}
 if (devicechanged[videoprojecteur]=='On' and otherdevices[check_vid]~='On') then
      os.execute('irsend -#4 SEND_ONCE optoma')
      os.execute('irsend -#4 SEND_ONCE optoma KEY_POWER')
 elseif (devicechanged[videoprojecteur]=='Off' and otherdevices[check_vid]~='Off') then
      os.execute('irsend -#4 SEND_ONCE optoma')
      os.execute('irsend -#6 SEND_ONCE optoma KEY_POWER')
 end
 -------------------
 -- Fin du script --
 -------------------
 return commandArray

Détail du scénario

Le bout de programme ci-dessus permet donc à partir d’un interrupteur virtuel de commander en tenant compte de l’état du périphérique (via Z-UNO) le vidéoprojecteur en envoyant des commandes infrarouges à travers LIRC.

local videoprojecteur = « Vidéoprojecteur » => interrupteur virtuel du vidéoprojecteur sous Domoticz

local check_vid = « Z-UNO – retour videoprojecteur » => retour d’état envoyé par le Z-UNO sur le PIN 8 si le vidéoprojecteur est déjà allumé il passe à ON sinon il est en OFF.

os.execute(‘irsend -#4 SEND_ONCE optoma KEY_POWER’)  => transmet le signal IR « ON » au USB-UIRT via une commande système. Le #4 et le #6 permettent de modifier le nombre de fois à transmettre la trame. Le vidéoprojecteur s’allume lorsqu’on presse une fois la commande mais demande un double appui pour l’éteindre.

Conclusion

En guise de conclusion, le module Z-UNO est un parfait compagnon pour ceux et celles désirant compléter leurs équipements de domotique lorsque cela nécessite des équipements qui n’existent pas sur le marché. De plus, sa prise en main est très facile et permet de répondre à une grande majorité des besoins.

Cependant il a aussi ses limites (ici la fréquence des timers limitées à 16 Mhz, qui est semblable aux attiny85).

D’autres projets fourmillent dans ma tête, entre autres l’utiliser pour piloter les chambres – en effet – son nombre d’entrées / sorties permet de réunir en un seul équipement les fonctions de plusieurs modules Z-Wave et donc de faire des économies (nous avons vu ici qu’il peut piloter des relais – donc des lampes) – les entrées permettront de faire du relevé de température dans chaque pièce avec le BUS ONE-WIRE et les sondes DS18S20 (abordées également dans ce sujet). De concert avec une box domotique telles que Jeedom ou Domoticz et des scénarios spécifiques pour répondre à chaque besoin d’une maison d’aujourd’hui.


Ci-dessous quelques photos de l’installation :

La partie Z-UNO

concours_zuno_chris_10


Le module branché sur la sortie du vidéoprojecteur (pas mal de poussière là-haut)

concours_zuno_chris_11


Une vue avant : rien n’apparait et le tout reste discret (l’horloge est DIY ^_^)

concours_zuno_chris_12


L’émetteur infrarouge USB-UIRT et la box Domoticz sur RPI2 (le boitier gris permet de piloter le portail collectif à distance)

concours_zuno_chris_13


Le boitier où l’ensemble sera intégré pour être le plus discret possible (actuellement c’est l’ancien système qui se trouve dedans – même principe mais avec un attiny85 et un transmetteur rf433Mhz beaucoup moins fiable)

concours_zuno_chris_14

Merci pour votre lecture et à Planète Domotique pour l’organisation de ce concours …^_^

Le code du projet est disponible en téléchargement : Code ino du projet Z-Uno de totoff974

A propos totoff974

L'informatique, l'électronique, le bricolage voilà 3 activités qui résument bien qui je suis. Gamin déjà le tournevis en main à démonter tous ceux qui pouvaient l'être. Toujours à la recherche des dernières innovations technologiques et éternel bidouilleur, adepte du DIY ! Mon parcours scolaire : diplômé d'un BTS en mécanique et automatisme industriel et du Bac S-SI, parcours pro : assistant chef dans un BET et actuellement responsable de la maintenance pour une collectivité sur une île de l'océan indien.

A voir aussi

Z-UNO – Système pour chauffage au bois

Me chauffant au bois, j’ai décidé de me monter un système me permettant de gérer …

12 commentaires

  1. La porteuse pour de l’IR c’est 38khz pas 38Mhz 🙂 du coup c’était peut être faisable avec le z-uno.

  2. je vais reverifier ça mais j’ai eu beau essayer impossible de le faire accepter l’envoi il est pas capable d’envoyer et pourtant des que j’envoie par un arduino uno pas de soucis … le attiny85 aussi n’envoie pas… les timers internes ne sont pas suffisant… mais je ne lâche pas je vais continuer à chercher

  3. Re,
    Pour être complet, j’ai essayé d’utiliser la librairie IR remote … le résultat étant négatif.
    J’ai également essayer avec le RAW code (décrypter le IR n’est pas compliqué).. avec initialisation des trames etc etc … mais la réponse est toujours négative … Comme expliqué dans l’article le vidéoprojecteur utilise le protocole NEC en 32bits si tu as des pistes pour tenter l’envoi je suis preneur …
    J’ai également souhaité utiliser un attiny85 au Z-UNO pour émettre (son aspect miniature étant acceptable) … mais là aussi aucune réussite.
    Pour la réception cependant aucun problème cela se passe bien.

  4. Bonjour à tous,
    totoff974 a partagé le code arduino de son projet, je viens de l’ajouter à la toute fin de l’article pour ceux qui seraient intéressés 🙂

  5. Je confirme pour avoir déjà expérimenté ce sujet que (les transmissions IR au protocole NEC sont en 38 KHz.

    Par contre, attention, la fonction « loop Arduino » est une des tâches d’un mini noyau temps-réel dans le Z-Uno. Essayer d’implémenter du code ayant des timing stricts me semble hasardeux dans le contexte de la fonction loop()…

    Je pense que les librairies développées par z-wave.me prennent des précautions sur ce point (je pense notamment au DS 18B20 ou pire les Neopixels – WS2812 https://forum.z-wave.me/viewtopic.php?f=3427&t=22547#p63390), mais ils ont la main sur le « scheduler ».

  6. Effectivement,
    Concernant l’IR je suis toujours en train de travailler dessus … le Z-UNO étant basé sur un 8051 la librairie IRremote ne passe pas .. j’ai réussi à modifier mais il me reste une erreur sur « deftype enum » peut être que cela va fonctionner prochainement … au niveau de l’attiny85 j’ai il me semble réussi à émettre test physique ce soir.

    Concernant le loop() je vais me pencher dessus … le système tourne sans bug visible ou problème pour l’instant mais si je peux l’optimiser je suis preneur.

    Merci pour vos commentaires

  7. J’ai enfin trouvé une méthode alternative aux timers (qui semblent pas encore actifs sur le z-uno – pas de docs pour y accéder) – Je testerai ça pour vous ce soir et je ferai un retour. Car le z-uno ne possède pas le micros() voir si la fonction millis() peut faire le job et à adapter d’autres parties …
    le lien si des gens sont intéressés à essayer dans la journée…

    https://www.analysir.com/blog/2015/09/01/simple-infrared-pwm-on-arduino-part-3-hex-ir-signals/

    Si ça fonctionne je verrai la possibilité de reposter la méthode complète pour intégrer l’IR à Z-UNO

  8. hum pour ceux qui suivent où qui essayent avec le lien ci-dessus .. il faut remplacer la fonction micros() par millis() * 1000 car le z-uno n’a pas implémenter la fonction micros() … et également remplacer les unsigned long par float pour sigTime et sigStart …
    c’est pas encore ca car je n’arrive pas a envoyer la commande mais je pense que cela vient d’un réglage pour corriger les delais du millis() lié au temps pour la lecture du programme … on est de l’ordre de la microseconde… nayant pas d’oscillo je le fais par tâtonnements…. a bientot pour la suite.

  9. bon le millis()*1000 … très mauvaise idée … forcement la précision est à la milliseconde … donc pas suffisant

    … hum faut trouver autre chose … je me tourne vers les timers comme le Z-UNO est basé sur un 8051 … mais les fonctions ne semblent pas encore codée … je triture les .h mais rien arghh

  10. Bientôt une mise à jour de ce projet … avec l’ajout d’un attiny85 qui va se charger de la partie émission d’infrarouge via une commande du z-uno, et ce afin de rentre l’ensemble compacte. J’espère également une fois la pince ampèremétrique reçue vous faire également la démo avec l’amplificateur. To be continued …

  11. Et voilà avec les nouvelles versions du firmware du Z-UNO
    il est possible maintenant du piloter l’IR sans devoir passer par des solutions autres…

    https://z-uno.z-wave.me/examples/ZWave2IR/

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *