TUTO Zipabox : Allumer/éteindre ses PC depuis la Zipa

Salut à tous !

Aujourd’hui je vous propose un nouveau tutoriel proposé initialement par DaBoss sur le forum de TOUTELADOMOTIQUE, mais qui a également accepté de le publier ici pour notre plus grand bonheur.

Bon je vous préviens à l’avance, ce tuto s’adresse aux plus confirmés !

Préambule :

Mes ordinateurs sont au sous-sol, et parfois j’avoue que cela me soule d’attendre qu’il boot ou pire, d’être obligé de redescendre si j’ai oublié d’en éteindre un avant de me coucher. Donc je souhaitais avoir un système centralisé pour faire un PowerOn/PowerOff de mes PCs (mais pas avec une simple prise sinon merci le cut off de l’os !) de n’ importe où dans la maison (voir plus si affinité). Tout cela en ayant un « WAF » max si possible.

J’avais déjà fait quelques recherches avant l’achat de la Zipabox et fait quelques tests avec mon nas synology. Pour le WakeOnLan … pas de problème via un script php mais le shutdown me posait des soucis. J’ai aujourd’hui une solution.

J’avais envie de faire partage cela au Zipanaute en espérant que cela en inspire d’autre ou que vous ayez des améliorations, mon système qui n’est surement pas le meilleur.

But :

Allumer et éteindre mes ordinateurs depuis les interfaces mise à disposition par la zipabox (Interface web, iDevice).

Principe général :

Grace à des VirtualSwitch et des règles, je fais des requêtes http sur mon NAS qui héberge mon script qui fera les actions arrêt/démarrage.
Ce qu’il faut :

  •  Une zipabox
  • Un PC avec une carte réseau permetant le wake on lan
  •  Un NAS en mode serveur WEB avec PHP et permetant d’exécuter une commande « net rpc »

Mise en place :

– Activer le wake on lan sur les ordinateurs.

Pour tester : http://www.depicus.com/wake-on-lan/wake-on-lan-gui.aspx
– Tester l’arrêt de votre machine depuis votre NAS en vous connectant en SSH sur celui-ci pour exécuter la commande suivant :
net rpc shutdown -t 60 -f -C « Arret demande depuis la Zipabox » -I « 192.168.1.x » -U « USER%PASSWORD » -d 1

Si votre ordinateur est un Windows 7 alors cela risque de ne pas fonctionner ajouté la clé de registre ci-dessous :

1. In the registry editor, navigate to HKLMSOFTWAREMicrosoftWindowsCurrentVersionPoliciesSystem.
2. If needed, create the DWORD value LocalAccountTokenFilterPolicy.
3. Modify the value of LocalAccountTokenFilterPolicy by changing the Value data to 1.

 

Copiez le script suivant sur votre NAS en le modifiant.

Les informations à fournir dans le script sont :
– Le numéro de série de la box
– La liste des ordinateurs.
Un ordinateur étant défini par :

  • Ip : son adresse IP
  • Mac : l’adresse mac de sa carte
  • Port : Port à tester pour savoir si le pc en allumer ou éteint
  • User : Login d’un utilisateur ayant des droits admin
  • Pwd : le mot de passe qui va avec
  • Zipa_ep et Zipa_apiKey on s’en occupera plus tard.

 

CODE: 
<code><!--?php
/*   CONFIGURATION   */

