Si, comme moi, vous avez une maison secondaire équipée de radiateurs électriques, vous vous dites sans doute qu'il serait assez agréable de pouvoir les allumer à distance, afin de ne pas passer le premier dîner en après-ski et doudoune !

La domotique s'impose alors.

Mais que faire lorsque cette résidence n'est reliée à aucun réseau cablé, pas même téléphonique ?

L'arrivée des forfaits mobile à bas prix semble ouvrir quelques perspectives : 2 à 3 euros par mois avec SMS illimités ...

Papier, crayon, réflexion = solution !

Il me faut donc : un contrôleur de relais interfacé ethernet, un routeur wifi-ethernet, un smartphone Androïd, une appli serveur et une appli cliente. Le smartphone recevra des commandes par SMS, basculera les relais correspondant de l'IPX800 via le LAN dédié et renverra un accusé de réception.

Donc, je commande au Père Noël un IPX800 V2, je ressort un Huawei AscendG300 remisé aprés que son écran ait rencontré le carrelage (smartphone rooté et embarquant CyanogenMod, débarrassé de tous le superflu), un petit routeur ethernet-wifi, et c'est parti.

Première étape :

Ecrire l'appli serveur. Ce sera l'occasion de découvrir Androîd ! (Voir plus bas pour les détails.)

L'onglet "Contrôle" permet de voir et commander l'état des radiateurs.
L'onglet "Admin" permet de gérer la liste des numéros autorisés (clic long sur un numéro pour éditer/supprimer), le bouton "IPX800" pour renseigner l'IP fixe du controleur, le bouton "Admin" pour renseigner le numéro de l'administrateur (à qui seront envoyés les messages d'alertes éventuelles), "Log" pour afficher un mini journal des erreurs éventuellement rencontrées et "Reboot" pour rebooter le serveur après la première installation afin de l'enregistrer auprès de superUser pour les smartphones rootés (ce qui permet ensuite à l'appli de rebooter le smartphone si les choses tournent mal, l'électronique de ces petites bêtes étant rarement parfaite :)



Seconde étape :

L'appli cliente. Pas très différente de l'interface du serveur :) Au premier lancement, le message "Téléphone serveur non renseigné" s'affiche, vous invitant à appuyer sur le bouton "menu" du tel pour renseigner le numéro en question. Après redémarrage, l'appli commence par envoyer une commande de récupération d'état, puis vous permet de régler l'état des radiateurs avant de cliquer sur "Envoyer" pour envoyer la commande. La durée de la transaction envoi/réponse dépend de l'état du réseau, en pratique entre 15 et 30 secondes.



Voilà pour la description brève.
Ce dispositif est en service depuis maintenant 3 mois, 100% stable et opérationnel.
Les curieux vont maintenant pouvoir tester la chose grâce aux paquets suivants:

Le serveur, ou plutôt une version spéciale, avec un "faux" contrôleur : pas besoin d'IPX800 ni de LAN dédié pour tester, la classe DeviceFake remplaçant DeviceIPX800 se charge de simuler un IPX800 ! Bien sûr vous n'allumerez aucun radiateur avec ça :) Mais vous pourrez tester le comportement client / serveur.
DomoSMSServer-fake.apk

Et le client, l'original celui-ci.
DomoSms.apk


Je tiens les sources à disposition des plus intéressés.
Contact : hftom_at_free.fr


Maintenant pour les plus curieux, quelques détails:

Un tel dispositif n'est pas trés sollicité, tout au plus quelques fois par mois, et il serait vraiment dommage de s'apercevoir que "ca ne marche plus" juste avant de partir en weekend ! Il est donc particulièrement important que le système soit capable de récupérer seul d'éventuels dysfonctionnements, ou à défaut de les signaler par un message d'alerte. Au cours des tests j'ai identifié plusieurs problèmes potentiels :
  • dysfonctionnement du wifi du smartphone; solution : désactiver puis réactiver le wifi.
  • plantage du routeur ethernet-wifi; solution : A/M du routeur. Comment faire ?? Et bien, l'alimentation du routeur passe par le NF d'un des relais qui est programmé par un timer en mode fugitif ! La suite plus bas.
  • dysfonctionnement du module GSM du smartphone; solution : rebooter le smartphone.
  • gel "inexpliqué" de l'éxécution de l'appli (observé 1 fois); solution : rebooter le smartphone.
En gros, le fonctionnement est le suivant :
BootReceiver est un BroadcastReceiver qui reçoit le message BOOT_COMPLETED (émis par Androîd au démarrage du smartphone) et programme une alarme (sorte de cron job) qui lancera DomoService 30 secondes plus tard.
DomoService est un IntentService, c'est à dire un processus d'arrière plan qui présente l'intérêt de sérialiser tous les appels au service (évite d'avoir 2 instances du service lancé par 2 réceptions de SMS quasi simultanées qui voudraient toutes deux controler l'IPX800 !). Au premier lancement (programmé par BootReceiver), DomoService est exécutée avec l'action CHECK_STATE. DomoService.checkState() vérifie alors la connection avec l'IPX800 (en téléchargeant "status.xml"). Si la connection réussie, DomoService programme alors une nouvelle alarme qui le relancera 10 minutes plus tard et programme également un timer sur le relai de l'IPX800 controlant l'alim du routeur (à +13 minutes). Et ainsi de suite. Si la connexion échoue, DomoService coupe le wifi du smartphone, puis la rétablie et essaie à nouveau la connexion. Si elle échoue à nouveau, DomoService attend quelques minutes, le temps que le timer fugitif programmé sur le relai controlant l'alim du routeur se déclenche (5 secondes en mode fugitif) ce qui provoque l'A/M du routeur, puis il teste à nouveau la connexion. Si elle échoue à nouveau, alors il reboot le smartphone (si celui-ci est rooté et n'a pas déjà été redémarré dans l'heure écoulée).
A chaque checkState(), DomoService en profite pour vérifier si le smartphone est alimenté électriquement et si non envoie un message d'alerte à l'administrateur toutes les heures (jusqu'à rétablissement... ou épuisement de la batterie:). Il envoie également un message d'alerte si la connexion avec l'IPX800 echoue pendant plus d'une heure. Plus quelques autres alertes.

Voilà, encore une fois, si les sources vous intéressent, voir plus haut.
Domotique SMS Androïd - 2014