lundi 28 juillet 2014

Un exemple de script Lua | Time : Cohérence et confirmation RFXCOM

LE 433mhz: pourquoi ? 


 Le RFXTRX 433mhz de RFXCOM est un outil permettant de communiquer avec des modules en 433 Mhz.

Avantage : leur prix (compter 15€ pour un module ON/OFF).

Inconvénient : Ces modules n'ont pas de retour d'état, c'est à dire qu'il est impossible de savoir si la commande que l'on vient d'envoyer à bien fonctionné (ou pas ) ...

 Il convient de ne pas lier des objets critiques à ce genre de modules, histoire de ne pas mettre le feu à la maison !

 Pour ma part, j'ai relié via ces modules quelques objets :
  • Radiateurs électriques pour gestion du chauffage. 
  • Contrôle de la VMC. 
  • Sondes de Température et Hygrométrie des chambres.

Un premier but : Vérifier la cohérence.

En domotisant ma VMC, il m'est arrivé de drôles de choses : ma vmc étant sensée s'éteindre en heures pleines continuait de tourner plein pot !
Comme nos chers modules 433 MHz n'accusent pas réception, il va falloir de temps en temps renvoyer la commande dans laquelle ils sont sensés être.
Pour cela nous allons utiliser les scripts LUA, surtout sous la forme "TIME" (c'est à dire déclenchée par le temps à certaines périodes).

Concrètement mon script fait ce qui suit :


  • Prend les éléments d'une liste à vérifier.
  • Regarde dans quel état l'élément est sensé être.
  • Renvoi le signal dans lequel l'élément est sensé être.
Deuxième But : Verifier l'âge des mesures de température.

Pour réduire la facture de domotisation, l'utilisation de sondes Oregon Scientific réduit considérablement la facture. Cependant il est difficile de savoir quand le module est à court de piles.
Mon script va donc vérifier l'age des dernières mesures de chaque sonde , et m'envoyer un mail dès que l'âge est supérieur à une valeur.

Voici le Fameux script :



--Permet toutes les 15 minutes de renvoyer la commande actuelle sensée etre appliquée aux modules en 433 ( sans retour d'etat )


commandArray = {}

--recupere les minutes
time=os.time()
minutes=tonumber(os.date('%M',time))
hours=tonumber(os.date('%H',time))

print('!*!*!*!*!*!*!*!*!Lancement du check à '..hours..'h'..minutes)


-------Toutes les 15 minutes
------------------------------------------------------------------------

if( (minutes==15) or (minutes==0) or (minutes==30) or (minutes==45) ) then



 --------Renforcement des envois de signal-------------------------------------
 ------------------------------------------------------------------------------
   print('check de tous les materiels rfxcom (sans retour d\'etat)');


   local check={}
   --Chauffage
   check['0']='Radiateur Mathilde'
   check['1']='Radiateur Parents'
   check['2']='Radiateur Salle De Bain'
   --VMC
   check['3']='VMC'
   --Lumieres
   check['4']='Lumiere TV'
   check['5']='Lumiere Salle De Jeu'
   --Piscine
   check['6']='Filtration Piscine Temp'

   --Parcours le Tableau
   for key, valeur in pairs(check) do
      print ('CHECK : '..valeur.. ' -> ' ..otherdevices[valeur])
      commandArray[valeur]=otherdevices[valeur]
   end


 --------FIN Renforcement des envois de signal-------------------------------------
 ------------------------------------------------------------------------------




end 

-------FIN Toutes les 15 minutes
------------------------------------------------------------------------

-------Une fois par heure, verifie l'age des mesures

if((minutes==0) or (minutes==1) ) then

    local temp={}
    --temperatures
    temp['0']='Mathilde'
    temp['1']='Parents'
    temp['2']='Salle De Bain'
    temp['3']='Salon'
    temp['4']='Meteo'
    --temp['4']='Entree'

    --delai au dela duquel on alerte en secondes
    local alerte=3600

    local mail='Alerte sur sonde temperature'
    local trigger=0

       --Parcours le Tableau de stemperatures
   for key, valeur in pairs(temp) do

                        s = otherdevices_lastupdate[valeur]
   -- returns a date time like 2013-07-11 17:23:12
                        t1 = os.time()
   year = string.sub(s, 1, 4)
   month = string.sub(s, 6, 7)
   day = string.sub(s, 9, 10)
   hour = string.sub(s, 12, 13)
   minutes = string.sub(s, 15, 16)
   seconds = string.sub(s, 18, 19)

   commandArray = {}

   t2 = os.time{year=year, month=month, day=day, hour=hour, min=minutes, sec=seconds}
   difference = (os.difftime (t1, t2))

             
      print ('CHECK Temperature: '..valeur.. ' -> ' ..otherdevices[valeur].. ' age = '..difference..' secondes')
             
             if(difference > alerte)then
                mail=mail..'Age de '..valeur .. '-> '..difference..' secondes !!
'
                trigger=trigger+1  
             end
      
   end
 if(trigger>0)then
    commandArray['SendEmail']='Alerte Age Sonde Temperature #Attention aux sondes suivantes :

'..mail..' #gruelt@gmail.com'
        end


end









return commandArray


Explications partie Renvoi de signal

--recupere les minutes
time=os.time()
minutes=tonumber(os.date('%M',time))
hours=tonumber(os.date('%H',time))

Au début du script on récupère l'heure système actuelle ( dans time) , et on extrait les chiffres des minutes et des secondes.
local check={}
   --Chauffage
   check['0']='Radiateur Mathilde'
   check['1']='Radiateur Parents'
   check['2']='Radiateur Salle De Bain'
   --VMC
   check['3']='VMC'
   --Lumieres
   check['4']='Lumiere TV'
   check['5']='Lumiere Salle De Jeu'
   --Piscine
   check['6']='Filtration Piscine Temp'


Ici j'initialise ma variable "check" , sous forme de tableau avec les deux accolades.Chaque ligne représente le nom du périphérique que je veux renforcer.
for key, valeur in pairs(check) do
Cette ligne permet d’exécuter le code suivant ( jusqu'au "end" associé ) une fois par périphérique. key = index dans le tableau ( 1 , 2 , 3 ...). valeur = centenu de la ligne du tableau ( 'Radiateur Mathilde' ....). check = nom du tableau parcouru.
      commandArray[valeur]=otherdevices[valeur]
Tout simplement : Je récupère l'état du périphérique courant, et je force le renvoi de l'état dans lequel il est sensé être. Et c'est fini pour cette partie !