En 2021, j’ai fait installer 2 climatisations air-air réversibles de marque Daikin, un caisson pour la zone Chambres et un caisson pour le Séjour. Chaque climatisation est indépendante, elle a sa propre pompe à chaleur à l’extérieur de la maison.
En 2022, j’ai installé (avec Mathieu et Sébastien – voir le forum) 8 panneaux photovoltaïques avec des micro-onduleurs Enphase pour mon auto-consommation.
L’objet de cet article est d’expliquer comment Domoticz lance automatiquement la climatisation ou le chauffage en fonction du contexte. Mon objectif étant de climatiser (ou de chauffer) automatiquement uniquement lorsque la production photovoltaïque est suffisante (i.e. gratuitement). Cela ne m’empêche pas d’utiliser manuellement la clim (ou le chauffage) lorsque je le souhaite.
Pour lancer ou arrêter la clim, voici ce que j’utilise :
Pilotage des caissons de climatisation
En complément à cet article du forum, voici la méthode pour enregistrer les codes Infra-Rouges depuis la télécommande.

A partir de l’interface zigbee2mqtt dans l’onglet « Expose », cliquer sur ON dans la zone learn_ir_code, puis appuyer sur la télécommande de la climatisation en direction du dispositif et à une distance de 10 cm environ. Le nouveau code reçu par le dispositif s’affiche dans la zone learned_ir_code. Il ne reste plus qu’à faire un copier/coller de ce code vers le script où vous allez l’utiliser.

