flamalex Posté(e) le 16 avril 2020 Signaler Posté(e) le 16 avril 2020 (modifié) 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 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 Modifié le 16 avril 2020 par flamalex
Dragoniacs Posté(e) le 16 avril 2020 Signaler Posté(e) le 16 avril 2020 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
jjacques68 Posté(e) le 17 avril 2020 Signaler Posté(e) le 17 avril 2020 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é ?
flamalex Posté(e) le 17 avril 2020 Auteur Signaler Posté(e) le 17 avril 2020 (modifié) 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é le 17 avril 2020 par flamalex
jjacques68 Posté(e) le 17 avril 2020 Signaler Posté(e) le 17 avril 2020 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" ??
flamalex Posté(e) le 17 avril 2020 Auteur Signaler Posté(e) le 17 avril 2020 (modifié) 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é le 17 avril 2020 par flamalex
jjacques68 Posté(e) le 17 avril 2020 Signaler Posté(e) le 17 avril 2020 (modifié) 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é le 17 avril 2020 par jjacques68 1
jjacques68 Posté(e) le 17 avril 2020 Signaler Posté(e) le 17 avril 2020 (modifié) 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é le 17 avril 2020 par jjacques68
flamalex Posté(e) le 17 avril 2020 Auteur Signaler Posté(e) le 17 avril 2020 (modifié) 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é le 17 avril 2020 par flamalex
jjacques68 Posté(e) le 17 avril 2020 Signaler Posté(e) le 17 avril 2020 tu peux faire un print de "date_derniere_pluie" ?
flamalex Posté(e) le 17 avril 2020 Auteur Signaler Posté(e) le 17 avril 2020 (modifié) 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é le 17 avril 2020 par flamalex
J3R3M Posté(e) le 17 avril 2020 Signaler Posté(e) le 17 avril 2020 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...
jjacques68 Posté(e) le 17 avril 2020 Signaler Posté(e) le 17 avril 2020 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")) 1
J3R3M Posté(e) le 17 avril 2020 Signaler Posté(e) le 17 avril 2020 @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")) 1
flamalex Posté(e) le 17 avril 2020 Auteur Signaler Posté(e) le 17 avril 2020 (modifié) 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é le 17 avril 2020 par flamalex
jjacques68 Posté(e) le 17 avril 2020 Signaler Posté(e) le 17 avril 2020 à 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...
jjacques68 Posté(e) le 17 avril 2020 Signaler Posté(e) le 17 avril 2020 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 ?
flamalex Posté(e) le 17 avril 2020 Auteur Signaler Posté(e) le 17 avril 2020 (modifié) 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é le 17 avril 2020 par flamalex
jjacques68 Posté(e) le 17 avril 2020 Signaler Posté(e) le 17 avril 2020 elle est rempli comment cette VG ?
jjacques68 Posté(e) le 17 avril 2020 Signaler Posté(e) le 17 avril 2020 il y a 13 minutes, J3R3M a dit : Ohhh, une nouvelle fonction que je ne connaissais pas du tout! elle est super partique
J3R3M Posté(e) le 17 avril 2020 Signaler Posté(e) le 17 avril 2020 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 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!
flamalex Posté(e) le 17 avril 2020 Auteur Signaler Posté(e) le 17 avril 2020 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.."");
jjacques68 Posté(e) le 17 avril 2020 Signaler Posté(e) le 17 avril 2020 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é...
J3R3M Posté(e) le 17 avril 2020 Signaler Posté(e) le 17 avril 2020 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().
Messages recommandés