Calcul de DJU personnalisé

Afin de surveiller sa consommation de chauffage, la facture ou les kwh consommés ne permettent pas de savoir si son installation fonctionne correctement.
dju
il manque pour cela une constante à laquelle se référer pour comparer les consommations : la rigueur climatique. Si un hiver est particulièrement doux, la facture est moins salée que d’habitude et on pense que notre installation fonctionne correctement. A l’inverse un hiver très froid nous fait craindre un quelconque dérèglement lors de la réception de la facture. Les professionnels, pour mesurer la constance des performances énergétiques d’une installation, utilisent les DJU. (pour Degré Jour Unifié) ils sont fournis via un abonnement payant par météo France ou le COSTIC. j’ai pour ma part essayé de reproduire la méthode de calcul la plus simple, celle de météo France.

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.
Il nous faut commencer par créer un capteur virtuel compteur,
dju-Domoticz
et quatre variables de type chaine Tn, Tx, Tn_Hold et Nb Jours de Chauffage
variables-Domoticz

ensuite créez un fichier tn_hold.sh

#!/bin/bash

# Settings
#crontab -e
# 0 6 * * * sudo /home/pi/domoticz/scripts/sh/tn_hold.sh
# chmod +x /home/pi/domoticz/scripts/sh/tn_hold.sh



DOMO_IP="192.168.10.240"      # Domoticz IP Address
DOMO_PORT="8080"         # Domoticz Port

Tn_IDX="16"               # Idx de la variable Tn
Tn_uservariablename="Tn"  # Nom de la variable Tn

Tn_hold_IDX="17"        # Idx de la variable Tn_hold
Tn_hold_uservariablename="Tn_Hold"  # Nom de la variable Tn_hold

	
        Tn=$(curl -s "http://$DOMO_IP:$DOMO_PORT/json.htm?type=command&param=getuservariable&idx=$Tn_IDX"| jq -r .result[].Value)
		echo "Recuperation valeur variable Tn"
		echo $Tn
		curl -s "http://$DOMO_IP:$DOMO_PORT/json.htm?type=command&param=updateuservariable&idx=$Tn_hold_IDX&vname=$Tn_hold_uservariablename&vtype=2&vvalue=$Tn"
		echo "Mise a jour valeur variable Tn_hold avec la Temperature mini"		
       curl -s "http://$DOMO_IP:$DOMO_PORT/json.htm?type=command&param=updateuservariable&idx=$Tn_IDX&vname=$Tn_uservariablename&vtype=2&vvalue=150"
		echo "Changement valeur variable Tn a 150 pour débuter un nouveau jour"

suivez les commandes de la rubrique setting afin lancer ce fichier via un crontab, et le rendre executable via chmod +x. indiquez enfin l’idx des variables Tn et Tn_hold et l’ip de domoticz.
ensuite créez un fichier script_variable_calcul_dju.lua

ensuite nous allons enregistrer les températures minimales et maximale via le script script_device_temp_ext.lua

--[[   
~/domoticz/scripts/lua/script_device_temp_ext.lua
 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. 
 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. 
]]--
------------------------------------------------------------------------------

--------------------------------
------ Tableau à éditer ------
--------------------------------
local debugging = false  -- true ou false
local url = '192.168.1.24:8080'   -- user:pass@ip:port de domoticz
local temp_ext  = 'Temperature exterieure' -- nom de la sonde extérieure
------------------------------------------------------------------------------
--------------------------------------------------------------------------- 
function voir_les_logs (s)
    if (debugging) then 
        print (s);
    end
end

---------------------------------------------------------------------------

commandArray = {}
if (devicechanged[temp_ext])then
voir_les_logs("=========== Mini/Maxi Température Extérieure (v1.0) ===========",debugging);
		if(uservariables['Tx'] == nil) then
		-- Création de la variable Tx si elle n'existe pas
         commandArray['OpenURL']=url..'/json.htm?type=command&param=saveuservariable&vname=Tx&vtype=2&vvalue=150'
            voir_les_logs("--- --- --- Création Variable Tx manquante --- --- --- ",debugging);
        print('script supendu')
		end
		if(uservariables['Tn'] == nil) then
         commandArray['OpenURL']=url..'/json.htm?type=command&param=saveuservariable&vname=Tn&vtype=2&vvalue=-150'
		 -- Création de la variable Tn si elle n'existe pas
            voir_les_logs("--- --- --- Création Variable Manquante Tn --- --- --- ",debugging);
        print('script supendu')
		end
max_min = string.match(otherdevices_svalues[temp_ext], "%d+%.*%d*")
t_max_min = tonumber(max_min)
voir_les_logs("--- --- --- Température Ext : "..t_max_min,debugging);
	if (t_max_min < tonumber(uservariables['Tn'])) then
		        voir_les_logs("--- --- --- Température Extérieure inférieure à Variable Tn : "..uservariables['Tn'],debugging);
	commandArray['Variable:Tn'] = tostring(t_max_min) -- mise à jour de la variable tn
