- 1.PNG (10.6 Kio) Consulté 9766 fois
[LUA] Fiabilisation des détecteurs de mouvement PIR chinois
Re: Fiabilisation des détecteurs de mouvement PIR chinois
Raspberry Pi B+ / RF-Link 433MHz / divers device maison 433MHz et Wifi
Re: Fiabilisation des détecteurs de mouvement PIR chinois
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
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
Re: Fiabilisation des détecteurs de mouvement PIR chinois
Il faudrait le script complet, car c'est à la ligne 50
Raspberry Pi B+ / RF-Link 433MHz / divers device maison 433MHz et Wifi
Re: Fiabilisation des détecteurs de mouvement PIR chinois
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¶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
-- 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
-- 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¶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
-- 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
Re: Fiabilisation des détecteurs de mouvement PIR chinois
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
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
Re: Fiabilisation des détecteurs de mouvement PIR chinois
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 :
PS: quand tu mets du code dans les posts, sélectionne le, et click sur le bouton "Code" pour la mise en forme.
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'
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
Re: Fiabilisation des détecteurs de mouvement PIR chinois
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)
En tout cas je te remercie pour ta réactivité et ton support
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
Re: Fiabilisation des détecteurs de mouvement PIR chinois
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')
endRe: Fiabilisation des détecteurs de mouvement PIR chinois
Tu as un problème de parenthèse dans tes if.
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.
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')
endRaspberry Pi B+ / RF-Link 433MHz / divers device maison 433MHz et Wifi
Re: Fiabilisation des détecteurs de mouvement PIR chinois
non pas de problème de parenthèse
. Tout fonctionne comme désiré.