Script timedifference

Forum dédié aux problématiques concernant les scripts pour DomoticZ.
Entourez votre code et les logs avec les balises nommées code grâce au bouton <\>.
dokho
Messages : 685
Inscription : 28 déc. 2014, 19:32

Re: Script timedifference

Message par dokho »

Ta solution ne me permet pas de connaître ma durée de chauffage. Si j'envoie un 0 ou un 1 je vais avoir une valeur en minutes, donc obligé de faire une conversion pour avoir un historique en hh:mm. En plus, tu peux avoir les courbes par mois et année.

De plus ta solution me donnera une valeur à la minute prêt, pas de précision à la seconde. Pour du chauffage c'est amplement suffisant tu vas me dire
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: Script timedifference

Message par Keros »

Oui je te l'accorde, c'était à la minute prêt. Mais dans l'idée que je te proposais, c'était de suivre l'utilisation comme la consommation électrique. Si tu avais 5.2 par jour pour une valeur de 1, c'est qu'il aurait chauffer pendant 5,2 heures.

Tu as pu modifier ton code en stockant os.time() dans une variable ?
Comment bien utiliser le forum : Poser une question, Mettre un script, un fichier, une image ou des logs
Mes petits guides : Débuter en programmation, Le débogage, Le choix de matériel, Les sauvegardes
Ma présentation - Mes Tutos
dokho
Messages : 685
Inscription : 28 déc. 2014, 19:32

Re: Script timedifference

Message par dokho »

Je ne sais pas si c'est très propre mais j'ai réussi.

Code : Tout sélectionner

commandArray = {}

if (devicechanged['TEST1'] == 'On') then
commandArray[1]={['Variable:compteurchauffage1'] = tostring(os.time())}


else if (devicechanged['TEST1'] == 'Off')
then

-- DERNIER CYCLE CHAUFFE --
-- on calcule la durée du dernier cycle
derniercyclechauffe = os.date("!%X",os.time() - tostring(uservariables["compteurchauffage1"]))
print('Durée du dernier cycle de chauffe : ' .. derniercyclechauffe)

--on met à jour le compteur "durée dernier cycle"
commandArray[1]={['UpdateDevice'] = 196 .. '|0|' .. derniercyclechauffe}



-- TOTAL CHAUFFE JOURNEE --
-- on calcule la durée totale journaliere
totalcyclechauffe = os.date("!%X",tostring(uservariables["compteurchauffage2"]) + (os.time() - tostring(uservariables["compteurchauffage1"])))
print('Durée total des cycles de chauffe : ' .. totalcyclechauffe)

-- on incrémente la variable de durée journalière
commandArray[2]={['Variable:compteurchauffage2'] = tostring(tonumber(uservariables["compteurchauffage2"]) + (os.time()) - (uservariables["compteurchauffage1"]))}

-- on met à jour le compteur "durée journalière"
commandArray[3]={['UpdateDevice'] = 197 .. '|0|' .. totalcyclechauffe}


end
end
return commandArray
Il ne me manque plus qu'à faire un script time pour remettre la variable et le compteur journalier à zéro à minuit et c'est bon.

Merci pour l'aiguillage ;)
denis_brasseur
Messages : 898
Inscription : 24 déc. 2018, 17:05
Localisation : (26)

Re: Script timedifference

Message par denis_brasseur »

Pas sur que ceci soit correcte, 196 n'est pas une variable :

Code : Tout sélectionner

commandArray[1]={['UpdateDevice'] = 196 .. '|0|' .. derniercyclechauffe}
Si cela fonctionne, parfait, mais cela devrait plutot ressembler à ceci

Code : Tout sélectionner