voir_les_logs("--- --- --- mise à jour de la Variable Tn  --- --- --- ",debugging);
	elseif (t_max_min > tonumber(uservariables['Tx'])) then
		        voir_les_logs("--- --- --- Température Extérieure supérieure à Variable Tx : "..uservariables['Tx'],debugging);
	commandArray['Variable:Tx'] = tostring(t_max_min) -- mise à jour de la variable tx
voir_les_logs("--- --- --- mise à jour de la Variable Tx  --- --- --- ",debugging);	
	end
end
return commandArray
--[[     Calcul DJU du jour

~/domoticz/scripts/lua_parsers/calcul_dju.lua
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 ))
]]--
---------------------------------------------------------------------------
-- Variables 
---------------------------------------------------------------------------
local S = 18 -- seuil de température de non chauffage (par convention : 18°C)
local temp_ext  = 'Temp+Hum extérieure' -- nom de la sonde extérieure
local var_chauffage="Nb Jours de Chauffage" -- nom de la variable permettant de compter le nombre de jour de chauffage et de connaitre l'état du chauffage  0 = Arret, >0 Nb de jours
local url = '192.168.10.240:8080'   -- user:pass@ip:port de domoticz
local idx_dju = 474 -- IDX du compteur virtuel DJU à créer avant de lancer ce script
local name_dju = "DJU" -- Nomp du compteur virtuel DJU à créer avant de lancer ce script
local indexArray=0
------------------------------------------------------------------------------
local debugging = true  -- true ou false
------------------------------------------------------------------------------ 
function voir_les_logs (s)
    if (debugging) then 
        print (s);
    end
end

function url_encode(str)
  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 round(n)
    return n % 1 >= 0.5 and math.ceil(n) or math.floor(n)
end

commandArray = {}

if uservariablechanged[var_chauffage] then

voir_les_logs("=========== Calcul DJU (v1.0) ===========",debugging);
	
	total_dju = string.match(otherdevices_svalues[name_dju], "%d+%.*%d*")
			voir_les_logs("--- --- --- Total DJU : ".. total_dju .." DJU",debugging);
		
			if (tonumber(uservariables[var_chauffage]) > 0) then --le chauffage est allumé, calcul des DJU
			voir_les_logs("--- --- --- Nb de jour de chauffage : " .. tonumber(uservariables[var_chauffage]) .." --- --- --- ",debugging);
		
max_min = string.match(otherdevices_svalues[temp_ext], "%d+%.*%d*")
t_max_min = tonumber(max_min)
voir_les_logs("--- --- --- Température Ext : "..t_max_min,debugging);

TN = tonumber(uservariables['Tn_Hold'])
TX = tonumber(uservariables['Tx'])
MOY = tonumber((TN + TX) / 2)

	if (S > TX) then
		voir_les_logs("--- --- --- Température de référence supérieure à Variable Tx : ".. TX,debugging);
		voir_les_logs("--- --- --- Température de référence : ".. S,debugging);
		voir_les_logs("--- --- --- Variable TX : ".. TX,debugging);
		voir_les_logs("--- --- --- Moyenne : ".. MOY,debugging);
DJ = round(S - MOY)
		voir_les_logs("--- --- --- DJU : ".. DJ,debugging);
-- commandArray['UpdateDevice']= idx_dju ..'|0|'.. tostring(DJ)
DJ = tonumber(DJ) + tonumber(total_dju) -- on ajoute les DJU du jour à l'index précédent
 commandArray[indexArray] = {['UpdateDevice'] = idx_dju..'|0|'..tostring(DJ)}
 indexArray=indexArray+1
 commandArray[indexArray] = {['Variable:Tx'] = tostring(-50)} -- Réinitialisation variable Tx
 indexArray=indexArray+1

	elseif (S <= TN) then
		voir_les_logs("--- --- --- Température de référence inférieure ou égale à Variable Tn : ".. TN,debugging);
	--commandArray['Variable:Tx'] = tostring(t_max_min) -- mise à jour de la variable tx
		voir_les_logs("--- --- --- Température de référence : ".. S,debugging);
		voir_les_logs("--- --- --- Variable Tn : ".. TN,debugging);
		voir_les_logs("--- --- --- Moyenne : ".. MOY,debugging);
DJ = 0
		voir_les_logs("--- --- --- DJU : ".. DJ,debugging);	
