Nous avons vu hier comment programmer une simulation de présence dans le logiciel Homeseer. Très peu de logiciels intègrent cette fonction, ce qui à mon avis est fort dommage. Toutefois, sur certains, la possibilité d'écrire des scripts permet de palier à ce manque. Nous allons donc voir aujourd'hui comment gérer une simulation de présence sur la Vera.
Le principe de la simulation de présence est d'effectuer certaines actions, à un moment qui ne soit pas toujours le même chaque jour, ceci afin de faire croire à l'extérieur que la maison est habitée. Si on programme l'allumage d'une lampe par exemple tous les jours à 22h, il ne faudra pas longtemps pour remarquer que cette lumière est tout le temps allumée à la même heure, et donc soupçonner une programmation automatique. Bien sûr, on pourrait créer un scénario avec une heure différente pour chaque jour: c'est lourd à paramétrer, et au bout d'un certain temps on peut également s'apercevoir de la régularité de ces actions.
Nous allons donc passer par un petit script en Lua, trouvé sur le forum de Micasaverde, qui remplit parfaitement cette fonction. Au premier abord il peut sembler complexe, mais il est au final très simple à utiliser.
Nous allons étudier deux cas: l'allumage de la lumière la nuit, et la diffusion de musique la journée.
I. Gestion de la lumière
Nous allons faire s'allumer une lampe, à une certaine heure, s'il fait nuit uniquement. Elle s'allumera à l'heure indiquée + un delta aléatoire, s'allumera un temps donné + un delta aléatoire, pour ensuite s'éteindre toute seule.
Pour que cela soit automatique, je veux que le scénario s'exécute si l'alarme est activée.
Le scénario à créer sur la Vera est relativement simple, puisque tout va se gérer dans le script Lua. On va donc simplement créer un scénario, avec un calendrier pour déterminer l'heure du déclenchement, par exemple ici tous les jours à 21h:
Ensuite, on va renseigner notre script dans l'onglet Luup:
Bon, on va décortiquer un peu le script:
Tout d'abord, on vérifie si l'alarme est activée, en récupérant le statut d'un device réel ou virtuel (id qu'on peut récupérer sur l'onglet avancé du device en question). Ici, je vérifie si le capteur de ma porte d'entrée est armé, ce qui signifie que l'alarme est activée, et donc la maison inoccupée:
local house_occupied=luup.variable_get(“urn:micasaverde-com:serviceId:SecuritySensor1″,”Armed”,45)
Si la maison est occupée ou qu'il ne fait pas nuit, on sort du scénario (on ne l'exécute pas)
if (house_occupied == “0”) or not ( luup.is_night() ) then
return false
end
Ensuite, on indique le device à activer (ici le 18), puis on règle en secondes les variables pour les actions aléatoires (dans l'ordre: delta pour l'allumage, temps minimum d'allumage, et delta pour l'extinction)
local Device3 = 18
local RandOnTime3 = 3600
local On3 = 1000
local RandOffTime3 = 600
On calcule des valeurs aléatoires comprises dans l'intervalle donné précédemment:
local RanNumbOn3 = (math.random() * RandOnTime3 )
local RanNumbOff3 = (math.random() * RandOffTime3 )
On crée la fonction d'allumage, qui se chargera d'allumer la lumière à l'heure définie
function DelayOn3()
luup.call_action(“urn:upnp-org:serviceId:SwitchPower1″,”SetTarget”,{ newTargetValue=”1″},Device3)
luup.call_timer(“StayOn3”, 1, On3 , “”, “”)
end
On crée la fonction qui déclenchera l'extinction à l'heure calculée
function StayOn3()
luup.call_timer(“DelayOff3”, 1, RanNumbOff3, “”, “”)
end
On crée la fonction qui éteindra effectivement le device
function DelayOff3()
luup.call_action(“urn:upnp-org:serviceId:SwitchPower1″,”SetTarget”,{ newTargetValue=”0″},Device3)
end
Enfin, on lance la simulation en elle même, qui va se programmer à l'heure calculée aléatoirement:
luup.call_timer(“DelayOn3″, 1 , RanNumbOn3,””,””)
Dans cet exemple, la lampe correspondant au device 18 va s'allumer entre 21h et 22h (21h + 3600 secondes), rester éclairée au moins 16min (1000 secondes), et s'éteindre entre 16 min et 26 min (1000 secondes + 600 secondes).
Dans les faits, j'ai ainsi obtenu cela:
- Lundi: Allumée à 21h03, extinction à 21h22
- Mardi: Allumée à 21h37, extinction à 22h01
- Mercredi: Allumée à 21h14, extinction à 21h36
- etc…
De l'extérieur, difficile de savoir si c'est programmé ou si c'est réellement quelqu'un !
II. Gestion de la musique
Allumer des lumières la nuit, c'est bien, mais la journée ? Et bien la journée, je diffuse de la musique, une webradio que j'écoute souvent pour les enfants (Disney), à des heures où j'ai l'habitude de l'écouter, mais avec un petit delta aléatoire comme pour les lumières. Quand on a compris le fonctionnement du script, il est assez facile à adapter pour piloter d'autres choses.
Le principe est le même: on crée un scénario, avec un calendrier où on défini les heures de lancement du scénario.
Ensuite, on complète l'onglet Luup avec notre script, que nous allons expliquer également.
Comme pour la lumière, je veux que le script s'exécute automatiquement si l'alarme est activée: si le détecteur de porte d'entrée est armé, cela veut dire que l'alarme est activée, et que la maison n'est pas occupée
local house_occupied=luup.variable_get(“urn:micasaverde-com:serviceId:SecuritySensor1″,”Armed”,45)
Si la maison est occupée, on sort du scénario (on ne l'exécute pas). On ne vérifie pas ici s'il fait nuit, le scénario peut s'exécuter n'importe quand.
if (house_occupied == “0”) then
return false
end
On règle en secondes les variables pour les actions aléatoires. Ici, j'ai mis une heure partout (3600 secondes): la musique se lancera entre l'heure définie dans le calendrier et cette heure + 1 heure, se fera entendre pendant 1 heure minimum, et s'éteindra dans les 60 minutes qui suivent.
local RandOnTime2 = 3600
local On2 = 3600
local RandOffTime2 = 3600
On calcule les valeurs aléatoires dans la fourchette indiquée précédemment
local RanNumbOn2 = (math.random() * RandOnTime2 )
local RanNumbOff2 = (math.random() * RandOffTime2 )
On crée la fonction qui lancera la musique. On utilise ici les API de la Squeezebox:
function DelayOn2()
socket=require(‘socket')
local client = socket.connect(‘192.168.5.8', 9090) => on indique l'adresse IP de son serveur Squeezebox
client:send(“00:04:20:27:d9:d1 power 1\n”) => on allume la Squeezebox correspondant à cette adrese MAC
local result=client:receive()
client:send(“00:04:20:27:d9:d1 mixer volume 90\n”) => on règle le volume de cette Squeezebox à 90%, histoire de l'entendre un peu de l'extérieur
local result=client:receive()
client:send(“00:04:20:27:d9:d1 playlist play http://opml.radiotime.com/Tune.ashx?id=s129490&formats=aac,ogg,mp3,wmpro,wma,wmvoice&partnerId=16&serial=561b209f37d5ef48d13b29e00b0fc47e\n”) => on lance la lecture de la webradio en indiquant le lien web
local result=client:receive()
luup.call_timer(“StayOn2”, 1, On2 , “”, “”)
end
On crée la fonction qui se chargera de l'extinction aléatoire
function StayOn2()
luup.call_timer(“DelayOff2”, 1, RanNumbOff2, “”, “”)
end
Puis on crée la fonction qui arrêtera la lecture sur la Squeezebox:
function DelayOff2()
socket=require(‘socket')
local client = socket.connect(‘192.168.5.8', 9090) => on indique l'adresse IP de son serveur Squeezebox
client:send(“00:04:20:27:d9:d1 mixer volume 50\n”) => on repasse le volume à 50% histoire de ne pas avoir de surprise à la prochaine écoute
client:send(“00:04:20:27:d9:d1 power 0\n”) => puis on éteint la Squeezebox correspondant à cette adresse MAC
local result=client:receive()
end
Enfin, on lance la simulation en elle même
luup.call_timer(“DelayOn2″, 1 , RanNumbOn2,””,””)
En réglant le calendrier à 12h, par exemple, la musique va se lancer quelque part entre 12h et 13h, être lue pendant au minimum 1 heure, puis s'éteindre toute seule dans les 60 minutes qui suivent. Avec un tel delta, on a vraiment de l'aléatoire :p
Je lance ici une webradio, ce qui permet d'avoir quelque chose qui change souvent (à l'écoute), mais on pourrait tout aussi bien lancer une playlist, ou pourquoi pas, un enregistrement de sa propre voix en train de discuter ;-)
III. Conclusion
J'ai utilisé cette simulation durant mes deux semaines de vacances, et cela fonctionne vraiment bien, à tel point que les voisins n'ont pas trop fait attention que nous étions partis. Avec les volets qui s'ouvrent automatiquement chaque jour, la musique diffusée la journée, et des lampes qui s'allument le soir, l'effet est plutot réussi.
On peut ainsi créer autant de scénarios qu'on souhaite, comme je l'ai fait:
Attention, toutefois, pour faire cela, à bien modifier les différentes variables dans les scripts (Device3, RandOnTime3, On3, RandOffTime3, RanNumbOn3, RanNumbOff3) ainsi que le nom des fonctions (DelayOn3, StayOn3, DelayOff3), sinon vos paramètres vont passer d'un scénario à l'autre, et vous risquez d'avoir des surprises. Personnellement, j'incrémente le chiffre à la fin à chaque scénario (1,2, 3, etc…).