mercredi 23 avril 2014

Un exemple de script Lua | device: Alarme Simple

Un des arguments m'ayant fait pencher vers domoticz est la possibilité d'utiliser un langage de script : Lua ( http://www.lua.org/ ). En effet Blocky est gentil pour les petites automatisations, mais trouve très vite ses limites dès que l'on veut chercher un peu plus loin que "si bouton 1 = allumer lumière".

Où sont les scripts ?

Les scripts se situent dans votre répertoire d'installation de domoticz, dans scripts/lua . Pour ma part cela donne /home/pi/domoticz/scripts/lua ).
Dans ce repertoire ce situent deux scripts exemples : script_time_demo.lua et script_device_demo.lua

A savoir que les scripts contenant comme dernier mot "demo" sont ignorés par le système. Il peut être judicieux d'aller consulter le contenu de ces scripts pour se donner une première idée.

Qui déclenche les scripts ?

Il existe deux méthodes de déclenchement :
  • Device : le changement d'état d'un périphérique. Lorsque je presse un bouton sur ma télécommande ou que mon capteur de mouvement détecte une présence, cela induit un changement d'état : le système va donc parcourir tous les script débutant par script_device_xxxx.lua et executant leur contenu. Nous verrons par la suite comment utiliser ces scritps.
  • Time : Le déclenchement est basé sur le temps. Pour ceux qui connaissent le monde Unix on peu assimiler cette partie aux taches planifiées dans Cron. Pour faire simple : le script peut se déclencher sans requérir de changement d'état. Le script de demo présente une manière simple de tester si une porte de garage est ouverte depuis plus de 10 minutes, et ainsi de notifier par mail de cet état. Il n'y a donc pas de changement d'état déclenchant ce script, juste le temps.

Un exemple : une alarme simple

  • Dans cet exemple je pars ce cette configuration initiale, notez bien que la casse est très importante !
Voici le fameux script que nous allons décrypter un peu plus bas :


commandArray = {}



if ((otherdevices['Alarme'] == 'On') and (devicechanged['Motion Salon'] == 'On' or devicechanged['Motion Couloir'] == 'On')) then
   --recupere qui a change
   mydevice="rien"
   if(devicechanged['Motion Salon']=='On')then
      mydevice = "Salon"
   end
   if(devicechanged['Motion Couloir']=='On')then
      mydevice = "Couloir"
   end

   --notifie l'android via NMA
   commandArray['SendNotification']='Alarme '..tostring(mydevice)..'#Mouvement detecte avec alarme activee ! !!'
   commandArray['SendEmail']='Alarme '..tostring(mydevice)..'#Attention alarme activee#yourmail@gmail.com'
   print('Detection sur alarme activee : '..tostring(mydevice))
end

return commandArray


Ligne par ligne :
commandArray = {} 
: Initialise le tableau de commandes qui va être retourné en fin de script. Tous les scripts débutent ainsi.
if ((otherdevices['Alarme'] == 'On') and (devicechanged['Motion Salon'] == 'On' or devicechanged['Motion Couloir'] == 'On')) then 
:  La boucle d'entrée vérifiant que les conditions sont réunies.
devicechanged contient les données sur l'élément ayant changé d'état ( et qui a donc ainsi déclenché le lancement du script). otherdevices contient les données des autres éléments , qui eut n'ont pas changé d'état. Cette ligne vérifie que si
  • Le switch "alarme" est bien en état activé.
  • Et que soit "Motion Salon" ou "Motion Couloir" ont changé d'état en passant à "On".
commandArray['SendNotification']='Alarme #Mouvement detecte avec alarme activee ! !!'
Ajoute Au tableau de commandes retournée en fin de script l'envoi d'une Notification Via NotifyMyAndroid.
commandArray['SendEmail']='Alarme#Attention alarme activee#tonmail@gmail.com'
   print('Detection sur alarme activee : '
Ajoute Au tableau de commandes retournée en fin de script l'envoi d'une Notification Via Mail. Formalisme : " TITRE DU MAIL#CONTENU DU MESSAGE#mail destinataire. Et voici notre premier script, qu'il ne reste plus qu'à renommer en script_device_alarme.lua ! Une alarme vous notifiera des mouvements , du moment que le virtual switch "alarme" est sur "on".



Aucun commentaire:

Enregistrer un commentaire