Did Posté(e) le 7 janvier 2014 Signaler Posté(e) le 7 janvier 2014 Bonjour, J'ai découvert une commande Lua "isdst" qui permet de savoir si nous sommes en heure d'été. On doit pouvoir stocker cette réponse "true" dans une variable Saison mais je ne sait pas si il y a une réponse "false" pour les mois d'hiver. Quelqu'un a une idée sur les lignes de commande Lua pour récupérer cette info dans le panneau des variables? Merci. 1
Krikroff Posté(e) le 7 janvier 2014 Signaler Posté(e) le 7 janvier 2014 Pour cela il faut créer une variable global depuis le panneau variable (il y a un tuto pour cela sur le forum il me semble). Par exemple la variable saison. Puis utiliser la commande LUA fibaro:getGlobalValue("saison") pour lire la valeur ou bien fibaro:setGlobal("saison", true ou false) pour mettre à jour la variable global. Example: -- récupération d'une table Date local dt = os.date("*t"); -- création de la chaîne pour l'affichage local display = dt.hour..":"..dt.min..":"..dt.sec.." Heure d'été -> "..tostring(dt.isdst); -- Sortie de la variable vers la fenêtre debug du HC2 -- false pour hiver, true pour été fibaro:debug(display); -- mise à jour de la variable fibaro:setGlobal("saison", dt.isdst); Voilou !
Did Posté(e) le 7 janvier 2014 Auteur Signaler Posté(e) le 7 janvier 2014 Merci beaucoup Krikroff Par contre, la routine ne modifie pas la valeur: Quand je fais démarrer, cela m'affiche: [DEBUG] 13:46:40: 13:46:40 Heure d'été -> false [ERROR] 13:46:40: line :setGlobal (arg 3), expected 'string const &' got 'boolean' et la valeur de la variable saison ne change pas dans le panneau.
Krikroff Posté(e) le 7 janvier 2014 Signaler Posté(e) le 7 janvier 2014 avec plaisir, ok, il faut remplacer la ligne fibaro:setGlobal("saison", dt.isdst); par fibaro:setGlobal("saison", tostring(dt.isdst)); il demande un string et pas un boolean
Did Posté(e) le 7 janvier 2014 Auteur Signaler Posté(e) le 7 janvier 2014 Bah oui, comment n'y ai-je pas pensé plus tôt? Je plaisante, je n'aurais jamais été capable de pondre ça et aussi rapidement. Merci encore.
Krikroff Posté(e) le 7 janvier 2014 Signaler Posté(e) le 7 janvier 2014 Après tu peux aller plus loin encore , avec une variable global "predefinie" par exemple: saison été/hiver et avec un code dans le genre if (dt.isdst) then fibaro:setGlobal("saison", "été"); else fibaro:setGlobal("saison","hiver"); end 1
Domodial Posté(e) le 7 janvier 2014 Signaler Posté(e) le 7 janvier 2014 Punaise je vais mettre ça en place 1
Did Posté(e) le 7 janvier 2014 Auteur Signaler Posté(e) le 7 janvier 2014 Royale, et il n'y a pas besoin de mettre de pause pour économiser les ressources de la HC2 (comme elle n'est utilisée qu'une fois tous les six mois)?
Krikroff Posté(e) le 8 janvier 2014 Signaler Posté(e) le 8 janvier 2014 Oui, placer le code dans une scène qui s’exécute 1x par jour par exemple
Did Posté(e) le 8 janvier 2014 Auteur Signaler Posté(e) le 8 janvier 2014 Je vais encore abuser de votre temps mais j'ai fait une scène avec les blocs et mis un timer basé sur un intervalle de 24 heures entre 4h00 et 4h02. Puis j'ai converti les blocs en Lua, et enfin ajouté le code ce qui me donne: --[[ %% properties %% globals --]] local sourceTrigger = fibaro:getSourceTrigger(); if (sourceTrigger["type"] == "autostart") then while true do local currentDate = os.date("*t"); local startSource = fibaro:getSourceTrigger(); if ( ( (tonumber(os.date("%H%M")) >= tonumber(string.format("%02d%02d", "04", "00")) and tonumber(os.date("%H%M")) <= tonumber(string.format("%02d%02d", "04", "02"))) and (math.floor(os.time()/60)-math.floor(1389063600/60))%1440 == 0 ) ) then end fibaro:sleep(60*1000); end else local currentDate = os.date("*t"); local startSource = fibaro:getSourceTrigger(); if ( startSource["type"] == "other" ) then -- récupération table Date local dt = os.date("*t"); -- création de la chaîne pour affichage local display = dt.hour..":"..dt.min..":"..dt.sec.." Heure d'été -> "..tostring(dt.isdst); -- Sortie de la variable vers la fenêtre debug du HC2 -- false pour hiver, true pour été fibaro:debug(display); -- mise à jour de la variable fibaro:setGlobal("Saison", tostring(dt.isdst)); if (dt.isdst) then fibaro:setGlobal("Saison", "Eté"); else fibaro:setGlobal("Saison","Hiver"); end end end Ais-je bon?
Shad Posté(e) le 8 janvier 2014 Signaler Posté(e) le 8 janvier 2014 met les balises codes pour que ce soit plus lisibles et revoit ton incrementation . Ton code contient des erreurs il me semble: --[[ %% properties %% globals --]] local sourceTrigger = fibaro:getSourceTrigger(); if (sourceTrigger["type"] == "autostart") then while true do local currentDate = os.date("*t"); local startSource = fibaro:getSourceTrigger(); if (((tonumber(os.date("%H%M")) >= tonumber(string.format("%02d%02d", "04", "00")) and tonumber(os.date("%H%M")) <= tonumber(string.format("%02d%02d", "04", "02"))) and (math.floor(os.time()/60)-math.floor(1389063600/60))%1440 == 0 )) then end fibaro:sleep(60*1000); end else local currentDate = os.date("*t"); local startSource = fibaro:getSourceTrigger(); if ( startSource["type"] == "other") then -- récupération table Date local dt = os.date("*t"); -- création de la chaîne pour affichage local display = dt.hour..":"..dt.min..":"..dt.sec.." Heure d'été -> "..tostring(dt.isdst); -- Sortie de la variable vers la fenêtre debug du HC2 -- false pour hiver, true pour été fibaro:debug(display); -- mise à jour de la variable fibaro:setGlobal("Saison", tostring(dt.isdst)); if (dt.isdst) then fibaro:setGlobal("Saison", "Eté"); else fibaro:setGlobal("Saison","Hiver"); end end end
Did Posté(e) le 8 janvier 2014 Auteur Signaler Posté(e) le 8 janvier 2014 Bonjour Shad et merci, Comment met-on ce cadre et la numérotation des lignes qui rend plus clair l'apparence du message?
Shad Posté(e) le 8 janvier 2014 Signaler Posté(e) le 8 janvier 2014 Heu attend, j'avais pas vue que ton code venait d'un bloc graphique. Je comprend pas mal de choses pourquoi ton code est bizarre En fait si tu veux faire une scène ou tu clics pour exécuter la commande de krikroff car j'avoue ne pas comprendre la partie entre 4h00 et 4h02 du matin. Le plus simple est de faire simplement: --[[ %% properties %% globals --]] local currentDate = os.date("*t"); local startSource = fibaro:getSourceTrigger(); if ( startSource["type"] == "other") then -- création de la chaîne pour affichage local display = currentDate.hour..":"..currentDate.min..":"..currentDate.sec.." Heure d'été -> "..tostring(currentDate.isdst); -- Sortie de la variable vers la fenêtre debug du HC2 -- false pour hiver, true pour été fibaro:debug(display); -- mise à jour de la variable fibaro:setGlobal("Saison", tostring(currentDate.isdst)); if (currentDate.isdst) then fibaro:setGlobal("Saison", "Eté"); else fibaro:setGlobal("Saison","Hiver"); end end Tiens moi au courant si c'est bon.
Did Posté(e) le 8 janvier 2014 Auteur Signaler Posté(e) le 8 janvier 2014 C'est pour ajouter un déclenchement journalier de cette commande de Krikroff qui n'a pas besoin de tourner 24h/24 mais simplement une fois/jour à 4h pendant 2 min. (changement d'heure effectué à 3h). Après la valeur est stockée dans ma variable saison.
Shad Posté(e) le 8 janvier 2014 Signaler Posté(e) le 8 janvier 2014 Pourquoi laisser pendant 2 min?? La lancer une fois à 4h10 devrais suffire. De plus je te conseille pour un soucis de facilité de gestion d'utiliser le scheduler que j'ai mis ici. Tu verras quand tu commenceras à avoir plein de scène ce sera beaucoup mieux à gérer tout depuis le même endroit et tu peux suivre si tes scènes sont bien lancer. Et pour la création des scènes, c'est également simplifiez car tu as juste à mettre pour la lancer: --[[ %% properties %% globals --]] local startSource = fibaro:getSourceTrigger(); if ( startSource["type"] == "other") then ...... end
Did Posté(e) le 8 janvier 2014 Auteur Signaler Posté(e) le 8 janvier 2014 La lancer une seule fois suffira en effet. J'ai mis en place le sheduler, Scene Restart Schedule dans des scènes et Alarm clock dans un périphérique virtuel mais là je suis encore plus perdu: en parcourant toutes les lignes, je vois qu'il y a des variables à ajouter dans le panneau mais je ne suis pas encore assez calé pour la mise en service et l'utilisation de sheduler. Merci
Shad Posté(e) le 8 janvier 2014 Signaler Posté(e) le 8 janvier 2014 Non c'est très simple Pose tes questions sur le fil, je t'aiderais.
Did Posté(e) le 8 janvier 2014 Auteur Signaler Posté(e) le 8 janvier 2014 Pour être sà»r ne de pas faire de bétises (corrige moi si je me trompe): 1 périphérique virtuel pour Réveil (j'ai pris celui d'I-magin en français) vérifier le nom des variables Dans ce périphérique virtuel, adapter le n°id de ce VD à la ligne: local alarmClockDevice de chaque bouton 1 scène pour Scene Restart Schedule Comment on la nomme? A quoi sert cette scène? compter le nombre de scènes qui tournent? tuer les scènes? 1 scène pour scheduler-1-3-0 Comment on la nomme? Planificateur? Dans la ligne 97: local restartScene = 67 correspond à quel Id? Dans la ligne 98: local alarmClocks = { alarmTime1 = {deviceID = 268, correspond à quel Id? idem pour la ligne 103 et le n°294? Quelles sont les variables à mettre en place et leur valeur? Merci pour ta patiente.
Krikroff Posté(e) le 8 janvier 2014 Signaler Posté(e) le 8 janvier 2014 Je comprends Shad dans sa démarche, mais j'aurais tendance à dire que le scheduler est à aborder avec un minimum d' aisance avec la prog LUA et pas forcement justifié au début d'une installation mais plus dans un second temps. Le code suivant fait une vérification tous les jours à 4:15, il n'est pas optimisé car juste passage du mode bloc à LUA mais bon ... --[[ %% autostart %% properties %% globals --]] function check() -- récupération table Date local dt = os.date("*t"); -- création de la chaîne pour affichage local display = dt.hour..":"..dt.min..":"..dt.sec.." Heure d'été -> "..tostring(dt.isdst); -- Sortie de la variable vers la fenêtre debug du HC2 -- false pour hiver, true pour été fibaro:debug(display); -- mise à jour de la variable if (dt.isdst) then fibaro:setGlobal("Saison", "Eté"); else fibaro:setGlobal("Saison","Hiver"); end end local sourceTrigger = fibaro:getSourceTrigger(); if (sourceTrigger["type"] == "autostart") then while true do local currentDate = os.date("*t"); local startSource = fibaro:getSourceTrigger(); if ( ( ((currentDate.wday == 1 or currentDate.wday == 2 or currentDate.wday == 3 or currentDate.wday == 4 or currentDate.wday == 5 or currentDate.wday == 6 or currentDate.wday == 7) and string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == "04:15") )) then check(); end fibaro:sleep(60*1000); end else local currentDate = os.date("*t"); local startSource = fibaro:getSourceTrigger(); if (startSource["type"] == "other") then check(); end end Bon courage.
Did Posté(e) le 8 janvier 2014 Auteur Signaler Posté(e) le 8 janvier 2014 Il ne manque pas entre les lignes 16 & 17 cette commande: fibaro:setGlobal("Saison", tostring(dt.isdst));
Krikroff Posté(e) le 8 janvier 2014 Signaler Posté(e) le 8 janvier 2014 Alors: Si tu utilises une variable prédéfinie "Été" / "Hiver" il faut utiliser if (dt.isdst) then fibaro:setGlobal("Saison", "Eté"); else fibaro:setGlobal("Saison","Hiver"); end si c'est une variable "simple" il faut utiliser fibaro:setGlobal("Saison", tostring(dt.isdst)); mais pas les deux
Rocketlud Posté(e) le 11 décembre 2014 Signaler Posté(e) le 11 décembre 2014 Salut les gars, Je souhaiterais faire de même afin d'optimiser mes volets roulants lors du changement d'heure ou de saison;) Did tu pourrais me faire un ptit retour de ce que tu as fait Merci
Did Posté(e) le 11 décembre 2014 Auteur Signaler Posté(e) le 11 décembre 2014 Ouh la, c'est vieux ça... Mais ça, c'était avant. Depuis, Steven nous a pondu un truc de malade!
Rocketlud Posté(e) le 11 décembre 2014 Signaler Posté(e) le 11 décembre 2014 C'est le fameux dst dans gea?
Messages recommandés