Page 1 sur 1

Alerte fenêtres ouvertes

Publié : 26 oct. 2022, 20:16
par Tontonpat
Bonjour à tous,
Je démarre dans les scripts Lua. et je cherche à me faire une alerte (device Générale on/off 2 fois de suite) lorsque la température extérieure est inférieure à 14°c et que certaines fenêtres sont ouvertes depuis 30 minutes. puis si toujours pas fermés, relancer l'alerte toutes les 30 minutes.

Je penses ne pas arriver à mémoriser l'heure d'ouverture de chaque fenêtre comme il faut.
Ce matin dès que j'ai ouvert la "fenêtre nous", j'ai eu l'alerte direct.

Voici ce que j'ai tenté de faire en récupérant des morceaux à gauche à droite:

Code : Tout sélectionner

-- Température extérieur <= 14°C

time = os.date("*t")  

function timedifference(d)
   s = otherdevices_lastupdate[d]
   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 round(num, dec)
    if num == 0 then
        return 0
    else
        local mult = 10^(dec or 0)
        return math.floor(num * mult + 0.5) / mult
    end
end

local temps_ouv_fnous = timedifference('Fenêtre Nous')
local temps_ouv_fsdb = timedifference('Fenêtre Salle de bain')
local delais = 1800    --1800 secondes
local consigne = 14 --14°C

commandArray = {}
local repetn = round(temps_ouv_fnous/delais,0)
local delain = round((temps_ouv_fnous-((repetn-1)*delais)),0)
local repetsdb = round(temps_ouv_fsdb/delais,0)
local delaisdb = round((temps_ouv_fsdb-((repetsdb-1)*delais)),0)

--print("fnous : "..temps_ouv_fnous.." "..repetn.." "..delain)
--print("sdb : "..temps_ouv_fsdb.." "..repetsdb.." "..delaisdb)

if ((otherdevices['Fenêtre Nous']=='Open') and delain>=delais) or ((otherdevices['Fenêtre Salle de bain']=='Open') and delaisdb>=delais) then
    if (devicechanged['Temp extérieur']) then
        local tempex = round(devicechanged[string.format('%s_Temperature', 'Temp extérieur')],1)
        if tempex <= consigne then
            commandArray[1]={['Générale']='Off AFTER 1'}
            commandArray[2]={['Générale']='On AFTER 2'}
            commandArray[3]={['Générale']='Off AFTER 3'}
            commandArray[4]={['Générale']='On AFTER 4'}
            if (otherdevices['Fenêtre Nous']=='Open') then
            print("durée totale d'ouverture fnous : "..temps_ouv_fnous)
            print("nbr repetition nous: "..repetn)
            print("délai nous : "..delain)
            elseif (otherdevices['Fenêtre Salle de bain']=='Open') then
            print("durée totale d'ouverture fsdb : "..temps_ouv_fsdb)
            print("nbr repetition sdb: "..repetsdb)
            print("délai sdb: "..delais)
            else
            print("Ferme les fenetres, ça caille dehors :"..tempex.."°C")
            end
        end
    end
end

return commandArray
En blocky, ça fonctionne parfaitement.

Merci pour votre aide

Re: Alerte fenêtres ouvertes

Publié : 08 nov. 2022, 16:28
par zemax_59
Hello,

Désolé pour cette réponse tardive, mais si ca peut t'aider, voici comment j'ai monté une alerte qui me prévient quand la porte d'entrée est ouverte depuis plus de 5mn, et qu'il fait froid dehors. C'est assez similaire à ce que tu cherches à faire il me semble.

Pour ça j'ai besoin de 2 scripts : 1 en "all" qui gère le décompte du temps et le statut de la porte,

Code : Tout sélectionner

commandArray = {}

--Calcule la différence de temps (en secondes)
function timedifference(timestamp)
  y, m, d, H, M, S = timestamp:match("(%d+)-(%d+)-(%d+) (%d+):(%d+):(%d+)")
  difference = os.difftime(os.time(), os.time{year=y, month=m, day=d, hour=H, min=M, sec=S})
  return difference
end

local s = otherdevices_lastupdate['Porte entrée']
local mydevice_changed = false

if (devicechanged ~= nil and devicechanged['Porte entrée']) then
    mydevice_changed = true
end

