jojo Posté(e) le 17 décembre 2015 Signaler Partager Posté(e) le 17 décembre 2015 Bonjour, J'ai un binary sensor (FGBS) qui m'informe si ma chaudière est en fonctionnement ou pas. Je voudrais incorporer cela dans les graphes de Lazer. Je pense donc à créer une VG pour cela, et à y stocker toutes les 3 secondes (temps du cycle d'un main loop) si le contact est fermé ou pas. J'incrémenterais donc ma variable de 3 toutes les 3 secondes, et au bout d'une minute, j'aurais le nombre de secondes de fonctionnement de ma chaudière, qui serait transféré vers la DB de Lazer (et remise à zéro après le transfert). Je pourrais ainsi visualiser par jour. semaine, mois, ... la durée de fonctionnement de ma chaudière. (ça ne changera rien à ma vie, mais c'est rigolo ) En multipliant les variables, je pourrais ainsi compter ce que je veux. Avant que je ne réinvente la roue, est-ce que quelqu'un a déjà fait ce type de VD ou a des idées sur l'algorithme que je devrais développer ? Merci Lien vers le commentaire Partager sur d’autres sites More sharing options...
Lazer Posté(e) le 18 décembre 2015 Signaler Partager Posté(e) le 18 décembre 2015 Je suppose que tu pourrais même utiliser une scène, avec une boucle infinie et un sleep de seulement 1s, tu aurais un meilleure précision. Par contre il va te falloir créer de nouvelles tables et un nouveau type de donnée dans domocharts, non ? Lien vers le commentaire Partager sur d’autres sites More sharing options...
jojo Posté(e) le 18 décembre 2015 Auteur Signaler Partager Posté(e) le 18 décembre 2015 donc, c'est normal que je n'ai pas trouvé, ça n'existe pas encore .... Merci pour l'idée de la scène, c'est mieux en effet. Pour domochart, je n'ai pas encore regardé, mais n'as-tu pas déjà prévu le rapatriement de données stockées dans une VG toutes les minutes ? Et comme tu as prévu une table pour l'humidité, je vais utiliser celle-là , car pour l'instant je ne l'utilise pas. Te connaissant, lorsque j'aurai développé et testé cette scène, tu l'inclueras dans une prochaine version de domochart ... Lien vers le commentaire Partager sur d’autres sites More sharing options...
Lazer Posté(e) le 18 décembre 2015 Signaler Partager Posté(e) le 18 décembre 2015 oui tu peux utiliser le type de données "humidity" dans l'immédiat, en attendant qu'on trouve une méthode propre pour l'intégrer. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Berale64 Posté(e) le 18 décembre 2015 Signaler Partager Posté(e) le 18 décembre 2015 Si tu fais le choix de la scène, pense aux triggers. C'est moins gourmand pour les ressources de la hc2. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Berale64 Posté(e) le 19 décembre 2015 Signaler Partager Posté(e) le 19 décembre 2015 Voilàcomment je vois les choses. --[[ %% properties 169 value %% globals --]] local currentDate = os.date("*t"); local TriggerTime = string.format("%02d",currentDate.hour)..":"..string.format("%02d",currentDate.min)..":"..string.format("%02d",currentDate.sec); time = fibaro:getGlobalValue("CTime"); fibaro:debug(time); if (tonumber(time) == 0) then -- la première foi la variable Ctime est à0 fibaro:setGlobal("CTime", TriggerTime); fibaro:abort(); end _, _, h1, m1, s1 = string.find(time, "(%d+)%d+)%d+)") _, _, h2, m2, s2 = string.find(TriggerTime, "(%d+)%d+)%d+)") dh = h2-h1; if (dh < 0) then dh = dh + 24; end dm = m2-m1; if (dm < 0) then dm = dm + 60; end ds = s2-s1; if (ds < 0) then ds = ds + 60; end local status = fibaro:getValue(169, "value"); if (status == "1") then -- le Device pass de off àon -- le temps correspond àun temps d'arrêt fibaro:debug("arret pendant :"..dh.." h "..dm.." m "..ds.." s"); else -- le device passe de on àoff -- le temps calculé correspond àun temps de marche fibaro:debug("marche pendant :"..dh.." h "..dm.." m "..ds.." s"); end fibaro:setGlobal("CTime", TriggerTime); Il faut créer une variable CTime. Tu peux mettre plusieurs triggers et utiliser json pour gérer plusieurs devices avec la même scène et la même variable. A toi de voir ce que tu fais avec les temps calculés. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Krikroff Posté(e) le 19 décembre 2015 Signaler Partager Posté(e) le 19 décembre 2015 @Jojo, il me semble que j'avais donné à ohan un bout de code pour faire un truc du genre, si il passe dans le coin... Lien vers le commentaire Partager sur d’autres sites More sharing options...
Yohan Posté(e) le 19 décembre 2015 Signaler Partager Posté(e) le 19 décembre 2015 Salut, Voilà le code : --[[ %% autostart %% properties 463 value %% globals --]] if (fibaro:countScenes() > 1) then fibaro:abort() end local deviceID = 463 local startedAt = os.time() local startSource = fibaro:getSourceTrigger() function getActuatorStatus(id) return (tonumber(fibaro:getValue(id, "value")) ~= 0) end if (startSource["type"]~="autostart") then local dt = os.date("*t", startedAt) local date = string.format("%04d/%02d/%02d %02d:%02d:%02d", dt.year, dt.month, dt.day, dt.hour, dt.min, dt.sec) -- check actuator status and count only when turned on if (getActuatorStatus(deviceID)) then fibaro:debug("The actuator has been turned on at <font color=\"green\">"..date.."</font>") else fibaro:debug("The actuator has been turned off at <font color=\"red\">"..date.."</font>") end end L'id 463 correspond à l'id de ton actionneur jojo. 1 Lien vers le commentaire Partager sur d’autres sites More sharing options...
mprinfo Posté(e) le 19 décembre 2015 Signaler Partager Posté(e) le 19 décembre 2015 Il est trop fort notre co-admin Merci krikroff et merci yohan Envoyé de mon SM-G900F en utilisant Tapatalk Lien vers le commentaire Partager sur d’autres sites More sharing options...
jojo Posté(e) le 19 décembre 2015 Auteur Signaler Partager Posté(e) le 19 décembre 2015 merci pour tous vos retours, mais comme je souhaite utiliser le domochart de Lazer, je dois mettre à jour une VG pour dire combien de seconde le device a été ON durant la dernière minute, puis le remettre à zéro, car le domochart de lazer va compabiliser toutes les minutes. Donc en effet les trigger sont une bonne idée, mais ils ne seront activé qu'en cas de changement détat, et si ma chaudière est on pendant 4min 35 sec, je devrais avoir qqch comme ceci pour utiliser le domochart de Lazer : min 1 : VD = 15 , puis remise à zéro (la chaudière a démarré à 12h34 et 45') min 2 : VD = 60 , puis remise à zéro (la chaudière a tourné toute la minute) min 3 : VD = 60 , puis remise à zéro (la chaudière a tourné toute la minute) min 4 : VD = 60 , puis remise à zéro (la chaudière a tourné toute la minute) min 5 : VD = 60 , puis remise à zéro (la chaudière a tourné toute la minute) min 6 : VD = 20 , puis remise à zéro (la chaudière a tourné jusqu'à 12h39 et 20") Lien vers le commentaire Partager sur d’autres sites More sharing options...
Lazer Posté(e) le 19 décembre 2015 Signaler Partager Posté(e) le 19 décembre 2015 dans ce cas là, il faudrait que domocharts puisse remettre ta variable àzero juste après chaque lecture. Ca veut dire adapter le code. Lien vers le commentaire Partager sur d’autres sites More sharing options...
jojo Posté(e) le 19 décembre 2015 Auteur Signaler Partager Posté(e) le 19 décembre 2015 J'avance dans ma scène, mais je bloque sur la création automatique de la variable --[[ %% properties %% autostart %% globals --]] Timer = { {deviceName = "CHAUDIERE_OUTPUT", deviceID = 214, variable = "Timer_Chaudiere"}, {deviceName = "SOLAIRE_OUTPUT", deviceID = 82, variable = "Timer_Solaire"}, } variables = api.get('/globalVariables/') for i = 1, #Timer do -- vérification existance variable found = false for j = 1, #variables do if variables[j].name == Timer[i].variable then found = true end end if found == false then -- création de la varialbe fibaro:debug("La variable "..Timer[i].variable.. " n'existe PAS") fibaro:debug("data = {name="..Timer[i].variable..", isEnum=0}") local http = net.HTTPClient() http:request("http://127.0.0.1:11111/api/globalVariables", { options = { method = "POST", data = json.encode({name=Timer[i].variable, isEnum=false}) }, success = function(response) fibaro:debug(Timer[i].variable .. " créé avec succès") end, error = function(response) fibaro:debug(Timer[i].variable .. " ERROR !!!") end, }) else fibaro:debug("La variable "..Timer[i].variable.. " existe") end end local seconde = os.date('%S') if tonumber(seconde) ~= 1 then for i = 1, #Timer do fibaro:setGlobal(Timer[i].variable, 0) end local delta = 61 - seconde -- il faut décaler de 1 seconde pour être sûr que domochart ait bien fait son job àla seconde 0 fibaro:debug("Time is " .. os.date('%H:%M:%S') .. ", waiting for " .. delta .. " seconds...") fibaro:sleep(delta*1000) end --pour des raison de test : --fibaro:setGlobal(TimerVG["CHAUDIERE_OUTPUT"], os.date('%S')-1) local min = os.date('%M') while true do -- Actions to perform every new second for i = 1, #Timer do if tonumber(fibaro:getValue(Timer[i].deviceID, "value")) == 1 then fibaro:setGlobal(Timer[i].variable, fibaro:getGlobal(Timer[i].variable) + 1) end fibaro:debug('Last run : ' .. os.date('%d/%m/%Y %H:%M:%S').. " - VG '".. Timer[i].variable.. "' = ".. fibaro:getGlobal(Timer[i].variable)) end fibaro:sleep(1000) -- 1 second -- Actions to perform every new min if tonumber(os.date('%S')) == 1 then fibaro:debug('New minute') for i = 1, #Timer do fibaro:setGlobal(Timer[i].variable, 0) end end end Lien vers le commentaire Partager sur d’autres sites More sharing options...
Lazer Posté(e) le 19 décembre 2015 Signaler Partager Posté(e) le 19 décembre 2015 J'ai remarqué que ce n'était pas une bonne idée de faire des sleeps dans une scène quand tu introduits la notion d'asynchronisme avec net.HTTPClient(). En effet, la scène ne rend jamais la main au système, et les fonctions asynchrones ne démarrent jamais..... sauf quand le programme finit par se terminer, or avec ton "while true do" tu risques d'attendre longtemps. Donc il faut que tu revois entièrement la logique de ta scène pour permettre aux appels à net.HTTPClient() de s'exécuter. Pour cela, il faut remplacer tes sleeps tous les matins par des appels à setTimeout(), donc à des fonctions. C'est pour cela que ça t'oblige à revoir toute la structure du code. Regarde mon watchdog pour voir comment j'ai traité le problème : - le code ne se compose que de fonctions... - ... sauf à la fin, moins de 10 lignes de codes sont exécutés linéairement, puis le programme se termine - dans ces lignes, il y a un appel setTimeout(function() Check(intervalle) end, delay*1000) - donc tu cherches plus haut la fonction Check(interval) - dans cette fonction, tu vois toutes les instructions exécutées, y compris des appels à net.HTTPClient() - à la fin de la fonction Check(), on trouve l'appel suivant pour que la fonction se rappelle elle-même en asynchrone après un délai : setTimeout(function() Check(interval) end, interval*1000) - au moment où le timeout démarre, le système reprend la main, et les instructions httpClient:request précédentes qui étaient en attente peuvent démarrer Ce mécanisme d'appel de fonction récursif par l'intermédiaire du timeout est l'équivalent asynchrone d'un bon vieux "while true .... sleep() do" Lien vers le commentaire Partager sur d’autres sites More sharing options...
jojo Posté(e) le 19 décembre 2015 Auteur Signaler Partager Posté(e) le 19 décembre 2015 merci pour toutes ces explications, mais je ne suis pas un développeur, et ça me parait fort compliqué (àcette heure-ci en tout cas). Donc, comme j'arrive àtester si la variable existe, je vais me contenter dans un premier temps d'arrêter la scène si elle n'existe pas et de la créer àla main. Ce n'est pas le plus important de la scène. Lien vers le commentaire Partager sur d’autres sites More sharing options...
jojo Posté(e) le 19 décembre 2015 Auteur Signaler Partager Posté(e) le 19 décembre 2015 --[[ %% properties %% autostart %% globals --]] Timer = { {deviceName = "CHAUDIERE_OUTPUT", deviceID = 214, variable = "Timer_Chaudiere"}, {deviceName = "SOLAIRE_OUTPUT", deviceID = 82, variable = "Timer_Solaire"}, } variables = api.get('/globalVariables/') for i = 1, #Timer do -- vérification existance variable found = false for j = 1, #variables do if variables[j].name == Timer.variable then found = true end end if found == false then fibaro:debug("La variable "..Timer.variable.. " n'existe PAS. \nA créer manuellement. \nArrêt de ma scène.") fibaro:abort() --[[ -- création de la varialbe fibaro:debug("data = {name="..Timer.variable..", isEnum=0}") local http = net.HTTPClient() http:request("http://127.0.0.1:11111/api/globalVariables", { options = { method = "POST", data = json.encode({name=Timer.variable, isEnum=false}) }, success = function(response) fibaro:debug(Timer.variable .. " créé avec succès") end, error = function(response) fibaro:debug(Timer.variable .. " ERROR !!!") end, }) --]] else fibaro:debug("La variable "..Timer.variable.. " existe") end end local seconde = os.date('%S') if tonumber(seconde) ~= 1 then for i = 1, #Timer do fibaro:setGlobal(Timer.variable, 0) end local delta = 61 - seconde -- il faut décaler de 1 seconde pour être sûr que domochart ait bien fait son job àla seconde 0 fibaro:debug("Time is " .. os.date('%H:%M:%S') .. ", waiting for " .. delta .. " seconds...") fibaro:sleep(delta*1000) end --pour des raison de test : --fibaro:setGlobal(TimerVG["CHAUDIERE_OUTPUT"], os.date('%S')-1) local min = os.date('%M') while true do -- Actions to perform every new second for i = 1, #Timer do if tonumber(fibaro:getValue(Timer.deviceID, "value")) == 1 then fibaro:setGlobal(Timer.variable, fibaro:getGlobal(Timer.variable) + 1) end fibaro:debug('Last run : ' .. os.date('%d/%m/%Y %H:%M:%S').. " - VG '".. Timer.variable.. "' = ".. fibaro:getGlobal(Timer.variable)) end fibaro:sleep(1000) -- 1 second -- Actions to perform every new min if tonumber(os.date('%S')) == 1 then fibaro:debug('New minute') for i = 1, #Timer do fibaro:setGlobal(Timer.variable, 0) end end end Lien vers le commentaire Partager sur d’autres sites More sharing options...
jojo Posté(e) le 19 décembre 2015 Auteur Signaler Partager Posté(e) le 19 décembre 2015 et voici le debug, avec remise àzéro de la variable 1 seconde après chaque nouvelle minute. Mais je perds quelques secondes par minutes [DEBUG] 00:28:51: La variable Timer_Chaudiere existe [DEBUG] 00:28:51: La variable Timer_Solaire existe [DEBUG] 00:28:51: Time is 00:28:51, waiting for 10 seconds... [DEBUG] 00:29:01: Last run : 20/12/2015 00:29:01 - VG 'Timer_Chaudiere' = 1 [DEBUG] 00:29:01: Last run : 20/12/2015 00:29:01 - VG 'Timer_Solaire' = 1 [DEBUG] 00:29:02: Last run : 20/12/2015 00:29:02 - VG 'Timer_Chaudiere' = 2 [DEBUG] 00:29:02: Last run : 20/12/2015 00:29:02 - VG 'Timer_Solaire' = 2 [DEBUG] 00:29:03: Last run : 20/12/2015 00:29:03 - VG 'Timer_Chaudiere' = 3 [DEBUG] 00:29:03: Last run : 20/12/2015 00:29:03 - VG 'Timer_Solaire' = 3 [DEBUG] 00:29:04: Last run : 20/12/2015 00:29:04 - VG 'Timer_Chaudiere' = 4 [DEBUG] 00:29:04: Last run : 20/12/2015 00:29:04 - VG 'Timer_Solaire' = 4 [DEBUG] 00:29:06: Last run : 20/12/2015 00:29:06 - VG 'Timer_Chaudiere' = 5 [DEBUG] 00:29:06: Last run : 20/12/2015 00:29:06 - VG 'Timer_Solaire' = 5 ... [DEBUG] 00:29:57: Last run : 20/12/2015 00:29:57 - VG 'Timer_Chaudiere' = 51 [DEBUG] 00:29:57: Last run : 20/12/2015 00:29:57 - VG 'Timer_Solaire' = 51 [DEBUG] 00:29:58: Last run : 20/12/2015 00:29:58 - VG 'Timer_Chaudiere' = 52 [DEBUG] 00:29:58: Last run : 20/12/2015 00:29:58 - VG 'Timer_Solaire' = 52 [DEBUG] 00:29:59: Last run : 20/12/2015 00:29:59 - VG 'Timer_Chaudiere' = 53 [DEBUG] 00:29:59: Last run : 20/12/2015 00:29:59 - VG 'Timer_Solaire' = 53 [DEBUG] 00:30:00: Last run : 20/12/2015 00:30:00 - VG 'Timer_Chaudiere' = 54 [DEBUG] 00:30:00: Last run : 20/12/2015 00:30:00 - VG 'Timer_Solaire' = 54 [DEBUG] 00:30:01: New minute [DEBUG] 00:30:01: Last run : 20/12/2015 00:30:01 - VG 'Timer_Chaudiere' = 1 [DEBUG] 00:30:01: Last run : 20/12/2015 00:30:01 - VG 'Timer_Solaire' = 1 [DEBUG] 00:30:02: Last run : 20/12/2015 00:30:02 - VG 'Timer_Chaudiere' = 2 [DEBUG] 00:30:02: Last run : 20/12/2015 00:30:02 - VG 'Timer_Solaire' = 2 [DEBUG] 00:30:03: Last run : 20/12/2015 00:30:03 - VG 'Timer_Chaudiere' = 3 [DEBUG] 00:30:03: Last run : 20/12/2015 00:30:03 - VG 'Timer_Solaire' = 3 Lien vers le commentaire Partager sur d’autres sites More sharing options...
Lazer Posté(e) le 19 décembre 2015 Signaler Partager Posté(e) le 19 décembre 2015 moi ce qui me gêne si tu gère toi même la remise à 0 de la variable, comment tu peux être sur que Domocharts sera synchronisé ? Je pense qu'en pratique tu vas perdre des tours. => c'est pour ça que je suggérais d'ajouter les instructions nécessaires au VD Domocharts pour qu'il remette ta variable à 0 juste après sa lecture. Le seul risque est que ta scène incrémente la variable pile entre le moment où le VD Domocharts lis la variable puis la remet à zero, mais le risque est faible, et je ne vois aucun moyen de résoudre ce problème sachant qu'on n'a pas de gestion des mutex (concept de programmation multi-thread) En plus de ton problème de sleep, car ta boucle met plus d'une seconde à s’exécuter (1s de sleep, plus quelques ms pour toutes les autres instructions) => le settimeout améliorerait beaucoup les choses Lien vers le commentaire Partager sur d’autres sites More sharing options...
jojo Posté(e) le 19 décembre 2015 Auteur Signaler Partager Posté(e) le 19 décembre 2015 oui, en effet, j'y avais pensé, mais je ne voulais pas modifier ton code car il faudrait que je ré-applique ces modifs lors d'une prochaine version de ta part), sauf si on peut intégrer cela dans le futur. Donc je "modifie" ton code, j'essaye avec le settimeout, mais je sens que ça va être chaud d'intégrer tout ça proprement Lien vers le commentaire Partager sur d’autres sites More sharing options...
Lazer Posté(e) le 19 décembre 2015 Signaler Partager Posté(e) le 19 décembre 2015 J'ai noté la remise àzero dans ma todolist, mais ne soit pas pressé... Lien vers le commentaire Partager sur d’autres sites More sharing options...
jojo Posté(e) le 20 décembre 2015 Auteur Signaler Partager Posté(e) le 20 décembre 2015 bon bhen j'ai eu une idée simple pour le reset, et je n'ai pas pu m'empêcher de la tester ... Donc dans le VD DomoCharts, bouton Sensors : local variables = { { ["type"] = "co2", ["id"] = 10001, ["name"] = "Timer_Chaudiere", ["reset"] = true, ["resetValue"] = 0 }, { ["type"] = "co2", ["id"] = 10002, ["name"] = "Timer_Solaire", ["reset"] = true, ["resetValue"] = 0 },} J'ai rajouté pour chaquevariable 2 paramètres ["reset"] et ["resetValue"] puis, à la fin du code, -- Get User Variable list (updated from FHEM through API) datas = nil local datas = {} for i = 1, #variables do payload = "/graph/data_post_" .. variables[i].type .. ".php?id=" .. variables[i].id .. "&value=" .. fibaro:getGlobalValue(variables[i].name) datas[#datas+1] = {} datas[#datas].id = variables[i].id datas[#datas].timestamp = 'NULL' datas[#datas].type = variables[i].type datas[#datas].value = fibaro:getGlobalValue(variables[i].name) if variables[i].reset == true then fibaro:setGlobal(variables[i].name, variables[i].resetValue) end end j'ai ajouté les 3 lignes if variables[i].reset == true then fibaro:setGlobal(variables[i].name, variables[i].resetValue) end FACILE (et propre me semble-t-il) 1 Lien vers le commentaire Partager sur d’autres sites More sharing options...
jojo Posté(e) le 20 décembre 2015 Auteur Signaler Partager Posté(e) le 20 décembre 2015 aller, re-dodo Lien vers le commentaire Partager sur d’autres sites More sharing options...
jojo Posté(e) le 20 décembre 2015 Auteur Signaler Partager Posté(e) le 20 décembre 2015 que penses-tu de ce code ? as-tu d'autres idées ? --[[ %% properties %% autostart %% globals --]] local interval = 1 -- interval de vérification en sec local Counter = { {deviceID = 214, variable = "Timer_Chaudiere", testValue = 1, increment = 1}, -- CHAUDIERE_OUTPUT {deviceID = 215, variable = "Timer_Solaire", testValue = 1, increment = 1}, -- SOLAIRE_OUTPUT } function checkVar() variables = api.get('/globalVariables/') for i = 1, #Counter do -- vérification existance variable found = false for j = 1, #variables do if variables[j].name == Counter[i].variable then found = true end end if found == false then fibaro:debug("La variable "..Counter[i].variable.. " n'existe PAS.") -- création de la varialbe local http = net.HTTPClient() http:request("http://127.0.0.1:11111/api/globalVariables", { options = { method = "POST", data = json.encode({name=Counter[i].variable, isEnum=0}) }, success = function(response) fibaro:debug(Counter[i].variable .. " créé avec succès") end, error = function(response) fibaro:debug(Counter[i].variable .. " ERROR !!!") end, }) else fibaro:debug("La variable "..Counter[i].variable.. " existe") end end end function start() local seconde = os.date('%S') if tonumber(seconde) ~= 0 then for i = 1, #Counter do fibaro:setGlobal(Counter[i].variable, 0) end local delta = 60 - seconde fibaro:debug("Time is " .. os.date('%H:%M:%S') .. ", waiting for " .. delta .. " seconds...") fibaro:sleep(delta*1000) fibaro:debug("Start") end --pour des raison de test : --fibaro:setGlobal(TimerVG["CHAUDIERE_OUTPUT"], os.date('%S')-1) end function counter() -- Actions to perform every new second for i = 1, #Counter do if tonumber(fibaro:getValue(Counter[i].deviceID, "value")) == Counter[i].testValue then fibaro:setGlobal(Counter[i].variable, fibaro:getGlobal(Counter[i].variable) + Counter[i].increment) end fibaro:debug('Last run : ' .. os.date('%d/%m/%Y %H:%M:%S').. " - VG '".. Counter[i].variable.. "' = ".. fibaro:getGlobal(Counter[i].variable)) end -- Actions to perform every new min -- le reset de la variable est effectuée par le VD DomoCharts setTimeout(function() counter() end, interval*1000) --vérification toutes les secondes end --vérification de l'existence des variables et création si nécessaire checkVar() -- démarrage àla seconde 0 start() -- démarrage de la boucle du compteur counter() Lien vers le commentaire Partager sur d’autres sites More sharing options...
jojo Posté(e) le 20 décembre 2015 Auteur Signaler Partager Posté(e) le 20 décembre 2015 je me suis permis d'adapter le code de la scène domoCharts pour éviter le décalage en utilisant le settimeout(). C'est en test. Je verrai ce soir si décalage Lien vers le commentaire Partager sur d’autres sites More sharing options...
Lazer Posté(e) le 20 décembre 2015 Signaler Partager Posté(e) le 20 décembre 2015 Excellent ta modif de domocharts, c'est exactement comme ça que je comptais procéder J'ai pas lu en détail le code de ta scène compteur, mais ça me semble correct. Pour le décalage, comme expliqué sur l'autre topic, il est inévitable, même avec setTimeout. Si tu mets cette instruction en début de fonction, ce qui n'est pas ton cas car tu l'as mis à la fin. Mais la bonne solution, c'est de calculer le décalage et de compenser en ajustant la valeur du timeout. Lien vers le commentaire Partager sur d’autres sites More sharing options...
jojo Posté(e) le 20 décembre 2015 Auteur Signaler Partager Posté(e) le 20 décembre 2015 ok, merci , je vais essayer de voir ce que je peux faire pour calculer le décalage. Ce qui est TRES bizarre, c'est que le reset de la variable n'est pas systématique toutes les minutes, bien que la scène domoChart a bien tourné. Je te remets ici également la scène domoCharts adaptée avec le setTimeout pour info, mais je regarde pour adapter le décalage. --[[ %% properties %% autostart %% globals --]] local VirtualDeviceID = 157 function start() local seconde = os.date('%S') if tonumber(seconde) ~= 0 then local delta = 60 - seconde fibaro:debug("Time is " .. os.date('%H:%M:%S') .. ", waiting for " .. delta .. " seconds...") fibaro:sleep(delta*1000) end hour = os.date('%H') day = os.date('%d') end function domoCharts() -- Actions to perform every new minute fibaro:call(VirtualDeviceID, "pressButton", "1"); -- Sensors (Temperature, humidity, light) fibaro:call(VirtualDeviceID, "pressButton", "2"); -- Power consumption --fibaro:call(17, "pressButton", "1"); -- Eco-Devices Teleinfo -- Actions to perform every new hour local newhour = os.date('%H') if newhour ~= hour then fibaro:debug('New hour') -- Actions to perform at 23:00 if tonumber(newhour) == 23 then fibaro:call(VirtualDeviceID, "pressButton", "3"); -- Battery level end hour = newhour end -- Actions to perform every new day local newday = os.date('%d') if newday ~= day and tonumber(os.date('%M')) >= 1 then fibaro:debug('New day') fibaro:call(VirtualDeviceID, "pressButton", "4"); -- Devices fibaro:call(VirtualDeviceID, "pressButton", "5"); -- Trend data fibaro:call(VirtualDeviceID, "pressButton", "6"); -- Energy --fibaro:call(81, "pressButton", "1"); -- Water day = newday end fibaro:debug('Last run : ' .. os.date('%d/%m/%Y %H:%M:%S')) setTimeout(function() domoCharts() end, 60*1000) --vérification toutes les minutes end -- démarrage à la seconde 0 start() -- démarrage de la boucle domoCharts domoCharts() Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés