Calcul de DJU méthode Costic

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.
dju
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 résultat en graphique

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



 Site Officiel :   github.com

One thought on “Calcul de DJU méthode Costic

Laisser un commentaire