Aller au contenu

Help!! comparer/mesurer l’écart entre 2 dates/time


flamalex

Messages recommandés

 

ça avance, encore merci, pcq j'etais bien bloqué

 

la scene de depart qui signale la derniere pluie:

 

--[[
%% autostart
%% properties
%% globals
pluie_dans_lheure
--]]
if (fibaro:countScenes() > 1) then
  fibaro:abort()
end
local mavariable1
mavariable1 = fibaro:getGlobalValue('pluie_dans_lheure')
local startedAt = os.time()
local startSource = fibaro:getSourceTrigger()
function getActuatorStatus(id)
return (tonumber(fibaro:getGlobalValue("pluie_dans_lheure")) ~= 1)
end
if (startSource["type"]~="autostart") then
  local date = os.date("%d/%m/%Y %H:%M:%S", os.time())
  -- check actuator status and count only when turned on
  if (getActuatorStatus(mavariable1)) then
    fibaro:debug("il ne pleut plus depuis <font color=\"green\">"..date.."</font>")
    fibaro:setGlobal('time_last_rain', os.time()) --on enregistre la date et l'heure de la fin de derniere pluie
  else
    fibaro:debug("il pleut depuis <font color=\"red\">"..date.."</font>")
  end
end

 

dans le bp MJ du VD: (finalement j'ai placé le code dans le BP MJ toutes les minutes) il actualise les labels et variables

 

local date_derniere_pluie = tonumber(fibaro:getGlobalValue("time_last_rain"))
local ma_date_en_toute_lettre = os.date("%d/%m/%Y - %H:%M:%S",date_derniere_pluie)
fibaro:debug(ma_date_en_toute_lettre)
fibaro:call(fibaro:getSelfId(), "setProperty", "ui.LastRain.value", ma_date_en_toute_lettre)
--------------------------
-- on mesure la difference entre 2 dates
print ("date derniere pluie")  
local date_derniere_pluie = tonumber(fibaro:getGlobalValue("time_last_rain"))
fibaro:debug(os.date("%d/%m/%Y - %H:%M:%S",date_derniere_pluie))
  
print ("date actuelle")  
local date_actuelle = os.time()  
fibaro:debug(os.date("%d/%m/%Y - %H:%M:%S",date_actuelle))  
   
print ("diff_des_2_dates")
local diff_des_2_dates = os.difftime (date_actuelle, date_derniere_pluie)
fibaro:debug(diff_des_2_dates/(24*60*60).." jour(s)")
local difference_jr = diff_des_2_dates/(24*60*60)
fibaro:setGlobal('difference_jr', difference_jr)
fibaro:call(fibaro:getSelfId(), "setProperty", "ui.lbtpsecoule.value", diff_des_2_dates /(24*60*60).." jour(s)")

mon GEA: j'ai un doute, mais on verra

EDIT: j'ai une erreur sur la variable diiference_jr (en jour soit maintenant à 0,229.....) et la consigne qui est égale à 3 (en jours)

  le but etant de dire: si la différence en tps est > à la consigne alors ......

  --"difference_jr" = variable contenant l'ecart entre heure actu et heure derniere pluie en jour
  -- "Consigne_Tps_Arros = WArrosage_J_avant" en jour au lieu de seconde, variable qui contient un nombre (exemple 3) qui sera le nombre de jour apres lequel on pourra declencher l'arrosage
GEA.add({{"Global+" , "difference_jr", "Consigne_Tps_Arros"},{"Global","pluie_dans_lheure","0"},{"Global-" , "HumidExt", "60"},{"Global","Saison","Printemps"},{"Days", "Weekday"},{"Time", "Sunset+1"}},-1 , "cela fait {global, difference_jr}jours qu'il n'a pas plu, humidite {global, HumidExt}%, allumer arrosage")    
[DEBUG] 15:39:50: Démarrage par évenement de GEA 6.12 (mode global [difference_jr])
[DEBUG] 15:39:50: --------------------------------------------------------------------------------
[DEBUG] 15:39:50: 2020-04-17 15:39:50.661959 [ fatal] Unknown exception: /opt/fibaro/scenes/348.lua:1556: attempt to compare nil with number
[DEBUG] 15:40:08: ... vérification en cours #1 @30s...

 

et une capture du VD avec la différence de temps entre la consigne et la dernière pluie, j'avoue que les xxxxxxxxx après la virgule, ce n'est pas jolie et je m'en passerai bien

 

 

 

 

vd arros 3.png

Modifié par flamalex
Lien vers le commentaire
Partager sur d’autres sites

si si, ils y sont

ils sont dans les BP + et - du VD, ça c'est bon

mais dans GEA je compare bien mes 3 jrs de consigne (qui ont ete convertis en seconde precedement, sauf qu'ici il faut qu'ils soient en jour, donc on a bien 3 jours)

avec les secondes de difference que j'ai passé en jour (d'ou les 0,23.....) 