$zipabox_serial="mon_serial";
$computer_list=<span class="hiddenSpellError" pre=""-->array(
   "MON_ORDI" =&gt; array("ip" =&gt; "<span style="color: #ff0000;">192.168.1.x</span>", "mac" =&gt; "<span style="color: #ff0000;">xx:xx:xx:xx:xx:xx</span>", "port" =&gt; <span style="color: #ff0000;">135</span>, "user" =&gt; "'<span style="color: #ff0000;">bip</span>'", "pwd" =&gt; "'<span style="color: #ff0000;">bip</span>'", "zipa_ep" =&gt; "<span style="color: #ff0000;">xxxx</span>", "zipa_apiKey" =&gt; "<span style="color: #ff0000;">x</span>")
);

/*  FUNCTION   */

//Get computer status
function GetServerStatus($site, $port){
  $status_final=9;
  $status = array(0, 1);
  if($port!=0){
   $fp = @fsockopen($site, $port, $errno, $errstr, 2);
   if (!$fp) { $status_final = $status[0]; }else{ $status_final = $status[1]; }
  }
  return $status_final;
}
//Send wake on lan to computer
function wol($addr, $mac, $socket_number){
   $addr_byte = explode(':', $mac);
   $hw_addr = '';
   for ($a=0; $a &lt; 6; $a++)
      $hw_addr .= chr(hexdec($addr_byte[$a]));
   $msg = chr(255).chr(255).chr(255).chr(255).chr(255).chr(255);
   for ($a = 1; $a &lt;= 16; $a++)
      $msg .= $hw_addr;
   $s = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
   if ($s == false){
      echo "Error creating socket!\n";
      echo "Error code is '".socket_last_error($s)."' - " . socket_strerror(socket_last_error($s));
   }else{
      $opt_ret = socket_set_option($s, 1, 6, TRUE);
      if($opt_ret &lt; 0)
         echo "setsockopt() failed, error: " . strerror($opt_ret) . "\n";
      $e = socket_sendto($s, $msg, strlen($msg), 0, $addr, $socket_number);
      socket_close($s);
      echo "Magic Packet sent (".$e.") to ".$addr;
   }
}

/*   MAIN   */

switch($_GET['action']){
   case "checkstatus":
      foreach($computer_list as $computer_name=&gt;$computer_info){
         echo $computer_name."-&gt;".GetServerStatus($computer_info['ip'],$computer_info['port'])."
";
         $zipa_sensor_url = "http://my.zipato.com/zipato-web/remoting/attribute/set?serial=".$zipabox_serial."&amp;ep=".$computer_info["zipa_ep"]."&amp;apiKey=".$computer_info["zipa_apiKey"]."&amp;state=";
         if(GetServerStatus($computer_info['ip'],$computer_info['port'])){
            $zipa_sensor_url.="true";
         }else{
            $zipa_sensor_url.="false";
         }
         $ch = curl_init();
         curl_setopt($ch, CURLOPT_URL, $zipa_sensor_url);
         curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
         $result = curl_exec($ch);
      }
   break;
   case "poweron":
      echo $computer_list[strtoupper($_GET['name'])]['ip'];
      $_status=GetServerStatus($computer_list[strtoupper($_GET['name'])]['ip'],$computer_list[strtoupper($_GET['name'])]['port']);
      $_action="Nothing";
      if(!$_status){
         $socket_number = "32446";        // any number between 1-40000
         $mac_addy = $computer_list[strtoupper($_GET['name'])]['mac']; // superman (wired lan)
         $ip_addy = "192.168.1.255";     // broadcast address of my network   
         wol($ip_addy, $mac_addy,$socket_number);
         $_action="Power On Sended";
         $fp = fopen($_SERVER['PHP_SELF'].'.log', 'a');
         fwrite($fp, date("d-m-Y h:i:s").' - '.$_SERVER['PHP_SELF'].','.strtoupper($_GET['name']).','.$_status.','.$computer_list[strtoupper($_GET['name'])]['ip'].','.$computer_list[$_GET['name']]['mac'].','.$_action.chr(13));
         fclose($fp);
      }
   break;
   case "poweroff":
      $_status=GetServerStatus($computer_list[strtoupper($_GET['name'])]['ip'],$computer_list[strtoupper($_GET['name'])]['port']);
      $_action="Nothing";
      if($_status){
         $_action="Power Off Sended";
         exec("net rpc shutdown -t 60 -f -C \"Arret demande depuis la Zipabox\" -I \"".$computer_list[strtoupper($_GET['name'])]['ip']."\" -U \"".$computer_list[strtoupper($_GET['name'])]['user']."%".$computer_list[strtoupper($_GET['name'])]['pwd']."\" -d 1");
         $fp = fopen($_SERVER['PHP_SELF'].'.log', 'a');
         fwrite($fp, date("d-m-Y h:i:s").' - '.$_SERVER['PHP_SELF'].','.strtoupper($_GET['name']).','.$_status.','.$computer_list[strtoupper($_GET['name'])]['ip'].','.$computer_list[$_GET['name']]['mac'].','.$_action.chr(13));
         fclose($fp);
      }
   break;
   default:
      echo "Error !";
   break;
}
?&gt;</code>

Une fois copié il ne reste plus qu’à tester son bon fonctionnement. Dans un navigateur il suffit de saisir :
Démarrer votre pc nommé MON_ORDI :
http://ip_du_nas/REPERTOIRE/computer_action.php?action=poweron&name=MON_ORDI
Arreter votre pc nommé MON_ORDI :
http://ip_du_nas/REPERTOIRE/computer_action.php?action=poweroff&name=MON_ORDI
Checker le statut de tout vos pc :
http://ip_du_nas/REPERTOIRE/computer_action.php?action=checkstatus

Voilà déjà une bonne chose de faite, Il ne reste plus qu’à interfacer tout cela avec la Zipabox.
Créer un VirtualSwitch et un VirtualSensor par ordinateur.
Pour chaque VirtualSensor récupérez les infos que nous avions laissés en attente précédemment, à savoir Zipa_ep & Zipa_apiKey.
Il faut récupérer l’url dans les propriétés du vSensor :

http://my.zipato.com/zipato-web/remoting/attribute/set?serial=xxxxxxxxxxxxxxxxxxxx&ep=xxxxxxxxxxxxxxxxxxxxxx&apiKey=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&state=true

Complétez le fichier computer_action.php avec ces informations.

Vous pouvez de nouveau faire :
Checker le statut de tout vos pc :

http://ip_du_nas/REPERTOIRE/computer_action.php?action=checkstatus

Cela modifiera le statut des VirtualSensor en fonction du statut de vos ordinateur et valider le bon fonctionnement et paramétrage.
Pour que cela se fasse automatiquement, créez une règle qui s’exécutera comme bon vous semble tous les x minutes :

image2nnm

Les VirtualSensor se mettront maintenant à jour automatiquement en fonction du statut de vos pcs.
Si vous allumez un PC par le boutton au bout de x minute la VirtualSensor correspondant sera mis à jour, vous saurez alors que le PC est allumé.
Créer maintenant la règle qui enverra les requêtes vers le script lorsque l’on agira sur le VirtualSwitch :
capturemyv

J’ai ajouté une nouvelle règle qui permet de modifier l’état du VirtualSwitch en fonction du VirtualSensor. Pourquoi ? Parce que si ls vSwitch est OFF et le vSensor est INACTIF . . . j’allume mon PC . . . au bout de x minute le vSensor passe à ACTIF . . . mais vSwitch reste à OFF . . pas très cohérent . . . d’où mes questions sur les forums . . j’ai pu directement modifier le statut du vSwitch cela aurait été plus simple et clair mais bon on fait avec. (Cela du coup fait 1vSwitch, 1vSensor, 2 Rules pour 1 PC . . . ).
imagegn
Alors oui du coup quand cette regle s’execute elle modif le vSwitch qui tout coup execute la regle qui envoie les actions mais pour le moment je ne sais pas faire autrement . . .

DaBoss

Passioné domotique

Vous aimerez aussi...

12 réponses

  1. Cyril dit :

    Très intéressant ce tutoriel merci pour tous le travail que tu fait pour nous novices!!!!

  2. Domotics dit :

    Un lien vers la source serait légitime …

  3. C’est une usine à gaz ! Désolé d’être aussi dur 😉
    Si on dispose d’un NAS (j’en ai deux) pourquoi utiliser la Zipabox. Il suffit de planifier avec le cron 2 commandes : La « net rpc shutdown », et wakelan (ipkg ou opkg repo). Pour le script PHP ci-dessus il y a une transgression de sécurité PHP en utilisant la commande « exec ». Curl_exec ok ! Y a moyen de le faire en lua script, en perl, en python assez facilement. Pour allez plus loin il y a aussi MCE Controller :http://domotique34.com/?p=2830 !
    C’est bien tout de même pour l’effort, mais y des moyens d’optimiser.
    Sébastien

    • Je pense qu’ici le but du tuto de DaBoss est surtout de pouvoir contrôler l’allumage et l’extinction des Pc via l’appli mobile connecté à la Zipa. Après, si il y a une optimisation possible, on pourra toujours la diffusée 😉

    • DaBoss dit :

      Sébastien> Les critiques ne me gêne tant qu’elles sont constructives. D’ailleurs,si j’ai posté mon « tuto » sur un forum et accepté qu’il soit repris sur ce blog c’est dans le but d’améliorer mon système.
      En effet, on peut considéré que c’est une usine à gaz, mais aujourd’hui c’est MA solution qui répond à MON problème et MES contraintes.

      – Le but étant bien de démarrer/arrêter mes PCs quand je le décide et non à heure fixe (et donc pas de cron).
      – Absolument d’accord avec toi sur la transgression php mais je n’aie pas encore trouvé de contournent, tes lumières pourrons peut être me le permettre.
      – Je ne suis pas seul à la maison et le facteur WAF bien connu de nous tous n’est pas compatible avec la « bidouille ». Il faut fournir à madame une solution simple et centralisé. Donc, le but est bien d’utilisé l’App de la Zipabox sur l’iDevice comme moyen de commande. S’il faut que je dise à madame, pour les pcs il faut que tu utilise safari sur ton téléphone, pour la lumière c’est la zipabox, pour la barrière c’est le bouton de l’interphone, etc…
      En lua, en perl, en python je ne doute pas que cela soit compliqué mais ou et comment tu exécute depuis un événement de la Zipabox les scripts ?
      Je vais regarde ce MCE Controler, il peut éventuellement me permettre de m’affranchir du exec en php.

      • Captainigloo dit :

        Peut-être prendre un peu de recul sur la pertinence du besoin. Par exemple : est-il vraiment nécessaire d’éteindre tes ordinateurs ? Une mise en veille profonde est disponible sur tous les systèmes cela se configure simplement. Cela permet aussi de les redémarrer plus vite (avec ou sans wol). Éventuellement il existe aussi les tâches planifiées, au moins si tu as oublié d’éteindre cela se fera systématiquement selon ta planification. Pour l’allumage le wol est une bonne solution. L’actionneur zipa+php socket c’est vraiment ça le truc qui cloche. Une box qui ne sait pas nativement l’exécuter est une box limitée. Il est dommage que la zipabox ne sache pas faire du M2M avec un langage script de base.
        Voilà pourquoi j’ai renvoyé ma zipabox deux jours après sa réception. Il y a pour moi une inadéquation entre un utilsateur geek (toi) et une zipabox. Le truc c’est que la marketing plan à été fait sur blockly (puzzle gestionnaire de scenarii) et que ceux n’ayant jamais eu de box avant se sont fait berner.

        • DaBoss dit :

          Oui j’avais pense à la tache planifier pour ne pas oublié de l’éteindre . . . mais j’ai par exemple un serveurs HyperV que j’allume de temps a autre pour des durées indéfinies et à des heures aléatoires . . .
          C’est ma première box et j’avoue rester un peu sur ma faim avec cette dernière quand à la stabilité, et l’évolution car beaucoup de bruit court sur leur forum concernant les évolutions mais aucunes roadmap officielle publié.
          Du coup en attendant mieux de leur part je « compense » . . .

  4. Sam dit :

    Bonjour j’ai donc créé un fichier computer_action.php que j’ai placé dans le répertoire web de mon synology

    Et lorsque j’appel celui-ci, son contenu est affiché dans la page web et rien ne se passe.

    J’ai just rajouté :<?php au début car sinon j'avais un retour page not found.

    Si vous pourriez m'aider,
    Merci

  1. 11 mai 2013

    […] Salut à tous !Aujourd’hui je vous propose un nouveau tutoriel proposé initialement par DaBoss sur le forum de TOUTELADOMOTIQUE, mais qui a également accepté de le publier ici pour notre plus grand bonheur.Bon je vous préviens à l’avance, ce tuto s’adresse aux plus confirmés !  […]

  2. 6 juin 2013

    […] l’utilité d’avoir à héberger des scripts PHP, comme par exemple, avec cette soluce : « Éteindre ou allumer ses PC depuis la zipa » ou encore « Déclenchement de règle depuis le calendrier […]

Laisser un commentaire