Prenez un petit garage. Un seul détecteur de présence ne suffit pas car on peut être caché/mal vu quand on est derrière la voiture.
On ajoute un interrupteur pour pouvoir forcer l'allumage si jamais ces cons d'interrupteurs sont trop nuls pour vous voir et vous avez la problématique.
Les détecteurs de présence envoient 2 informations :
On ne peut pas déclenché l'arrêt de la lumière quand un détecteur envoie 'Off' car l'autre détecteur peut très bien vous avoir vu plus récemment.
Il faut aussi prendre en compte que vous pouver utiliser l'interrupteur.
Pour gére cela, l'idée utilisée ici est d'utiliser une date/heure de fin qui indique quand éteindre la lumière (varprochainarret).
Quand un des détecteurs capture quelque-chose (commande 'On'), il donne l'ordre d'allumage et renseigne la date/heure d'extinction à H+qquelques secondes.
Quand un des détecteurs arrive à la fin de son timer (commande 'Off'), on regarde si on a dépassé la date/heure d'extinction et si c'est le cas on coupe la lumière.
Dans les difficultés, les variables sont de bases éphémères en lua sous Domoticz. Donc on ne peut pas stocket la date/heure d'extinction dans une simple variable.
La solution est de passer par la fonction uservariables() qui permet de stocker une variable dans la base de données de Domoticz.
Il y a 2 scripts :
Du côté de l'interrupteur, pour gérer le côté 'forcé' de l'allumage, quand on l'actionne je programme une date/heure d'extinction à H+4 heures.
C'est un parti pris. Je ne laisse pas indéfiniment la lumière allumée. 4h me va bien.
Vous remarquerez dans le script des détecteurs ce contrôle qui empêche qu'un petit ajout de 20 secondes vienne écraser celui de 4 heures généré par l'interrupteur :
--Si l'ajout de seconde qu'on s'apprete à faire est supérieur à ce qui existe déjà (genre l'appui sur un bouton n'a pas déjà mis plus)
if (varostime + 20) > varprochainarret then
varprochainarret = varostime + 20
logMessage("Garage : varprochainarret après ajout de quelques secondes " .. varprochainarret)
commandArray['Variable:varzigbeeOnOffLightGarage']= tostring(varprochainarret)
else
logMessage("Garage : Pas d'ajout de secondes à varprochainarret car il avait déjà un total plus élevé (interrupteur manuel utilisé)")
end
Le script de gestion des détecteurs en lua
commandArray = {}
--Fonction trouvée sur http://easydomoticz.com/forum/viewtopic.php?f=10&t=7147
function getDevNameByIdx(devIdx)
for i, v in pairs(otherdevices_idx) do
if v == devIdx then
return i
end
end
return 0
end
function logMessage (TheMessage)
year = tonumber(os.date("%Y"));
month = tonumber(os.date("%m"));
day = tonumber(os.date("%d"));
hour = tonumber(os.date("%H"));
minutes = tonumber(os.date("%M"));
seconds = tonumber(os.date("%S"));
if (string.len(month) == 1) then month = "0" .. month end
if (string.len(day) == 1) then day = "0" .. day end
if (string.len(hour) == 1) then hour = "0" .. hour end
if (string.len(minutes) == 1) then minutes = "0" .. minutes end
if (string.len(seconds) == 1) then seconds = "0" .. seconds end
--logtime = year .. " " .. month .. " " .. day .. " " .. hour .. " " .. minutes .. " " .. seconds
logtime = year .. month .. day .. " " .. hour .. minutes .. seconds
file = io.open("mylog.txt", "a")
file:write(logtime .. " " .. TheMessage.."\n")
file:close()
end
--local temp = os.date("*t", 906000490)
varMotionSensorGarage01 = getDevNameByIdx(186)
varMotionSensorGarage02 = getDevNameByIdx(214)
varLumiereGarage = getDevNameByIdx(219)
if (uservariables['varzigbeeOnOffLightGarage'] == nil) then
commandArray['Variable:varzigbeeOnOffLightGarage']= -1
end
local varostime = 0
varostime = os.time()
--print("varostime " .. varostime)
local varprochainarret = 0
varprochainarret = (uservariables["varzigbeeOnOffLightGarage"])
if (devicechanged[varMotionSensorGarage01] == 'On') or (devicechanged[varMotionSensorGarage02] == 'On') then
logMessage("Garage : Allumage de la lumière par un détecteur de présence")
commandArray[varLumiereGarage]='On'
--Si l'ajout de seconde qu'on s'apprete à faire est supérieur à ce qui existe déjà (genre l'appui sur un bouton n'a pas déjà mis plus)
if (varostime + 20) > varprochainarret then
varprochainarret = varostime + 20
logMessage("Garage : varprochainarret après ajout de quelques secondes " .. varprochainarret)
commandArray['Variable:varzigbeeOnOffLightGarage']= tostring(varprochainarret)
else
logMessage("Garage : Pas d'ajout de secondes à varprochainarret car il avait déjà un total plus élevé (interrupteur manuel utilisé)")
end
logMessage("Garage : Light : " .. otherdevices[varLumiereGarage])
end
if (devicechanged[varMotionSensorGarage01] == 'Off') or (devicechanged[varMotionSensorGarage02] == 'Off') then
logMessage("Garage : Extinction d'un détecteur de présence")
if varprochainarret < varostime then
logMessage('Garage : Arret suite timer atteint')
if otherdevices[varLumiereGarage] ~= 'Off' then
commandArray[varLumiereGarage]='Off'
else
logMessage('Garage : Sauf qu il est déjà éteint (appui sur bouton off normalement')
end
end
logMessage("Garage : Light : " .. (otherdevices[varLumiereGarage]))
end
return commandArray
Lien vers le fichier : cliquez ici
Le script pour l'interrupteur
commandArray = {}
--Fonction trouvée sur http://easydomoticz.com/forum/viewtopic.php?f=10&t=7147
function getDevNameByIdx(devIdx)
for i, v in pairs(otherdevices_idx) do
if v == devIdx then
return i
end
end
return 0
end
function logMessage (TheMessage)
year = tonumber(os.date("%Y"));
month = tonumber(os.date("%m"));
day = tonumber(os.date("%d"));
hour = tonumber(os.date("%H"));
minutes = tonumber(os.date("%M"));
seconds = tonumber(os.date("%S"));
if (string.len(month) == 1) then month = "0" .. month end
if (string.len(day) == 1) then day = "0" .. day end
if (string.len(hour) == 1) then hour = "0" .. hour end
if (string.len(minutes) == 1) then minutes = "0" .. minutes end
if (string.len(seconds) == 1) then seconds = "0" .. seconds end
--logtime = year .. " " .. month .. " " .. day .. " " .. hour .. " " .. minutes .. " " .. seconds
logtime = year .. month .. day .. " " .. hour .. minutes .. seconds
file = io.open("mylog.txt", "a")
file:write(logtime .. " " .. TheMessage.."\n")
file:close()
end
local varostime = 0
local varprochainarret = 0
varInterrupteur2boutons = getDevNameByIdx(199)
varLumiereGarage = getDevNameByIdx(219)
varostime = os.time()
varprochainarret = (uservariables["varzigbeeOnOffLightGarage"])
if (devicechanged[varInterrupteur2boutons] == 'B2') then
logMessage("Garage : Appui sur Interrupteur B2")
local b = otherdevices[varLumiereGarage]
local f = otherdevices[varInterrupteur2boutons]
logMessage("Garage : Etat light : " .. b .. " Interrupteur : " .. f)
if (otherdevices[varLumiereGarage] == "On") then
varprochainarret = varostime -1
commandArray['Variable:varzigbeeOnOffLightGarage']= tostring(varprochainarret)
commandArray[varLumiereGarage]='Off'
logMessage("Garage : extinction de la lumière")
else
varprochainarret = varostime + (60*60*4) --On allume pour 4 heures
logMessage("Garage : varprochainarret après ajout " .. varprochainarret)
commandArray['Variable:varzigbeeOnOffLightGarage']= tostring(varprochainarret)
commandArray[varLumiereGarage]='On'
logMessage("Garage : allumage de la lumière")
end
end
return commandArray
Lien vers le fichier : cliquez ici
Pour rappel, quand vous créez vos scripts LUA, choisissez bien 'Device' dans le type de trigger, sinon les évènements if (devicechanged[]) fonctionneront mal.
Article(s) en relation(s)