[LUA] Fiabilisation des détecteurs de mouvement PIR chinois

Vous avez créé un script LUA dont vous êtes fier, un .sh génial, un programme Python hors du commun, un Tuto, c'est ici que vous pouvez les partager.
fratton
Messages : 150
Inscription : 19 août 2015, 16:38

Re: Fiabilisation des détecteurs de mouvement PIR chinois

Message par fratton »

1.PNG
1.PNG (10.6 Kio) Consulté 9763 fois
Raspberry Pi B+ / RF-Link 433MHz / divers device maison 433MHz et Wifi
Froggy13
Messages : 6
Inscription : 03 oct. 2016, 13:29

Re: Fiabilisation des détecteurs de mouvement PIR chinois

Message par Froggy13 »

Bonjour,
Je viens de connecter un détecteur de présence Mysensor qui se nomme 'PIR Garage'.
La detection fonctionne correctement avec le problème de rebond de detection de présence.
J'ai copié le script que vous avez posté et créé un Device 'PIR Virtuel' mais sous les log j'ai ce message
2016-10-03 13:27:00.612 Error: EventSystem: in PIR: [string "-- Tableau des intérupteurs des PIR ..."]:50: attempt to concatenate a nil value

Voici le debut du script :
-- Tableau des intérupteurs des PIR
local PIR = {}
PIR['0'] = 'PIR Garage'

-- Nom de l'interupteur virtuel de type motion detector
local PIRVirtuel = 'PIR Virtuel'

-- Nom de la variable qui stock le dernier PIR detecté
local PIRVirtuel_detected = 'PIR_detected'

avez-vous une idée de mon pb de log ?
merci d'avance pour votre aide
fratton
Messages : 150
Inscription : 19 août 2015, 16:38

Re: Fiabilisation des détecteurs de mouvement PIR chinois

Message par fratton »

Il faudrait le script complet, car c'est à la ligne 50
Raspberry Pi B+ / RF-Link 433MHz / divers device maison 433MHz et Wifi
Froggy13
Messages : 6
Inscription : 03 oct. 2016, 13:29

Re: Fiabilisation des détecteurs de mouvement PIR chinois

Message par Froggy13 »

voici le script au complet. il y a un détecteur que j'ai noté 'PIR Garage' et un détecteur virtuel noté 'PIR Virtuel'

-- Tableau des intérupteurs des PIR
local PIR = {}
PIR['0'] = 'PIR Garage'

-- Nom de l'interupteur virtuel de type motion detector
local PIRVirtuel = 'PIR Virtuel'

-- Nom de la variable qui stock le dernier PIR detecté
local PIRVirtuel_detected = 'PIR_detected'

-- IP:PORT du serveur Domoticz
local ip = '192.168.0.250:8080' -- user:pass@ip:port de domoticz

-- Variables
local detection = false
local PIRdeclanche = ' '
local nbdetecteur = 0

commandArray = {}

function timedifference(s)
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)
t1 = os.time()
t2 = os.time{year=year, month=month, day=day, hour=hour, min=minutes, sec=seconds}
difference = os.difftime (t1, t2)
return difference
end

function urlencode(str)
if (str) then
str = string.gsub (str, "\n", "\r\n")
str = string.gsub (str, "([^%w ])",
function (c) return string.format ("%%%02X", string.byte(c)) end)
str = string.gsub (str, " ", "+")
end
return str
end

for key, valeur in pairs(PIR) do
-- Création de la variable si elle n'existe pas
if(uservariables['V_'..valeur] == nil) then
print('PIR Virtuel : création variable V_'..valeur)
commandArray[tonumber(key)]={['OpenURL']=ip..'/json.htm?type=command&param=saveuservariable&vname=V_'..urlencode(valeur)..'&vtype=2&vvalue='..urlencode(otherdevices_lastupdate[valeur])}
end
-- test de fiabilité déclanchement
local etat=tostring(devicechanged[valeur])
local last=timedifference(uservariables['V_'..valeur])
if (etat=='On' and last<30) then
commandArray['Variable:V_'..valeur]=otherdevices_lastupdate[valeur]
PIRdeclanche=valeur
detection=true
elseif (etat=='On') then
commandArray['Variable:V_'..valeur]=otherdevices_lastupdate[valeur]
PIRdeclanche=PIRdeclanche..' '..valeur
end
--compte le nombre de detecteur dans les 30 dernière secondes
if (last<30) then
nbdetecteur=nbdetecteur+1
end
end

-- Si plus d'1 detecteur sont sur On
if (detection==false and nbdetecteur>=2) then
detection=true
end

-- Mise à jour du detecteur virtuel si la dernière mise à jour à plus de 3mn
if (timedifference(otherdevices_lastupdate[PIRVirtuel])>180 and detection==true) then
-- if (detection==true) then
commandArray['Variable:'..PIRVirtuel_detected]=PIRdeclanche
print('PIR Virtuel Script: '..PIRdeclanche..' detecte ('..nbdetecteur..')')
commandArray[PIRVirtuel]='On'
end

if (devicechanged[PIRVirtuel] == 'On' and otherdevices['Garage'] == 'Off') then
commandArray['Garage']='On FOR 5'
end

print('PIRVirtuel Last update : ' .. otherdevices_lastupdate[PIRVirtuel])
return commandArray
Froggy13
Messages : 6
Inscription : 03 oct. 2016, 13:29

Re: Fiabilisation des détecteurs de mouvement PIR chinois

