TUTOS.EU

Gestion en lua d'un interrupteur et de plusieurs détecteurs sous Domoticz

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 quand ils ont capté quelque-chose
  • Off quand cela fait un certain temps qu'ils n'ont rien détecté

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 :

  • un pour l'interrupteur
  • un pour les capteurs

 

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.