DJ = tonumber(total_dju) -- on renvoi l'index du jour précédent
-- commandArray['UpdateDevice']= idx_dju ..'|0|'.. tostring(DJ)
DJ = tonumber(DJ) + tonumber(total_dju) -- on ajoute les DJU du jour à l'index précédent
 commandArray[indexArray] = {['UpdateDevice'] = idx_dju..'|0|'..tostring(DJ)}
 indexArray=indexArray+1
 commandArray[indexArray] = {['Variable:Tx'] = tostring(-50)} -- Réinitialisation variable Tx
 indexArray=indexArray+1
	else 
		voir_les_logs("--- --- --- Température de référence comprise entre Tn et Tx",debugging);
	-- commandArray['Variable:Tx'] = tostring(t_max_min) -- mise à jour de la variable tx
		voir_les_logs("--- --- --- Température de référence : ".. S,debugging);
		voir_les_logs("--- --- --- Variable TN : ".. TN,debugging);
		voir_les_logs("--- --- --- Variable TX : ".. TX,debugging);
		voir_les_logs("--- --- --- Moyenne : ".. MOY,debugging);

S_TN = 	S - TN
		voir_les_logs("--- --- --- S - TN : ".. S_TN,debugging);
TX_TN = TX - TN
		voir_les_logs("--- --- --- TX - TN : ".. TX_TN,debugging);
DJ =  round(S_TN  * ("0.08" + "0.42" * S_TN / TX_TN))
	--DJ = ( S – TN ) * ('0.08' + '0.42' * ( S – TN ) / ( TX - TN ))
		voir_les_logs("--- --- --- DJU : ".. DJ,debugging);
--commandArray['UpdateDevice']= idx_dju ..'|0|'.. tostring(DJ)
DJ = tonumber(DJ) + tonumber(total_dju) -- on ajoute les DJU du jour à l'index précédent
 commandArray[indexArray] = {['UpdateDevice'] = idx_dju..'|0|'..tostring(DJ)}
 indexArray=indexArray+1
 commandArray[indexArray] = {['Variable:Tx'] = tostring(-50)} -- Réinitialisation variable Tx
 indexArray=indexArray+1
	end
--commandArray['Variable:'.. var_chauffage]=tostring(tonumber(uservariables[var_chauffage])+1)  -- Ajoute un jour de chauffage supplémentaire dans la variable			
				else -- Le chauffage est éteint, pas de calcul de DJU
		voir_les_logs("--- --- --- Nb de jour de chauffage : " .. tonumber(uservariables[var_chauffage]) .." --- --- --- ",debugging);
		voir_les_logs("--- --- --- Le chauffage est arrêté --- --- --- ",debugging);
 commandArray[indexArray] = {['Variable:Tx'] = tostring(-50)} -- Réinitialisation variable Tx
 indexArray=indexArray+1				
		end

		
voir_les_logs("=========== Fin Calcul DJU (v1.0) ===========",debugging);	
end	
return commandArray

idem que pour le premier script , personnalisez les idx des variables l’ip de domoticz le nom de de votre sonde de température…
Vient en dernier la création d’un script de lancement du calcul à 18h00 chaque jour. J’ai choisi de conditionner le lancement de ce script au fait que le chauffage est allumé. je teste donc si la variable de Nb Jours de Chauffage et supérieure à 0. Lors de l’arrêt du chauffage, il faudra donc remettre cette variable à 0. et bien sur la mettre à 1 le jour de l’allumage du chauffage.

#!/bin/bash

# Settings
#crontab -e
# 0 18 * * * sudo /home/pi/domoticz/scripts/sh/lance_calcul_dju.sh
# chmod +x /home/pi/domoticz/scripts/sh/lance_calcul_dju.sh
DOMO_IP="192.168.10.240"      # Domoticz IP Address
DOMO_PORT="8080"         # Domoticz Port
nb_IDX="18" # IDX variable Nb Jours de Chauffage 18
uservariablename="Nb Jours de Chauffage"
uservariabletype="2"

urlencode() {
    # urlencode 

    local LANG=C
    local length="${#1}"
    for (( i = 0; i < length; i++ )); do
        local c="${1:i:1}"
        case $c in
            [a-zA-Z0-9.~_-]) printf "$c" ;;
            *) printf '%%%02X' "'$c" ;; 
        esac
    done
}
       nb=$(curl -s "http://$DOMO_IP:$DOMO_PORT/json.htm?type=command&param=getuservariable&idx=$nb_IDX"| jq -r .result[].Value)
		echo $nb
			if expr "$nb" '>' 0
			then
			echo "test condition avant calcul"
			echo $nb
		nb=$((nb+1))
		echo "test condition apres calcul"
		echo $nb
		uservariablename=$( urlencode "$uservariablename" )
		#curl -s "http://$DOMO_IP:$DOMO_PORT/json.htm?type=command¶m=udevices&script=calcul_dju.lua"
		curl -s -i -H "Accept: application/json" "http://$DOMO_IP:$DOMO_PORT/json.htm?type=command¶m=updateuservariable&idx=$nb_IDX&vname=$uservariablename&vtype=$uservariabletype&vvalue=$nb"
					else
				echo $nb
		fi

Comme pour le fichier bash précédent suivez les commandes de la rubrique setting afin lancer ce fichier via un crontab, et le rendre exécutable via chmod +x. Renseignez les caractéristiques de la variables Nb Jours de Chauffage et l’ip de domoticz.

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

Laisser un commentaire