Allan2b Posté(e) le 4 septembre 2016 Signaler Posté(e) le 4 septembre 2016 Bonjour , j'aurais besoin d'aide pour finir la programmation de ma piscine que je mettrais sur le forum . J'explique : La piscine est gérer par une ipx800 V3 Pour calculer le temps de filtration de ma piscine en fonction de la temperature de l'eau, j'aurais besoin de connaitre la valeur max atteint la veille. la temperature est stocker dans un variable mais je n'arrive pas a sauvegarder la valeur max sur une journée . pouvez m'aidez je galère .
jojo Posté(e) le 4 septembre 2016 Signaler Posté(e) le 4 septembre 2016 tu dois passer par une variable temporaire. Dans la variable temporaire, tu stockes la valeur "instantanée" qui vient de ton IPX ensuite tu (la HC2) la compares avec la valeur de la seconde variable, et si la valeur est supérieure, tu la notes dans la seconde variable
Allan2b Posté(e) le 4 septembre 2016 Auteur Signaler Posté(e) le 4 septembre 2016 Merci Jojo , mon code a l'air de bien fonctionner , peut tu me dire si mon code pourrais être plus simple ou pus propre. --[[ %% autostart %% properties %% events %% globals --]] fibaro:debug("HC2 a démarré le script le " .. os.date()) local sourceTrigger = fibaro:getSourceTrigger() if (sourceTrigger["type"] == "autostart") then while true do local currentDate = os.date("*t") local startSource = fibaro:getSourceTrigger() -- Heure àlaquelle vous souhaitez générer le rapport journalier reportTime = "23:58" local Temp_piscine = fibaro:getGlobalValue("valueTemp_piscine") -- T° Piscine local Temp_piscine2 = fibaro:getGlobalValue("valueTemp_piscine2") --T° Piscine + 1 Min local Temp_piscineM = fibaro:getGlobalValue("valueTemp_piscineM") --T° Piscine Max local Temp_piscineV = fibaro:getGlobalValue("valueTemp_piscineV") --T° Piscine de la Veille fibaro:setGlobal("valueTemp_piscine2", Temp_piscine) fibaro:debug(('Temperature = ' .. Temp_piscine).."°") if (( tonumber(fibaro:getGlobalValue("valueTemp_piscine2")) >= tonumber(fibaro:getGlobalValue("valueTemp_piscine")))) then fibaro:setGlobal("valueTemp_piscineM",Temp_piscine2) end -- Tous les jours àminuit, je stockera valeur de la T° Max. if tostring(os.date("%H:%M")) == reportTime then fibaro:setGlobal("valueTemp_piscineV",Temp_piscineM) --T° Piscine de la Veille fibaro:setGlobal("valueTemp_piscineM","0") fibaro:debug(('Temperature Max= ' .. Temp_piscineV).."°") end fibaro:sleep(60*1000) -- 1 Minutes end end
jojo Posté(e) le 4 septembre 2016 Signaler Posté(e) le 4 septembre 2016 je mettrais déjàle reportTime = "23:58" en dehors de la boucle while true do avant d'écrire dans une variable, je vérifie (quand c'est possible) que la valeur que je veux y écrire est différente de celle qu'elle contient. Surtout que dans le cas d'une piscine la température ne change pas toutes les min
jojo Posté(e) le 4 septembre 2016 Signaler Posté(e) le 4 septembre 2016 tu as fait ceci : fibaro:setGlobal("valueTemp_piscine2", Temp_piscine) donc la condition if (( tonumber(fibaro:getGlobalValue("valueTemp_piscine2")) >= tonumber(fibaro:getGlobalValue("valueTemp_piscine")))) sera toujours = ?
Allan2b Posté(e) le 4 septembre 2016 Auteur Signaler Posté(e) le 4 septembre 2016 Oui au debut j'avais mit toute les 30 minutes le relever de T°, mais je n'arrive pas a envoyer le rapport a l'heur que je voudrait. il faut peux être que je crée deux scenes?
jojo Posté(e) le 4 septembre 2016 Signaler Posté(e) le 4 septembre 2016 voici une scène écrite par Lazer pour faire exécuter un VD àun moment précis (toutes les sec, min, heure, jour, ....) --[[ %% properties %% autostart %% globals --]] local idEmoncms = 334 -- EMONCMS 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 local hour = os.date('%H') local day = os.date('%d') while true do -- Actions to perform every new minute fibaro:call(idEmoncms, "pressButton", "1"); -- Graphe -- Actions to perform every new hour local newhour = os.date('%H') if newhour ~= hour then fibaro:debug('New hour') -- 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') -- day = newday end fibaro:debug('Last run : ' .. os.date('%H:%M:%S')) fibaro:sleep(60*1000) -- 1 minute end
Allan2b Posté(e) le 4 septembre 2016 Auteur Signaler Posté(e) le 4 septembre 2016 c'est genial merci , donc je peux tout faire avec une seul scene en faisant comme ceci --[[ %% properties %% autostart %% globals --]] 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 local hour = os.date('%H') local day = os.date('%d') while true do local Temp_piscine = fibaro:getGlobalValue("valueTemp_piscine") -- T° Piscine local Temp_piscine2 = fibaro:getGlobalValue("valueTemp_piscine2") --T° Piscine + 1 Min local Temp_piscineM = fibaro:getGlobalValue("valueTemp_piscineM") --T° Piscine Max local Temp_piscineV = fibaro:getGlobalValue("valueTemp_piscineV") --T° Piscine de la Veille -- Actions to perform every new minute fibaro:debug('New minute') -- Actions to perform every new hour local newhour = os.date('%H') if newhour ~= hour then fibaro:setGlobal("valueTemp_piscine2", Temp_piscine) fibaro:debug(('Temperature = ' .. Temp_piscine2).."°") if (( tonumber(fibaro:getGlobalValue("valueTemp_piscine2")) >= tonumber(fibaro:getGlobalValue("valueTemp_piscine")))) then fibaro:setGlobal("valueTemp_piscineM",Temp_piscine2) 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:setGlobal("valueTemp_piscineV",Temp_piscineM) --T° Piscine de la Veille fibaro:setGlobal("valueTemp_piscineM","0") fibaro:debug(('Temperature Max= ' .. Temp_piscineV).."°") day = newday end fibaro:debug('Last run : ' .. os.date('%H:%M:%S')) fibaro:sleep(60*1000) -- 1 minute end
Allan2b Posté(e) le 4 septembre 2016 Auteur Signaler Posté(e) le 4 septembre 2016 tous le jour c'est bien a 0H00 et pas le lendemain a l'heur a laquelle a été lancer le script?
Steven Posté(e) le 5 septembre 2016 Signaler Posté(e) le 5 septembre 2016 Il suffit d'envoyer ce code àpartir de n'importe quand pour avoir la température max de la veille : function getMaxTempYesterday(id) local t = os.date("*t") t.day = t.day - 1 local debut = os.time{year=t.year, month=t.month, day=t.day, hour=0, min=0, sec=0} local fin = os.time{year=t.year, month=t.month, day=t.day, hour=23, min=59, sec=59} local res = api.get("/temperature/"..debut.."/"..fin.."/compare/devices/temperature/"..id) return res[1].max end local max_hier = getMaxTempYesterday(442) fibaro:debug("La température maximum était de " .. max_hier) . 442 est l'id de mon capteur de température. 2
Allan2b Posté(e) le 5 septembre 2016 Auteur Signaler Posté(e) le 5 septembre 2016 Merci Steven , Ça fonctionne aussi même si mon capteur de température est sur mon ipx donc virtuel sur la HC2? 1
Steven Posté(e) le 5 septembre 2016 Signaler Posté(e) le 5 septembre 2016 Arggg, non, sauf si tu as pu installer le Virtual Sensor de Krikroff : http://www.domotique-fibaro.fr/index.php/topic/2164-plugin-virtual-sensor/ Désolé de ne pas avoir tout lu, j'ai juste lu le sujet et partagé sans réfléchir un morceau de code.
Allan2b Posté(e) le 5 septembre 2016 Auteur Signaler Posté(e) le 5 septembre 2016 Non je l'ai supprimer . c'est pas grave ton code me servira quand même .
Allan2b Posté(e) le 5 septembre 2016 Auteur Signaler Posté(e) le 5 septembre 2016 Steven peux tu me donner ton avis sur le code que j'utilise pour récupéré la température de L ipx , je l'ai récupéré sur le forum mais il ne manque pas une boucle? HC2 = Net.FHttp("192.168.1.30") 8 response ,status, errorCode = HC2:GET("/api/xdevices.json?cmd=30") 9 if response ~= nill and tonumber(status)==200 then 10 response = json.decode(response) 11 local valueTemp = tonumber(response.AN1 or 0) 12 local valueTempok = valueTemp* 0.323 - 50 13 local valueTempokstr = " "..string.format("%.2f", valueTempok).." °C" 14 fibaro:setGlobal("valueTemp_piscine", valueTempok) 15 fibaro:debug(valueTemp * 0.323 - 50) 16 fibaro:call(selfId, "setProperty", "ui.Label1.value", valueTempokstr) 17 18 else 19 fibaro:debug("Error: Failed to load json") 20
Steven Posté(e) le 5 septembre 2016 Signaler Posté(e) le 5 septembre 2016 En effet, ce code ne va s'exécuter qu'une seule fois puisque, comme tu le précise, il n'y a pas de boucle sauf si tu le met dans le main loop d'un module virtuel (dans ce cas, il sera exécuté toutes les 3 secondes) Par contre, je n'aime pas du tout ce genre de code qui s'exécute en boucle pour rien. En effet, si la valeur ne change pas, il n'y a aucune raison de faire un appel http pour rien. De plus, faire des appel http dans un main loop est souvent source de plantée de la HC2 Le meilleur moyen est de traiter l'information ainsi : L'IPX envoi la valeur à la HC2 (uniquement quand la valeur change) L'HC2 traite la valeur et la stocke Voici comment je fais (purement personnel). J'ai un Module Virtuel qui va recevoir les données de l'IPX ( 1 label par valeur reçu ). Ce module est caché. J'au un scénario qui va écouter les changement du Module Virtuel ci-dessus et qui va traiter l'information. Exemple : J'ai un module virtuel (id 484) avec un label "ConsoGlobal" (représente la consommation électrique de ma maison) . Sur mon IPX j'ai ajouté ceci sur mon analogue cette rquête va mettre à jour le label ConsoGlobal avec la valeur de mon analog 5 : Ensuite j'ai un scénario qui va récupérer les changement de libellé sur le module virtuel caché et qui va les traiter : --[[ %% properties 484 ui.ConsoGlobal.value --]] actions = { ["ui.ConsoGlobal.value"] = function(value) fibaro:debug(value) local valueTempok = tonumber(value) * 0.323 - 50 local valueTempokstr = " "..string.format("%.2f", valueTempok).." °C" fibaro:setGlobal("valueTemp_piscine", valueTempok) fibaro:call(283, "setProperty", "ui.Label1.value", valueTempokstr) end, } -- =============================== -- Démarrage du script -- =============================== local trigger = fibaro:getSourceTrigger() if (trigger.type == "property") then property = trigger.propertyName device = trigger.deviceID value = fibaro:getValue(device, property) actions[property](value) end Ce script peux gérer plein de bouton. Et voilà .... tordu ... non ? 3 avantages à ce procédé : il est instantané (des que la valeur change, tout ce met à jour), il ne s'exécute que lorsque cela est nécessaire et pour finir, on a pas besoin de variable globale puisque le label "ConsoGlobal" est toujours présent et toujours à jour. Donc au lieu de faire fibaro:getGlobalValue(...) on peux faire fibaro:getValue(484, "ui.ConsoGlobal.label").
Allan2b Posté(e) le 5 septembre 2016 Auteur Signaler Posté(e) le 5 septembre 2016 Je te remercie pour ce tuto tres vien bien expliquer. Je vais tester demain soir . Vu que je suis reparti de zéro depuis la dernière stable àcause des 503 a répétition. Je voudrais essayer de remettre au propre certain script qui consomme de la memoir pour rien . 1
Allan2b Posté(e) le 6 septembre 2016 Auteur Signaler Posté(e) le 6 septembre 2016 je viens de tester pour la température je n'arrive pas a mettre a jour le label T° depuis l'ipx le serveur et le login sont bien renseigner. /api/callAction?deviceID=16&name=setProperty&arg1=ui.TempPiscine.value&arg2='$A1'
Steven Posté(e) le 6 septembre 2016 Signaler Posté(e) le 6 septembre 2016 '$A1' ... ne devrait-il pas être '$A' tout simplement ?
Allan2b Posté(e) le 6 septembre 2016 Auteur Signaler Posté(e) le 6 septembre 2016 les deux ne fonctionne pas
Allan2b Posté(e) le 6 septembre 2016 Auteur Signaler Posté(e) le 6 septembre 2016 je n'arrive pas a modifier mon label depuis la requête http://xxx:xxx@xxx.xxx.x.xx/api/callAction?deviceID=16&name=setProperty&arg1=ui.TempPiscine.value&arg1&arg2=Ok
Steven Posté(e) le 6 septembre 2016 Signaler Posté(e) le 6 septembre 2016 16 est bien l'ID du module virtuel qui contient le bouton dans l'ID est TempPiscine ? Car aucune raison que cela ne fonctionne pas.
Allan2b Posté(e) le 6 septembre 2016 Auteur Signaler Posté(e) le 6 septembre 2016 juste une question a quel moment par le push pour les entree analogique de l ipx pour la HC2 ?
Messages recommandés