[LUA] Fiabilisation des détecteurs de mouvement PIR chinois
Publié : 16 févr. 2016, 11:10
Si comme moi vous avez des détecteurs de mouvement PIR 433MHz pas cher (7€), vous avez certainement eu des déclenchements intempestifs
Ce problème se rencontre en hiver par exemple, lorsqu'un radiateur se met en marche.
Mais j'ai essayé de mettre le détecteur dans un tiroir que je n'ai pas ouvert et en 1 semaine j'ai eu 2 déclenchements, même avec des piles neuves... donc là ça pose quand même problème !
J'ai donc réfléchit au moyen de fiabilisé la détection car j'utilise les PIR pour l'alarme mais aussi pour le chauffage (NEST and co like).
Je me suis dit :
Si un voleur entre chez moi, il va se déplacer et déclenchera au moins 2 fois de suite le même détecteur dans les 30 secondes (j'ai testé et les déclenchement des PIR se font toutes les 5 à 6 secondes) ou alors 2 détecteurs seront déclenchés à la suite (2 détecteurs dans la même pièce).
J'ai donc créer :
- 1 détecteur virtuel qui sera le déclencheur d'alarme et/ou de chauffage avec délais d'extinction à 2 secondes. Pour éviter de surcharger domoticz, la mise à jour se fait uniquement si la dernière mise à jour à plus de 3mn.
- 1 variable texte qui stockera le dernier détecteur déclenché (pour que mon script alarme envoi la zone d'intrusion).
- 1 variable chaîne par détecteur pour stocké l'heure du dernier déclenchement (On)
- Tous les détecteurs on un délais d'extinction de 1 seconde (augmenter si l'on souhaite augmenter la sensibilité, mais rester en dessous de 5s)




Evénement de type LUA / Device
Après 15 jours de test, je n'est pas eu d'alarme intempestive alors que dans les log j'ai eu 5 déclenchements intempestif (sans véritable intrusion).
Le seul cas qui pourrait arriver est que 2 détecteurs ont un déclenchement intempestif simultanément ce qui me semble être un cas plutôt rare.
Ce problème se rencontre en hiver par exemple, lorsqu'un radiateur se met en marche.
Mais j'ai essayé de mettre le détecteur dans un tiroir que je n'ai pas ouvert et en 1 semaine j'ai eu 2 déclenchements, même avec des piles neuves... donc là ça pose quand même problème !
J'ai donc réfléchit au moyen de fiabilisé la détection car j'utilise les PIR pour l'alarme mais aussi pour le chauffage (NEST and co like).
Je me suis dit :
Si un voleur entre chez moi, il va se déplacer et déclenchera au moins 2 fois de suite le même détecteur dans les 30 secondes (j'ai testé et les déclenchement des PIR se font toutes les 5 à 6 secondes) ou alors 2 détecteurs seront déclenchés à la suite (2 détecteurs dans la même pièce).
J'ai donc créer :
- 1 détecteur virtuel qui sera le déclencheur d'alarme et/ou de chauffage avec délais d'extinction à 2 secondes. Pour éviter de surcharger domoticz, la mise à jour se fait uniquement si la dernière mise à jour à plus de 3mn.
- 1 variable texte qui stockera le dernier détecteur déclenché (pour que mon script alarme envoi la zone d'intrusion).
- 1 variable chaîne par détecteur pour stocké l'heure du dernier déclenchement (On)
- Tous les détecteurs on un délais d'extinction de 1 seconde (augmenter si l'on souhaite augmenter la sensibilité, mais rester en dessous de 5s)




Evénement de type LUA / Device
Code : Tout sélectionner
--------- Tableau des intérupteurs des PIR
local PIR={}
PIR['0']='PIR Salon'
PIR['1']='PIR Salle'
PIR['2']='PIR Bureau'
-- 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.1.100: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¶m=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
commandArray['Variable:'..PIRVirtuel_detected]=PIRdeclanche
print('PIR Virtuel Script: '..PIRdeclanche..' detecté ('..nbdetecteur..')')
commandArray[PIRVirtuel]='On'
end
return commandArrayLe seul cas qui pourrait arriver est que 2 détecteurs ont un déclenchement intempestif simultanément ce qui me semble être un cas plutôt rare.