Il faut prendre quelques précautions avant d’envoyer le code car c’est une longue séquence qui contient beaucoup d’informations. Si l’on souhaite mettre la clim sur ON, bien s’assurer que la télécommande est sur OFF avant d’appuyer sur la télécommande + régler la température sur la valeur voulue ainsi que les divers autres paramètres (chaud/froid, balayage horizontal/vertical, vitesse, silence, etc.). En effet, le code obtenu reprend tous les paramètres configurés sur la télécommande.
-- Script DzVents qui active ou arrête le caisson de climatisation du séjour
-- en utilisant un émetteur Infra-Rouge zigbee MOES UFO-R11
-- via l'envoi d'un payload à zibgee2mqtt
-- script basé sur un script publié par waaren dans le forum Domoticz :
-- https://www.domoticz.com/forum/viewtopic.php?p=291971&hilit=mosquitto_pub#p291971
-- 05/09/2022 : Version initiale
-- 26/09/2022 : Ajout des modes : Chauffage/Climatisation/Automatique/Silence
-- Nom du device à piloter dans zigbee2mqtt (ne doit pas contenir de blanc ni de lettres accentuées)
-- Le nom doit être identique pour le switch virtuel dans Domoticz qui permettra le lancement du script
local myDevicename = 'Clim_Sejour'
-- Topic à utiliser pour la clim à piloter
local myTopic = 'zigbee2mqtt/'..myDevicename..'/set'
return
{
on = {
devices = { myDevicename, },
},
logging = {
level = domoticz.LOG_DEBUG, -- change to LOG_ERROR when ok
},
execute = function(dz)
-- Variables à valoriser
-- Payload à envoyer à Zigbee2MQTT pour arrêter la clim - Arret
local payload_arret = '{ "ir_code_to_send": "A/sBVAHgCQMLtWK5DbsGtAEcBbQB4AMB4AcPQAHAE0AHQANAAUAH4AcDwAFAF+AjAeATL0AbwANAAeAPC8ABQB9AAUAHQAPgHQEC+wG04BIB4CFH4CkB4FNbwAHgFd3gVQFA3+AHA8ABQBcB04vigYfgHwFAt8AD4AMB4QNn4Asf4CMB4AM/wAvgAwfgKwHAP+AfAeAnL+ATAUBLQAHAB8ABQA9AA+AjAeATL0AbQANAAQscBbQBHAW0AbQBtAE=" }'
-- Payload à envoyer à Zigbee2MQTT pour mettre la clim en mode Chauffage - On/Chaud/Silence/21/RotH
local payload_chaud = '{ "ir_code_to_send": "DdUBVgE0AlYB1QGxAdUBQAdAAwu2YsINvQaxARgFsQHgAwHgAQ8C1QGxoAHAE0AHARgFgBcBGAXAAwDVoAsC1QGxoAEDGAWxAYAB4AET4BMB4BMvQBuAAwDVYAcBsQHAB4ABARgFgAOAAcAbwAfgDQEC1QGx4AYB4AkRwAFAX4ABgCOABeAZAYAngAXgEwEBGAWAI+ADBeAfAeAJM4AR4BMB4Bkh4AMBgC2ABeAfAYAtgAXgBQEBGAVAA4AZQAUFGAWxAa6LwodAEQGxAYAFBbEBGAWxAcAB4AcTQBtAA0ABQAeAAwDVoAcBsQHAAeADC0ABAtUBsSAB4AMF4A0BgCGAAYALAdUB4ANL4AULAtUBsSABQAUDGAWxAUAB4AcHgAFAIQGxAeAJBeANAQIYBdUgAwGxAUABQAfgBwNAAQLVAbHgIgEB1QHAQ+ANAQLVAbEgAYAFgAHgES+AJYAF4AEB4AcP4AMBQEtAAUAH4AMnQA9AA4ABgBmABeARAeALL0ATwANAAYALCdUBGAWxAbEBsQE=" }'
-- Payload à envoyer à Zigbee2MQTT pour mettre la clim en mode Climatisation - On/Froid/Silence/24/RotH
local payload_froid = '{ "ir_code_to_send": "A+oBbAHgCQMLm2LVDbwGsgEaBbIB4AMB4AcPQAHAE0AHBBoF6gGyIAEBGgXgCQPAAUAb4CMB4BMvwBvgAwfAC0ABQAtAA0ABQJlAC8AH4AcBQBfgCwHgDxdAAUBPQAHgEyPgDxvgAxcE6gFsAbLgAgEC6gGyYAHAX0ABwBPgCwHgAxvgAwvgEwHgAyfgAwvgEwHgAyfgDwvgBwHgBSfgAecC6gGyYAFA4+ADA+ADFwGsi+IvhwGyAUABQAfgBwPAAUAX4D8B4ANLQAvAA+APAeAXH8ED4A8B4AM/wAvgAwfgKwHAP+AfAeAnL+ATAUBLQAHAB8ABQA9AA+AjAeALL8ATQAdAA0ABCxoFsgEaBbIBsgGyAQ==" }'
-- Fin des variables
-- Cas où le switch selector passe à Arret = Arrêt de la clim
if (dz.devices(''..myDevicename..'').state == 'Arret')
then
myMessage = payload_arret
dz.log(''..myDevicename..' - Arrêt de la clim ')
end
-- Cas où le switch selector passe à Chaud = Passage en mode Chauffage
if (dz.devices(''..myDevicename..'').state == 'Chaud')
then
myMessage = payload_chaud
dz.log(''..myDevicename..' - Passage en mode Chauffage ')
end
-- Cas où le switch selector passe à Froid = Passage en mode Climatisation
if (dz.devices(''..myDevicename..'').state == 'Froid')
then
myMessage = payload_froid
dz.log(''..myDevicename..' - Passage en mode Climatisation ')
end
local function osCommand(cmd)
dz.log(''..myDevicename..' - Executing Command : ' .. cmd,dz.LOG_DEBUG)
local fileHandle = assert(io.popen(cmd .. ' 2>&1 || echo ::ERROR::', 'r'))
local commandOutput = assert(fileHandle:read('*a'))
local returnTable = {fileHandle:close()}
if commandOutput:find '::ERROR::'
then -- something went wrong
dz.log(''..myDevicename..' - Error ==>> ' .. tostring(commandOutput:match('^(.*)%s+::ERROR::') or ' ... but no error message ' ) ,dz.LOG_DEBUG)
else -- all is fine!!
dz.log(''..myDevicename..' - ReturnCode : ' .. returnTable[3] .. '\ncommandOutput:\n' .. commandOutput, dz.LOG_DEBUG)
end
return commandOutput,returnTable[3] -- rc[3] contains returnCode
end
local function sendMQTT(message, topic)
osCommand ( 'mosquitto_pub' .. ' -t ' .. myTopic .. " -m '" .. myMessage .. "'")
end
sendMQTT(myMessage, myTopic)
end
}
Voici le script dzVents que j’utilise pour le séjour, il intègre les 3 modes que je souhaite Arrêt/Climatisation/Chauffage. J’ai le même script pour la zone des chambres et les payloads à envoyer sont les mêmes.
Le script lua qui lance les scripts dzVents en fonction du contexte.
-- Script d'optimisation de l'auto-consommation
-- Analyse périodique de la consommation et de la production
-- Choix d'activer certains appareils si la consommation est à zéro
-- si la production est significative
-- et en fonction de la température des pièces
-- 21/08/2022 : Version initiale
-- 05/09/2022 : Ajout des seuils pour l'activation de la clim ou du chauffage
-- 14/09/2022 : Ajout du contrôle du fonctionnement de la pompe de la piscine définir le seuil (haut ou bas)
-- 23/09/2022 : Ajout du pilotage de la clim des chambres
-- 24/09/2022 : Début d'intégration du mode hiver
-- 26/09/2022 : Mise en place du pilotage chauffage ou climatisation
-- 09/10/2022 : Différentiation des seuils de température (clim1 ou clim2)
-- 12/10/2022 : Priorisation de la zone des chambres pour le chauffage
-- chargement des modules (http://easydomoticz.com/forum/viewtopic.php?f=17&t=3940)
dofile('/home/pi/domoticz/scripts/lua/modules.lua')
local scriptName = 'Auto-Consommation'
local scriptVersion = 'V 0.5 ADx'
local function log(message)
-- Décommenter la ligne du dessous pour afficher les logs / Commenter pour ne pas afficher les logs
print("[Auto-Consommation - Pilotage Clim/Chauffage] "..message)
end
-- Variables du script
-- Nom des devices à piloter
local nomclim1 = uservariables["ac_clim1_nom"]
local idxclim1 = otherdevices_idx[""..nomclim1..""]
local nomclim2 = uservariables["ac_clim2_nom"]
local idxclim2 = otherdevices_idx[""..nomclim2..""]
-- Périodicité d'exécution de ce script
local t = tonumber(uservariables["ac_cycle"])
-- Compteurs stockés pour le calcul de consommation de la période
local cyconso = tonumber(uservariables["ac_conso"])
local cyvente = tonumber(uservariables["ac_vente"])
local cyprod = tonumber(uservariables["ac_prod"])
-- Variables utilisateurs pour le réglage des paramètres
local idxedf = tonumber(uservariables['idxedf'])
local idxenphase = tonumber(uservariables['idxenphase'])
local idxfronius = tonumber(uservariables['idxfronius'])
-- Saison été ou hiver
local saison = uservariables["ac_saison"]
-- Seuil de contrôle pour la conso EDF du cycle précédent
local sc = tonumber(uservariables["ac_seuil_conso_cycle-1"])
-- Décision 4
local d4 = 0
-- Objet du mail envoyé qui varie en fonction de la décision
local objet = "objet"
local function clim1off() -- Arrêt Clim1
if otherdevices[nomclim1] ~= "Arret"
then
commandArray[#commandArray+1]={['OpenURL']=domoticzURL..'/json.htm?type=command¶m=switchlight&idx='..idxclim1..'&switchcmd=Set%20Level&level=00'}
log("Arret de "..nomclim1.." IDX = "..idxclim1)
else
log(""..nomclim1.." IDX = "..idxclim1.." deja arretee ")
end
end
local function clim2off() -- Arrêt Clim2
if otherdevices[nomclim2] ~= "Arret"
then
commandArray[#commandArray+1]={['OpenURL']=domoticzURL..'/json.htm?type=command¶m=switchlight&idx='..idxclim2..'&switchcmd=Set%20Level&level=00'}
log("Arret de "..nomclim2.." IDX = "..idxclim2)
else
log(""..nomclim2.." IDX = "..idxclim2.." deja arretee ")
end
end
local function clim1onc() -- Activation Chauffage Clim1
if otherdevices[nomclim1] ~= "Chaud"
then
commandArray[#commandArray+1]={['OpenURL']=domoticzURL..'/json.htm?type=command¶m=switchlight&idx='..idxclim1..'&switchcmd=Set%20Level&level=10'}
log("Activation de "..nomclim1.." IDX = "..idxclim1.." en mode chauffage ")
else
log(""..nomclim1.." IDX = "..idxclim1.." deja active en mode chauffage ")
end
end
local function clim2onc() -- Activation Chauffage Clim2
if otherdevices[nomclim2] ~= "Chaud"
then
commandArray[#commandArray+1]={['OpenURL']=domoticzURL..'/json.htm?type=command¶m=switchlight&idx='..idxclim2..'&switchcmd=Set%20Level&level=10'}
log("Activation de "..nomclim2.." IDX = "..idxclim2.." en mode chauffage ")
else
log(""..nomclim2.." IDX = "..idxclim2.." deja active en mode chauffage ")
end
end
local function clim1onf() -- Activation Climatisation Clim1
if otherdevices[nomclim1] ~= "Froid"
then
commandArray[#commandArray+1]={['OpenURL']=domoticzURL..'/json.htm?type=command¶m=switchlight&idx='..idxclim1..'&switchcmd=Set%20Level&level=20'}
log("Activation de "..nomclim1.." IDX = "..idxclim1.." en mode climatisation ")
else
log(""..nomclim1.." IDX = "..idxclim1.." deja active en mode climatisation ")
end
end
local function clim2onf() -- Activation Climatisation Clim2
if otherdevices[nomclim2] ~= "Froid"
then
commandArray[#commandArray+1]={['OpenURL']=domoticzURL..'/json.htm?type=command¶m=switchlight&idx='..idxclim2..'&switchcmd=Set%20Level&level=20'}
log("Activation de "..nomclim2.." IDX = "..idxclim2.." en mode climatisation ")
else
log(""..nomclim2.." IDX = "..idxclim2.." deja active en mode climatisation ")
end
end
commandArray = {}
-- Execution du script toutes les t minutes (variable utilisateur ac_cycle) uniquement en journée
if dayTime and ((time.min) % t == 0)
then
-- Valorisation du seuil de production en fonction de l'état de la pompe de la piscine
-- seuil haut avec piscine (On) et seuil bas sans piscine (Off)
if otherdevices["Piscine"] == "On"
then
sp = tonumber(uservariables["ac_seuil_prod_h"])
log("Seuil de production : "..sp.." Watt(s)")
else
sp = tonumber(uservariables["ac_seuil_prod_b"])
log("Seuil de production : "..sp.." Watt(s)")
end
-- Valorisation du seuil de température en fonction de la saison (été ou hiver) et de la zone (clim1 ou clim2)
if uservariables["ac_saison"] == "ete"
then
stemp1 = tonumber(uservariables["ac_seuil_ete_clim1"])
log("Seuil de temperature ete : "..stemp1.." degres pour "..nomclim1.."")
stemp2 = tonumber(uservariables["ac_seuil_ete_clim2"])
log("Seuil de temperature ete : "..stemp2.." degres pour "..nomclim2.."")
else
stemp1 = tonumber(uservariables["ac_seuil_hiver_clim1"])
log("Seuil de temperature hiver : "..stemp1.." degres pour "..nomclim1.."")
stemp2 = tonumber(uservariables["ac_seuil_hiver_clim2"])
log("Seuil de temperature hiver : "..stemp2.." degres pour "..nomclim2.."")
end
-- Récupération des noms des devices à partir des idx
local nom = getDeviceName(idxedf)
local nom1 = getDeviceName(idxenphase)
local nom2 = getDeviceName(idxfronius)
-- Récupération des températures
local t_chambre = round(tonumber(otherdevices_temperature["Sonde Chambre"]),1)
local t_sejour = round(tonumber(otherdevices_temperature["Sonde Sejour"]),1)
log("Cycle : "..t.." minutes")
-- log("Seuil de temperature : "..stemp.." degres")
-- log("Saison : "..saison.." ")
-- log("Seuil de Production : "..sp.." Watt(s)")
log("Seuil Conso EDF du cycle moins un : "..sc.." kWh")
log("Temperature Chambre : "..t_chambre.." degres")
log("Temperature Sejour : "..t_sejour.." degres")
log(""..nomclim1.." = "..otherdevices[nomclim1].."")
log(""..nomclim2.." = "..otherdevices[nomclim2].."")
-- Récupération des informations de consommation
local conso = jsonInfos(nom)
-- log("conso Name : "..conso.Name)
-- log("conso Data : "..conso.Data)
-- log("conso Usage : "..conso.Usage)
-- log("conso Counter : "..conso.Counter)
-- Récupération des informations de vente (enphase)
local vente = jsonInfos(nom1)
-- log("vente Name : "..vente.Name)
-- log("vente Data : "..vente.Data)
-- log("vente Usage : "..vente.Usage)
-- log("vente Counter : "..vente.Counter)
-- Récupération des informations de production (fronius)
local prod = jsonInfos(nom2)
-- log("prod Name : "..prod.Name)
-- log("prod Data : "..prod.Data)
-- log("prod Usage : "..prod.Usage)
-- Changement de format des informations récupérées
-- Compteur de consommation
local counter_conso = conso.Counter
-- log("Counter Conso : "..counter_conso)
local c_conso = tonumber(counter_conso)
-- log("Counter Conso num : "..c_conso.."")
-- Usage de consommation
local usage_conso = conso.Usage
-- log("Usage Conso : "..usage_conso)
local l = string.len(usage_conso)
-- log("Longueur Usage Conso : "..l)
local jour_conso = string.sub(usage_conso,1,l-4)
-- log("Nouveau Usage Conso : "..jour_conso)
local i_conso = tonumber(jour_conso)
-- log("Usage Conso num : "..i_conso.."")
-- Compteur de vente
local counter_vente = vente.Counter
-- log("Counter Vente : "..counter_vente)
local c_vente = tonumber(counter_vente)
-- log("Counter Vente num : "..c_vente.."")
-- Usage de vente
local usage_vente = vente.Usage
-- log("Usage Vente : "..usage_vente)
local l = string.len(usage_vente)
-- log("Longueur Usage Vente : "..l)
local jour_vente = string.sub(usage_vente,1,l-4)
-- log("Nouveau Usage Vente : "..jour_vente)
local i_vente = tonumber(jour_vente)
-- log("Usage Vente num : "..i_vente.."")
-- Data de production
local data_prod = prod.Data
-- log("Data Prod : "..data_prod)
local l = string.len(data_prod)
-- log("Longueur Data Prod : "..l)
local tot_prod = string.sub(data_prod,1,l-4)
-- log("Nouveau Data Prod : "..tot_prod)
local c_prod = tonumber(tot_prod)
-- log("Data Prod num : "..c_prod.."")
-- Usage de production
local usage_prod = prod.Usage
-- log("Usage Prod : "..usage_prod)
local l = string.len(usage_prod)
-- log("Longueur Usage Prod : "..l)
local jour_prod = string.sub(usage_prod,1,l-4)
-- log("Nouveau Usage Prod : "..jour_prod)
local i_prod = tonumber(jour_prod)
-- log("Usage Prod num : "..i_prod.."")
-- Stockage de la valeur des compteurs conso et prod dans des variables utilisateur
commandArray['Variable:ac_conso']= tostring(c_conso)
commandArray['Variable:ac_vente']= tostring(c_vente)
commandArray['Variable:ac_prod']= tostring(c_prod)
-- log("Compteur instantane de consommation : "..i_conso.."")
-- log("Compteur instantane de vente : "..i_vente.."")
-- log("Compteur instantane de production : "..i_prod.."")
-- log("Compteur global de consommation : "..c_conso.."")
-- log("Compteur global de vente : "..c_vente.."")
-- log("Compteur global de production : "..c_prod.."")
local deltaconso = c_conso - cyconso
local deltavente = c_vente - cyvente
local deltaprod = c_prod - cyprod
local deltaconso = round(tonumber(deltaconso),3)
local deltavente = round(tonumber(deltavente),3)
local deltaprod = round(tonumber(deltaprod),3)
local t = math.floor(t)
-- Logique de déclenchement de la clim ou du chauffage
-- Prise de décision 1 en fonction de la consommation
if i_conso == 0
then
log("Decision 1 - Consommation : "..i_conso.." Watt => GO ")
-- Prise de décision 2 en fonction de la production
if i_prod > sp
then
log("Decision 2 - Production : "..i_prod.." Watts => GO ")
-- Prise de décision 3 en fonction de la consommation du cycle précédent
if deltaconso < sc
then
log("Decision 3 - Consommation du cycle moins un : "..deltaconso.." Watts => GO")
-- Prise de décision 4 en fonction de la température de la pièce
-- Température du séjour pour l'été et activation des 2 clims
if (t_sejour > stemp1 and uservariables["ac_saison"] == "ete")
then
-- Activation de la climatisation si elle n'est pas déjà active
clim1onf()
clim2onf()
objet = "[Auto-Conso] Activation de la climatisation (Séjour et Chambres) le "..date_jour.." à "..heure.." "
d4 = 3
log("Decision 4 - Temperature sejour : "..t_sejour.." degres ("..saison..") => GO ")
end
-- Température de la chambre pour l'hiver et activation en fonction des températures des pièces
if (t_chambre < stemp2 and uservariables["ac_saison"] == "hiver")
then
-- Activation du chauffage dans la zone chambres s'il n'est pas déjà activé
clim2onc()
objet = "[Auto-Conso] Activation du chauffage dans la zone Chambres le "..date_jour.." à "..heure.." "
d4 = 2
log("Decision 4 (d4 = "..d4.." - Temperature chambres : "..t_chambre.." degres ("..saison..") => GO ")
if (t_sejour < stemp1 and uservariables["ac_saison"] == "hiver")
then
-- Activation du chauffage dans la zone séjour s'il n'est pas déjà activé
clim1onc()
objet = "[Auto-Conso] Activation du chauffage (Séjour et Chambres) le "..date_jour.." à "..heure.." "
d4 = 1
log("Decision 4 (d4 = "..d4.." - Temperature sejour : "..t_sejour.." degres ("..saison..") => GO ")
end
end
if d4 == 1 or d4 == 2 or d4 == 3
then
-- Formattage des informations à envoyer
local corps0 = ""..date_jour.." - "..heure.." - Saison : "..saison.." "
local corps1 = "Consommation EDF : "..i_conso.." Watt(s) - Compteur : "..c_conso.." kWh "
local corps2 = "Auto-Conso Fronius : "..i_prod.." Watt(s) - Compteur : "..c_prod.." kWh "
local corps3 = "Vente Enphase : "..i_vente.." Watt(s) - Compteur : "..c_vente.." kWh "
local corps4 = "Température Chambre : "..t_chambre.."° - seuil : "..stemp2.."° "
local corps5 = "Température Séjour : "..t_sejour.."° - seuil : "..stemp1.."° "
local corps6 = "Cycle d'exécution : toutes les "..t.."' "
local corps7 = "Consommation EDF pendant le cycle écoulé : "..deltaconso.." kWh "
local corps8 = "Production Fronius pendant le cycle écoulé : "..deltaprod.." kWh "
local corps9 = "Production Enphase pendant le cycle écoulé : "..deltavente.." kWh "
local corps = ""..corps0.."<br>"..corps1.."<br>"..corps2.."<br>"..corps3.."<br>"..corps4.."<br>"..corps5.."<br>"..corps6.."<br>"..corps7.."<br>"..corps8.."<br>"..corps9.."<br>"
-- Envoi du mail vers le destinataire
local destinataire = tostring(uservariables['mail'])
commandArray['SendEmail']=''..objet..'#'..corps..'#'..destinataire..''
-- Envoi pushbullet (possiblité d'envoyer à plusieurs destinataires)
-- Valorisation des variables pour l'envoi de la notification pushbullet
local systeme = 'pushbullet'
local corps_push = ""..corps0.."\n"..corps1.."\n"..corps2.."\n"..corps3.."\n"..corps4.."\n"..corps5.."\n"..corps6.."\n"..corps7.."\n"..corps8.."\n"..corps9..""
-- Envoi de la notification par Domoticz avec les paramètres valorisés (clé utilisateur + clé API)
-- Décommenter la ligne suivante pour utiliser pushbullet
-- commandArray['SendNotification']=''..objet..'#'..corps_push..'####'..systeme..''
print(corps)
else
log("Decision 4 - Temperature cote sejour : "..t_sejour.." degres ("..saison..") => NOGO ")
log("Decision 4 - Temperature cote chambres : "..t_chambre.." degres ("..saison..") => NOGO ")
clim1off()
clim2off()
end
else
log("Decision 3 - Consommation du cycle moins un : "..deltaconso.." Watts => NOGO")
clim1off()
clim2off()
end
else
log("Decision 2 - Production : "..i_prod.." Watts => NOGO ")
clim1off()
clim2off()
end
else
log("Decision 1 - Consommation : "..i_conso.." Watt => NOGO ")
clim1off()
clim2off()
end
end
return commandArray
La décision de lancer la climatisation (ou le chauffage) est basée sur plusieurs critères qui sont décrits dans l’article de Piblog, je rajoute les règles sur les températures qui s’appliquent après les règles déjà décrites :
- Si l’on est en été et que la température est supérieure à un seuil défini dans les variables utilisateur (un seuil pour la zone chambres et un seuil pour le séjour) alors on active la clim avec les valeurs prévues dans le code infra-rouge.
- Si l’on est en hiver, c’est pareil mais si la température est inférieure aux seuils.
Il y a pas mal de logs (utiles pour le debug) et un mail qui indique l’activation avec le résumé du contexte lors de la prise de décision.
Dans le script, on active des switchs de type selector et le changement d’état déclenche les scripts dzVents ad hoc qui envoient le code Infra-Rouge au caisson.

Il est envisageable de rajouter des niveaux avec des températures différentes : Chaud 22° – Chaud 19° – Froid 25° – etc.

Nota : Dans le script lua, à partir de la ligne 156, il y a un exemple intéressant de récupération de différentes valeurs d’un IDX présentes dans un json.

Dans le mail, on voit bien toutes les conditions de démarrage, on a un bilan de la consommation/production instantanée (lignes 2-3-4) et la situation pendant le dernier 1/4 d’heure (car le cycle est à 15′).
