Un Raspberry Pi comme passerelle pour la domotique

Un Raspberry Pi comme passerelle pour la domotique

Suite de l'article de la semaine dernière, voici un petit exemple d'application réel des callbacks HTTP pour piloter des modules Yoctopuce à travers le NAT. Nous utiliserons un Raspberry Pi, parce qu'il ne coûte pas cher et qu'on ne lui demande pas grand chose: juste de faire tourner un VirtualHub, afin de générer les callbacks périodiques.




L'application: commutation à distance

L'application choisie est un contrôle de l'éclairage à distance. Cela peut permettre par exemple de simuler une présence dans votre maison pour écarter les rodeurs, mais vous pouvez bien sûr transposer cet exemple à la commutation à distance de presque n'importe quel appareil chez vous (allumer votre PC à distance, faire préchauffer la machine à café, etc.)

Pour commuter une lampe ou un autre appareil, la méthode classique est bien sûr le Yocto-PowerRelay. Simple et efficace, on peut même le dissimuler directement dans une multiprise:

La version triviale: un relais caché dans la multiprise
La version triviale: un relais caché dans la multiprise



Si vous voulez éviter de devoir toucher du 220V, ou si vous aimeriez commander un appareil qui n'est pas directement à portée de câble, il est parfois plus aisé de piloter une télécommande. Pour cet exemple, nous avons acheté en grande surface un jeu de trois prises radio-commandées (pour un peu moins de 50 EUR):

Un jeu de prises radio-commandées acheté en grande surface
Un jeu de prises radio-commandées acheté en grande surface



Les boutons des télécommandes sont en général faits selon le modèle des claviers Chiclets: une pellicule chargée en carbone, déposée sur les touches en caoutchouc, met en contact deux pistes sur le circuit imprimé de la télécommande lorsque la touche est enfoncée (pour plus de détails, consultez la page de Wikipedia en anglais sur ce sujet). On peut donc simuler une pression sur la touche en fermant les mêmes contacts avec un simple relais. Il n'est pas aisé de souder un fil directement sur les pistes du circuit imprimé sans endommager la télécommande, mais en suivant les pistes et en utilisant un testeur électrique, on peut facilement repérer sur quelle patte du circuit imprimé chaque touche est ramenée, et trouver un point plus facile pour souder un fil.

Avec le boîtier Le circuit, de dessus Le circuit, de dessous
Intérieur d'une télécommande à boutons "Chiclets"



Nous avons choisi de rapporter simplement tous les points de contact dans une barrette à contacts en ligne que nous insérons dans la paroi inférieure de la télécommande. Ainsi, la télécommande restera pratique à utiliser manuellement, mais nous pourrons la poser dans un socle (station de commande) pour la piloter automatiquement par des relais.

Télécommande ouverte, avec notre connecteur de contrôle à distance, qui passera inaperçu
Télécommande ouverte, avec notre connecteur de contrôle à distance, qui passera inaperçu



Notre station de commande est très simple: elle ne contient que deux Yocto-Relay (chacun comportant une paire de relais), eux-mêmes connectés à un Micro-Hub pour n'utiliser qu'un seul port USB. Il faut juste prendre soin de câbler les relais sur les contacts de sorte à pouvoir reproduire les fermetures de contacts des touches de commande.

Schéma de raccord de la télécommande avec les relais
Schéma de raccord de la télécommande avec les relais



Le tout est fixé au propre dans une YoctoBox-MaxiRelay-Black, avec une façade légèrement modifiée pour permettre à la télécommande de tenir droite. La station de commande sera connectée au Raspberry Pi par un simple câble USB, de même que notre multiprise USB.

Notre 'Yocto-docking station' pour télécommande de prise
Notre 'Yocto-docking station' pour télécommande de prise