donc je lui dis, si 0,23 est  > à 3jrs alors la condition est OK ...

Lien vers le commentaire
Partager sur d’autres sites

Il y a 5 heures, jjacques68 a dit :

l'essentiel c'est qu'il doit comparer des jours avec des jours, ou des secondes avec des secondes.

Normalement j'imagine que ça passera.

Surtout pas des jours avec des secondes !

non c'est pas comme cela que ca ce passe ca compare juste des seconds

 

 nombre de secondes écoulées depuis 01/01/1970 00:00:00

https://fr.wikipedia.org/wiki/Heure_Unix

 

Lien vers le commentaire
Partager sur d’autres sites

la comparaison fonctionne, tt est ok

maintenant, j'ai 2 variables dans lesquelles j'importe 

"difference_jr" une valeure qui va varier de 0 à 3 dans cette exemple, en passant par des 0,3 _ 1,2 _ 2,4 ....... jusqu'a 3

puis "consigne_Tps_arros" qui contient une valeur de 0 à 3, de nombres entiers  1, 2 ou 3

donc sans parler de date, d'heure, ça c'est bon, en GEA comment comparer ces 2 valeurs contenues dans ces 2 variables 

{"Global+", 0,23 , 3}

en temps normal, on compare la variable à une valeur

exemple: {"Global+, "variable", 60} = si la valeur de la variable est supérieur à 60 alors ......

moi ici, j'ai essayé ceci, mais j'ai une erreur (debug plus haut)

{"Global+" , "difference_jr", "Consigne_Tps_Arros"}
Lien vers le commentaire
Partager sur d’autres sites

et en LUA, 

si la valeur difference_jr est > consigne_tps_arros alors on passe un variable à 0

j'ai essayé ceci

mais lui demander de voir si 0,3 > 2 alors variable à 1, il ne sait pas

ça devient une usine à gaz :)

 

local date_derniere_pluie = tonumber(fibaro:getGlobalValue("time_last_rain"))
local ma_date_en_toute_lettre = os.date("%d/%m/%Y - %H:%M:%S",date_derniere_pluie)
fibaro:debug(ma_date_en_toute_lettre)
fibaro:call(fibaro:getSelfId(), "setProperty", "ui.LastRain.value", ma_date_en_toute_lettre)
--------------------------
-- on mesure la difference entre 2 dates
print ("date derniere pluie")  
local date_derniere_pluie = tonumber(fibaro:getGlobalValue("time_last_rain"))
fibaro:debug(os.date("%d/%m/%Y - %H:%M:%S",date_derniere_pluie))
  
print ("date actuelle")  
local date_actuelle = os.time()  
fibaro:debug(os.date("%d/%m/%Y - %H:%M:%S",date_actuelle))  
   
print ("diff_des_2_dates")
local diff_des_2_dates = os.difftime (date_actuelle, date_derniere_pluie)
fibaro:debug(diff_des_2_dates/(24*60*60).." jour(s)")
local difference_jr = diff_des_2_dates/(24*60*60)
fibaro:setGlobal('difference_jr', difference_jr)
fibaro:call(fibaro:getSelfId(), "setProperty", "ui.lbtpsecoule.value", diff_des_2_dates /(24*60*60).." jour(s)")

difference_jr= fibaro:getGlobal("difference_jr");
fibaro:debug(difference_jr)
Consigne_Tps_Arros= fibaro:getGlobal("Consigne_Tps_Arros");
fibaro:debug(Consigne_Tps_Arros)
if ((fibaro:getValue(difference_jr, "value")) > (fibaro:getValue(Consigne_Tps_Arros, "value")) )
then fibaro:setGlobal('OK_FOR_ARROZ', 1) 
    else fibaro:setGlobal('OK_FOR_ARROZ', 0)
