Aller au contenu
flamalex

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

Recommended Posts

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

Partager ce message


Lien à poster
Partager sur d’autres sites

Pour mon VD Weatherbit, je n'ai pas trouvé d'autre solution que de passer par un os.date("%w") qui donne le numéro du jour de l'année en cours....

Envoyé de mon SM-A530F en utilisant Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites
Il y a 11 heures, flamalex a dit :

difftime en sec

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

 

tu peux poster le code que tu as essayé ?

Partager ce message


Lien à poster
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

Partager ce message


Lien à poster
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" ??

 

 

Partager ce message


Lien à poster
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

Partager ce message


Lien à poster
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

Partager ce message


Lien à poster
Partager sur d’autres sites

attention !! dans difftime, faut inverser les 2 : 

 

il y a 3 minutes, jjacques68 a dit :

local diff_des_2_dates = os.difftime (date_actuelle, date_derniere_pluie)

 

Modifié par jjacques68

Partager ce message


Lien à poster
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

Partager ce message


Lien à poster
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

Partager ce message


Lien à poster
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:

Partager ce message


Lien à poster
Partager sur d’autres sites

mouai je sais pas quelle est la ligne 160...

 

essaye de remplacer cette ligne

 

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

par 

 

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

 

  • Thanks 1

Partager ce message


Lien à poster
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

Partager ce message


Lien à poster
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

Partager ce message


Lien à poster
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...

Partager ce message


Lien à poster
Partager sur d’autres sites
il y a 3 minutes, flamalex a dit :

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?

l'écart est en seconde, dans ta VG "WArrosage_J_avant" il y a quoi comme valeur ?

Partager ce message


Lien à poster
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

Partager ce message


Lien à poster
Partager sur d’autres sites
il y a 13 minutes, J3R3M a dit :

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

elle est super partique :) 

Partager ce message


Lien à poster
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!

Partager ce message


Lien à poster
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.."");

 

Partager ce message


Lien à poster
Partager sur d’autres sites

ok alors en effet il faut que tu l'as convertisse en seconde...

 

pour le +1 et le -1

 

ou alors :

 

Tu modifies dans l'action qui est déclenchée si le nombre e jour est dépassé...

Partager ce message


Lien à poster
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().

Partager ce message


Lien à poster
Partager sur d’autres sites

×