--si depuis 5mn, la porte est restée ouverte et qu'on n'a pas encore prévenu
if(otherdevices['Porte entrée']=='Open' and timedifference(s) > 300 and not mydevice_changed and uservariables["avertissement"] == "Non") then
    local temp = otherdevices_temperature['Dehors']
    if (temp < 20) then  --s'il fait endessous de 20°C dehors
    --envoie un sms
    commandArray['SendNotification']='Alerte porte entrée#La porte d\'entrée est ouverte depuis 5 minutes!#0#sound#extradata#http'
    -- fait parler Alexa
    os.execute('/home/pi/domoticz/scripts/python/alexa_remote_control.sh -d "Partout" -e speak:"Attention! La porte d entrée est ouverte depuis 5 minutes."')
    -- retient que l'avertissement a été fait
    commandArray['Variable:avertissement'] = 'Oui' 
    end
end

return commandArray
Et un autre en "time", pour éviter que l'alerte soit répétée sans fin, à chaque variable mise à jour ou capteur déclenché, et ce, jusqu'à ce qu'on ferme la porte (Comme ça, ça limite à 1 fois par minute ce qui me va)

Code : Tout sélectionner

-- sert à réinitialiser l'avertissement de la porte pour qu'il ne prévienne qu'1 fois par minute
commandArray = {}

commandArray['Variable:avertissement'] = 'Non' 

return commandArray

En espérant que cela puisse t'aider.

Re: Alerte fenêtres ouvertes

Publié : 11 nov. 2022, 18:27
par Tontonpat
Merci beaucoup !!
Je l'ai adapté et ça fonctionne :

Code : Tout sélectionner

commandArray = {}

--Calcule la différence de temps (en secondes)
function timedifference(timestamp)
  y, m, d, H, M, S = timestamp:match("(%d+)-(%d+)-(%d+) (%d+):(%d+):(%d+)")
  difference = os.difftime(os.time(), os.time{year=y, month=m, day=d, hour=H, min=M, sec=S})
  return difference
end

local s = otherdevices_lastupdate['Fenêtre Nous']
local s2 = otherdevices_lastupdate['Fenêtre Salle de bain']
local mydevice_changed = false
local delai = 1800

if (devicechanged ~= nil and (devicechanged['Fenêtre Nous'] or devicechanged['Fenêtre Salle de bain'])) then
    mydevice_changed = true
end

--si depuis 30mn, l'une des fenêtres est restée ouverte et qu'on n'a pas encore prévenu
if(((otherdevices['Fenêtre Nous']=='Open' and timedifference(s) > delai) or (otherdevices['Fenêtre Salle de bain']=='Open' and timedifference(s2) > delai)) and not mydevice_changed and uservariables["avertissement"] == "Non") then
    local temp = otherdevices_temperature['Temp extérieur']
    if (temp < 14) then --s'il fait en dessous de 14°C dehors
        commandArray[1]={['Générale']='Off AFTER 1'}
        commandArray[2]={['Générale']='On AFTER 2'}
        commandArray[3]={['Générale']='Off AFTER 3'}
        commandArray[4]={['Générale']='On AFTER 4'}
        -- retient que l'avertissement a été fait
        commandArray['Variable:avertissement'] = 'Oui' 
    end
end

return commandArray

Re: Alerte fenêtres ouvertes

Publié : 17 nov. 2022, 15:26
par Tontonpat
J'ai modifié le script time afin de n'avoir l'alerte de rappel que toutes les 30 minutes.
Mais si j'ouvre une fenêtre à 8h54 par exemple, la 1ère alerte est faite à 9h24 (normal) et le rappel se fait à 9h30 puis toutes les 30 minutes, au lieu de 9h54, puis 10h24, etc..

Voici ce que j'ai fait :

Code : Tout sélectionner

-- sert à réinitialiser l'avertissement de la porte pour qu'il ne prévienne qu'1 fois par minute
commandArray = {}
local time = os.date("*t")

if (time.min % 30)==0 then
    if uservariables['avertissement'] == 'Oui' then
        commandArray['Variable:avertissement'] = 'Non'
        print ("RAZ avertissement fenetres ouvertes")
    end
end
return commandArray
Comment enregistrer l'heure d'ouverture, puis de contrôler cette heure et lancer une alerte toutes les 30 minutes?