Page 1 sur 4

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

Publié : 16 févr. 2016, 11:10
par fratton
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)

Image

Image

Image

Image

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&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
    commandArray['Variable:'..PIRVirtuel_detected]=PIRdeclanche
    print('PIR Virtuel Script: '..PIRdeclanche..' detecté ('..nbdetecteur..')')
    commandArray[PIRVirtuel]='On'
end

return commandArray
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.

Re: Fiabilisation des détecteurs de mouvement PIR chinois

Publié : 22 févr. 2016, 19:40
par hades_75
Bonjour,

Je trouve votre approche de fiabilisation très intéressante mais je débute sur les scripts LUA, pourriez vous me dire si votre script est de type script_device_xxxxxxxxx.lua ou script_time_xxxxxxxx.lua ? Merci pour votre aide (je pencherai pour un type time sur le capteur virtuel).
Cordialement

Laurent

Re: Fiabilisation des détecteurs de mouvement PIR chinois

Publié : 22 févr. 2016, 20:20
par vil1driver
salut,

tu peux partir du principe que si tu trouves dans un script ceci devicechanged c'est qu'il s'agit d'un script_device.

et sans abuser c'était précisé ;)
fratton a écrit :(...)
Evénement de type LUA / Device
(...)
fratton utilise certainement l'éditeur intégré, d'où cette façon de préciser le type de script..

Re: Fiabilisation des détecteurs de mouvement PIR chinois

Publié : 23 févr. 2016, 10:20
par fratton
J'ai mis à jour le code avec :

- Création d'une boucle sur les PIR pour éviter la répétition de code
- Création automatique des variables de stockage en fonction du nom des détecteurs.

Re: Fiabilisation des détecteurs de mouvement PIR chinois

Publié : 27 févr. 2016, 12:29
par jml
Excellent , merci. Cela me servira.

Re: Fiabilisation des détecteurs de mouvement PIR chinois

Publié : 27 févr. 2016, 16:32
par deennoo
Super tuto, par contre quels modeles vous avez ? parce que j'en ai 5 en place et pas un me fait de fausse detection...

Re: Fiabilisation des détecteurs de mouvement PIR chinois

Publié : 29 févr. 2016, 19:39
par fratton
Des PIR Chinois EV1527 récupéré dans une alarme à 30€ :oops:

on trouve les mêmes à 4€93 sur :
http://www.aliexpress.com/item/Free-shi ... 28854.html
Image
Image

Re: Fiabilisation des détecteurs de mouvement PIR chinois

Publié : 29 févr. 2016, 20:35
par deennoo
OK en voyant la photo du pcb je comprends la différence avec les miens payer 5€ sur ebay, j'ai la fonction : compensation automatique de la température, du coup pas de problème.

Le pcb n'est pas du tout le même, je dois mettre le code par des jumpers.

A vérifier pour les prochains voulant s'équiper.

Re: Fiabilisation des détecteurs de mouvement PIR chinois

Publié : 29 févr. 2016, 22:42
par fratton
Je suppose que tu as des SC2262:

Image

Les modèles comme les miens ont aussi la compensation automatique de la température. Mais ça ne suffit pas, peut être un défaut de série.

le SC1527, c'est la puce qui gère le protocole de transmission de donnée, le code est automatique sur 20bits et interdit les scanner de code.
http://sc-tech.cn/en/hs1527.pdf

Le SC2261, c'est aussi la puce qui gère le protocole de transmission de donnée, le code 10bits est sélectionné manuellement.
http://www.sc-tech.cn/en/sc2262.pdf

Re: Fiabilisation des détecteurs de mouvement PIR chinois

Publié : 14 juin 2016, 12:50
par Triple0s
bonjour,

J'ai un soucis avec le script.

message d'erreur:
Error: EventSystem: in /home/sylvain/domoticz/scripts/lua/script_device_PIR.lua: /home/sylvain/domoticz/scripts/lua/script_device_PIR.lua:24: bad argument #1 to 'sub' (string expected, got nil)

Si je commente le dernier bloc IF plus d'erreur. Je pense que le script n'arrive pas a calculer correctement le temps.

Pouvez vous m'aider