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.


