Aller au contenu
flamalex

temps utilisation device

Recommended Posts

Bonjour,

je cherche à cumuler le temps d'utilisation d'un device

j'ai commencé un QA on/off pour simuler le device

j'arrive à obtenir le temps de la derniere utilisation, mais je n'arrive pas à l'additionner avec la précedente utilisation et dans un 2eme temps cumuler les durées depuis minuit (ce jour)

puis dans un 3eme temps, reporting sur la durée utilisation à j-1 puis j-2 .....

un petit (gros) coup de pouce serait bienvenu :2:

function QuickApp:onInit()
      self:debug("Initialisation du QA Présence...")
 end

function QuickApp:turnOn()
    self:debug("binary switch turned on")
    self:updateProperty("value", true)
    self.time = tonumber(os.time()) --il a boot time
 end

function QuickApp:turnOff()
    self:debug("binary switch turned off")
    self:updateProperty("value", false) 
    local elapsed = os.difftime(os.time(), tonumber(self.time)) -- tps écoulé entre le ON et OFF
    local LasteTime = self:SecondsToClock(elapsed);
    self:updateProperty("log", "Tps cycle: "..LasteTime.." \r") -- mise à jour du Log (ecriture sur la Tuile en bas)
    self:debug("DUREE DU DERNIER CYCLE: " ..LasteTime.."")
end

function QuickApp:SecondsToClock(sSeconds)
  local nSeconds = tonumber(sSeconds)
  if nSeconds == 0 then
	return "00:00:00";
  else
	nHours = string.format("%02.f", math.floor(nSeconds/3600));
	nMins = string.format("%02.f", math.floor(nSeconds/60 - (nHours*60)));
	nSecs = string.format("%02.f", math.floor(nSeconds - nHours*3600 - nMins *60));
	return nHours..":"..nMins..":"..nSecs
  end
end

 

Modifié par flamalex

Partager ce message


Lien à poster
Partager sur d’autres sites

voici ma solution

 

function QuickApp:onInit()
      self:debug("Initialisation du QA Présence...")
      self:setVariable("DUREE_LASTE_CYL",0)  --remise à zero de la variable, ici je souhaite une remise à zero chaque jour à minuit ou une heure du mat
 end

function QuickApp:turnOn()
    self:debug("binary switch turned on")
    self:updateProperty("value", true)
    self.time = tonumber(os.time()) --il a boot time
 end

function QuickApp:turnOff()
    self:debug("binary switch turned off")
    self:updateProperty("value", false) 
    local elapsed = os.difftime(os.time(), tonumber(self.time)) 
   
  local DUREE_LASTE_CYL = self:getVariable("DUREE_LASTE_CYL") -- on lit la variable du dernier cycle
  self:debug("DUREE DU DERNIER CYCLE : " ..DUREE_LASTE_CYL.."")
  local CYCLE_ACTU = elapsed
  self:setVariable("CYCLE_ACTU",CYCLE_ACTU)  --on ecrit la variable
  self:debug("CYCLE ACTUEL: " ..CYCLE_ACTU.."")
local NEW_DUREE = (DUREE_LASTE_CYL + CYCLE_ACTU)
self:debug("NEW DUREE "..NEW_DUREE.."")
self:setVariable("DUREE_LASTE_CYL",NEW_DUREE)  --on ecrit la variable

local ADD_TIME = self:SecondsToClock(NEW_DUREE);  -- on transforme le "compteur" en h min sec 00:00:00
    self:updateProperty("log", "Tps Total: "..ADD_TIME.." \r") -- mise à jour du Log (ecriture sur la Tuile en bas)
end

function QuickApp:SecondsToClock(sSeconds) -- on transforme le "compteur" en h min sec 00:00:00
  local nSeconds = tonumber(sSeconds)
  if nSeconds == 0 then
	return "00:00:00";
  else
	nHours = string.format("%02.f", math.floor(nSeconds/3600));
	nMins = string.format("%02.f", math.floor(nSeconds/60 - (nHours*60)));
	nSecs = string.format("%02.f", math.floor(nSeconds - nHours*3600 - nMins *60));
	return nHours..":"..nMins..":"..nSecs
  end
end

