Rafraîchissement nocturne

Le plus dur dans un script c’est souvent de trouver l’idée de départ. Et plus l’idée est simple, et plus on enrage de ne pas l’avoir trouvé le premier.
C’est ce qu’il m’est arrivé en lisant l’article de Mr Xhark sur blogmotion
En ces temps de canicule il est intéressant de connaitre le moment où la température extérieure passe en dessous de la température intérieure pour profiter du rafraîchissement nocturne (night cooling).

c’est ce que je me suis attaché à faire en LUA pour être intégré facilement à domoticz

Principe : ce script vérifie toutes les dix minutes si la température extérieure (variable temp_ext) passe en dessous de la température des pièces référencées dans le tableau les_températures.
il compare chaque température au seuil fixé par la variable seuil_notification (en °). Si une ou plusieurs températures sont supérieures à ce seuil, envoie d’une notification pour chacune d’elle.
une seule notification par jour, réinitialisée en cours d’après midi, la période la plus chaude de la journée.
Plusieurs type de notifications, par mail, par pushbullet ou via les notifications de domoticz.
Création de la variable utilisateur de réinitialisation automatique.
tableau des températures intérieures avec définition du nombre de pièces au dessus de la température extérieure avant envoi de notification (variable Nb_pieces)

--[[
--[[
name : script_time_rafraichissement_nocturne.lua
auteur : papoo
MAJ : 09/07/2017
création : 24/06/2017

/rafraichissement-nocturne/
http://easydomoticz.com/forum/viewtopic.php?f=17&t=4343#p38107
Principe : ce script vérifie toutes les dix minutes si la température extérieure (variable temp_ext) passe en dessous de la température  des pièces référencées dans le tableau les_températures. 
il compare chaque température au seuil fixé par la variable  seuil_notification (en °). Si une ou plusieurs températures sont supérieures à ce seuil, envoie d'une notification pour chacune d'elle.
une seule notification par jour, réinitialisée en cours d'après midi, la période la plus chaude de la journée.
Plusieurs type de notifications, par mail, par pushbullet ou via les notifications de domoticz.
Création de la variable utilisateur de réinitialisation automatique.
tableau des températures intérieures avec définition du nombre de pièces au dessus de la température extérieure avant envoi de notification (variable Nb_pieces)

]]--
--------------------------------------------
------------ Variables à éditer ------------
-------------------------------------------- 
local nom_script = 'Rafraîchissement nocturne'
local version = '1.05'
local debugging = true   	                                    -- true pour voir les logs dans la console log Dz ou false pour ne pas les voir
local url = '127.0.0.1:8080'                                    -- adresse ip domoticz
local seuil_notification = 25 	        	                    -- seuil température intérieure au delà duquel les notifications d'alarme seront envoyées
local deltaT = 2                                                -- Delta T entre T° interieure et T° extérieure avant alarme 
local temp_ext = 'Temperature exterieure' 	                    -- nom de la sonde extérieure
local les_temperatures = {"Temperature CH1", "Temperature CH2", "Temperature Entree", "Temperature Salon","Couloir 1er étage", "Temperature Parents", "Temperature Bureau", "Temperature Cuisine", "Temperature Douche"}; -- Liste de vos sondes intérieures séparées par une virgule
local notif_mail = true                                         -- true si l'on  souhaite être notifié  par mail, sinon false.
local notif_pushbullet = false                                   -- true si l'on  souhaite être notifié  via pushbullet, sinon false.
local notif_all = true                                         -- true si l'on  souhaite être notifié  via le système de notification domoticz, sinon false.
local EmailTo = 'votre.adresse@gmail.com'                            -- adresse mail, séparées par ; si plusieurs (pour la notification par mail)
local var_notif = 'Notification_ouverture_fenetres'             -- nom de la variable de limite de notification
local Nb_pieces = 4                                             -- Définissez le nombre de pièces minimum dont la T° est supérieure à la température extérieure avant l'envoi des notifications
local ResetHeure = 14                                           -- Heure à laquelle vous souhaitez réinitialiser les notifications
local ResetMinute = 25                                           -- Minute à laquelle vous souhaitez réinitialiser les notifications
local Pushbullet_token = ''   -- Token de votre Pushbullet (pour la notification via Pushbullet)
local OS = "linux"                                              -- Définissez l'os sous lequel fonctionne ce script. "linux" ou "windows"

--------------------------------------------
----------- Fin variables à éditer ---------
--------------------------------------------
local message = {}
local alarme = 0
local notification = '' 
commandArray = {}
--------------------------------------------
---------------- Fonctions -----------------
--------------------------------------------
--package.path = package.path..";/home/pi/domoticz/scripts/lua/fonctions/?.lua"
--json = (loadfile "/home/pi/domoticz/scripts/lua/JSON.lua")()  -- For Linux
--curl = '/usr/bin/curl -m 5 -u domoticzUSER:domoticzPSWD '		 	-- ne pas oublier l'espace à la fin
--require('fonctions_perso')

function voir_les_logs (s, debugging) -- nécessite la variable local debugging
    if (debugging) then 
		if s ~= nil then
        print ("".. s .."")
		else
		print ("aucune valeur affichable")
		end
    end
end	-- usage voir_les_logs("=========== ".. nom_script .." (v".. version ..") ===========",debugging)
--============================================================================================== 
function urlencode(str) -- encode la chaine str pour la passer dans une url 
   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 
--==============================================================================================
function Pushbullet(pb_title,pb_body)  -- séparer titre et message par un ;
    if OS == "windows" then -- pour windows
        local pb_command = 'c:\\Programs\\Curl\\curl -u ' .. Pushbullet_token .. ': "https://api.pushbullet.com/v2/pushes" -d type=note -d title="' .. pb_title .. '" -d body="' .. pb_body ..'"'
    else --pour Linux
        local pb_command = '/usr/bin/curl -m 5 -u ' .. Pushbullet_token .. ': "https://api.pushbullet.com/v2/pushes" -d type=note -d title="' .. pb_title .. '" -d body="' .. pb_body ..'"'
    end
    exec_success = os.execute(pb_command)
end
-------------------------------------
-------------- Fin Fonctions ---------------
--------------------------------------------
time=os.date("*t")
  
if ((time.min-1) % 10) == 0 then -- Déclenchement du script toutes les 10 minutes en commençant à HH:01 
--if time.min % 1 == 0 then -- pour test
    voir_les_logs("=========== ".. nom_script .." (v".. version ..") ===========",debugging)
	voir_les_logs("--- --- --- seuil de notification ".. seuil_notification .."°C",debugging)
    temperature_exterieure = string.match(otherdevices_svalues[temp_ext], "%d+%.*%d*")
    temperature_exterieure = temperature_exterieure 
    voir_les_logs("--- --- --- Temperature exterieure ".. temperature_exterieure .."°C",debugging)
    
    if var_notif ~= nil then -- le nom de la variable utilisateur a t'il été renseigné ?
        if(uservariables[var_notif] == nil) then -- Création de la variable  car elle n'existe pas
            voir_les_logs("--- --- --- La Variable " .. var_notif .." n'existe pas --- --- --- ",debugging)
            commandArray['OpenURL']=url..'/json.htm?type=command¶m=saveuservariable&vname='..urlencode(var_notif)..'&vtype=2&vvalue=0'
            adresse = urlencode(var_notif)
            voir_les_logs("--- --- --- adresse " .. adresse .."  --- --- --- ",debugging);
            voir_les_logs("--- --- --- Création de la Variable " .. var_notif .." manquante --- --- --- ",debugging)
            print('script supendu')
        else
        voir_les_logs("--- --- --- La Variable " .. var_notif .." est à : ".. uservariables[var_notif],debugging)
        notification = uservariables[var_notif] 
            if tonumber(notification) > 0 then
            voir_les_logs("--- --- --- Une notification a déjà été envoyée aujourd\'hui",debugging)
            else 
            voir_les_logs("--- --- --- Aucune notification n\'a été envoyée aujourd\'hui",debugging)
            end
        end  
    else 
        voir_les_logs("--- --- --- Le nom de la variable utilisateur n'a pas été correctement défini",debugging)
    end        
            
    for i,d in ipairs(les_temperatures) do
		
		local v=otherdevices[d]                        
			voir_les_logs("--- --- --- device value "..d.." = "..(v or "nil"),debugging)
            if v~= nil then
			
                if string.match(v, ';')  then
                    v=v:match('^(.-);')
                    voir_les_logs("--- --- --- svalue "..d.." = "..(v or "nil").."°C moins le delta T : "..tonumber(v)-tonumber(deltaT).."°C",debugging)
                    local temp_int = tonumber(v)-tonumber(deltaT)
                else
                    voir_les_logs("--- --- --- svalue "..d.." = "..(v or "nil").."°C moins le delta T : "..tonumber(v)-tonumber(deltaT).."°C",debugging)
                end			
			
				if ((tonumber(v)-tonumber(deltaT)) > tonumber(temperature_exterieure)) and (tonumber(v) > tonumber(seuil_notification)) and  (tonumber(temperature_exterieure) >= (tonumber(seuil_notification)-3)) then
                    alarme = tonumber(alarme) + 1
                    voir_les_logs("--- --- --- Température corrigée : "..(tonumber(v)-tonumber(deltaT)).."°C supérieure à la Température exterieure : "..tonumber(temperature_exterieure).."°C, valeur de la variable alarme : ".. alarme,debugging)
                    table.insert(message, 'température '..d..' : '..v..'°C, supérieure à la température exterieure '.. temperature_exterieure ..'°C et au seuil fixé à '.. seuil_notification ..'°C 
') end end end if alarme >= tonumber(Nb_pieces) then if notification == 0 then voir_les_logs("--- --- --- valeur de la variable alarme :".. alarme .." supérieure ou égale à la valeur de nbPieces :" ..Nb_pieces,debugging) if notif_mail == true then voir_les_logs("--- --- --- Nb d'alarme(s) : "..alarme,debugging) objet = 'Ouverture fenetres recommandee '..os.date("%H:%M") commandArray['SendEmail']= objet..'#'.. table.concat(message) .. '#' .. EmailTo voir_les_logs("--- --- --- Objet:"..objet,debugging) voir_les_logs("--- --- --- Corps du message: "..table.concat(message),debugging) voir_les_logs("--- --- --- Destinataire: "..EmailTo,debugging) else voir_les_logs("--- --- --- Notification par mail désactivée",debugging) end -- if notif_mail if notif_pushbullet == true and Pushbullet_token ~= nil then Pushbullet('Ouverture des fenetres recommandée','la température exterieure est inférieure à la temperature interieure') voir_les_logs("--- --- --- Notification pushbullet",debugging) else voir_les_logs("--- --- --- Notification pushbullet désactivée",debugging) end -- notif_pushbullet if notif_all == true then commandArray[#commandArray+1] = {['SendNotification'] = 'Ouverture des fenetres recommandée#la température exterieure est de '.. temperature_exterieure ..'°C'} voir_les_logs("--- --- --- Notification domoticz",debugging) else voir_les_logs("--- --- --- Notification domoticz désactivée",debugging) end --notif_all commandArray['Variable:'.. var_notif] = tostring(1) -- mise à jour de la variable utilisateur voir_les_logs("--- --- --- Mise à jour de la variable:".. var_notif .." à 1",debugging) end else voir_les_logs("--- --- --- valeur de la variable alarme :".. alarme .." inférieure ou égale à la valeur de nbPieces :" ..Nb_pieces,debugging) end voir_les_logs("========= Fin ".. nom_script .." (v".. version ..") =========",debugging) end -- if time if time.hour == ResetHeure and time.min == ResetMinute then commandArray['Variable:'.. var_notif] = tostring(0) -- mise à jour de la variable utilisateur voir_les_logs("=========== ".. nom_script .." (v".. version ..") ===========",debugging) voir_les_logs("--- --- --- Mise à jour de la variable:".. var_notif .." à 0",debugging) voir_les_logs("========= Fin ".. nom_script .." (v".. version ..") =========",debugging) end return commandArray

En espérant que cela puisse vous être utile

Laisser un commentaire