Aller au contenu

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


flamalex

Messages recommandés

Bonjour à toutes et à tous,

je dois probablement ne pas savoir utiliser google, ne pas savoir écrire

il faut que je retourne à l'école, enfin pas avant mai :98:

en résume, j’ai 2 variables

je récupère dans une variable "time_last_rain" la date et heure de la dernière pluie tombée

puis je la compare à la date et heure du jour

si l’ecart entre ces 2 dates est = ou > à 

une autre variable "consigne_jr_avt" (modifiable via un vd voir ci dessous, en 2,3 ou 4 jours)

alors je lance l’arrosage (au coucher du soleil, humidité < à 60.....)

j’ai essayé bcp de bout de code (difftime en sec, prise de tete....) pour les comparaisons, je ne m’en sors pas avec les tables, 

j’aurai besoin d’aide (la fin du code, partie action c’est bon) 

par avance merci

 

large.1712736454_vdarrosage1.png.138541c4296e9d71ae0da5459239a9a5.png

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

voici un exemple, avec le difftime (je sais qu'il compare des choux et de carottes)


-

- ==========================================================
-- "time_last_rain" variable qui contient la date de la dernière pluie format "16/04/2020 22:21"
-- "WArrosage_J_avant" variable qui contient un nombre (exemple 3) qui sera le nombre de jour après lequel on pourra déclencher l'arrosage


print ("date derniere pluie")  
local date_derniere_pluie;
date_derniere_pluie = fibaro:getGlobal("time_last_rain");
fibaro:debug(date_derniere_pluie)
  
print ("date actuelle")  
local startedAt = os.time()
local dt = os.date("*t", startedAt)
local date_actuelle = string.format("%02d/%02d/%04d %02d:%02d", dt.day, dt.month, dt.year, dt.hour, dt.min)   
fibaro:debug(date_actuelle)  
   
print ("diff_des_2_dates");  
local diff_des_2_dates;  
diff_des_2_dates = os.date ("!% X", os.difftime (date_derniere_pluie, date_actuelle));
fibaro:debug(diff_des_2_dates)

[DEBUG] 08:34:35: date derniere pluie
[DEBUG] 08:34:35: 16/04/2020 22:21
[DEBUG] 08:34:35: date actuelle
[DEBUG] 08:34:35: 17/04/2020 08:34
[DEBUG] 08:34:35: diff_des_2_dates
[DEBUG] 08:34:35: 2020-04-17 08:34:35.930996 [ fatal] Unknown exception: /opt/fibaro/scenes/348.lua:177: bad argument #2 to 'difftime' (number expected, got string)

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

mouai alors la fonction difftime demande des valeur sous forme de timestamp (heure en nombre de secondes) et non de chaine de caractère sous la forme :

il y a 44 minutes, flamalex a dit :

"16/04/2020 22:21"

pour l'une c'est facile : "date_actuelle", tu remplaces 

il y a 47 minutes, flamalex a dit :

os.difftime (date_derniere_pluie, date_actuelle)

par  :

os.difftime (date_derniere_pluie, os.time())

pour "date_derniere_pluie", ça se complique.

Le plus simple aurait été de stocker dans la VG "time_last_rain" la date sous le format nombre entier et non chaine de caractère.

 

est ce que tu peux afficher le code qui rempli la VG "time_last_rain" ??

 

 

Lien vers le commentaire
Partager sur d’autres sites

voici le code pour VG time_last_rain

-[[
%% 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 dt = os.date("*t", startedAt)
  local date = string.format("%02d/%02d/%04d %02d:%02d", dt.day, dt.month, dt.year, dt.hour, dt.min)   
  -- 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', date) ----on enregistre la date et l'heure de  fin de la dernière pluie dans la VG time_last_rain
  else
    fibaro:debug("il pleut depuis <font color=\"red\">"..date.."</font>")
  end
end

 

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

alors je ferais ça

 

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

ensuite dans le difftime

 

-- ==========================================================
-- "time_last_rain" variable qui contient la date de la dernière pluie format "16/04/2020 22:21"
-- "WArrosage_J_avant" variable qui contient un nombre (exemple 3) qui sera le nombre de jour après lequel on pourra déclencher l'arrosage
 

print ("date derniere pluie")  
local date_derniere_pluie = tonumber(fibaro:getGlobal("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_derniere_pluie, date_actuelle)
fibaro:debug(diff_des_2_dates.." seconde(s)")

 

Modifié par jjacques68
  • Upvote 1
Lien vers le commentaire
Partager sur d’autres sites

ok, modif faites et variable time_last_rain actualisée

 

j'ai ceci dans le debug du difftime

[DEBUG] 09:50:27: date derniere pluie
[DEBUG] 09:50:27: 1587109655
[DEBUG] 09:50:27: date derniere pluie
[DEBUG] 09:50:27: 2020-04-17 09:50:27.538803 [ fatal] Unknown exception: /opt/fibaro/scenes/348.lua:170: bad argument #2 to 'tonumber' (base out of range)

 

si je comprends bien, tu me l'as converti en secondes!!

apres je vais devoir comparer "l'ecart" avec un nombre situé dans la VG  "WArrosage_J_avant", cela ne va t il pas poser problème?


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

le code:

print ("date derniere pluie")  
local date_derniere_pluie = tonumber(fibaro:getGlobal("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.." seconde(s)")

 

le debug:

[DEBUG] 09:56:35: date derniere pluie
[DEBUG] 09:56:35: 2020-04-17 09:56:35.339991 [ fatal] Unknown exception: /opt/fibaro/scenes/348.lua:160: bad argument #2 to 'tonumber' (base out of range)

 

pour info: dans ma variable "time_last_rain" j'ai comme valeur: 1587109655

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

Il y a 1 heure, jjacques68 a dit :

pourtant os.difftime fonctionne très bien ! je l'utilise souvent !

 

tu peux poster le code que tu as essayé ?

Ohhh, une nouvelle fonction que je ne connaissais pas du tout!

Moi qui, dans un premier temps, m'embêtais à convertir les heures et minutes en seconde... :wacko:

Lien vers le commentaire
Partager sur d’autres sites

@flamalex, ce serait plus compréhensible et lisible si tu utilisais les balises <code> qui sont faites exactement pour cela!

Rapidement, je vois que tu utilises fibaro:getGlobal("time_last_rain") qui retourne un tableau : ton erreur est donc normale. Pour avoir la valeur de la variable, il faut que tu utilises fibaro:getGlobalValue() comme ceci :

local date_derniere_pluie = tonumber(fibaro:getGlobalValue("time_last_rain"))

 

  • Thanks 1
Lien vers le commentaire
Partager sur d’autres sites

ok, parfait, plus d'erreur

 

 

[DEBUG] 10:02:39: date derniere pluie
[DEBUG] 10:02:39: 17/04/2020 - 09:47:35
[DEBUG] 10:02:39: date actuelle
[DEBUG] 10:02:39: 17/04/2020 - 10:02:38
[DEBUG] 10:02:39: diff_des_2_dates
[DEBUG] 10:02:39: 903 seconde(s)



edit: 

si je comprends bien, tu me l'as converti en secondes!!

apres je vais devoir comparer "l'ecart" avec un nombre situé dans la VG  "WArrosage_J_avant", cela ne va t il pas poser problème?

 

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

 

à l’instant, flamalex a dit :

si je comprends bien, tu me l'as converti en secondes!!

oui tout à fait.

on travaille avec les date /heure en format timestamp (donc un nombre entier), c'est beaucoupp plus simple...

par contre on utilise 

os.date("%d/%m/%Y - %H:%M:%S",____un_timestamp____)

pour l'affichage...

Lien vers le commentaire
Partager sur d’autres sites

ok, donc, il faudrait que je convertisse la valeur contenue dans ma VG "WArrosage_J_avant", en secondes, actuellement elle est à 3 (pour 3jours) 

 

edit dans mon VD (capture plus haut) j'ai ceci

Citation
Citation

 


local WArrosage_J_avant;
-- incremantation de +1 de variable globale consigneT
fibaro:setGlobal('WArrosage_J_avant', fibaro:getGlobalValue('WArrosage_J_avant') - 1);
-- puis on affiche la variable dans le champs consigne
  
 WArrosage_J_avant= fibaro:getGlobal("WArrosage_J_avant");
fibaro:debug(WArrosage_J_avant);
  
fibaro:call(fibaro:getSelfId(), "setProperty", "ui.consigneTimeavant.value","Nbre de jours passés sans pluie: "..WArrosage_J_avant.."");

 

 

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

il y a 5 minutes, flamalex a dit :

ok, donc, il faudrait que je convertisse la valeur contenue dans ma VG "WArrosage_J_avant", en secondes, actuellement elle est à 3 (pour 3jours) 

 

edit dans mon VD (capture plus haut) j'ai ceci

 

 

il y a 4 minutes, jjacques68 a dit :

elle est rempli comment cette VG ?

Je pense sincèrement que le plus simple est de changer l'enregistrement de cette valeur par un timestamp afin d'harmoniser et simplifier les codes :2:

il y a 3 minutes, jjacques68 a dit :

elle est super partique :) 

Oui, il va falloir que je creuse cela, puisque je m'embête à faire les opérations à chaque fois, dans toutes mes scènes et tous mes VD!

Lien vers le commentaire
Partager sur d’autres sites

il y a 12 minutes, jjacques68 a dit :

elle est rempli comment cette VG ?

elle est comme ceci:

local WArrosage_J_avant;
-- incremantation de +1 de variable globale consigneT
fibaro:setGlobal('WArrosage_J_avant', fibaro:getGlobalValue('WArrosage_J_avant') - 1);
-- puis on affiche la variable dans le champs consigne
  
 WArrosage_J_avant= fibaro:getGlobal("WArrosage_J_avant");
fibaro:debug(WArrosage_J_avant);
  
fibaro:call(fibaro:getSelfId(), "setProperty", "ui.consigneTimeavant.value","Nbre de jours passés sans pluie: "..WArrosage_J_avant.."");

 

Lien vers le commentaire
Partager sur d’autres sites

Beaucoup plus simplement, il faudrait que tu enregistres simplement la valeur os.time() dans tes variables dès qu'un évènement que tu souhaites historiser se passe.

Ainsi, lorsque tu voudras comparer ou calculer une différence, il te suffira d'effectuer le os.difftime() et ensuite de l'afficher sous la forme que tu préfères avec os.date().

Lien vers le commentaire
Partager sur d’autres sites

×
×
  • Créer...