Afin de surveiller sa consommation de chauffage, la facture ou les kwh consommés ne permettent pas de savoir si son installation fonctionne correctement.
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,
et quatre variables de type chaine Tn, Tx, Tn_Hold et Nb Jours de Chauffage
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¶m=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¶m=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¶m=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¶m=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¶m=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() { # urlencodelocal 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¶m=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