Page 1 sur 1

[lua] transformer des minutes en h/mn

Publié : 24 oct. 2019, 11:47
par Sherco49
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

Re: [lua] transformer des minutes en h/mn

Publié : 24 oct. 2019, 14:31
par denis_brasseur
Pour commencer, une petite fonction 'universelle', qui te permet de convertir un temps (en seconde) en SEM JJ HH MM SS

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)
end
Tu l'utilise ensuite comme ceci

Code : Tout sélectionner

sem, jj, hh, mm, ss = format_temps(nb_secondes, 'jour')
tu affectes à un variable locale le format que tu veux obtenir

Code : Tout sélectionner

    temps_restant = hh..'/'..mm
et tu met à jour ton device de type texte comme ceci :

Code : Tout sélectionner

commandArray[#commandArray+1]={['UpdateDevice'] = idx..'|0'|'..temps_restant }

Re: [lua] transformer des minutes en h/mn

Publié : 24 oct. 2019, 19:01
par Sherco49
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

Re: [lua] transformer des minutes en h/mn

Publié : 25 oct. 2019, 18:35
par denis_brasseur
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.
Effectivement, le custom sensor ne semble accepter que des valeurs numériques.
AInsi, 08.15 sera prit en compte comme 8.15, et 10.10 comme 10.1.