Message par Froggy13 »

Quelqu'un peu m'expliquer cette fonction ?
Merci

function urlencode(str)
if (str) then
str = string.gsub (str, "\n", "\r\n")
str = string.gsub (str, "([^%w ])",
function (c) return string.format ("%%%02X", string.byte(c)) end)
str = string.gsub (str, " ", "+")
end
return str
end
fratton
Messages : 150
Inscription : 19 août 2015, 16:38

Re: Fiabilisation des détecteurs de mouvement PIR chinois

Message par fratton »

Pas eu le temps de regarder en détail le pourquoi de l'erreur.

la fonction urlencode permet de mettre en forme une chaîne de caractères pour qu'elle soit utilisable comme URL, par exemple elle remplace les espaces par + . La création automatique de la variable se fait par l'appel de l'url json.html suivi des paramètres.

Je vois que tu utilise qu'un seul PIR, essaye pour voir de mettre 2 fois le même :

Code : Tout sélectionner

-- Tableau des intérupteurs des PIR
local PIR = {}
PIR['0'] = 'PIR Garage'
PIR['1'] = 'PIR Garage'
PS: quand tu mets du code dans les posts, sélectionne le, et click sur le bouton "Code" pour la mise en forme.
Dernière modification par fratton le 06 oct. 2016, 09:24, modifié 1 fois.
Raspberry Pi B+ / RF-Link 433MHz / divers device maison 433MHz et Wifi
Froggy13
Messages : 6
Inscription : 03 oct. 2016, 13:29

Re: Fiabilisation des détecteurs de mouvement PIR chinois

Message par Froggy13 »

Merci Fratton pour ton aide et tes explications très claires.

J'ai finalement changé de méthode. En fait j'utilise un capteur de présence PIR pour allumer mon garage automatiquement et désire que la lumière s'éteigne après 1 ou 2 min d'inactivité du capteur de présence.

Ma solution final et qui fonctionne est de créer un scénario (je vais le remplacer par un script aussi) qui allume la lumière quand le détecteur est actif puis un script LUA pour éteindre la lumière quand i'l n'y a plus d'activité.

Voici le code final (rien a voir avec le tien que j'aurai aimer comprendre de A à Z)

Code : Tout sélectionner

 function timedifference (s)
   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)
   t1 = os.time()
   t2 = os.time{year=year, month=month, day=day, hour=hour, min=minutes, sec=seconds}
   difference = os.difftime (t1, t2)
   return difference
 end
 commandArray = {}
 print('evaluating if someone is in Garage')
 if (otherdevices['Garage'] == 'On') and (timedifference(otherdevices_lastupdate['PIR Garage']) > 60) then
         commandArray['Garage']='Off'
         print('turning off Garage, no movement for 1mn')
end
En tout cas je te remercie pour ta réactivité et ton support
Froggy13
Messages : 6
Inscription : 03 oct. 2016, 13:29

Re: Fiabilisation des détecteurs de mouvement PIR chinois

Message par Froggy13 »

au final sans scénario :)

Code : Tout sélectionner

 
 function timedifference (s)
   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)
   t1 = os.time()
   t2 = os.time{year=year, month=month, day=day, hour=hour, min=minutes, sec=seconds}
   difference = os.difftime (t1, t2)
   return difference
 end
 
 commandArray = {}
 print('Test si présence dans le Garage')
 
 if (otherdevices['Garage'] == 'On') and (timedifference(otherdevices_lastupdate['PIR Garage']) > 60) then
         commandArray['Garage']='Off'
         print('Lumière Garage Off, Pas de mouvement durant 1mn')
 end
 
 if (otherdevices['PIR Garage'] == 'On') and (otherdevices['Garage'] == 'Off') then
         commandArray['Garage']='On'
         print('Eclairage Garage On')
 end
fratton
Messages : 150
Inscription : 19 août 2015, 16:38

Re: Fiabilisation des détecteurs de mouvement PIR chinois

Message par fratton »

Tu as un problème de parenthèse dans tes if.

Code : Tout sélectionner

function timedifference (s)
   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)
   t1 = os.time()
   t2 = os.time{year=year, month=month, day=day, hour=hour, min=minutes, sec=seconds}
   difference = os.difftime (t1, t2)
   return difference
 end
 
 commandArray = {}
 print('Test si présence dans le Garage')
 
 if (otherdevices['Garage'] == 'On' and  timedifference(otherdevices_lastupdate['PIR Garage']) > 60) then
         commandArray['Garage']='Off'
         print('Lumière Garage Off, Pas de mouvement durant 1mn')
 end
 
 if (otherdevices['PIR Garage'] == 'On'  and  otherdevices['Garage'] == 'Off') then
         commandArray['Garage']='On'
         print('Eclairage Garage On')
 end
Je suppose que c'est un script sur de type "Device", du coup le garage s’éteindra que si un device est activé après 60s. Il y a plus simple en mettant simplement 60s d'extinction sur l’interrupteur garage et en envoyant 'On' a chaque détection du PIR Garage, par LUA ou scénario.
Raspberry Pi B+ / RF-Link 433MHz / divers device maison 433MHz et Wifi
Froggy13
Messages : 6
Inscription : 03 oct. 2016, 13:29

Re: Fiabilisation des détecteurs de mouvement PIR chinois

Message par Froggy13 »

non pas de problème de parenthèse :). Tout fonctionne comme désiré.
Répondre