[LUA+Bash] Calcul de DJU
-
Antori91
-
benbidouille
- Messages : 102
- Inscription : 11 déc. 2017, 11:48
Re: Calcul de DJU
Impressionnant de réactivité
et merci a vous tous.
Les premiers chiffres de DJU méthode intégrale sortent avant même que je n'ai eu le temps de péniblement implémenter la méthode Météo Ciel en suivant les instructions toutes prêtes, je n'ai vraiment aucun mérite.
Sur les graph présentés, je comprend que l'on dispose de courbes de DJU par Jours / semaine et années, mais est il possible dans Domoticz de modifier l'affichage pour disposer du cumul de DJU par semaine et par année sous forme de chiffre DJU cumulé ?
Ou au contraire les formatages sont figés en fonction du type de device et il convient de développer un/des autres user_variables avec scripts associées a un/des device virtuel de type compteur qui feraient le cumul par période ?
Excusez mes questions peut êtres naïves, je découvre au fur et a mesure l'esprit domoticz au travers de ce forum, Un outil génial qui nul doute me permettra de mettre en œuvre les multiples idées qui me traversent la tête.
Les premiers chiffres de DJU méthode intégrale sortent avant même que je n'ai eu le temps de péniblement implémenter la méthode Météo Ciel en suivant les instructions toutes prêtes, je n'ai vraiment aucun mérite.
Sur les graph présentés, je comprend que l'on dispose de courbes de DJU par Jours / semaine et années, mais est il possible dans Domoticz de modifier l'affichage pour disposer du cumul de DJU par semaine et par année sous forme de chiffre DJU cumulé ?
Ou au contraire les formatages sont figés en fonction du type de device et il convient de développer un/des autres user_variables avec scripts associées a un/des device virtuel de type compteur qui feraient le cumul par période ?
Excusez mes questions peut êtres naïves, je découvre au fur et a mesure l'esprit domoticz au travers de ce forum, Un outil génial qui nul doute me permettra de mettre en œuvre les multiples idées qui me traversent la tête.
RPI3 + WDPiDrive + UPS Pico HV3.0B HAT + Teleinfo USB (6) + 1Wire GPIO + DS18B20 (15)+ Gateway MySensor NRF24, Sensors , Relais ... + Gateway Velux .... + Gestion Pompe à Chaleur + NRFDoctor .... tout en DIY
-
Antori91
-
benbidouille
- Messages : 102
- Inscription : 11 déc. 2017, 11:48
Re: Calcul de DJU
Merci à vous tous pour les multiples retours
qui confirment ma première impression sur le fait qu'il faille s'arranger du formalisme des devices et rapports proposés dans domoticz, donc une gymnastique pas facile a appréhender sans recul dans le temps et multiples essais.
Je comprend aussi qu'il va être difficile d'éviter de procéder à des extractions excels, je m'étais plu à croire que j'allais pourvoir obtenir directement des graphs avec cumul par jours, semaine, mois et année/saison de chauffage de KWh/DJU ou autres ratio HC/HP avec cumuls.
Bref, dans un premier temps, j'ai recopié la méthode de calcul Météo France de @papoo et attend les premiers résultats pour me faire une idée des indicateurs obtenus et la manière dont je les utiliserai, j'évoluerai très certainement vers la méthode de calcul DJU intégrale qui me parait plus précise et plus représentative des besoins énergétiques.
Je comprend aussi qu'il va être difficile d'éviter de procéder à des extractions excels, je m'étais plu à croire que j'allais pourvoir obtenir directement des graphs avec cumul par jours, semaine, mois et année/saison de chauffage de KWh/DJU ou autres ratio HC/HP avec cumuls.
Bref, dans un premier temps, j'ai recopié la méthode de calcul Météo France de @papoo et attend les premiers résultats pour me faire une idée des indicateurs obtenus et la manière dont je les utiliserai, j'évoluerai très certainement vers la méthode de calcul DJU intégrale qui me parait plus précise et plus représentative des besoins énergétiques.
RPI3 + WDPiDrive + UPS Pico HV3.0B HAT + Teleinfo USB (6) + 1Wire GPIO + DS18B20 (15)+ Gateway MySensor NRF24, Sensors , Relais ... + Gateway Velux .... + Gestion Pompe à Chaleur + NRFDoctor .... tout en DIY
-
benbidouille
- Messages : 102
- Inscription : 11 déc. 2017, 11:48
Re: Calcul de DJU
Papoo,
Quel type de compteur utilises tu pour le calcul de tes DJU ?
Lors de la création d'un device virtuel, j'ai choisis "counter" parmi les 2 seuls compteurs proposés avec "counter incremental" , mais je réalise en regardant tes rapports de DJU Meteo France que ton graph est personalisé avec en ordonnés des "degré DJU" et que donc qu'il me faille assurément personnaliser le compteur choisit à supposer que celui sélectionné soit seulement adapté, je n'en suis pas même sur.
(A moins que la base SQL ne traitant si j'ai bien compris que des variables de type string, la personnalisation se fera dès lors que les premières données de DJU seront calculées et écrites dans ce compteur, et les DJU degré remplaceront les KWh, mais j'ai des doutes, les KWh et RFXMetercounter me perturbent)
Merci de bien vouloir me rediriger vers un tuto de méthode de personnalisation ou de description des devices virtuels disponibles, je n'ai trouvé que la liste des API JSON sur le forum pour le moment.
A toute fins utiles, Je joins ci dessous le détail du compteur utilisé.
Quel type de compteur utilises tu pour le calcul de tes DJU ?
Lors de la création d'un device virtuel, j'ai choisis "counter" parmi les 2 seuls compteurs proposés avec "counter incremental" , mais je réalise en regardant tes rapports de DJU Meteo France que ton graph est personalisé avec en ordonnés des "degré DJU" et que donc qu'il me faille assurément personnaliser le compteur choisit à supposer que celui sélectionné soit seulement adapté, je n'en suis pas même sur.
(A moins que la base SQL ne traitant si j'ai bien compris que des variables de type string, la personnalisation se fera dès lors que les premières données de DJU seront calculées et écrites dans ce compteur, et les DJU degré remplaceront les KWh, mais j'ai des doutes, les KWh et RFXMetercounter me perturbent)
Merci de bien vouloir me rediriger vers un tuto de méthode de personnalisation ou de description des devices virtuels disponibles, je n'ai trouvé que la liste des API JSON sur le forum pour le moment.
A toute fins utiles, Je joins ci dessous le détail du compteur utilisé.
- ActTime 1514463725
ServerTime "2017-12-28 13:22:05"
Sunrise "08:45"
Sunset "17:00"
result 0
AddjMulti 1
AddjMulti2 1
AddjValue 0
AddjValue2 0
BatteryLevel 255
Counter "0.000 kWh"
CounterToday "0.000 kWh"
CustomImage 0
Data "0.000 kWh"
Description ""
Favorite 0
HardwareID 6
HardwareName "Dummy"
HardwareType "Dummy (Does nothing, use for virtual switches only)"
HardwareTypeVal 15
HaveTimeout true
ID "14079"
LastUpdate "2017-12-27 13:32:09"
Name "DJU"
Notifications "false"
PlanID "0"
PlanIDs
0 0
Protected false
ShowNotifications true
SignalLevel 10
SubType "RFXMeter counter"
SwitchTypeVal 0
Timers "false"
Type "RFXMeter"
TypeImg "counter"
Unit 1
Used 1
ValueQuantity ""
ValueUnits ""
XOffset "0"
YOffset "0"
idx "41"
status "OK"
title "Devices"
RPI3 + WDPiDrive + UPS Pico HV3.0B HAT + Teleinfo USB (6) + 1Wire GPIO + DS18B20 (15)+ Gateway MySensor NRF24, Sensors , Relais ... + Gateway Velux .... + Gestion Pompe à Chaleur + NRFDoctor .... tout en DIY
-
benbidouille
- Messages : 102
- Inscription : 11 déc. 2017, 11:48
Re: Calcul de DJU
Oups, J'ai honte de mes questions.
J'ai finalement trouvé le bouton "edit" du device virtuel pour éditer les intitulés des axes et les unités.
J'ai finalement trouvé le bouton "edit" du device virtuel pour éditer les intitulés des axes et les unités.
RPI3 + WDPiDrive + UPS Pico HV3.0B HAT + Teleinfo USB (6) + 1Wire GPIO + DS18B20 (15)+ Gateway MySensor NRF24, Sensors , Relais ... + Gateway Velux .... + Gestion Pompe à Chaleur + NRFDoctor .... tout en DIY
Re: Calcul de DJU
j’étais en train de te faire des screenshots
il n'y a pas de honte à avoir
il n'y a pas de honte à avoir
Re: Calcul de DJU méthode intégrale
sinon le script dju methode intregale semble fonctionner correctement
Code : Tout sélectionner
--[[
~/domoticz/scripts/lua/script_time_dju.lua
auteur : papoo
MAJ : 07/01/2018
création : 26/12/2017
Principe :
Calculer, via l'information température d'une sonde extérieure, les Degrés jour Chauffage et Froid "intégrales"
https://easydomoticz.com/forum/viewtopic.php?f=17&t=1876&p=46879#p46879
https://github.com/papo-o/domoticz_scripts/blob/master/Lua/script_time_dju.lua
trouvez le coefficient moyen de conversion Gaz/kwh pour votre commune sur https://www.grdf.fr/particuliers/services-gaz-en-ligne/coefficient-conversion
]]--
--------------------------------------------
------------ Variables à éditer ------------
--------------------------------------------
local debugging = true -- true pour voir les logs dans la console log Dz ou false pour ne pas les voir
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' -- nom de la variable utilisateur de type 2 (chaine) pour le stockage temporaire des données journalières DJC
local cpt_djc = 'DJU 2' -- nom du dummy compteur DJC en degré
local heure_raz_var = 23 -- heure de l'incrémentation du compteur DJC compteur_djc_idx et de remise à zéro de la variable utilisateur var_user_djc
local minute_raz_var = 59 -- Minute de l'incrémentation du compteur DJC compteur_djc_idx et de remise à zéro de la variable utilisateur var_user_djc
local var_user_djf = nil -- nom de la variable utilisateur de type 2 (chaine) pour le stockage temporaire des données journalières DJF, nil si inutilisé
local cpt_djf = 'DJF' -- nom du dummy compteur DJF en degré, nil si vous ne souhaitez pas calculer les Degrés Jour Climatisation
local coef_gaz = 10.83 -- coefficient moyen gaz pour votre commune
local cpt_gaz = 'Compteur Gaz' -- nom de votre compteur gaz, nil si vous ne souhaitez pas calculer l'énergie consommée
local cpt_nrj = 'Energie consommée chauffage' -- nom du dummy compteur nrj, nil si vous ne souhaitez pas totaliser l'énergie consommée en Wh
local var_user_gaz = 'conso_gaz' -- nom de la variable utilisateur de type 2 (chaine) pour le stockage temporaire des données
--------------------------------------------
----------- Fin variables à éditer ---------
--------------------------------------------
commandArray = {}
local nom_script = 'Calcul Degrés jour Chauffage et Froid'
local version = '1.30'
local djc
local somme_djc
local reste_djc
local conso_gaz
local conso_nrj
local index_nrj
local djf
local somme_djf
local reste_djf
time=os.date("*t")
--------------------------------------------
---------------- Fonctions -----------------
--------------------------------------------
curl = '/usr/bin/curl -m 15 -u domoticzUSER:domoticzPSWD '
--==============================================================================================
function voir_les_logs (s, debbuging)
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 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 calc_djc(temperature) -- calcul des degrés jour mode chauffage
djc = tonumber((18 - temperature)*1/1440)
return djc
end
--==============================================================================================
function calc_djf(temperature)-- calcul des degrés jour mode réfrigération proposé par thuglife
djf = tonumber((temperature - 18)*1/1440)
return djf
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')
--==============================================================================================
-- Obtenir le nom d'un device via son idx
function GetDeviceNameByIDX(deviceIDX) -- https://www.domoticz.com/forum/viewtopic.php?t=18736#p144720
deviceIDX = tonumber(deviceIDX)
for i, v in pairs(otherdevices_idx) do
if v == deviceIDX then
return i
end
end
return 0
end -- exemple usage = commandArray[GetDeviceNameByIDX(383)] = 'On'
--==============================================================================================
-- Obtenir l'idx d'un device via son nom
function GetDeviceIdxByName(deviceName)
for i, v in pairs(otherdevices_idx) do
if i == deviceName then
return v
end
end
return 0
end -- exemple usage = commandArray['UpdateDevice'] = GetDeviceIdxByName('Compteur Gaz') .. '|0|' .. variable
--==============================================================================================
function timeDiff(dName,dType) -- retourne le temps en seconde depuis la dernière maj du péréphérique (Variable 'v' ou Device 'd'
if dType == 'v' then
updTime = uservariables_lastupdate[dName]
elseif dType == 'd' then
updTime = otherdevices_lastupdate[dName]
end
t1 = os.time()
y, m, d, H, M, S = updTime:match("(%d+)-(%d+)-(%d+) (%d+):(%d+):(%d+)")
t2 = os.time{year=y, month=m, day=d, hour=H, min=M, sec=S}
tDiff = os.difftime(t1,t2)
return tDiff
end -- usage: timeDiff(name,'v|d')
--------------------------------------------
-------------- Fin Fonctions ---------------
--------------------------------------------
voir_les_logs("========= ".. nom_script .." (v".. version ..") =========",debugging)
-- calcul DJC et DJF
if otherdevices_svalues[temp_ext] ~= nil then
if (uservariables[var_user_djc] == nil) then creaVar(var_user_djc,2,0)end
temperature = tonumber(string.match(otherdevices_svalues[temp_ext], "%d+%.*%d*"))
if temperature < 18 then --si la température extérieure est inférieure à 18
voir_les_logs("--- --- Température extérieure : ".. temperature .."°C inférieure à 18°C --- ---",debugging)
djc = calc_djc(temperature)
voir_les_logs("--- --- DJC : ".. round(djc,5) .." --- ---",debugging)
voir_les_logs("--- --- Variable DJC : ".. round(tonumber(uservariables[var_user_djc]),4) .." --- ---",debugging)
somme_djc = tonumber(uservariables[var_user_djc]) + djc
voir_les_logs("--- --- somme DJC : ".. round(somme_djc,4) .." --- ---",debugging)
commandArray[#commandArray+1] = {['Variable:'.. var_user_djc] = tostring(somme_djc)}
cpt_djc_index = otherdevices_svalues[cpt_djc]
voir_les_logs("--- --- compteur DJC : ".. cpt_djc_index .." --- ---",debugging)
else --si la température extérieure est supérieure à 18
voir_les_logs("--- --- Température extérieure : ".. temperature .."°C supérieure à 18°C --- ---",debugging)
djf = calc_djf(temperature)
voir_les_logs("--- --- DJF : ".. round(djf,5) .." --- ---",debugging)
voir_les_logs("--- --- Variable DJF : ".. round(tonumber(uservariables[var_user_djf]),4) .." --- ---",debugging)
somme_djf = tonumber(uservariables[var_user_djf]) + djf
voir_les_logs("--- --- somme DJF : ".. round(somme_djf,4) .." --- ---",debugging)
commandArray[#commandArray+1] = {['Variable:'.. var_user_djf] = tostring(somme_djf)}
cpt_djf_index = otherdevices_svalues[cpt_djf]
voir_les_logs("--- --- compteur DJF : ".. cpt_djf_index .." --- ---",debugging)
somme_djc = tonumber(uservariables[var_user_djc])
voir_les_logs("--- --- somme DJC : ".. somme_djc .." --- ---",debugging)
end -- fin si temp ext
if tonumber(uservariables[var_user_djc]) > 1 and cpt_djc ~= nil then -- si variable djc supérieure à 1 on incrémente le compteur de 1 et on réduit la variable de 1
voir_les_logs("--- --- mise a jour compteur DJC --- ---",debugging)
reste_djc = tonumber(uservariables[var_user_djc]) - 1
if timeDiff(cpt_djc,'d') < 119 then -- on vérifie si le compteur à été rafraichi depuis moins de deux minutes si c'est le cas on soustrait 1 de la variable
voir_les_logs("--- --- dernier rafraichissement compteur DJC : ".. timeDiff(cpt_djc,'d') .." secondes --- ---",debugging)
commandArray[#commandArray+1] = {['Variable:'.. var_user_djc] = tostring(reste_djc)}
voir_les_logs("--- --- reste DJC : ".. tonumber(uservariables[var_user_djc]) .." --- ---",debugging)
else -- si le compteur n'as pas été rafraichi depuis moins de 2 minutes on l'incrémente de 1
cpt_djc_index = tonumber(cpt_djc_index) + 1
commandArray[#commandArray+1] = {['UpdateDevice'] = GetDeviceIdxByName(cpt_djc) .. '|0|'..tostring(cpt_djc_index)}
end
end
if var_user_djf ~= nil then
if (uservariables[var_user_djf] == nil) then creaVar(var_user_djf,2,0)end
if tonumber(uservariables[var_user_djf]) > 1 and cpt_djf ~= nil then -- si variable djf supérieure à 1 on incrémente le compteur de 1 et on réduit la variable de 1
voir_les_logs("--- --- mise a jour compteur DJF --- ---",debugging)
reste_djf = tonumber(uservariables[var_user_djf]) - 1
if timeDiff(cpt_djf,'d') < 119 then -- on vérifie si le compteur à été rafraichi depuis moins de deux minutes si c'est le cas on soustrait 1 de la variable
voir_les_logs("--- --- dernier rafraichissement compteur DJF : ".. timeDiff(cpt_djf,'d') .." secondes --- ---",debugging)
commandArray[#commandArray+1] = {['Variable:'.. var_user_djf] = tostring(reste_djf)}
voir_les_logs("--- --- reste DJF : ".. tonumber(uservariables[var_user_djf]) .." --- ---",debugging)
else -- si le compteur n'as pas été rafraichi depuis moins de 2 minutes on l'incrémente de 1
cpt_djf_index = tonumber(cpt_djf_index) + 1
commandArray[#commandArray+1] = {['UpdateDevice'] = GetDeviceIdxByName(cpt_djf) .. '|0|'..tostring(cpt_djf_index)}
end
end
end
else
voir_les_logs("--- --- le device : ".. temp_ext .." n\'existe pas --- ---",debugging)
end -- fin si otherdevices_svalues[temp_ext] ~= nil
-- fin calcul DJC et DJF
--==============================================================================================
-- calcul nrj consommée
if otherdevices_svalues[cpt_gaz] ~= nil then
if (uservariables[var_user_gaz] == nil) then creaVar(var_user_gaz,2,0)end
voir_les_logs("--- --- Compteur gaz : ".. otherdevices_svalues[cpt_gaz]/100 .." m3 --- ---",debugging) -- /100 car compteur gaz en décalitres, 1 impulsion tous les 0.01 m3
voir_les_logs("--- --- Précédent index gaz : ".. uservariables[var_user_gaz]/100 .." m3 --- ---",debugging)-- /100 car compteur gaz en décalitres 1 impulsion tous les 0.01 m3
conso_gaz = tonumber(otherdevices_svalues[cpt_gaz]/100) - tonumber(uservariables[var_user_gaz]/100) -- /100 car compteur gaz en décalitres, 1 impulsion tous les 0.01 m3
voir_les_logs("--- --- Consommation gaz : ".. round(conso_gaz,4) .." m3 --- ---",debugging)
if tonumber(conso_gaz) > 0 then
conso_nrj = conso_gaz * coef_gaz -- transformation en kWh
voir_les_logs("--- --- Coeff conversion gaz : ".. coef_gaz .." --- ---",debugging)
voir_les_logs("--- --- Consommation nrj : ".. conso_nrj .." kWh--- ---",debugging)
if cpt_nrj ~= nil then
index_nrj = otherdevices_svalues[cpt_nrj]
voir_les_logs("--- --- Compteur nrj : ".. index_nrj .." kWh --- ---",debugging)
conso_nrj = tonumber(conso_nrj) + tonumber(index_nrj)
commandArray[#commandArray+1] = {['UpdateDevice'] = GetDeviceIdxByName(cpt_nrj) .. '|0|' .. conso_nrj}
end
end
commandArray[#commandArray+1] = {['Variable:'.. var_user_gaz] = tostring(otherdevices_svalues[cpt_gaz])}
end
-- fin calcul nrj consommée
voir_les_logs("========= Fin ".. nom_script .." (v".. version ..") =========",debugging)
return commandArray
Dernière modification par papoo le 13 janv. 2018, 11:48, modifié 14 fois.
Re: Calcul de DJU
maj du script avec la totalisation de l’énergie consommée sur une journée
-
benbidouille
- Messages : 102
- Inscription : 11 déc. 2017, 11:48
Re: Calcul de DJU
Beau travail
Merci Papoo pour cette mise en application en un temps record, je la mettrai en application dès que possible, très peu probablement avant ce week-end toutefois.
Si je comprend bien, 1 seul script et 2 compteurs virtuels DJU et NRJ en complément de quelques variables pour évaluer les KWh Gaz / DJU.
Je suppose qu'un compteur électrique P1 peut être utilisé en substitution du compteur gaz après modification du coef m3/Kwh = 1 sans autre modification.
il va être intéressant de comparer les DJU obtenus par les 2 méthodes.
Encore Merci
Merci Papoo pour cette mise en application en un temps record, je la mettrai en application dès que possible, très peu probablement avant ce week-end toutefois.
Si je comprend bien, 1 seul script et 2 compteurs virtuels DJU et NRJ en complément de quelques variables pour évaluer les KWh Gaz / DJU.
Je suppose qu'un compteur électrique P1 peut être utilisé en substitution du compteur gaz après modification du coef m3/Kwh = 1 sans autre modification.
il va être intéressant de comparer les DJU obtenus par les 2 méthodes.
Encore Merci
RPI3 + WDPiDrive + UPS Pico HV3.0B HAT + Teleinfo USB (6) + 1Wire GPIO + DS18B20 (15)+ Gateway MySensor NRF24, Sensors , Relais ... + Gateway Velux .... + Gestion Pompe à Chaleur + NRFDoctor .... tout en DIY