Site icon Abavala !!!

Extinction de feux automatisée

Problèmatique : Equipé depuis peu d’une Zibase, et toujours dans un souci d’économie d’énergie, je souhaitais pouvoir éteindre dans la maison les différents appareils actifs et non utiles (ex: Freebox HD,…) à partir du moment ou l’on va se coucher. Il me faut un moyen d’identifier cet évènement de manière simple et non contraignante!

Première idée : faire un scénario qui éteindrait les appareils à minuit. C’est simple!

Inconvénient : on ne se couche pas tous les jours à minuit et c’est dommage de couper la Freebox HD alors que l’on regarde un film en 2ème partie de soirée => ça peut être contraignant.

Deuxième idée : mettre à disposition quelque part un interrupteur que l’on accionnerai pour dire “ça y est je suis au lit tu peux éteindre la freebox HD”. C’est simple!

Inconvénient : Le souci c’est que qu’il ne faut pas oublier de le faire avant de se coucher… => ça peut être contraignant.

Troisième idée : identifier une action qui est faite tous les soirs au coucher et l’utiliser comme évènement déclancheur. J’ai une piste sérieuse! Une chose que je fais tous les soirs c’est de mettre mon smartphone en mode avion pour l’utiliser comme réveil sans les inconvénients des ondes wifi/3G proche de la tête. L’idée sera donc de faire en sorte que la Zibase si mon iPhone est en mode avion pour pouvoir endormir la maison.

Je me lance…

Etude préalable

Quand l’iPhone est mis en “mode avion”, il se coupe de tout réseau: bluetooth, téléphonique, 3G et… Wifi. Il “suffirait” donc de tester si l’iPhone est connecté au réseau wifi de l’appartement.

  • Une commande simple pour savoir si une machine est sur un réseau est la commande PING. Cela marche bien sûr si l’on connait l’adresse IP de la machine en question.

=> Pré-requis 1 : affecter une adresse IP fixe à mon iPhone.

  • La Zibase ne peut pas faire de PING. Elle peut par contre effectuer des appels HTTP.

=> Pré-requis 2 : avoir une machine “serveur” sur le réseau qui puisse être appelée en HTTP pour faire un PING.

  • Dès que l’iPhone est détécté il faut que le retour d’information soit fourni à la Zibase.

=> Pré-requis 3 : que la machine serveur puisse discuter avec la Zibase et lui fournisse un retour d’information.

  • Si l’iPhone n’est pas utilisé il se met en veille. On peut également le mettre en veille manuellement. Dans cette configuration et sûrement poura des raisons de sauvegarde de la batterie, l’iPhone se deconnecte du réseau Wifi.

=> Pré-requis 4 : trouver une façon pour laisser l’iPhone connecté au Wifi ou de l’obliger à se connecter avant le test de présence.

Mise en oeuvre

Pré-requis 1 : affecter une adresse IP fixe à mon iPhone.

Il suffit de se connecter sur la console d’admin de la Freebox et d’affecter une adresse IP fixe à l’adresse MAC de mon iPhone. L’adresse MAC de l’iPhone se trouve dans : Réglages/Général/Informations -> adresse wi-fi.

Pré-requis 2 : avoir une machine “serveur” sur le réseau qui puisse être appelée en HTTP pour faire un PING.

Machine serveur: j’ai la chance d’avoir un NAS Synology DS210J. J’ai donc créé un site Web et utiliserai le langage PHP pour faire le travail. Je n’ai pas d’autre machine qui tourne 24/24 je n’ai pas l’embarras du choix.

PING: c’est la que les choses se corsent. Débutant en PHP et après plusieurs tests et lectures diverses je me rends compte que la fonction PING est bizarement implémentée sous PHP/Synology. Je n’arrive pas à obtenir le résultat escompté. Mes différents tests n’arrivent pas à identifier l’iPhone. Ou plutôt si, il est toujours considéré comme connecté…

Une autre approche de la détection est de tenter une connexion par socket sur l’iPhone. Pour cela, il faut, en plus de l’adresse IP, un numéro de port. J’ai utilisé un scanner de port récupéré sur l’App Store un jour ou il était gratuit (on ne sait jamais ça peut servir un jour). J’ai donc auto-scanné mon iPhone et le résultat est … il existe au moins un port ouvert sur l’iPhone. Le port 62078: iTunes Sync Port sera l’heureux élu.

Le code suivant fait correctement le travail:


<?php
/*TEST DE PRESENCE SUR LE RESEAU*/
$host = "192.168.xxx.yyy"; /*il faut renseigner ici l'adresse IP de l'iPhone*/
$port = 62078;

require_once(“ZiBase.php”);

# Adresse IP de la zibase est nécessaire pour utiliser cette classe
$zibase = new ZiBase(“192.168.aaa.bbb”);

/*connexion au smartphone*/

$fp = fsockopen($host, $port, &$errno, &$errstr, 30);

/*test de présence*/

if(!$fp)
{
/*L’iPhone n’est pas présent*/
$present=0;
print”HS”;
} else {
/*L’iPhone est présent*/
$present=1;
print”OK”;
}

# Met à jour la variable 0 de la zibase en lui mettant la valeur de présence
$zibase->setVariable(0, $present);

?>

On y est presque!

Pré-requis 3 : que la machine serveur puisse discuter avec la Zibase et lui fournisse un retour d’information.

J’ai commencé à étudier la ZAPI, l’API mis à disposition par Zodianet pour discuter avec la Zibase. C’est tout à fait possible de l’atteindre en PHP. A mon grand soulagement 😉 Benjamin Garel a mis à disposition de la communauté un SDK alors que je commençait à créer le miens. Cela m’a permi de gagner beaucoup de temps! Merci à Benjamin et à Zodianet pour cette mise à disposition.

Pré-requis 4 : trouver une façon pour laisser l’iPhone connecté au Wifi ou l’obliger à se connecter avant le test de présence.

Je n’ai pas trouvé de moyens pour que la connexion au réseau wifi ne soit pas interrompue. Je ne trouvais d’ailleurs pas forcément que cette démarche était la bonne. Si elle est rompue je trouve cela plutôt sain pour la batterie.

J’ai remarqué que lorsque l’on fait sortir l’iPhone du mode veille, ce dernier se reconnecte rapidement et automatiquement au Wifi. Une méthode pour le faire sortir du mode veille si ce n’est manuellement c’est de recevoir un SMS ou une info en PUSH. Il suffira donc que la Zibase envoie un message PUSH (via pushme.to par exemple) à l’iPhone à tester pour que ce dernier sorte de veille et se connecte au Wifi. C’est une sorte de heartbeat pour ceux qui connaissent.

Implémentation

Maintenant que les différents “modules” sont en place il faut les assembler pour que le “service” soit rendu.

Sur la Zibase:

Scénario 1 “Extinction des feux” lancement à 00h00 tous les jours

  • Envoi d’un push de “bonsoir” via Pushme.to
  • Lancement du scénario 2 “Il y a-t-il un iPhone à la maison?” dans 5 secondes
  • Lancement du scénario 3 “Vérification de la réponse” dans 8 secondes
Scénario 2 “Il y a-t-il un iPhone à la maison?”
  • Lancement de la comande HTTP sur le NAS vers la page PHP de détection.

Scénario 3 “Vérification de la réponse”

  • Lancement d’un scénario selon une condition calculée: V0-1
  • Si >0 alors lancement du scénario 4 “Relance de vérification”
  • Sinon lancement du scénario 5 “On éteint tout”

Scénario 4 “Relance de vérification”

  • Lancement dans 30 minutes du scénario 1 “Extinction des feux”

Scénario 5 “On éteint tout”

  • On eteint tout ce qui doit l’être…

Sur le NAS:

  • Création d’une page PHP avec le code donné précédemment.
  • Installer le SDK PHP pour la ZAPI.

Sur l’iPhone:

  • Installation de pushme.to si ce n’était pas déjà le cas.

Sur la Freebox:

  • affectation d’une adresse IP fixe pour l’adresse MAC de l’iPhone.

Et voilà!

Conclusion

Ca marche très bien.

L’implémentation faite peur être améliorée par exemple en faisant en sorte que ce soit le script PHP qui appelle le scénario 5 “On éteint tout” ou qui relance le scénario 1 “Extinction des feux” 30 minutes plus tard. Cela permettrait de gagner de la place dans la mémoire de la Zibase et synchroniserait le retour du NAS vers la Zibase au lieu que la Zibase teste le retour du NAS 8 secondes après le début du scénario.

On peut imaginer utiliser cette méthode pour :

  • détecter qui est à la maison dès qu’une ouverture s’ouvre
  • mettre en route l’alarme dès que l’on n’est plus à la maison si on a oublié de le faire
  • mettre la maison en veille énergétique en cours de journée si personne n’est à la maison
Quitter la version mobile