Dans un article précédent : Calcul de DJU personnalisé je vous proposais un script un peu compliqué pour que domoticz calcul les DJU chauffage, afin de pouvoir comparer votre consommation d’énergie selon la rigueur climatique de votre lieu de résidence.
Pourquoi un nouveau script alors que le précédent fonctionne très bien?
Pour le simplifier et permettre à tous de l’installer sans peine.
Il n’y a plus qu’un seul fichier à mettre en place et le device se créé automatiquement.
je vous rappelle le principe :
Un degré jour est calculé à partir des températures météorologiques extrêmes du lieu et du jour J :
– Tn : température minimale du jour J mesurée à 2 mètres du sol sous abri et relevée entre J-1 (la veille) à 18h et J à 18h UTC.
– Tx : température maximale du jour J mesurée à 2 mètres du sol sous abri et relevée entre J à 6h et J+1 (le lendemain) à 6h UTC.
– S : seuil de température de référence choisi.
– Moy = (Tn + Tx)/2 Température Moyenne de la journée
Pour un calcul de déficits de température par rapport au seuil choisi :
– Si S > TX (cas fréquent en hiver) : DJ = S – Moy
– Si S ≤ TN (cas exceptionnel en début ou en fin de saison de chauffe) : DJ = 0
– Si TN < S ≤ TX (cas possible en début ou en fin de saison de chauffe) : DJ = ( S –TN ) * (0.08 + 0.42 * ( S –TN ) / ( TX – TN ))
Vous l’avez compris, il nous faut donc pour calculer les DJU d’une sonde extérieure placée sur l’exposition la plus défavorable (généralement la façade nord) à l’abri du soleil, si possible sous abri.
Mais si vous n’en disposez pas, la température extérieure donnée par DarkSky (par exemple) fonctionne aussi très bien. c’est d’ailleurs ma configuration sur mon PI de test.
pensez à éditer le nom de votre device température extérieure dans le script
local temp_ext = 'Temperature exterieure' -- nom de la sonde de température extérieure
Le script est à placer dans votre répertoire /domoticz/scripts/lua/
--[[ ~/domoticz/scripts/lua/script_time_dju_methode_costic.lua auteur : papoo MAJ : 16/02/2018 création : 29/01/2018 Principe : Calculer, via l'information température d'une sonde extérieure, les Degrés jour Chauffage méthode COSTIC Création automatique du device compteur et des variables nécessaire au fonctionnement de ce script. Seul pré-requis à la création d'un device par ce script, l'existence d'un hardware dummy dans votre domoticz. Pour cela, uploadez ou créez ce script dans le répertoire domoticz/scripts/lua/ éditer éventuellement les noms des devices à créer, passez la variable script_actif à true, sauvegardez et vérifiez vos logs. Un degré jour est calculé à partir des températures météorologiques extrêmes du lieu et du jour J : - Tn : température minimale du jour J mesurée à 2 mètres du sol sous abri et relevée entre J-1 (la veille) à 18h et J à 18h UTC. - Tx : température maximale du jour J mesurée à 2 mètres du sol sous abri et relevée entre J à 6h et J+1 (le lendemain) à 6h UTC. - S : seuil de température de référence choisi. - Moy = (Tn + Tx)/2 Température Moyenne de la journée Pour un calcul de déficits de température par rapport au seuil choisi : - Si S > TX (cas fréquent en hiver) : DJ = S - Moy - Si S ≤ TN (cas exceptionnel en début ou en fin de saison de chauffe) : DJ = 0 - Si TN < S ≤ TX (cas possible en début ou en fin de saison de chauffe) : DJ = ( S – TN ) * (0.08 + 0.42 * ( S –TN ) / ( TX – TN )) https://github.com/papo-o/domoticz_scripts/blob/master/Lua/script_time_dju_methode_costic.lua https://pon.fr/calcul-de-dju-methode-costic/ http://easydomoticz.com/forum/viewtopic.php?f=17&t=5984 --]] -------------------------------------------- ------------ Variables à éditer ------------ -------------------------------------------- local debugging = true -- true pour voir les logs dans la console log Dz ou false pour ne pas les voir local script_actif = true -- active (true) ou désactive (false) ce script simplement local temp_ext = 'Temperature exterieure' -- nom de la sonde de température extérieure local domoticzURL = '127.0.0.1:8080' -- user:pass@ip:port de domoticz local var_user_djc = 'dju_methode_costic' -- nom de la variable utilisateur de type 2 (chaine) pour le stockage temporaire des données journalières DJC local Tn = "Tn_methode_costic" -- température maximale du jour J relevée entre J à 6h et J+1 (le lendemain) à 6h UTC local Tx = "Tx_methode_costic" -- température minimale du jour J relevée entre J-1 (la veille) à 18h et J à 18h UTC. local Tn_hold = "Tn_Hold_methode_costic" -- variable de stockage de la température mini. local S = 18 -- seuil de température de non chauffage, par convention : 18°C local cpt_djc = 'DJU méthode COSTIC' -- nom du dummy compteur DJC en degré -------------------------------------------- ----------- Fin variables à éditer --------- -------------------------------------------- commandArray = {} local nom_script = 'Calcul Degrés jour Chauffage méthode COSTIC' local version = '1.02' local id local djc time=os.date("*t") -------------------------------------------- ---------------- Fonctions ----------------- -------------------------------------------- curl = '/usr/bin/curl -m 9 ' if (package.config:sub(1,1) == '/') then luaDir = debug.getinfo(1).source:match("@?(.*/)") else luaDir = string.gsub(debug.getinfo(1).source:match("@?(.*\\)"),'\\','\\\\') end json = assert(loadfile(luaDir..'JSON.lua'))()-- chargement du fichier JSON.lua --============================================================================================== function voir_les_logs (s, debugging) if (debugging) then if s ~= nil then print ("".. s ..""); else print ("aucune valeur affichable"); end end end --============================================================================================== function round(value, digits) if not value or not digits then return nil end local precision = 10^digits return (value >= 0) and (math.floor(value * precision + 0.5) / precision) or (math.ceil(value * precision - 0.5) / precision) end --============================================================================================== function url_encode(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 creaVar(vname,vtype,vvalue) -- pour créer une variable de type 2 nommée toto comprenant la valeur 10 os.execute(curl..'"'.. domoticzURL ..'/json.htm?type=command¶m=saveuservariable&vname='..url_encode(vname)..'&vtype='..vtype..'&vvalue='..url_encode(vvalue)..'" &') end -- usage : creaVar('toto','2','10') --============================================================================================== function DeviceInfos(device) --[[ inspiré de http://www.domoticz.com/forum/viewtopic.php?f=61&t=15556&p=115795&hilit=otherdevices_SwitchTypeVal&sid=dda0949f5f3d71cb296b865a14827a34#p115795 Attributs disponibles : AddjMulti; AddjMulti2; AddjValue; AddjValue2; BatteryLevel; CustomImage; Data; Description; Favorite; HardwareID; HardwareName; HardwareType; HardwareTypeVal; HaveDimmer; HaveGroupCmd; HaveTimeout; ID; Image; IsSubDevice; LastUpdate; Level; LevelInt; MaxDimLevel; Name; Notifications; PlanID; PlanIDs; Protected; ShowNotifications; SignalLevel; Status; StrParam1; StrParam2; SubType; SwitchType; SwitchTypeVal; Timers; Type; TypeImg; Unit; Used; UsedByCamera; XOffset; YOffset; idx --]] local config = assert(io.popen(curl..'"'.. domoticzURL ..'/json.htm?type=devices&rid='..otherdevices_idx[device]..'"')) local blocjson = config:read('*all') config:close() local jsonValeur = json:decode(blocjson) if jsonValeur ~= nil then return json:decode(blocjson).result[1] end end --[[usage : local attribut = DeviceInfos(cpt_djc) if attribut.SwitchTypeVal == 0 then end --]] --============================================================================================== -------------------------------------------- -------------- Fin Fonctions --------------- -------------------------------------------- if script_actif == true then voir_les_logs("========= ".. nom_script .." (v".. version ..") =========",debugging) if otherdevices[cpt_djc] == nil then -- recherche d'un hardware dummy pour l'associer au futur compteur local config = assert(io.popen(curl..'"'.. domoticzURL ..'/json.htm?type=hardware" &')) local blocjson = config:read('*all') config:close() local jsonValeur = json:decode(blocjson) if jsonValeur ~= nil then for Index, Value in pairs( jsonValeur.result ) do if Value.Type == 15 then -- hardware dummy = 15 voir_les_logs("--- --- --- idx hardware dummy : ".. Value.idx .." --- --- ---",debugging) voir_les_logs("--- --- --- Nom hardware dummy : ".. Value.Name .." --- --- ---",debugging) id = Value.idx end end end if id ~= nil then voir_les_logs("--- --- --- création du device RFXMeter : ".. cpt_djc .. " --- --- ---",debugging) os.execute(curl..'"'.. domoticzURL ..'/json.htm?type=createvirtualsensor&idx='..id..'&sensorname='..url_encode(cpt_djc)..'&sensortype=113"') end else local attribut = DeviceInfos(cpt_djc) if attribut then if attribut.SwitchTypeVal == 0 then voir_les_logs("--- --- --- modification du device RFXMeter : ".. cpt_djc .. " en compteur de type 3 --- --- ---",debugging) os.execute(curl..'"'.. domoticzURL ..'/json.htm?type=setused&idx='..otherdevices_idx[cpt_djc]..'&name='..url_encode(cpt_djc)..'&switchtype=3&used=true"') end else voir_les_logs("--- --- --- impossible d\'extraire les caracteristiques du compteur ".. cpt_djc .." --- --- ---",debugging) end end -- if otherdevices[cpt_djc] -- calcul DJCvoir_les_logs("--- --- --- Température Ext : "..temperature,debugging) if otherdevices_svalues[temp_ext] ~= nil then if (uservariables[Tx] == nil) then creaVar(Tx,2,"-150")end if (uservariables[Tn] == nil) then creaVar(Tn,2,150)end if (uservariables[Tn_hold] == nil) then creaVar(Tn_hold,2,150)end if (uservariables[Tx] ~= nil) and (uservariables[Tn] ~= nil) and (uservariables[Tn_hold] ~= nil) then temperature = tonumber(string.match(otherdevices_svalues[temp_ext], "%d+%.*%d*")) voir_les_logs("--- --- --- Température Ext : "..temperature,debugging) voir_les_logs("--- --- --- Tn : "..uservariables[Tn],debugging) voir_les_logs("--- --- --- Tx : "..uservariables[Tx],debugging) voir_les_logs("--- --- --- Tn_hold : "..uservariables[Tn_hold],debugging) if temperature < S then --si la température extérieure est inférieure au seuil S défini dans les variables voir_les_logs("--- --- --- Température Extérieure inférieure au seuil de ".. S .."°c",debugging) if temperature < tonumber(uservariables[Tn]) then voir_les_logs("--- --- --- Température Extérieure inférieure à Variable Tn : "..uservariables[Tn],debugging) commandArray[#commandArray+1] = {['Variable:'.. Tn] = tostring(temperature)} -- mise à jour de la variable tn voir_les_logs("--- --- --- mise à jour de la Variable Tn --- --- --- ",debugging) elseif temperature > tonumber(uservariables[Tx]) then voir_les_logs("--- --- --- Température Extérieure supérieure à Variable Tx : "..uservariables[Tx],debugging) commandArray[#commandArray+1] = {['Variable:'.. Tx] = tostring(temperature)} -- mise à jour de la variable tx voir_les_logs("--- --- --- mise à jour de la Variable Tx --- --- --- ",debugging) end end end else voir_les_logs("--- --- le device : ".. temp_ext .." n\'existe pas --- ---",debugging) end -- fin si otherdevices_svalues[temp_ext] ~= nil if (time.min == 0 and time.hour == 2) then local temp_mini = tonumber(uservariables[Tn]) commandArray[#commandArray+1] = {['Variable:'.. Tn_hold] = tostring(temp_mini)} -- mise à jour de la variable Tn_hold commandArray[#commandArray+1] = {['Variable:'.. Tn] = tostring(150)} -- ré-initialisation de la variable Tn end if (time.min == 01 and time.hour == 18) then local temp_mini_hold = tonumber(uservariables[Tn_hold]) if temp_mini ~= 150 then local temp_maxi = tonumber(uservariables[Tx]) voir_les_logs("--- --- --- Tx ("..temp_maxi.."°C) --- --- --- ",debugging) local moyenne = tonumber((temp_mini_hold + temp_maxi)/2) voir_les_logs("--- --- --- Moyenne ("..moyenne.."°C) --- --- --- ",debugging) S = tonumber(S) if S > temp_maxi then djc = round(S - moyenne,0) voir_les_logs("--- --- --- Le Seuil de "..S.."°C est superieur a Tx ("..temp_maxi.."°C) --- --- --- ",debugging) voir_les_logs("--- --- --- Le Seuil de "..S.."°C est inferieur ou egal a Tn_hold ("..temp_mini_hold.."°C) --- --- --- ",debugging) voir_les_logs("--- --- --- djc : "..djc,debugging) elseif temp_mini_hold < S and S < temp_maxi then local a = S - temp_mini_hold voir_les_logs("--- --- --- a : "..a,debugging) local b = temp_maxi - temp_mini_hold voir_les_logs("--- --- --- b : "..b,debugging) djc = a * ( 0.08 + 0.42 * a / b ) voir_les_logs("--- --- --- djc : "..djc,debugging) djc = round(djc,0) --djc = ( S – temp_mini_hold ) * (0.08 + 0.42 * ( S – temp_mini_hold ) / ( temp_maxi – temp_mini_hold ) ) voir_les_logs("--- --- --- Le Seuil de "..S..")C est superieur a Tx ("..temp_maxi.."°C) est inferieur a Tn_hold ("..temp_mini_hold.."°C)--- --- --- ",debugging) elseif S <= temp_mini_hold then djc = 0 end local cpt_djc_index = otherdevices_svalues[cpt_djc] voir_les_logs("--- --- --- compteur avant mise à jour ".. cpt_djc .." : ".. cpt_djc_index .." DJU",debugging) cpt_djc_index = tonumber(cpt_djc_index) + djc voir_les_logs("--- --- --- mise à jour compteur ".. cpt_djc .." : ".. cpt_djc_index .." DJU",debugging) commandArray[#commandArray+1] = {['UpdateDevice'] = otherdevices_idx[cpt_djc] .. '|0|'..tostring(cpt_djc_index)} --mise à jour du compteur commandArray[#commandArray+1] = {['Variable:'.. Tx] = tostring(-150)} -- mise à jour de la variable Tx else voir_les_logs("--- --- --- Calcul impossible, il n\'y a pas de Température minimum enregistrée, attendre le prochain calcul",debugging) end end -- fin calcul DJC -- --============================================================================================== voir_les_logs("======= Fin ".. nom_script .." (v".. version ..") =======",debugging) end return commandArray
Vos premiers DJU ne seront visibles qu'après une période de 24 h après le calcul de 18 heures
A vous de jouer
Retrouvez la dernière version de ce script sur
merci pour ce script papoo