end

 

Lien vers le commentaire
Partager sur d’autres sites

ça ça me dérange

 

il y a 2 minutes, flamalex a dit :

if ((fibaro:getValue(difference_jr, "value")) > (fibaro:getValue(Consigne_Tps_Arros, "value")) )

ce serait plutôt

il s'agit bien de Variables Globales ?

if tonumber(fibaro:getGlobalValue(difference_jr)) > tonumber(fibaro:getGlobalValue(Consigne_Tps_Arros))

 

Lien vers le commentaire
Partager sur d’autres sites

pareil, je sais pas si ça a de l'importance, mais

 

then fibaro:setGlobal('OK_FOR_ARROZ', 1) 
    else fibaro:setGlobal('OK_FOR_ARROZ', 0)
end

plutot ça :

then fibaro:setGlobalValue('OK_FOR_ARROZ', 1) 
    else fibaro:setGlobalValue('OK_FOR_ARROZ', 0)
end

 

 

Lien vers le commentaire
Partager sur d’autres sites

il y a 1 minute, jjacques68 a dit :

pour faire propre :

 


if tonumber(fibaro:getGlobalValue(difference_jr)) > tonumber(fibaro:getGlobalValue(Consigne_Tps_Arros)) then
    fibaro:setGlobalValue('OK_FOR_ARROZ', 1) 
else
    fibaro:setGlobalValue('OK_FOR_ARROZ', 0)
end

 

il me retourne

 


[DEBUG] 19:04:51: 0.38699074074074
[DEBUG] 19:04:51: 2
[ERROR] 19:04:51: line 32: attempt to compare two nil values

 

ligne 32

if tonumber(fibaro:getGlobalValue(difference_jr)) > tonumber(fibaro:getGlobalValue(Consigne_Tps_Arros)) then
 

Lien vers le commentaire
Partager sur d’autres sites

difference_jr= fibaro:getGlobal("difference_jr");
fibaro:debug(difference_jr) -- ici j'ai mon 0,38
Consigne_Tps_Arros= fibaro:getGlobal("Consigne_Tps_Arros");
fibaro:debug(Consigne_Tps_Arros) -- ici le 2
if tonumber(fibaro:getGlobalValue(difference_jr)) > tonumber(fibaro:getGlobalValue(Consigne_Tps_Arros)) then
    fibaro:setGlobalValue('OK_FOR_ARROZ', 1) 
else
    fibaro:setGlobalValue('OK_FOR_ARROZ', 0)
end

 

Modifié par flamalex
Lien vers le commentaire
Partager sur d’autres sites

il y a 1 minute, jjacques68 a dit :

encore plus simple

 


if tonumber(difference_jr) > tonumber(Consigne_Tps_Arros) then

vu que tu les as mises dans des variables locales.

j'ai essayé avec tonumber tte à l'heure, mais error, probablement à cause de mon manque d'experience avec les parenthésés :)

Lien vers le commentaire
Partager sur d’autres sites

il y a 2 minutes, jjacques68 a dit :

encore plus simple

 


if tonumber(difference_jr) > tonumber(Consigne_Tps_Arros) then

vu que tu les as mises dans des variables locales.

je pourrai alléger, en faisant l'inverse, je vire les locales et je laisse code précedent

pcq la c'est une usine 

Lien vers le commentaire
Partager sur d’autres sites

c'est bon, ça fonctionne nikel, j'ai ajouté un label pour visualiser le "OK"   "pas OK" pour arrosage

 

du coup le GEA est plus simple :P

 

-- OK_FOR_ARROZ, variable du VD arrosage qui passe à 1 lorsque la consigne en temps est atteinte
  GEA.add({{"Global" , "OK_FOR_ARROZ", "1"},{"Global","pluie_dans_lheure","0"},{"Global-" , "HumidExt", "60"},{"Global","Saison","Printemps"},{"Days", "Weekday"},{"Time", "Sunset+1"}},-1 , "cela fait {global, difference_jr}jours qu'il n'a pas plu, humidite {global, HumidExt}%, allumer arrosage")    

 

Modifié par flamalex
  • Thanks 1
Lien vers le commentaire
Partager sur d’autres sites

×
×
  • Créer...