Extinction de feux automatisée7 minute(s) de lecture

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

11 Comments

  1. […] Pourquoi parler de smartphone ici? Tout simplement parce que le smartphone est souvent une solution efficace pour piloter sa domotique. Cela permet d'agir sur son domicile à distance. Comme cet objet vous suit partout, cela peut permettre au système domotique de savoir si vous êtes à la maison et si vous n'êtes pas encore couché… […]

    mardi 4 octobre 2011
    Reply
  2. Bastien said:

    et un capteur de luminosité dans le salon aurais pu marché,

    vendredi 16 mars 2012
    Reply
  3. Hervé Hervé said:

    Bonjour,
    Tu veux dire utiliser le capteur de luminosité pour savoir s’il y a de la lumière dans le salon? Ce n’est pas assez fiable à mon goût car si l’on regarde un bon film tranquilement lumières éteintes, la lumière dans la pièce est similaire à celle fournie par les lampadaires urbains…

    vendredi 16 mars 2012
    Reply
  4. Spyou said:

    Et un détecteur de pression sous le matelas? 🙂

    mercredi 11 juillet 2012
    Reply
    • Hervé Hervé said:

      C’est une idée. Mais alors interdit de lire au lit! 🙂

      mercredi 11 juillet 2012
      Reply
  5. nat said:

    salut
    perso je suis le dernier de la tribu a me coucher et la chose que je fais je ferme la porte donc
    je pense avec un simple detecteur de fenetre sur la porte
    je verif si porte open ou close
    si close
    je coupe tous
    non ?

    jeudi 18 octobre 2012
    Reply
    • Hervé Hervé said:

      Bonsoir,
      Tout à fait. C’est une autre manière de faite le boulot. Le tout est de trouver le gestion ou la situation quotidienne qui ne sera pas contraignant.

      jeudi 18 octobre 2012
      Reply
  6. Shaigan said:

    De mon coté j’utilise Tasker et Android sur mon smartphone et celui de ma femme. Nous rechargeons nos téléphones la nuit, mais nous pouvons les recharger en dehors de cette période, il faut une plage horaire. Pour ajouter un “code”, nous avons prit l’habitude de retourner les deux téléphones face contre table lorsque nous dormons.
    Tasker est capable de reconnaitre cet état (plage horaire + en charge + face en bas) et envoie l’ordre de mettre la maison en sommeil. Nous sommes deux, il faudra donc que les deux téléphones soient dans cet état pour que la maison réagisse.

    J’avais pensé domotiser la lampe de chevet (c’est embêtant à faire à cause de l’interrupteur situé sur le fil d’alim) qui place la maison en sommeil dès que les deux lampes sont éteintes 😉

    vendredi 16 novembre 2012
    Reply
    • Hervé Hervé said:

      Pas mal comme code. L’application Tasket a l’air très intéressante en effet pour interagir avec sa domotique. Étant à ce jour sous iPhone c’est ce genre de choses sympa que j’envie.

      lundi 19 novembre 2012
      Reply
      • alex said:

        Salut Hervé,
        je cherche à réaliser une détection de présence de mon iphone par le synology avec une fibaro HC2 le tout sur le wifi modem numericable
        c’est ton tuto qui s’en rapproche le plus, néanmoins je ne sais pas comment fonctionne les scripts sur synology, ni même les exécuter et encore moins les faire dialoguer avec la HC2 .
        j’ai également trouver des tutos sur la détection de présence, sans passer par le syno, mais cela fonctionne uniquement pour les android, sur iphone il faut alors push x fois/jr pour sortir de veille.
        aurais tu une piste, d’autres tutos pour débutant comme moi?
        par avance merci
        Alex

        vendredi 29 janvier 2016
        Reply

Laisser un commentaire

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

Prouvez que vous êtes humain: * Time limit is exhausted. Please reload CAPTCHA.