commandArray['UpdateDevice']='idx|nValue|sValue' -- for updating Dummy devices e.g. '96|0|Hello World'
commandArray[#commandArray+1]={['UpdateDevice'] = '196|0|' .. derniercyclechauffe}
Pi3 + DD PiDrive - RFXtrx433 - AEON Labs ZW090
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: Script timedifference

Message par Keros »

Je pense que tu te mélanges un peu avec les formats :

Tu stockes os.time() en format caractère sous la variable compteurchauffage1 :

Code : Tout sélectionner

commandArray[1]={['Variable:compteurchauffage1'] = tostring(os.time())}
Tu reformates compteurchauffage1 en caractères pour le comparer avec os.time() qui lui n'a pas de formatage :

Code : Tout sélectionner

derniercyclechauffe = os.date("!%X",os.time() - tostring(uservariables["compteurchauffage1"]))
A la fin, pour stocker la variable compteurchauffage2 tu utilises compteurchauffage1 sans le formater alors que tu formates compteurchauffage2.

Code : Tout sélectionner

commandArray[2]={['Variable:compteurchauffage2'] = tostring(tonumber(uservariables["compteurchauffage2"]) + (os.time()) - (uservariables["compteurchauffage1"]))}
Je pense que tu dois pouvoir stocker toutes les variables au format nombre (Entier). Tu aurais juste besoin de faire des tostring() lorsque tu pousses les valeurs dans les devices.
Comment bien utiliser le forum : Poser une question, Mettre un script, un fichier, une image ou des logs
Mes petits guides : Débuter en programmation, Le débogage, Le choix de matériel, Les sauvegardes
Ma présentation - Mes Tutos
Mitch58
Messages : 20
Inscription : 28 déc. 2019, 13:10
Localisation : Fribourg / Suisse

Re: Script timedifference

Message par Mitch58 »

Bonjour, j'utilise ce script là pour comptabiliser le temps de fonctionnement de ma chaudière. J'avais trouvé celui-ci sur le forum et je l'ai adapté à mon installation et cela fonctionne parfaitement. La durée de fonctionnement est indiquée en minutes.

Code : Tout sélectionner

-- Ce script Time permet de remonter la durée de fonctionnement de la chaudière dans un capteur virtuel de type "Counter"
-- « Counter Incremental » pour les anciennes versions de Domoticz
-- A enregistrer en script_time.lua
-- Créer une uservariable. Réglage /plus d'option / Variable utilisateur. Nommé "Total_compteur"
-- Créer un compteur « Brûleur » et relever son idx

 --------------------------------
 ------ Variables à éditer ------
 --------------------------------
 local switch = 'Chauffage'      -- Nom de l'interrupteur virtuel Chauffage dans Domoticz
 local counter = 922         -- Numéro idx du Counter « Brûleur » dans Domoticz
 local current_date = (os.date("29/12/2020"))      -- Date courante
 local current_heure = (os.date("19:30"))         -- Heure courante
 --------------------------------
 -- Fin des variables à éditer --
 --------------------------------


 -------------------
 -- Fonction time --
 -------------------
 time = os.date("*t")  

function timedifference(d)
   s = otherdevices_lastupdate[d]
   year = string.sub(s, 1, 4)
   month = string.sub(s, 6, 7)
   day = string.sub(s, 9, 10)
   hour = string.sub(s, 12, 13)
   minutes = string.sub(s, 15, 16)
   seconds = string.sub(s, 18, 19)
   t1 = os.time()
   t2 = os.time{year=year, month=month, day=day, hour=hour, min=minutes, sec=seconds}
   difference = os.difftime (t1, t2)
   return difference
end

 ------------------- --------------------
 -- Fonction arrondir à deux décimales --
 ------------------- --------------------
  -- Le chiffre"x" (dec or x) correspond au nombre de décimales à prendre en compte dans le resultat
   function arrondir(num, dec)
      if num == 0 then
      return 0
         else
            local mult = 10^(dec or 2)
            return math.floor(num * mult + 0.5) / mult
       end
   end

commandArray = {}

-----------------------------------------------------------------------------------------------------
--------------------Calcul du temps de fonctionnement de la chaudière -------------------------------
-----------------------------------------------------------------------------------------------------

   -- Si chauffage ON incrémentation de la variable Domoticz "Total_compteur" --
   
      if (otherdevices[switch]=='On') then
   commandArray['Variable:Bruleur']= tostring(uservariables["Bruleur"] +1)
   end
   
   -- Envoi de la varaible valeur Total_compteur dans le Custom Counter Valeur_Compteur --
   Valeur_Compteur = tostring(uservariables["Bruleur"])

   -- Envoi de la valeur dans le compteur "counter" --
   commandArray['UpdateDevice'] = counter .. '|0|' .. tostring(Valeur_Compteur)

 
   -- Envoi des informations dans le LOG si chauffage ON --   
   
   if (otherdevices[switch]=='On') then
       
      print("Cumul du temps de fonctionnement du brûleur "..Valeur_Compteur.." Minutes")
      
   end  
return commandArray
J'utilise ce script pour voir ma consommation de fioul.

Code : Tout sélectionner

-- Ce script permet de remonter une estimation de la consommation en fioul de la chaudière dans un capteur virtuel de type "Counter"
-- « Counter Incremental » pour les anciennes versions de Domoticz
-- A enregistrer en script_time.lua
-- Créer une uservariable. Réglage /plus d'option / Variable utilisateur. Nommé "Total_mazout"
-- Créer un compteur « Consommation mazout » et relever son idx

--------------------------------
------ Variables à éditer ------
--------------------------------
local switch = 'Chauffage' -- Nom de l'interrupteur virtuel Chauffage dans Domoticz
local counter = 923 -- Numéro idx du Counter « Consommation mazout » dans Domoticz
local current_date = (os.date("29/12/2020")) -- Date courante
local current_heure = (os.date("17:19")) -- Heure courante
--------------------------------
-- Fin des variables à éditer --
--------------------------------

--------------------------------
---Paramètres--
----------------------------------
Debit_gicleur = 0.85 --Gallon/heure
Conv_Gallon = 3.78541178 --Litres
Debit_gicleur_l_min = Debit_gicleur * Conv_Gallon / 60 -- En litres/min
Var_ajustement = 1 --Ajustement chaudière ON 3.2176 l/h

-------------------
-- Fonction time --
-------------------
time = os.date("*t") 

function timedifference(d)
s = otherdevices_lastupdate[d]
year = string.sub(s, 1, 4)
month = string.sub(s, 6, 7)
day = string.sub(s, 9, 10)
hour = string.sub(s, 12, 13)
minutes = string.sub(s, 15, 16)
seconds = string.sub(s, 18, 19)
t1 = os.time()
t2 = os.time{year=year, month=month, day=day, hour=hour, min=minutes, sec=seconds}
difference = os.difftime (t1, t2)
return difference
end

------------------- --------------------
-- Fonction arrondir à deux décimales --
------------------- --------------------
-- Le chiffre"x" (dec or x) correspond au nombre de décimales à prendre en compte dans le resultat
function arrondir(num, dec)
if num == 0 then
return 0
else
local mult = 10^(dec or 2)
return math.floor(num * mult + 0.5) / mult
end
end

commandArray = {}

-----------------------------------------------------------------------------------------------------
--------------------Calcul du temps de fonctionnement de la chaudière -------------------------------
-----------------------------------------------------------------------------------------------------

-- Si chauffage ON incrémentation de la variable Domoticz "Total_mazout" --
if (otherdevices[switch]=='On') then
commandArray['Variable:Total_mazout']= tostring(uservariables["Total_mazout"] +1)
end

-- Envoi de la variable valeur Total_compteur dans le Custom Counter Valeur_Compteur en min--
Valeur_Compteur = tostring(uservariables["Total_mazout"])
-- Transforme Valeur_compteur en litre pour gicleur 0.6 gallon/heure
Litre_Compteur = (Valeur_Compteur )* (Debit_gicleur_l_min)*(Var_ajustement)


-- Envoi de la valeur dans le compteur "counter" --
commandArray['UpdateDevice'] = counter .. '|0|' .. tostring(Litre_Compteur)

-- Envoi des informations dans le LOG si chauffage ON -- 
if (otherdevices[switch]=='On') then
print("")
print("Cumul Litres fioul "..Litre_Compteur.." Litres")
print("")

end 
return commandArray
Dernière modification par Keros le 09 janv. 2021, 21:38, modifié 1 fois.
Raison : Merci de regrouper les messages dans un seul
dokho
Messages : 685
Inscription : 28 déc. 2014, 19:32

Re: Script timedifference

Message par dokho »

@keros: si je tente de stocker "os.time()" dans une variable sans le formater j'ai un message d'erreur

Code : Tout sélectionner

Error: EventSystem: commandArray in script /home/domoticz/domoticz/scripts/lua/script_device_temps_chauffage.lua should only return ['string']='actionstring' or [integer]={['string']='actionstring'}
Pour les autres formatage, j'ai fait un peu de ménage ;)

@denis_brasseur: cela fonctionnait tel quel mais j'ai modifié en suivant tes conseils, c'est sûrement plus propre.


Merci pour vos remarques et conseils.

Code : Tout sélectionner

commandArray = {}

if (devicechanged['TEST1'] == 'On') then
commandArray[1]={['Variable:compteurchauffage1'] = tostring(os.time())}


else if (devicechanged['TEST1'] == 'Off')
then

-- DERNIER CYCLE CHAUFFE --
-- on calcule la durée du dernier cycle
derniercyclechauffe = os.date("!%X",os.time() - uservariables["compteurchauffage1"])
print('Durée du dernier cycle de chauffe : ' .. derniercyclechauffe)

--on met à jour le compteur "durée dernier cycle"
commandArray[1]={['UpdateDevice'] = '196|0|'.. derniercyclechauffe}



-- TOTAL CHAUFFE JOURNEE --
-- on calcule la durée totale journaliere
totalcyclechauffe = os.date("!%X",uservariables["compteurchauffage2"] + (os.time() - uservariables["compteurchauffage1"]))
print('Durée total des cycles de chauffe : ' .. totalcyclechauffe)

-- on incrémente la variable de durée journalière
--commandArray[2]={['Variable:compteurchauffage2'] = tostring(tonumber(uservariables["compteurchauffage2"]) + (os.time()) - (uservariables["compteurchauffage1"]))}
commandArray[2]={['Variable:compteurchauffage2'] = tostring(uservariables["compteurchauffage2"] + (os.time() - uservariables["compteurchauffage1"]))}

-- on met à jour le compteur "durée journalière"
commandArray[3]={['UpdateDevice'] = '197|0|'.. totalcyclechauffe}


end
end
return commandArray
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: Script timedifference

Message par Keros »

Autant pour moi, je viens d'essayer en changeant le type de variable et ça ne le prend pas non plus :?

Pour info, tu peux aussi utiliser commandArray['Variable:MyVar']='Some value' pour mettre à jour une variable.
Voici une liste des commandes en LUA.
Comment bien utiliser le forum : Poser une question, Mettre un script, un fichier, une image ou des logs
Mes petits guides : Débuter en programmation, Le débogage, Le choix de matériel, Les sauvegardes
Ma présentation - Mes Tutos
dokho
Messages : 685
Inscription : 28 déc. 2014, 19:32

Re: Script timedifference

Message par dokho »

Pas de soucis

L'important c'est, qu'avec vos remarques et conseils, je sois arrivé à faire quelque chose de propre qui fonctionne

Merci encore.
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: Script timedifference

Message par Keros »

dokho a écrit : 10 janv. 2021, 01:29 je sois arrivé à faire quelque chose
C'est toi qui l'a fait : c'est ça le plus important ;)
Comment bien utiliser le forum : Poser une question, Mettre un script, un fichier, une image ou des logs
Mes petits guides : Débuter en programmation, Le débogage, Le choix de matériel, Les sauvegardes
Ma présentation - Mes Tutos
Répondre