[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.
landaisbenj
Messages : 695
Inscription : 12 mars 2017, 19:24

Re: Fiabilisation des détecteurs de mouvement PIR chinois

Message par landaisbenj »

Hello.

Je déterre un peu car je cherchais un moyen de gérer ma présence suivant la totalité de mes capteurs de mouvement.
J’étais partie sur le même principe: si un détecteur passe a ON j'oublie, sauf si lui même ou un autre détecteur était déjà passé a ON il y a peu.

J'ai regardé un peu ce script mais je ne l'ai pas compris. Du coup, j'essai de faire le miens en collant a celui la mais sans les variables.

Je suis en plein dans la boucle for: Si le détecteur passe a ON mais c'est la première fois qu'il est a ON depuis 1 minutes je vérifie les autres. Si un des détecteur était a ON il y a moins d'une minute, je valide et je souhaite sortir de ma boucle de recherche pour ne pas vérifier les autres (et soulager domoticz).

Avez vous un moyen de sortir de la boucle for sans interrompre le script ?

Code : Tout sélectionner

--recuperer l'etat du device
local etat=devicechanged[next(devicechanged)]
local delai=60

--Ceci: next(devicechanged)..': '..devicechanged[next(devicechanged)]
--Affiche cela: " Motion test: On "

warn(script..'1 Verification sur device: '..device..': '..etat..' '..lastSeen(next(devicechanged)), debug)

--si j'allume le meme motion en moins de 10 secondes alors Detection de presence passe a On
if (etat=='On' and lastSeen(device)<delai) or (od['Television']=='On' or od['Presence benjamin'] == 'On' or od['Smartphone celine'] == 'On') then

warn(script..' 2 Detection presence sur deuxieme etat en moins de 10s valide: '..etat..' '..lastSeen(next(devicechanged)), debug)
    switchOn('Detection presence')
    
--sinon je verifie qu'un autre motion n'etait pas deja a on depuis le delai en secondes
elseif etat=='On' then
    for key, valeur in pairs(PIR) do
        local etat=tostring(devicechanged[valeur])
        
warn(script..'1.2 Verification sur autre device: '..valeur..': '..etat..' '..lastSeen(valeur), debug)
        if lastSeen(valeur)<delai then
            switchOn('Detection presence')
warn(script..'2.2 Detection presence sur un autre device: '..valeur..': '..etat, debug)
--Sortir de la boucle car je viens de valider un deuxieme device.
        end
    end
end
Rpbi3b: Domoticz + Homebridge + Monit + Freebox scripts + Shellinabox; Rpbi2: Jarvis
Domoticz: Derniere stable; RFLINK: Dernière stable; Xiaomi Gateway
landaisbenj
Messages : 695
Inscription : 12 mars 2017, 19:24

Re: Fiabilisation des détecteurs de mouvement PIR chinois

Message par landaisbenj »

j'ai trouvé:

Code : Tout sélectionner

break
Rpbi3b: Domoticz + Homebridge + Monit + Freebox scripts + Shellinabox; Rpbi2: Jarvis
Domoticz: Derniere stable; RFLINK: Dernière stable; Xiaomi Gateway
lost
Messages : 1511
Inscription : 12 nov. 2016, 11:01

Re: Fiabilisation des détecteurs de mouvement PIR chinois

Message par lost »

landaisbenj a écrit : Je déterre un peu car je cherchais un moyen de gérer ma présence suivant la totalité de mes capteurs de mouvement.
J’étais partie sur le même principe: si un détecteur passe a ON j'oublie, sauf si lui même ou un autre détecteur était déjà passé a ON il y a peu.
Une autre façon de faire est de donner un poids aux capteurs, de les additionner sur une tranche de temps glissante et déclencher sur un seuil atteint.
landaisbenj
Messages : 695
Inscription : 12 mars 2017, 19:24

Re: Fiabilisation des détecteurs de mouvement PIR chinois

Message par landaisbenj »

lost a écrit :
landaisbenj a écrit : Je déterre un peu car je cherchais un moyen de gérer ma présence suivant la totalité de mes capteurs de mouvement.
J’étais partie sur le même principe: si un détecteur passe a ON j'oublie, sauf si lui même ou un autre détecteur était déjà passé a ON il y a peu.
Une autre façon de faire est de donner un poids aux capteurs, de les additionner sur une tranche de temps glissante et déclencher sur un seuil atteint.
Je sais pas si il y a un interet d'avoir un seuil different si tu compte le nombre ? Ou peutetre pour la presence d'animaux.

J'ai bossé un peu dessus et j'ai fais ca:

Code : Tout sélectionner

-- Raccourci rapide
local od = otherdevices
local dc = devicechanged
local uv = uservariables
local vc = uservariablechanged
local ca = commandArray
--######################################################################################################################################################--

--------- Tableau des interrupteurs des PIR
local PIR={}
PIR['0']='Motion entree'
PIR['1']='Motion couloir'
PIR['2']='Motion salon'
PIR['3']='Motion garage'
PIR['4']='Motion test'
PIR['5']='Motion test2'

--recuperer l'etat du device
local etat=devicechanged[next(devicechanged)]
local delai=60
--Ceci: next(devicechanged)..': '..devicechanged[next(devicechanged)]
--Affiche: "Motion test: On"
--si j'allume le meme motion en moins de 10 secondes alors Detection de presence passe a ON
if ((etat=='On') and (lastSeen(device)<delai)) or (dc['Television']=='On' or dc['Presence Wifi'] == 'On') then
warn(script..' 1 Detection presence sur deuxieme etat en moins de '..delai..'s valide: '..etat..' '..lastSeen(next(devicechanged)), debug)
    switchOn('Detection presence')
--sinon je verifie qu'au moins un autre motion n'etait pas deja a ON depuis le delai en secondes
elseif etat=='On' then
    for deviceName,deviceValue in pairs(PIR) do
        if lastSeen(deviceValue)<delai then
            switchOn('Detection presence')
warn(script..'1.2 Detection presence sur un autre device: '..deviceName..': '..deviceValue, debug)
break
        end
    end
end

Rpbi3b: Domoticz + Homebridge + Monit + Freebox scripts + Shellinabox; Rpbi2: Jarvis
Domoticz: Derniere stable; RFLINK: Dernière stable; Xiaomi Gateway
lost
Messages : 1511
Inscription : 12 nov. 2016, 11:01

Re: Fiabilisation des détecteurs de mouvement PIR chinois

Message par lost »

landaisbenj a écrit :
lost a écrit : Une autre façon de faire est de donner un poids aux capteurs, de les additionner sur une tranche de temps glissante et déclencher sur un seuil atteint.
Je sais pas si il y a un interet d'avoir un seuil different si tu compte le nombre ? Ou peutetre pour la presence d'animaux.
En fait, cela me sert en effet surtout pour les capteurs extérieurs.
Mes PIR intérieurs semblent fiables et ont un poids de base égal à celui de déclenchement immédiat de l'alarme.

L'autre subtilité est que dehors, je n'ai qu'un PIR car un seul angle protégé des variations lumineuses, surtout. Sans parler des passages de chats (surtout)/fouines/hérissons...

J'ai donc surtout des caméras... ce qui est PIRe (!!) encore niveau déclenchements même en baissant fortement les sensibilités et adaptant les zones de detection de mvt!

En réalité ces caméras alimentent un détecteur de mvt switch vituel dans domoticz et sont vues comme un PIR en interne. C'est un service écrit en python qui fait le job et en plus d'un poids de base, prends en compte le nb d'images capturées (check par tranche de 10s) recues sur un FTP du PI afin de calculer un poids global. Poids de base et un diviseur du nb d'images pour calculer un poids global sont configurables par cam (ainsi qu'un message vocal, cf + loin) via un fichier YML. Si on est présent une synthèse vocale dit ou ca bouge (une seule fois par tranche de 5mn par cam, histoire d'éviter le spam vocal continu quand on est dehors), sinon ce service ne déclenche pas directement d'alarme (juste passer à on le PIR en début de script et off en fin + update poids global) mais envoie les lots d'images compressées/chiffrées sur un compte gmail dédié (ce que Domoticz ne sait pas faire et je refuse d'envoyer des images de chez moi, même dehors, en clair).

C'est donc un peu plus complexe mais en fait, ces cam ne font qu'alimenter un switch virtuel et additionner le poids du aux captures dans une variable utilisateur poids d'alarme global via l'API HTTP/JSON. Ca ajoute un service mais côté domoticz et ses scripts alarme en Lua ca ne change pas grand chose.

Car pour le reste, tout switch (virtuel ou réel) mouvement qui change d'état déclenche un script device Lua qui va regarder ces poids et en notre absence, déclencher la sirène si le seuil est atteint.

Pour les poids de base, c'est une convention de nommage. Tous les pirXXX déclenchent immédiatement car poids = seuil, ainsi que les opnXXX (capteurs ouverture porte). Les prmXXX (PIRs installé dehors pour surveiller un périmètre) ont un poids de base au quart du seuil et les camXXX on un poids de base de 1 (auquel s'ajoute le poids dû aux captures calculé côté python).

Ainsi, j'ajoute un nouveau capteur je n'ai pas à toucher aux scripts tant le nommage du switch respecte le préfixe de la convention de nommage! Idée très pratique trouvée dans le wiki.

Sinon, c'est encore un poil plus complexe côté déclenchement alarme car il y a un seuil intermédiaire (qui ne va concerner en pratique que les prm/cam) qui va faire une alarme courte (5s, manière de dire "vu" à un intrus en repérage sans emmerder trop le voisinage si c'est juste un chat qui traîne un peu inhabituellement là ou il faut pas) et non envoyer la sirène pour 2mn.