maintenant, je souhaite une remise à zero du compteur temps à minuit ou 1h du mat (j'imagine un refresh loop....)

(je pourrais le faire dans GEA, passer la variable à 0 tous les jours à minuit, mais n'y a t il pas une solution, dans le QA, sans faire une usine à gaz)

enfin, je souhaite, visualiser la durée totale sur une journée, mais aussi à j-1 et j-2 (surement un stockage de la durée dans une variable avant le RESET de minuit)

 

par avance merci pour votre aide

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Regarde dans le code de DomoCharts, j'ai un truc qui fait ça :

 

Initialisation :

function QuickApp:onInit()

	-- fait plein de trucs...

	self.loopDay = os.date('%d')

	-- fait encore d'autres trucs...

end

 

Dans la boucle :

loop = function(self)

		-- fait des machins...

		-- Actions to perform every new day (at 00:02)
		local newday = os.date('%d')
		if newday ~= self.loopDay and tonumber(os.date('%M')) >= 2 then
			if self.isdebug then
				self:debug('New day')
			end
			fibaro.setTimeout(10*1000, function() self:buttonGetDevices_onReleased({}) end)
			fibaro.setTimeout(20*1000, function() self:generateTrends() end)
			fibaro.setTimeout(40*1000, function() self:generateEnergy() end)
			self.loopDay = newday
		end

		-- fait maintenant des bidules...

end

 

Partager ce message


Lien à poster
Partager sur d’autres sites

merci @Lazer

 

je vais tenter ça, mais ça ne fonctionnera pas car je l'ai integré lorsqu'il y aura le turnOff, alors qu'il faut une function indépendante uniquement pour la remise du compteur à zero à 00h02

function QuickApp:onInit()
      self:debug("Initialisation du QA Présence...")
      --self:setVariable("DUREE_LASTE_CYL",0)  --on ecrit la variable
      self.loopDay = os.date('%d')
 end

function QuickApp:turnOn()
    self:debug("binary switch turned on")
    self:updateProperty("value", true)
    self.time = tonumber(os.time()) --il a boot time
 end


function QuickApp:turnOff()
    self:debug("binary switch turned off")
    self:updateProperty("value", false) 
   self:Time_CUMUL ()
end


function QuickApp:Time_CUMUL()
local elapsed = os.difftime(os.time(), tonumber(self.time)) -- il s'est arrete et il s'est ecoulé x tps
local DUREE_LASTE_CYL = self:getVariable("DUREE_LASTE_CYL") -- on lit la variable du dernier cycle
self:debug("DUREE DU DERNIER CYCLE : " ..DUREE_LASTE_CYL.."")
local CYCLE_ACTU = elapsed
self:setVariable("CYCLE_ACTU",CYCLE_ACTU)  --on ecrit la variable
self:debug("CYCLE ACTUEL: " ..CYCLE_ACTU.."")
local NEW_DUREE = (DUREE_LASTE_CYL + CYCLE_ACTU)
self:debug("NEW DUREE "..NEW_DUREE.."")
self:setVariable("DUREE_LASTE_CYL",NEW_DUREE)  --on ecrit la variable

local ADD_TIME = self:SecondsToClock(NEW_DUREE);  -- on transforme le "compteur" en h min sec 00:00:00
    self:updateProperty("log", "Tps Total: "..ADD_TIME.." \r") -- mise à jour du Log (ecriture sur la Tuile en bas)


loop = function(self)

		-- fait des machins...

		-- Actions to perform every new day (at 00:02)
		local newday = os.date('%d')
		if newday ~= self.loopDay and tonumber(os.date('%M')) >= 2 then self:setVariable("DUREE_LASTE_CYL",0) end
			self:debug('New day')
			self.loopDay = newday
		end

end


function QuickApp:SecondsToClock(sSeconds) -- on transforme le "compteur" en h min sec 00:00:00
  local nSeconds = tonumber(sSeconds)
  if nSeconds == 0 then
	return "00:00:00";
  else
	nHours = string.format("%02.f", math.floor(nSeconds/3600));
	nMins = string.format("%02.f", math.floor(nSeconds/60 - (nHours*60)));
	nSecs = string.format("%02.f", math.floor(nSeconds - nHours*3600 - nMins *60));
	return nHours..":"..nMins..":"..nSecs
  end
end
--==============================================================================

EDIT

 

function QuickApp:onInit()
      self:debug("Initialisation du QA Présence...")
    end

function QuickApp:RESET_TIME()
loop = function(self)
	-- Actions to perform every new day (at 00:02)
		local newday = os.date('%d')
		if newday ~= self.loopDay and tonumber(os.date('%M')) >= 2 then self:setVariable("DUREE_LASTE_CYL",0) end
			self:debug('New day')
			self.loopDay = newday
		end   
end


function QuickApp:turnOn()
    self:debug("binary switch turned on")
    self:updateProperty("value", true)
    self.time = tonumber(os.time()) 
    self:RESET_TIME()
 end


function QuickApp:turnOff()
    self:debug("binary switch turned off")
    self:updateProperty("value", false) 
     self.loopDay = os.date('%d')
    self:debug(self.loopDay)
   self:Time_CUMUL ()
   end


function QuickApp:Time_CUMUL()
local elapsed = os.difftime(os.time(), tonumber(self.time)) -- il s'est arrete et il s'est ecoulé x tps
local DUREE_LASTE_CYL = self:getVariable("DUREE_LASTE_CYL") -- on lit la variable du dernier cycle
self:debug("DUREE DU DERNIER CYCLE : " ..DUREE_LASTE_CYL.."")
local CYCLE_ACTU = elapsed
self:setVariable("CYCLE_ACTU",CYCLE_ACTU)  --on ecrit la variable
self:debug("CYCLE ACTUEL: " ..CYCLE_ACTU.."")
local NEW_DUREE = (DUREE_LASTE_CYL + CYCLE_ACTU)
self:debug("NEW DUREE "..NEW_DUREE.."")
self:setVariable("DUREE_LASTE_CYL",NEW_DUREE)  --on ecrit la variable

local ADD_TIME = self:SecondsToClock(NEW_DUREE);  -- on transforme le "compteur" en h min sec 00:00:00
self:updateProperty("log", "Tps Total: "..ADD_TIME.." \r") -- mise à jour du Log (ecriture sur la Tuile en bas)
end

function QuickApp:SecondsToClock(sSeconds) -- on transforme le "compteur" en h min sec 00:00:00
  local nSeconds = tonumber(sSeconds)
  if nSeconds == 0 then
	return "00:00:00";
  else
	nHours = string.format("%02.f", math.floor(nSeconds/3600));
	nMins = string.format("%02.f", math.floor(nSeconds/60 - (nHours*60)));
	nSecs = string.format("%02.f", math.floor(nSeconds - nHours*3600 - nMins *60));
	return nHours..":"..nMins..":"..nSecs
  end
end

   

Je m'embrouille la !!! ?

le RESET_TIME dans le turnOn

et le loopDay dans le turnOff

 

c'est un compteur pour device, l'equiepemnt tournera en journée (voir crépuscule), donc le turnOff sera la derniere action (d'ou le loopDay dans turnOff) de la journée

le turnOn aura lieu à l'aube (d'ou le reset_time, remise du compteur à 0 puisque Nouveau jour) comparaison avec le loopDay de la veille.

 

c'est bien cela?

Modifié par flamalex

Partager ce message


Lien à poster
Partager sur d’autres sites

ça fonctionne avec code ci dessous, mais je dois passer par GEA pour j-1 et j-2

ça fait un peu usine à gaz pour un simple compteur de temps

 

function QuickApp:refresh()
local ADD_TIME_HMS = self:getVariable("ADD_TIME_HMS")  ---on lit variable
self:updateView("Lbl1", "text", "cumul tps jour: " ..ADD_TIME_HMS.."")
local jmoins1 = self:getVariable("j-1")  ---on lit variable
self:updateView("Lbl2", "text", "cumul tps J-1: " ..jmoins1.."")
local jmoins2 = self:getVariable("j-2")  ---on lit variable
self:updateView("Lbl3", "text", "cumul tps J-2: " ..jmoins2.."")
self:updateView("last_update", "text", "Dernière MAJ : " .. os.date("%H:%M"))
end

function QuickApp:RESET_TIME()
	-- Actions to perform every new day (at 00:02)
    local loopDay = self:getVariable("LOOP_DAY") -- on lit la variable du dernier cycle
		local newday = os.date('%d')
        if newday ~= loopDay then self:setVariable("DUREE_LASTE_CYL",0)   end
self.loopDay = newday
end

function QuickApp:jmoins1()  -- 1 fois par jour à 23h50 , je mémorise la durée de la veille et on l'affiche dans label 2  the_day_before  
-- donc à 23h50 le addtime devient j-1
local jmoins1 = self:getVariable("ADD_TIME_HMS")  ---on lit variable
self:setVariable("j-1", jmoins1)
self:updateView("Lbl2", "text", "cumul tps J-1: " ..jmoins1.."")
end

function QuickApp:jmoins2()  -- 1 fois par jour à 23h45 , je mémorise la durée de la veille et on l'affiche dans label 3   
-- donc à 23h45 le j-1 devient j-2
local jmoins2 = self:getVariable("j-1")  ---on lit variable
self:setVariable("j-2", jmoins2)
self:updateView("Lbl3", "text", "cumul tps J-2: " ..jmoins2.."")
end

function QuickApp:turnOn()
    self.time = tonumber(os.time()) --il a boot time
    self:RESET_TIME()
 end


function QuickApp:turnOff()
   self.loopDay = os.date('%d')
   self:setVariable("LOOP_DAY",self.loopDay)  --on ecrit la variable
   self:Time_CUMUL ()
    local jour = self:getVariable("LOOP_DAY") -- on lit la variable du dernier cycle
    self:updateProperty("value", tonumber(jour)) --on l'affiche ds tuile
    self:updateView("last_update", "text", "Dernière MAJ : " .. os.date("%H:%M"))
   end


function QuickApp:Time_CUMUL()
local elapsed = os.difftime(os.time(), tonumber(self.time)) -- il s'est arrete et il s'est ecoulé x tps
local DUREE_LASTE_CYL = self:getVariable("DUREE_LASTE_CYL") -- on lit la variable du dernier cycle
self:debug("DUREE DU DERNIER CYCLE : " ..DUREE_LASTE_CYL.."")
local CYCLE_ACTU = elapsed
self:setVariable("CYCLE_ACTU",CYCLE_ACTU)  --on ecrit la variable
self:debug("CYCLE ACTUEL: " ..CYCLE_ACTU.."")
local NEW_DUREE = (DUREE_LASTE_CYL + CYCLE_ACTU)
self:debug("NEW DUREE "..NEW_DUREE.."")
self:setVariable("DUREE_LASTE_CYL",NEW_DUREE)  --on ecrit la variable

local ADD_TIME = self:SecondsToClock(NEW_DUREE);  -- on transforme le "compteur" en h min sec 00:00:00
self:updateProperty("log", "Tps Total: "..ADD_TIME.." \r") -- mise à jour du Log (ecriture sur la Tuile en bas)
self:setVariable("ADD_TIME_HMS",ADD_TIME)  --on ecrit la variable
self:updateProperty("value", ADD_TIME_HMS) -- on l'affiche sur tuile (marche pas)

local ADD_TIME_HMS = self:getVariable("ADD_TIME_HMS") -- on lit la variable du dernier cycle
self:updateView("Lbl1", "text", "cumul tps jour: " ..ADD_TIME_HMS.."")
end


function QuickApp:SecondsToClock(sSeconds) -- on transforme le "compteur" en h min sec 00:00:00
  local nSeconds = tonumber(sSeconds)
  if nSeconds == 0 then
	return "00:00:00";
  else
	nHours = string.format("%02.f", math.floor(nSeconds/3600));
	nMins = string.format("%02.f", math.floor(nSeconds/60 - (nHours*60)));
	nSecs = string.format("%02.f", math.floor(nSeconds - nHours*3600 - nMins *60));
	return nHours..":"..nMins..":"..nSecs
  end
end 

 

Partager ce message


Lien à poster
Partager sur d’autres sites

depuis ce soir, j'ai cette erreur

bad argument #2 to 'difftime' (number expected, got nil)

 

sur la ligne suivante, je ne trouve rien sur google, rien sur le difftime, une idée? 

local elapsed = os.difftime(os.time(), tonumber(self.time)) -- tps écoulé entre le ON et OFF

Partager ce message


Lien à poster
Partager sur d’autres sites

Très probablement ta variable self.time qui n'est pas initialisée, donc le tonumber() retourne nil, d'où l'erreur.

 

Une rapide recherche sur ton code montre qu'elle n'est initialisée que dans turnOn(), donc si tu appelles le turnOff() avant, alors il est logique que ça plante.

Partager ce message


Lien à poster
Partager sur d’autres sites

Ah ok ça explique le plantage après un reboot de la box

mais comment tu l’initialises ?

 

avant j'avais pensé à un start_time puis un endTime

mais je ne m'en sors pas

Modifié par flamalex

Partager ce message


Lien à poster
Partager sur d’autres sites

Dans le onInit()

 

  • Thanks 1

Partager ce message


Lien à poster
Partager sur d’autres sites

oui en effet, ben ce n'est pas encore clair pour moi le tonumber(os.time) dans l'init

pour moi, le ON provoqué le start du tonumber(os.time) et le OFF le "end" du os.time

puis je déduisais le temps entre les 2 (diff) .....

 

function QuickApp:onInit()
      self:debug("Initialisation du QA compteur piscine...")
      self:updateProperty("deviceIcon", 1120)
      self.time = tonumber(os.time())
self:refresh()
self:Time_CUMUL()

 

Partager ce message


Lien à poster
Partager sur d’autres sites

voici le code complet, avec le stockage des valeurs à j-1/-2/-3  entre 23h45 et minuit, réalisé par le Qa et non plus avec GEA 

 

function QuickApp:onInit()
      self:debug("Initialisation du QA compteur tps pompe piscine...")
      self:updateProperty("deviceIcon", 1120)
      self.time = tonumber(os.time())
      self:refresh()
      self:Time_CUMUL()
      self:stocktime()
  end

function QuickApp:refresh()
local ADD_TIME_HMS = self:getVariable("ADD_TIME_HMS")  ---on lit variable
self:updateView("Lbl1", "text", "cumul tps jour: " ..ADD_TIME_HMS.."")
local jmoins1 = self:getVariable("j-1")  ---on lit variable
self:updateView("Lbl2", "text", "cumul tps J-1: " ..jmoins1.."")
local jmoins2 = self:getVariable("j-2")  ---on lit variable
self:updateView("Lbl3", "text", "cumul tps J-2: " ..jmoins2.."")
local jmoins3 = self:getVariable("j-3")  ---on lit variable
self:updateView("Lbl4", "text", "cumul tps J-3: " ..jmoins3.."")
self:updateView("last_update", "text", "Dernière MAJ : " .. os.date("%H:%M"))
end

function QuickApp:RESET_TIME()  --à minuit 2minutes  on reset time
	-- Actions to perform every new day (at 00:02)
    local loopDay = self:getVariable("LOOP_DAY") -- on lit la variable du dernier cycle
		local newday = os.date('%d')
        if newday ~= loopDay then self:setVariable("DUREE_LASTE_CYL","00:00:00")   end

        local cycle_day = self:getVariable("DUREE_LASTE_CYL")
        if newday ~= loopDay then self:updateView("Lbl1", "text", "cumul tps jour: " ..cycle_day.."") end

self.loopDay = newday
    self:updateProperty("value", tonumber(newday)) --on l'affiche ds tuile
    self:updateView("last_update", "text", "Dernière MAJ : " .. os.date("%H:%M"))
end



function QuickApp:jmoins1()  -- 1 fois par jour à 23h50 , je mémorise la durée de la veille et on l'affiche dans label 1  the_day_before  
-- donc à 23h45 le addtime devient j-1
local jmoins1 = self:getVariable("ADD_TIME_HMS")  ---on lit variable
self:setVariable("j-1", jmoins1)
self:updateView("Lbl2", "text", "cumul tps J-1: " ..jmoins1.."")
end

function QuickApp:jmoins2()  -- 1 fois par jour à 23h45 , je mémorise la durée de la veille et on l'affiche dans label 2  the_day_before  
-- donc à 23h50 le addtime devient j-2
local jmoins2 = self:getVariable("j-1")  ---on lit variable
self:setVariable("j-2", jmoins2)
self:updateView("Lbl3", "text", "cumul tps J-2: " ..jmoins2.."")
end

function QuickApp:jmoins3()  -- 1 fois par jour à 23h40 , je mémorise la durée de la veille et on l'affiche dans label 3  the_day_before  
-- donc à 23h40 le addtime devient j-3
local jmoins3 = self:getVariable("j-2")  ---on lit variable
self:setVariable("j-3", jmoins3)
self:updateView("Lbl4", "text", "cumul tps J-3: " ..jmoins3.."")
end


function QuickApp:turnOn()
     self.time = tonumber(os.time()) --il a boot time
     end


function QuickApp:turnOff()
    self.loopDay = os.date('%d')
    self:setVariable("LOOP_DAY",self.loopDay)  --on ecrit la variable
    self:Time_CUMUL()
    self:updateView("last_update", "text", "Dernière MAJ : " .. os.date("%H:%M"))
   end


function QuickApp:Time_CUMUL()
local elapsed = os.difftime(os.time(), tonumber(self.time)) -- il s'est arrete et il s'est ecoulé x tps
--self:debug("elapsed")
local DUREE_LASTE_CYL = self:getVariable("DUREE_LASTE_CYL") -- on lit la variable du dernier cycle
--self:debug("DUREE DU DERNIER CYCLE : " ..DUREE_LASTE_CYL.."")
local CYCLE_ACTU = elapsed
self:setVariable("CYCLE_ACTU",CYCLE_ACTU)  --on ecrit la variable
--self:debug("CYCLE ACTUEL: " ..CYCLE_ACTU.."")
local NEW_DUREE = (DUREE_LASTE_CYL + CYCLE_ACTU)
--self:debug("NEW DUREE "..NEW_DUREE.."")
self:setVariable("DUREE_LASTE_CYL",NEW_DUREE)  --on ecrit la variable

local ADD_TIME = self:SecondsToClock(NEW_DUREE);  -- on transforme le "compteur" en h min sec 00:00:00
self:updateProperty("log", "Tps Total: "..ADD_TIME.." \r") -- mise à jour du Log (ecriture sur la Tuile en bas)
self:setVariable("ADD_TIME_HMS",ADD_TIME)  --on ecrit la variable
self:updateProperty("value", ADD_TIME_HMS) -- on l'affiche sur tuile (marche pas)

local ADD_TIME_HMS = self:getVariable("ADD_TIME_HMS") -- on lit la variable du dernier cycle
self:updateView("Lbl1", "text", "cumul tps jour: " ..ADD_TIME_HMS.."")

end


function QuickApp:SecondsToClock(sSeconds) -- on transforme le "compteur" en h min sec 00:00:00
  local nSeconds = tonumber(sSeconds)
  if nSeconds == 0 then
	return "00:00:00";
  else
	nHours = string.format("%02.f", math.floor(nSeconds/3600));
	nMins = string.format("%02.f", math.floor(nSeconds/60 - (nHours*60)));
	nSecs = string.format("%02.f", math.floor(nSeconds - nHours*3600 - nMins *60));
	return nHours..":"..nMins..":"..nSecs
  end
end 


 function QuickApp:stocktime()
        local Heure = tonumber(os.date("%H", os.time()))
        self:debug(Heure)
        local Minute = tonumber(os.date("%M", os.time()))
        self:debug(Minute)
-----------------------------------------------------------------
---------- MISE A JOUR DES VARIABLES POUR L'HISTORIQUE ----------
-----------------------------------------------------------------
-- 3eme
if (Heure == tonumber("23") and Minute > tonumber("55")) and (Heure == tonumber("23") and Minute < tonumber("59")) then self:jmoins1()
--if (Heure == tonumber("8") and Minute > tonumber("38")) and (Heure == tonumber("8") and Minute < tonumber("40")) then self:jmoins1()
end

-- 2eme
if (Heure == tonumber("23") and Minute > tonumber("50")) and (Heure == tonumber("23") and Minute < tonumber("54")) then self:jmoins2()
--if (Heure == tonumber("8") and Minute > tonumber("35")) and (Heure == tonumber("8") and Minute < tonumber("37")) then self:jmoins2()
end

-- 1er
if (Heure == tonumber("23") and Minute > tonumber("45")) and (Heure == tonumber("23") and Minute < tonumber("49")) then self:jmoins3()
--if (Heure == tonumber("8") and Minute > tonumber("32")) and (Heure == tonumber("8") and Minute < tonumber("34")) then self:jmoins3()
end

-- 4eme
if (Heure == tonumber("00") and Minute > tonumber("01")) and (Heure == tonumber("00") and Minute < tonumber("05")) then self:RESET_TIME()
--if (Heure == tonumber("8") and Minute > tonumber("41")) and (Heure == tonumber("8") and Minute < tonumber("44")) then self:RESET_TIME()
end
self:debug("Boucle TIME")
            fibaro.setTimeout(1000 * 60 * 1, function()
        self:stocktime()
    end)
end

 

Modifié par flamalex

Partager ce message


Lien à poster
Partager sur d’autres sites

Le problème avec le code ci dessus

la pompe est en marche depuis 2h, la hc3 reboot (tte seule) et lorsqu’il y a un turnoff de la pompe, le temps écoulé est celui entre le reboot et le turnoff et ne prend pas les 2h de marche avant le reboot

une idée ? Je sais que le code n’est pas très propre et fait usine à gaz, en l’état il est presque opérationnel à l’exception de ce désagrément 

Partager ce message


Lien à poster
Partager sur d’autres sites

Hum.... là comme ça non désolé pas d'idée précise.... car je n'ai pas eu le courage de lire tout le code pour en comprendre la logique.

 

Mais à lire ton commentaire, peut être mémoriser l'heure dans une variable du QA, qui est persistante, et qu'on peut donc relire au démarrage du QA dans le onInit()

Partager ce message


Lien à poster
Partager sur d’autres sites

Oui c’est pas mal ça, mais 

pcq’il y a toujours un mais « en admettant que »

 la pompe est arrêtée pendant que ma box reboot ?  

bon, je vais essayer 

c’est vraiment l’usine à gaz avec toutes les conversions 

Modifié par flamalex

Partager ce message


Lien à poster
Partager sur d’autres sites

Oui en programmation on passe notre temps à traiter des erreurs et cas particuliers...

 

Effectivement si le statut de la pompe change pendant que la box est arrêtée, c'est problématique... donc dans le onInit, vérifier si le statut est le même que celui connu précédemment, ou pas.

On pourrait aussi imaginer détecter un temps anormalement long, qui pourrait indiquer que la box est restée indisponible pendant plusieurs heures, jours ?

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Là tu m as perdu :) « donc dans le onInit, vérifier si le statut est le même que celui connu précédemment, ou pas. »


et ça aussi c’est intéressant, ça peut me servir aussi  pour d’autres applications, c’est Top

 »

On pourrait aussi imaginer détecter un temps anormalement long, qui pourrait indiquer que la box est restée indisponible pendant plusieurs heures, jours ? »

 

 

Modifié par flamalex

Partager ce message


Lien à poster
Partager sur d’autres sites

Et bien tu dis " la pompe est arrêtée pendant que ma box reboot "

 

Donc je suggère de mémoriser l'état de la pompe (pareil que le timer, dans une variable persistante du QA), et lors du redémarrage du QA (dans le onInit) tu vérifies si l'état courant de la pompe correspond au dernier état connu (dans la variable du QA)

 

Avec cette technique tu ne pourras pas détecter un arrêt/redémarrage de la pompe, ou un démarrage/arrêt, mais tu pourras juste détecter le changement d'état.

 

 

  • Thanks 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Ok ça roule, je vais refaire tt ça, c’est la pagaille dans le code

ca manque de structure 

la conversion en Time 00:00:00 puis l’affichage des labels et le contrôle du jour suivant, j’suis certain qu’il y a plus simple

puis je m’occupe de cette variable QA et comparaison 

Partager ce message


Lien à poster
Partager sur d’autres sites

voici le code qui va bien et il est autonome, plus de pseudo initialisation via GEA

merci pour les pistes

 


function QuickApp:onInit()
      self:debug("Initialisation du QA compteur tps pompe piscine...")
      self:updateProperty("deviceIcon", 1120)
     -- self.time = tonumber(os.time())
      self:refresh()
    --  self:Time_CUMUL()
      self:stocktime()
  end

function QuickApp:refresh()
local TOTAL_JOUR = self:getVariable("TOTAL_JOUR")  ---on lit variable
self:updateView("Lbl1", "text", "cumul tps jour: " ..TOTAL_JOUR.."")
local jmoins1 = self:getVariable("j-1")  ---on lit variable
self:updateView("Lbl2", "text", "cumul tps J-1: " ..jmoins1.."")
local jmoins2 = self:getVariable("j-2")  ---on lit variable
self:updateView("Lbl3", "text", "cumul tps J-2: " ..jmoins2.."")
local jmoins3 = self:getVariable("j-3")  ---on lit variable
self:updateView("Lbl4", "text", "cumul tps J-3: " ..jmoins3.."")
self:updateView("last_update", "text", "Dernière MAJ : " .. os.date("%H:%M"))
end

function QuickApp:RESET_TIME()  --à minuit 2minutes  on reset time
local vide = self:getVariable("Last_Cycle")  ---on lit variable
if vide == nil then self:setVariable("Last_Cycle","0")   end
	-- Actions to perform every new day (at 00:02)
    local loopDay = self:getVariable("LOOP_DAY") -- on lit la variable du dernier cycle
		local newday = os.date('%d')
        if newday ~= loopDay then self:setVariable("TOTAL_JOUR","00:00:00")   end
        local newday = os.date('%d')
       if newday ~= loopDay then self:setVariable("Add_Cycles","0")   end
       local newday = os.date('%d')
       if newday ~= loopDay then self:setVariable("Last_Cycle","0")   end

        local cycle_day = self:getVariable("TOTAL_JOUR")
        if newday ~= loopDay then self:updateView("Lbl1", "text", "cumul tps jour: " ..cycle_day.."") end

self.loopDay = newday
    self:updateProperty("value", tonumber(newday)) --on l'affiche ds tuile
    self:updateView("last_update", "text", "Dernière MAJ : " .. os.date("%H:%M"))

end


function QuickApp:jmoins1()  -- 1 fois par jour à 23h50 , je mémorise la durée de la veille et on l'affiche dans label 1  the_day_before  
-- donc à 23h45 le addtime devient j-1
local jmoins1 = self:getVariable("TOTAL_JOUR")  ---on lit variable
self:setVariable("j-1", jmoins1)
self:updateView("Lbl2", "text", "cumul tps J-1: " ..jmoins1.."")
end

function QuickApp:jmoins2()  -- 1 fois par jour à 23h45 , je mémorise la durée de la veille et on l'affiche dans label 2  the_day_before  
-- donc à 23h50 le addtime devient j-2
local jmoins2 = self:getVariable("j-1")  ---on lit variable
self:setVariable("j-2", jmoins2)
self:updateView("Lbl3", "text", "cumul tps J-2: " ..jmoins2.."")
end

function QuickApp:jmoins3()  -- 1 fois par jour à 23h40 , je mémorise la durée de la veille et on l'affiche dans label 3  the_day_before  
-- donc à 23h40 le addtime devient j-3
local jmoins3 = self:getVariable("j-2")  ---on lit variable
self:setVariable("j-3", jmoins3)
self:updateView("Lbl4", "text", "cumul tps J-3: " ..jmoins3.."")
end


function QuickApp:turnOn()
self.time = tonumber(os.time()) --il a boot time
 self:setVariable("Time_Debut_Num",self.time)  --on ecrit la variable
        end
------------------------------------------------------------
function QuickApp:ON_TEST()
 self.time = tonumber(os.time()) --il a boot time
 self:setVariable("Time_Debut_Num",self.time)  --on ecrit la variable

     end

function QuickApp:OFF_TEST()
 self.time = tonumber(os.time()) --il a boot time
 self:setVariable("Time_Fin_Num",self.time)  --on ecrit la variable
 self:Actu_Cycle()
        end

function QuickApp:Actu_Cycle()
 local HD = self:getVariable("Time_Debut_Num") --on lit heure debut de cycle
local HF = self:getVariable("Time_Fin_Num")   --on lit la variable heure de fin de cycle
local TE = (HF-HD)  --temps ecoulé en numeric
self:setVariable("Actu_Cycle",TE)  --on ecrit la variable en numeric
self:Add_Cycles()
     end

function QuickApp:Add_Cycles()
local Actu_Cycle = self:getVariable("Actu_Cycle")   --on lit la variable
local Last_Cycle = self:getVariable("Last_Cycle") --on lit
local Add_Cycles = (Last_Cycle + Actu_Cycle)
self:setVariable("Add_Cycles",Add_Cycles)  --on ecrit la variable 
self:setVariable("Last_Cycle",Add_Cycles)  --on ecrit la variable
local New_Last_Cycles = self:getVariable("Last_Cycle") -- on lit variable
local TOTAL_JOUR = self:SecondsToClock(New_Last_Cycles);  -- conversion du temps ecoulé en heure min sec
self:setVariable("TOTAL_JOUR",TOTAL_JOUR)  --on ecrit la variable
self:debug(TOTAL_JOUR)
local TOTAL_JOUR = self:getVariable("TOTAL_JOUR") -- on lit la variable du dernier cycle
self:updateView("Lbl1", "text", "cumul tps jour: " ..TOTAL_JOUR.."")
self:updateProperty("log", "Tps Total: "..TOTAL_JOUR.." \r") -- mise à jour du Log (ecriture sur la Tuile en bas)
end
-------------------------------------------------


function QuickApp:turnOff()
   self.time = tonumber(os.time()) --il a boot time
 self:setVariable("Time_Fin_Num",self.time)  --on ecrit la variable
 self:Actu_Cycle()
   end




function QuickApp:SecondsToClock(sSeconds) -- on transforme le "compteur" en h min sec 00:00:00
  local nSeconds = tonumber(sSeconds)
  if nSeconds == 0 then
	return "00:00:00";
  else
	nHours = string.format("%02.f", math.floor(nSeconds/3600));
	nMins = string.format("%02.f", math.floor(nSeconds/60 - (nHours*60)));
	nSecs = string.format("%02.f", math.floor(nSeconds - nHours*3600 - nMins *60));
	return nHours..":"..nMins..":"..nSecs
  end
end 


 function QuickApp:stocktime()
        local Heure = tonumber(os.date("%H", os.time()))
        --self:debug(Heure)
        local Minute = tonumber(os.date("%M", os.time()))
        --self:debug(Minute)
-----------------------------------------------------------------
---------- MISE A JOUR DES VARIABLES POUR L'HISTORIQUE ----------
-----------------------------------------------------------------
-- 3eme
if (Heure == tonumber("23") and Minute > tonumber("55")) and (Heure == tonumber("23") and Minute < tonumber("59")) then self:jmoins1()
--if (Heure == tonumber("8") and Minute > tonumber("38")) and (Heure == tonumber("8") and Minute < tonumber("40")) then self:jmoins1()
end

-- 2eme
if (Heure == tonumber("23") and Minute > tonumber("50")) and (Heure == tonumber("23") and Minute < tonumber("54")) then self:jmoins2()
--if (Heure == tonumber("8") and Minute > tonumber("35")) and (Heure == tonumber("8") and Minute < tonumber("37")) then self:jmoins2()
end

-- 1er
if (Heure == tonumber("23") and Minute > tonumber("45")) and (Heure == tonumber("23") and Minute < tonumber("49")) then self:jmoins3()
--if (Heure == tonumber("8") and Minute > tonumber("32")) and (Heure == tonumber("8") and Minute < tonumber("34")) then self:jmoins3()
end

-- 4eme
if (Heure == tonumber("00") and Minute > tonumber("01")) and (Heure == tonumber("00") and Minute < tonumber("05")) then self:RESET_TIME()
--if (Heure == tonumber("8") and Minute > tonumber("41")) and (Heure == tonumber("8") and Minute < tonumber("44")) then self:RESET_TIME()
end
self:debug("Boucle TIME")
            fibaro.setTimeout(1000 * 60 * 1, function()  ---toutes les minutes
        self:stocktime()
    end)
end

 

  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites

×