Vera: Programmer une simulation de présence

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 !

Télécharger le script complet

 

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 ;-)

Télécharger le script complet

 

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…).


5 Commentaires

      Laisser un commentaire

      Ne ratez plus aucune news !

      Inscrivez vous à notre newsletter, et recevez chaque mois toute l'actualité du blog pour ne plus rien louper: actualité, guides, tutoriaux, concours !

      Merci pour votre inscription !