Pour simuler les touches de la télécommande avec l'API Yoctopuce, nous ne devons fermer les contacts que temporairement (impulsion). En fonction du schéma ci-dessus, le code à utiliser pour relier le contact commandant la prise 2 au contact On est le suivant:

  $state = yFindRelay("OnOff");
  $out2 = yFindRelay("Out2");
  $state->set_output(Y_OUTPUT_ON)); // sélectionner le contact "On"
  $out2->pulse(500); // mise en contact avec la sortie 2
 



Une interface web pour piloter les relais

Pour vous faciliter la tâche, nous vous avons préparé un petit exemple en PHP incluant une page de contrôle en PHP, et une interface de commande par le web (basée jQuery et compatible avec les téléphones portables).

Page principale de l'application Les différentes actions possible pour un relais logique



Cette application web permet de définir des interrupteurs virtuels qui vont actionner un ou plusieurs relais bien réels. Comme c'est le VirtualHub qui décide quand il contact notre scripte PHP, il faut que l'application web sauve dans un fichier (ou dans une base de donnée) les actions à effectuer la prochaine fois que notre script de callback est appelé.

Page de configuration d'un interrupteur logique
Page de configuration d'un interrupteur logique



La seule page qui utilise l'API est la page callback.php qui en plus d'initialiser l'API en mode callback HTTP va avoir deux tâches à effectuer:

Premièrement, on sauve dans un fichier la liste des relais connectés. L'objectif est d'avoir une liste des relais connectés pour que lors de la configuration on n'ait pas besoin de se rappeler du numéro de série du relais qui est connecté.

Deuxièmement, on applique les actions nécessaires sur les relais. Pour cela, on charge le fichier qui contient les actions à executer et on appelle les méthodes pulse ou set_output des relais.

  include('yocto_api.php');
  include('yocto_relay.php');

  // Uses explicit error handling rather than exceptions
  yDisableExceptions();

  // Sets up the API to use the VirtualHub on local machine
  $errmsg = "";
  if(yRegisterHub('callback',$errmsg) != YAPI_SUCCESS) {
    logtofile("Unable to start the API in callback mode ($errmsg)");
    die();
  }

  ...
  ...
  // create an array of all connected Relay ( we do not use it
  // no but if will be usefull when the user will configure his
  // VirtualSwitch)
  $detected_relay= LoadDetectedRelays();
  $yrelay = yFirstRelay();
  while($yrelay!=null){
        $detected_relay[$yrelay->get_hardwareId()] = new Relay($yrelay);
        $yrelay = $yrelay->nextRelay();
  }
  SaveDetectedRelays($detected_relay);

  // loads all VirtualSwitch that need to be updated
  $all_vswitches = LoadVirtualSwitchesToUpdate();
  foreach($all_vswitches as $name => $virtual_switch) {
    // retrieves the list of all physical relay of current
    // Virtual Switch to update
    if($virtual_switch->isOnNow()){
      $relay_to_update =$virtual_switch->getRelaysForState('on');
    } else {
      $relay_to_update =$virtual_switch->getRelaysForState('off');
    }
    foreach ($relay_to_update as  $hwid => $action) {
      //applies to the Yocto-Relay the corresponding action
      $yrelay = yFindRelay($hwid);
      if(!$yrelay->isOnline()){
        logtofile("$hwid is not online");
      }
      switch($action){
      case 'stateOn':
        $yrelay->set_output(Y_OUTPUT_ON);
        break;
      case 'stateOff':
        $yrelay->set_output(Y_OUTPUT_OFF);
        break;
      case 'pulse':
        $yrelay->pulse(500);
        break;
      default:
        logtofile("Unspported action:".$action);
      }
    }
  }

 



Tout le code est disponible sur GitHub. Pour avoir une solution plus universelle et professionnelle, il faudrait ajouter la possibilité de programmer différents cycles jour/nuit et une fonction de randomisation pour simuler une présence. Nous avons essayé de garder le code le plus simple possible pour illustrer ce nouveau mode de fonctionnement.

Commenter aucun commentaire Retour au blog












Yoctopuce, get your stuff connected.