Re: Calcul de DJU
Publié : 31 déc. 2017, 14:04
La variablebenbidouille a écrit :
Les variables Tn, Tn_Hold, Tx et Nb Jours de Chauffage sont mises à jours conformément aux évolutions de température de la sonde utilisée ainsi que sous l'effet des deux scripts lancés à 6:00 et 18:00 par crontab.
existe elle et est elle > 0 ? lors de l'allumage de ton chauffage il te faut mettre cette variable à 1 automatiquement via un script, ou manuellement.local var_chauffage
non il n'existe pas dans la version finale.benbidouille a écrit : Je me suis lancé à regarder les codes et ai interprété que le script calcul_dju.lua situé dans le répertoire /lua_parser n'était jamais éxécuté.
Je crois comprendre que ce qui est dans le répertoire /lua est lancé périodiquement automatiquement à la différence de ce qui est situé dans /lua_parser aussi en regardant le script lance_calcul_dju.sh je me suis rendu compte qu'était commenté la commande suivante, que j'ai interprété comme nécessaire. (peut être à tord)
#curl -s "http://$DOMO_IP:$DOMO_PORT/json.htm?type=command¶m=udevices&script=calcul_dju.lua"
Une fois rétablit, calcul_dju.lua s'éxécute désormais mais plante avec l'erreur suivante correspondant à la ligne de code ci-dessous associée.
CLuaHandler: /home/pi/domoticz/scripts/lua_parsers/calcul_dju.lua:49: attempt to index global 'uservariablechanged' (a nil value)
if uservariablechanged[var_chauffage] then
Je devine qu'il s'agit ici d'un test de mise a jour récente dans la base Domoticz de la variable Nb Jours de Chauffage, selon les log d’exécution du script lance_calcul_dju.sh, nul doute que la variable est-bien incrémentée juste avant le calcul des DJU attendu.
Mes hypothèses selon laquelle calcul_dju.lua doit être décoché pour être éxécuté est elle pertinente ?
il y a 4 fichiers à créer :
tn_hold.sh
script_variable_calcul_dju.lua
lance_calcul_dju.sh
script_device_temp_ext.lua
je ne comprend pas ou tu as trouvé le contenu d'un fichier calcul_dju.lua à placer dans lua_handler, car je ne l'ai pas posté
tout est possible, et à la relecture de ce script qui date de mes débuts en lua, je me rend compte que je ne me suis pas facilité la tache et que du coup à vous non plus.benbidouille a écrit : Si confirmé alors, bizarrement commenté, ce pourrai t’il que le script calcul_dju.lua proposé sur le forum ne soit pas dans sa version finale ? et que je sois le premier bizu à essayer ton script depuis le forum ?
je tacherai de le reécrire pour qu'il soit simple à mettre en place et à utiliser.
le contenu des 4 fichiers
Code : Tout sélectionner
--[[
~/domoticz/scripts/lua/script_device_temp_ext.lua
auteur : papoo
version : 1.01
MAJ : 11/08/2016
création : 06/05/2016
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.
]]--
--------------------------------------------
------------ Variables à éditer ------------
--------------------------------------------
local debugging = false -- true pour voir les logs dans la console log Dz ou false pour ne pas les voir
local url = '127.0.0.1:8080' -- user:pass@ip:port de domoticz
local temp_ext = 'Temperature exterieure' -- nom de la sonde extérieure
--------------------------------------------
----------- Fin variables à éditer ---------
--------------------------------------------
--------------------------------------------
---------------- Fonctions -----------------
--------------------------------------------
function voir_les_logs (s, debugging)
if (debugging) then
if s ~= nil then
print ("<font color='#f3031d'>".. s .."</font>")
else
print ("<font color='#f3031d'>aucune valeur affichable</font>")
end
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
Code : Tout sélectionner
--[[ Calcul DJU du jour
name : script_variable_calcul_dju.lua
auteur : papoo
version : 1.15
mise à jour : 17/08/2016
création : 08/05/2016
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 ))
]]--
--------------------------------------------
------------ Variables à éditer ------------
--------------------------------------------
local debugging = false -- true pour voir les logs dans la console log Dz ou false pour ne pas les voir
local S = 18 -- seuil de température de non chauffage (par convention : 18°C)
local temp_ext = 'Temperature exterieure' -- 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 = '127.0.0.1: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
--------------------------------------------
----------- Fin variables à éditer ---------
--------------------------------------------
--------------------------------------------
---------------- Fonctions -----------------
--------------------------------------------
function voir_les_logs (s, debugging)
if (debugging) then
if s ~= nil then
print ("<font color='#f3031d'>".. s .."</font>")
else
print ("<font color='#f3031d'>aucune valeur affichable</font>")
end
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
--------------------------------------------
-------------- Fin Fonctions ---------------
--------------------------------------------
commandArray = {}
if uservariablechanged[var_chauffage] then
voir_les_logs("=========== Calcul DJU (v1.0) ===========",debugging)
--[[ if(uservariables[var_chauffage] == nil) then -- Création de la variable Tx car elle n'existe pas
voir_les_logs("--- --- --- La Variable " .. var_chauffage .." n'existe pas --- --- --- ",debugging)
commandArray['OpenURL']=url..'/json.htm?type=command¶m=saveuservariable&vname='..url_encode(var_chauffage)..'&vtype=2&vvalue=1'
adresse = url_encode(var_chauffage)
voir_les_logs("--- --- --- adresse " .. adresse .." --- --- --- ",debugging)
voir_les_logs("--- --- --- Création Variable " .. var_chauffage .." manquante --- --- --- ",debugging)
print('script supendu')
else
]]--
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[#commandArray+1] = {['UpdateDevice'] = idx_dju..'|0|'..tostring(DJ)}
commandArray[#commandArray+1] = {['Variable:Tx'] = tostring(-50)} -- Réinitialisation variable Tx
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[#commandArray+1] = {['UpdateDevice'] = idx_dju..'|0|'..tostring(DJ)}
commandArray[#commandArray+1] = {['Variable:Tx'] = tostring(-50)} -- Réinitialisation variable Tx
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[#commandArray+1] = {['UpdateDevice'] = idx_dju..'|0|'..tostring(DJ)}
commandArray[#commandArray+1] = {['Variable:Tx'] = tostring(-50)} -- Réinitialisation variable Tx
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[#commandArray+1] = {['Variable:Tx'] = tostring(-50)} -- Réinitialisation variable Tx
commandArray[#commandArray+1] = {['UpdateDevice'] = idx_dju..'|0|0'} -- Remise à zéro des Dju
end
voir_les_logs("=========== Fin Calcul DJU (v1.0) ===========",debugging)
end
return commandArray
Code : Tout sélectionner
#!/bin/bash
# Settings
#crontab -e
# */2 * * * * sudo /home/pi/domoticz/scripts/sh/tn_hold.sh
# chmod +x /home/pi/domoticz/scripts/sh/tn_hold.sh
# sudo /home/pi/domoticz/scripts/sh/tn_hold.sh
DOMO_IP="192.168.1.24" # 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
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" > /dev/null
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" > /dev/null
echo "Changement valeur variable Tn a 150 pour debuter un nouveau jour"
Code : Tout sélectionner
#!/bin/bash
# Settings
#crontab -e
# 0 18 * * * sudo /home/pi/domoticz/scripts/sh/calcul_dju.sh
# chmod +x /home/pi/domoticz/scripts/sh/calcul_dju.sh
# sudo /home/pi/domoticz/scripts/sh/calcul_dju.sh
#===============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 ))
#===============================================
DOMO_IP="192.168.1.24" # Domoticz IP Address
DOMO_PORT="8080" # Domoticz Port
S="2" # seuil de température de non chauffage (par convention : 18°C)
Tx_IDX="15" # Idx de la variable Tx
Tx_uservariablename="Tx" # Nom de la variable Tx
Tn_hold_IDX="17" # Idx de la variable Tn_hold
Tn_hold_uservariablename="Tn_Hold" # Nom de la variable Tn
Tx=$(curl -s "http://$DOMO_IP:$DOMO_PORT/json.htm?type=command¶m=getuservariable&idx=$Tx_IDX"| jq -r .result[].Value)
echo "Recuperation valeur variable Tx"
let Tx
echo $Tx
Tn=$(curl -s "http://$DOMO_IP:$DOMO_PORT/json.htm?type=command¶m=getuservariable&idx=$Tn_hold_IDX"| jq -r .result[].Value)
let Tn
echo "Recuperation valeur variable Tn memorisé"
echo $Tn
Moy= echo "($Tn+$Tx)/2" |bc -l
echo $Moy
#if [ $(($S)) -gt $(($Tx)) ] # > strictement superieur
if expr $S \> $Tx
then
echo $S ">" $Tx
#elif [ $(($S)) -le $(($Tn)) ] # inférieur ou égal
elif expr $S \< $Tn \| $S = $Tn
then
echo $S "<=" $Tn
else #if [ $((Tn)) -lt $(($S)) || $(($S)) -le $(($Tx)) ]
#then
echo $Tn "<" $S "<=" $Tx
fi
#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=$Tx_IDX&vname=$Tx_uservariablename&vtype=2&vvalue=-150"
#echo "Changement valeur variable Tx a -150 pour debuter un nouveau jour"