[LUA+Bash] Calcul de DJU

Vous avez créé un script LUA dont vous êtes fier, un .sh génial, un programme Python hors du commun, un Tuto, c'est ici que vous pouvez les partager.
Antori91

Re: Calcul de DJU

Message par Antori91 »

-
Dernière modification par Antori91 le 03 avr. 2021, 16:58, modifié 1 fois.
benbidouille
Messages : 102
Inscription : 11 déc. 2017, 11:48

Re: Calcul de DJU

Message par benbidouille »

Impressionnant de réactivité :D 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.
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

Re: Calcul de DJU

Message par Antori91 »

-
Dernière modification par Antori91 le 03 avr. 2021, 16:57, modifié 1 fois.
benbidouille
Messages : 102
Inscription : 11 déc. 2017, 11:48

Re: Calcul de DJU

Message par benbidouille »

Merci à vous tous pour les multiples retours :D 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.
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

Message par benbidouille »

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é.
  • 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

Message par benbidouille »

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.
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
papoo
Messages : 2029
Inscription : 10 janv. 2016, 11:29
Localisation : Limoges (87)
Contact :

Re: Calcul de DJU

Message par papoo »

j’étais en train de te faire des screenshots :D
il n'y a pas de honte à avoir
domoticz beta/RaspBerry PI3 stretch
https://pon.fr github
papoo
Messages : 2029
Inscription : 10 janv. 2016, 11:29
Localisation : Limoges (87)
Contact :

Re: Calcul de DJU méthode intégrale

Message par papoo »

sinon le script dju methode intregale semble fonctionner correctement
2017-12-29 17_25_52-Domoticz.png
2017-12-29 17_25_52-Domoticz.png (14.93 Kio) Consulté 7397 fois

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&param=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.
domoticz beta/RaspBerry PI3 stretch
https://pon.fr github
papoo
Messages : 2029
Inscription : 10 janv. 2016, 11:29
Localisation : Limoges (87)
Contact :

Re: Calcul de DJU

Message par papoo »

maj du script avec la totalisation de l’énergie consommée sur une journée
domoticz beta/RaspBerry PI3 stretch
https://pon.fr github
benbidouille
Messages : 102
Inscription : 11 déc. 2017, 11:48

Re: Calcul de DJU

Message par benbidouille »

Beau travail :D
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
Répondre