Pour l'anecdote, les caméras étant planquées et filmant à travers des trous de cache en bois, j'ai eu des mésanges qui ont fait sonner en venant s'y accrocher car elles se disaient probablement "chouette, un trou pour faire un nid... ah merde, y'a un objectif"! Les animaux, c'est vraiment un challenge...

Ca s'est fait un peu au fur et à mesure, faudrait d'ailleurs que je refonde ça proprement mais ca marche bien ainsi et j'aime pas trop Lua qui est pénible à tester et Python ca va un peu mieux, mais l'absence de délimiteur de bloc et se baser sur l’indentation est une stupidité qui m'indispose: Je comprends qu'on aime bien les indentations correctes facilitant la lecture, mais y obliger ainsi c'est juste bête et méchant: Parfois le problème est vu à l'analyse syntaxique et signalé avant exécution, mais tout ne peut être vu sans délimiteur. Et on peut ainsi, selon les config d'éditeurs étant passé sur le source, se retrouver avec des lignes de marge visuellement dans un bloc mais qui à l’exécution seront en dehors. Troquer sa fixette de présentation contre un biais aussi dangereux dans un langage de programmation c'est amha un peu inquiétant niveau santé mentale du créateur de ce langage...

Le support python dans Domoticz progresse, ouvrant la possibilité d'unifier cela un jour (surtout que j'ai pas abordé le côté détection de notre présence, un autre service python)... ou d'en faire un plug-in une fois que ce sera bien stable.
Là c'est trop bazar pour publier des sources. Ce serait trop de questions/support. Même moi quand je veux ajouter un truc après 6 mois je peine un peu, c'est pourquoi j'expose juste l'idée.
landaisbenj
Messages : 695
Inscription : 12 mars 2017, 19:24

Re: Fiabilisation des détecteurs de mouvement PIR chinois

Message par landaisbenj »

Oui du coup ça image un peu plus l’idée. Mais je n’en suis pas rendu à l’extérieur. A l’intérieur le chat ne fait que passer devant le capteur. Un humain passera et repassera d’où la validation de plusieurs passage.
Surtout que je n’ai que trois capteurs qui pointent les entrées. Là où le chat ne passe pas.

Mais l’idée pour l’extérieur mérite d’être retenu.
Rpbi3b: Domoticz + Homebridge + Monit + Freebox scripts + Shellinabox; Rpbi2: Jarvis
Domoticz: Derniere stable; RFLINK: Dernière stable; Xiaomi Gateway
Répondre