[LUA+Bash] Calcul de DJU
Publié : 14 avr. 2016, 22:58
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 énergetiques 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 methode 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 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 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.
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
A vous de jouer
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 énergetiques 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 methode 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
Code : Tout sélectionner
#!/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"
ensuite créez un fichier script_variable_calcul_dju.lua
Code : Tout sélectionner
--[[ 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
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.
Code : Tout sélectionner
#!/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 <string>
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¶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
fiVos 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
A vous de jouer