Bonjour
je suis débutant en lua, et je cherche à mettre à jour en heures/minutes un custom sensor "temps de chauffe"
le script lua se déclenche lorsque mon device "chaudiere" passe à "on" et incrémente une user variable (entière ?) toutes les minutes.
jusque là j'ai trouvé des exemples qui fonctionnent.
Par contre je n'ai rien trouvé pour convertir la valeur de cette variable, qui représente des minutes, en heures/minutes et surtout la syntaxe lua pour l'afficher dans mon custom sensor.
le calcul minutes=> heures minutes , je pensais à l'opérateur "//" pour les heures, et "%" pour les minutes, mais quelle syntaxe pour le command array vers mon custom sensor ?
merci de vos réponses
[lua] transformer des minutes en h/mn
-
denis_brasseur
- Messages : 898
- Inscription : 24 déc. 2018, 17:05
- Localisation : (26)
Re: [lua] transformer des minutes en h/mn
Pour commencer, une petite fonction 'universelle', qui te permet de convertir un temps (en seconde) en SEM JJ HH MM SS
Tu l'utilise ensuite comme ceci
tu affectes à un variable locale le format que tu veux obtenir
et tu met à jour ton device de type texte comme ceci :
Code : Tout sélectionner
--retourne une valeur sur 2 digit (exemple 1 retourne 01)
function deuxDigits(nombre)
nombre = string.format("%02d",nombre)
return nombre
end
--convertit un temps (en seconde) en SEM JJ HH MM SS
function format_temps(sec, value)
--valeur possible semaine, jour, heure, minute ou seconde
sem, jj, hh, mm, ss = 0, 0, 0, 0, 0
if value ~= nil then
if value == 'semaine' then
sem = math.floor(sec/(60*60*24*7))
reste = sec%604800
jj = math.floor(reste/(60*60*24))
reste = (reste%86400)
hh = math.floor(reste/(60*60))
reste = (reste%3600)
mm = math.floor(reste/60)
ss = (reste%60)
elseif value == 'jour' then
jj = math.floor(sec/(60*60*24))
reste = (sec%86400)
hh = math.floor(reste/(60*60))
reste = (reste%3600)
mm = math.floor(reste/60)
ss = (reste%60)
elseif value == 'heure' then
hh = math.floor(sec/(60*60))
reste = (sec%3600)
mm = math.floor(reste/60)
ss = (reste%60)
elseif value == 'minute' then
mm = math.floor(sec/60)
reste = (sec%60)
ss = (reste)
elseif value == 'seconde' then
ss = sec
end
end
return sem, jj, deuxDigits(hh), deuxDigits(mm), deuxDigits(ss)
endCode : Tout sélectionner
sem, jj, hh, mm, ss = format_temps(nb_secondes, 'jour')
Code : Tout sélectionner
temps_restant = hh..'/'..mmCode : Tout sélectionner
commandArray[#commandArray+1]={['UpdateDevice'] = idx..'|0'|'..temps_restant }Pi3 + DD PiDrive - RFXtrx433 - AEON Labs ZW090
Re: [lua] transformer des minutes en h/mn
Bonsoir et merci pour s'être penché sur ma question.
j'avais plus ou moins réussi à quelque chose en attendant une réponse, mais j'ai pris le parti d’utiliser tes fonctions.
J'arrive à un résultat de la forme "10.05 heures.minutes" comme affichage dans mon custom sensor.
il reste deux problèmes:
- un décalage de 1mn entre mon calcul de temps total et la variable qui mémorise le temps de chauffe, du a l'exécution des commandArray[], pas bien grave
- je n'arrive pas à garder les deux digits sur les minutes pour les valeurs ayant un zéro à la fin ! 10.1 pour 10 heures 10mn; j'ai essayé différents formatages, mais je pense que cela viens de la routine d'affichage du custom sensor.
Je n'ai trouvé que le custom sensor pour pouvoir afficher un résultat en heures/minutes tout en gardant un historique.
Si quelqu'un à une meilleure solution ....
ci dessous le code ( sans les fonctions )
commandArray = {}
-- si chaudiere en route
if (otherdevices['Chaudiere'] == 'On') then
-- récuperation de la user variable mémorisant le temps de chauffe
temp=tonumber(uservariables['temps_bruleur'])
-- incrémentation de la valeur
commandArray['Variable:temps_bruleur'] = tostring(temp + 1)
-- transforme les minutes du compteur en secondes
temp=temp*60
-- calcule les heures/minutes
sem, jj, hh, mm, ss = format_temps(temp, 'heure')
--le met sous forme de chaine
temps_restant = tostring(hh)..'.'..tostring(mm)
-- met à jour le custom sensor
commandArray[1] = {['UpdateDevice'] = idx..'|0|'..temps_restant }
--la récupérer pour formater l'affichage
-- temp=tonumber(uservariables['temps_bruleur'])
-- nombre d'heures
----nombre de minutes
--minutes=math.fmod(temp,60)
--Sminutes=string.format("%02d",minutes)
-- on concatene avec un point entre les deux pour faire comme si c'était numérique
-- duree=tostring(heures)..".".. string.format("%02d",minutes)
-- on met à jour le pseudo compteur
-- commandArray['UpdateDevice']='4|0|'..duree
end
return commandArray
j'avais plus ou moins réussi à quelque chose en attendant une réponse, mais j'ai pris le parti d’utiliser tes fonctions.
J'arrive à un résultat de la forme "10.05 heures.minutes" comme affichage dans mon custom sensor.
il reste deux problèmes:
- un décalage de 1mn entre mon calcul de temps total et la variable qui mémorise le temps de chauffe, du a l'exécution des commandArray[], pas bien grave
- je n'arrive pas à garder les deux digits sur les minutes pour les valeurs ayant un zéro à la fin ! 10.1 pour 10 heures 10mn; j'ai essayé différents formatages, mais je pense que cela viens de la routine d'affichage du custom sensor.
Je n'ai trouvé que le custom sensor pour pouvoir afficher un résultat en heures/minutes tout en gardant un historique.
Si quelqu'un à une meilleure solution ....
ci dessous le code ( sans les fonctions )
commandArray = {}
-- si chaudiere en route
if (otherdevices['Chaudiere'] == 'On') then
-- récuperation de la user variable mémorisant le temps de chauffe
temp=tonumber(uservariables['temps_bruleur'])
-- incrémentation de la valeur
commandArray['Variable:temps_bruleur'] = tostring(temp + 1)
-- transforme les minutes du compteur en secondes
temp=temp*60
-- calcule les heures/minutes
sem, jj, hh, mm, ss = format_temps(temp, 'heure')
--le met sous forme de chaine
temps_restant = tostring(hh)..'.'..tostring(mm)
-- met à jour le custom sensor
commandArray[1] = {['UpdateDevice'] = idx..'|0|'..temps_restant }
--la récupérer pour formater l'affichage
-- temp=tonumber(uservariables['temps_bruleur'])
-- nombre d'heures
----nombre de minutes
--minutes=math.fmod(temp,60)
--Sminutes=string.format("%02d",minutes)
-- on concatene avec un point entre les deux pour faire comme si c'était numérique
-- duree=tostring(heures)..".".. string.format("%02d",minutes)
-- on met à jour le pseudo compteur
-- commandArray['UpdateDevice']='4|0|'..duree
end
return commandArray
-
denis_brasseur
- Messages : 898
- Inscription : 24 déc. 2018, 17:05
- Localisation : (26)
Re: [lua] transformer des minutes en h/mn
Effectivement, le custom sensor ne semble accepter que des valeurs numériques.Sherco49 a écrit : 24 oct. 2019, 19:01
- je n'arrive pas à garder les deux digits sur les minutes pour les valeurs ayant un zéro à la fin ! 10.1 pour 10 heures 10mn; j'ai essayé différents formatages, mais je pense que cela viens de la routine d'affichage du custom sensor.
AInsi, 08.15 sera prit en compte comme 8.15, et 10.10 comme 10.1.
Pi3 + DD PiDrive - RFXtrx433 - AEON Labs ZW090