Comme indiqué dans ce post https://easydomoticz.com/forum/viewtopi ... 449#p38449, vous trouverez ci-dessous mon script pour le chauffage d'une chambre.
Code : Tout sélectionner
--------------------------------
------ Variables à éditer ------
--------------------------------
nom = 'Chambre de X' --Affichage dans le log
local consigne_normal = tonumber(otherdevices_svalues['Thermostat_Normal_Chambre']) -- Température de consigne mode travail
local consigne_vacances = tonumber(otherdevices_svalues['Thermostat_Vacances_Chambre']) -- Température de consigne mode congés à la maison
local consigne_abs = tonumber(otherdevices_svalues['Thermostat_Absent']) -- Température de consigne lors d'abscence prolongée
local consigne_eco = tonumber(otherdevices_svalues['Thermostat_Eco']) -- Température de consigne mode absence courte durée
local sonde = 'Sonde_Chambre_X' -- Nom de la sonde de température
local mode = 'Mode_Chauffage' -- Nom de l'interrupteur virtuel de sélection de mode Normal-Vavances-Absent-Eco
local hysteresis = 0.5
local radiateurr = 'Radiateur_Réel_X' -- Nom de l'interrupteur réel de chauffage
local radiateur = 'Radiateur_X' -- Nom de l'interrupteur virtuel de chauffage
local compteur = 'oui' -- oui ou non si gestion de la consommation
local puissance = 1000 -- puissance du chauffage en watt
local conso = 'Conso_Chambre_X' -- nom du capteur virtuel de consommation électrique
local conso_id = 50 -- idx du capteur virtuel de consommation électrique
local reset = false -- force la mise à zero de la consomation instantané (laisser à false pour un fonctionnement normal) true/false
local temps = 120 -- temps en seconde si sonde ne repond pas --
local modeAlarme = 'sondeBis' -- action à effectuer si il y a une alarme sonde:
-- choisir 'on' pour que le chauffage reste allumé, ou 'off' pour qu'il soit éteint
-- ou choisir 'sondeBis' pour utiliser une autre sonde de température (par ex une située dans une autre pièce)
local sondeBis = 'Sonde_Chambre_Y' -- nom de la sonde de remplacement pour le mode sondeBis
local EmailTo = 'mon.email@xxxxx.xxx' -- adresse mail où seront envoyées les notifications, si plusieurs séparer par ;
local objet = 'Domoticz - Alerte Sonde le '
local envoiMail = 'mail_sonde_X' -- nom de la variable utilisateur gérant l'envoi des alertes
local user = 'xxxxxx' -- A remplacer par identifiant Free Mobile
local pass = 'xxxxxx' -- A remplacer par la clé d'identification au service SMS Free
--------------------------------
-- Fin des variables à éditer --
--------------------------------
commandArray = {}
------------------------------------
--- Gestion de l'alarme de sonde ---
------------------------------------
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
cumul_power = 0 -- initialisation de la puissance instantanee des radiateurs en fonctionnement
local lastSeen = timedifference(sonde)
if (lastSeen > temps) then
alarmeSonde = 1
else
alarmeSonde = 0
commandArray['Variable:'..envoiMail] = tostring (0)
end
-- on récupère la valeur de envoiMail
mailEnvoye = tonumber(uservariables[envoiMail])
if (mailEnvoye==0) and (alarmeSonde == 1) then envoyerAlerte = 1 end
if (mailEnvoye==1) and (alarmeSonde == 1) then envoyerAlerte = 0 end
if (mailEnvoye==0) and (alarmeSonde == 0) then envoyerAlerte = 0 end
if (mailEnvoye==1) and (alarmeSonde == 0) then envoyerAlerte = 0 end
----------------------------------
--- Gestion de la température ----
----------------------------------
local temperature = tonumber(string.sub(otherdevices_svalues[sonde],1,4)) -- Température relevée
-- Adaptation de la consigne suivant le mode choisi --
if (otherdevices[mode] == 'Normal') then consigne = consigne_normal end
if (otherdevices[mode] == 'Vacances') then consigne = consigne_vacances end
if (otherdevices[mode] == 'Absent') then consigne = consigne_abs end
if (otherdevices[mode] == 'Eco') then consigne = consigne_eco end
if ((otherdevices[Jour_ferie] == 'On') and (otherdevices[mode] == 'Normal')) then consigne = consigne_vacances end
if (temperature < (consigne-hysteresis)) then
commandArray[radiateurr]='Off' -- Radiateur allumé : gestion fil pilote
commandArray[radiateur]='On' -- Radiateur virtuel pour afficher sur le tableau de bord que le radiateur est allumé
status = 1
print('Chauffage ' .. nom .. ' -. ON .-')
elseif (temperature > (consigne+hysteresis)) then
commandArray[radiateurr]='On'
commandArray[radiateur]='Off'
status = 0
print('Chauffage ' .. nom .. ' -. OFF .-')
print('il fait '..temperature..'°C pour une consigne de '..consigne..'°C dans la ' .. nom)
end
-- Radiateur est ON mais il y a une alarme sonde
if (otherdevices[radiateur]=='On') and (alarmeSonde == 1) then
if modeAlarme == 'off' then
print ('Extinction du chauffage :'..nom)
commandArray[radiateurr]='On'
commandArray[radiateur]='Off'
status = 0
-- on envoi un mail sauf si c'est déjà fait
if envoyerAlerte == 1 then
print ('Alerte sonde, envoi d\'un mail et SMS')
objet = 'Alerte chauffage '..nom..' '
message = 'Impossible d\'allumer le chauffage'..nom..' - Problème avec la sonde de la '..nom', inactive depuis plus de '..(temps/60)..' minutes.'
DateMail = os.date('%d/%m/%Y à %H:%M:%S', os.time())
commandArray['SendEmail']=objet..DateMail..'#'..message..'#'..EmailTo
commandArray['Variable:'..envoiMail] = tostring (1)
os.execute("curl -s 'https://smsapi.free-mobile.fr/sendmsg?user="..user.."&pass="..pass.."&msg="..message.."'")
else
print ('Alerte sonde, mail déjà envoyé')
end
elseif modeAlarme == 'sondeBis' then
print ('Alerte sonde, mode sonde bis')
if envoyerAlerte == 1 then
print ('Alerte sonde, envoi d\'un mail et SMS')
objet = 'Alerte chauffage '..nom..' '
message = 'Problème avec la sonde de la '..nom..', inactive depuis plus de '..(temps/60)..' minutes. Passage en mode sonde bis. La sonde utilisée est : '..sondeBis
DateMail = os.date('%d/%m/%Y à %H:%M:%S', os.time())
commandArray['SendEmail']=objet..DateMail..'#'..message..'#'..EmailTo
commandArray['Variable:'..envoiMail] = tostring (1)
os.execute("curl -s 'https://smsapi.free-mobile.fr/sendmsg?user="..user.."&pass="..pass.."&msg="..message.."'")
else
print ('Alerte sonde, mail déjà envoyé')
end
local temperature = tonumber(string.sub(otherdevices_svalues[sondeBis],1,4))
if (temperature < (consigne - hysteresis)) then
print('Allumage du chauffage :'..nom)
commandArray[radiateurr]='Off'
commandArray[radiateur]='On'
status = 1
elseif (temperature > (consigne + hysteresis)) then
print('Extinction du chauffage:'..nom)
commandArray[radiateurr]='On'
commandArray[radiateur]='Off'
status = 0
end
elseif modeAlarme == 'on' then
print ('Alerte sonde, mode ON')
print ('Allumage du chauffage :'..nom)
commandArray[radiateurr]='Off'
commandArray[radiateur]='On'
status = 1
-- on envoi un mail sauf si c'est déjà fait
if envoyerAlerte == 1 then
print ('Alerte sonde, envoi d\'un mail et SMS')
objet = 'Alerte chauffage '..nom..' '
message = 'Allumage permanent du chauffage'..nom..' - Problème avec la sonde de la '..nom..', inactive depuis plus de '..(temps/60)..' minutes.'
DateMail = os.date('%d/%m/%Y à %H:%M:%S', os.time())
commandArray['SendEmail']=objet..DateMail..'#'..message..'#'..EmailTo
commandArray['Variable:'..envoiMail] = tostring (1)
os.execute("curl -s 'https://smsapi.free-mobile.fr/sendmsg?user="..user.."&pass="..pass.."&msg="..message.."'")
else
print ('Alerte sonde, mail déjà envoyé')
end
end
end
-- Radiateur est OFF et il y a une alerte sonde
if (otherdevices[radiateur]=='Off') and (alarmeSonde == 1) then
print ('Extinction du chauffage :'..nom)
commandArray[radiateur]='Off'
commandArray[radiateurr]='On'
status = 0
-- on envoi un mail sauf si c'est déjà fait
if envoyerAlerte == 1 then
print ('Alerte sonde, envoi d\'un mail et SMS')
objet = 'Alerte chauffage '..nom
message = 'Problème avec la sonde de la '..nom..', inactive depuis plus de '..(temps/60)..' minutes.'
commandArray['SendEmail']= objet..'#'.. message .. '#' .. EmailTo
commandArray['Variable:'..envoiMail] = tostring (1)
os.execute("curl -s 'https://smsapi.free-mobile.fr/sendmsg?user="..user.."&pass="..pass.."&msg="..message.."'")
else
print ('Alerte sonde, mail déjà envoyé')
end
end
----------------------------------
--- Gestion de la consommation ---
----------------------------------
if (compteur == 'oui') then
-- calcul de la conso (npower = puissance actuelle / energy = puissance cumulee)
npower, energy = string.match(otherdevices_svalues[conso], "(%d+%.*%d*);(%d+%.*%d*)") -- extraction des valeurs stockees dans le device conso
if (status == 1) then -- le radiateur est allume
cumul_power = tonumber(cumul_power + puissance)
energy = tonumber(energy + (puissance / 60)) -- puissance journaliere cumulee
else -- Le radiateur est eteint
energy = tonumber(energy)
end
power = tonumber(cumul_power) -- puissance instantanee
-- envoi de la conso dans le capteur virtuel d'énergie
if (reset) then
power = 0
energy = 0
end
commandArray['UpdateDevice'] = conso_id .. '|0|' .. power .. ';' .. energy
end
return commandArray* De gérer 4 modes (4 thermostats avec un planning différent) :
- Normal (boulot en semaine)
- Vacances (présent à la maison, planning identique au weekend mais tous les jours)
- Eco (absent mais pas trop longtemps 1 jour ou 2)
- Absent (absence prolongée)
Le choix du mode passe par un Switch Selector.
* Si une sonde ne répond pas (envoi d'un SMS et d'un mail), 3 possibilités : bascule sur la sonde de la chambre d'a coté, arrêt du chauffage ou maintien sur On. Pour l'instant, mon script tourne avec la bascule sur une autre sonde.
* De Mesurer la conso de la pièce.
J'ai également rajouté un script pour les jours fériés (switch Jour_ferie passe à ON) pour que ça bascule automatiquement en mode Vacances (si mode Normal activé).
Le but de ce post est double :
- partager mon script,
- optimiser ce script et le modifier de façon intelligente pour qu'il gère trois chambre plutôt que d'avoir trois scripts (un par chambre).
Dans l'attente de vos suggestions.
Merci d'avance.