TitiXsi Posté(e) le 8 février Signaler Posté(e) le 8 février il y a 19 minutes, Lazer a dit : D'ailleurs ta question n'a rien à voir avec les QuickApp directement, mais plutôt aux possibilités du langage LUA en général. Là tu as raison... J'en reviens donc au sujet de base les QA... J'essaie de faire une QA avec un switch ON/OFF Je voudrais que suivant l'état du switch il exécute ou n'exécute pas le code ON : Je lance le code avec une boucle de 5min OFF : je stoppe la boucle Malheureusement, le switch n'est pas actif lorsque la boucle est en attente.. Voici mon code local function loop() -- Chanel_1 Get_HC3_Values_send_to_ThingSpeak(Key_Chanel_1,ids_for_Chanel_1) -- loop if (hub.getValue(plugin.mainDeviceId,"state") == true) then setTimeout(loop,60*1000*loop_value_min) --- minutes --setTimeout(loop,1000*loop_value_min) -- secondes for debug end end function QuickApp:turnOn() self:debug("binary switch turned on") self:updateProperty("value", true) loop() end function QuickApp:turnOff() self:debug("binary switch turned off") self:updateProperty("value", false) end --================================================================================================-- -- MAIN -- --================================================================================================-- function QuickApp:onInit() self:debug("onInit") self:turnOn() end Note : Désolé, le coloring n'est pas présent... dès que je sélectionne le langage lua dans le champs codage, je n'ai plus rien dans mon post... 3 fois que je perds tout... Grrrr
Lazer Posté(e) le 8 février Signaler Posté(e) le 8 février (modifié) Alors je développe pas mal en Shell à mes heures perdues, mais le backquote (ou le $(...)) ne sert pas à évaluer le nom d'une variable sous forme de chaine de caractère, mais à évaluer une commande complète. Ou alors je veux bien un exemple où tu manipules le nom d'une variable, car il ne me semble jamais avoir vu ça en Shell. EDIT : après les scripts Shell ne sont pas compilés, mais interprétés, donc ça change beaucoup de choses, les possibilités peuvent être différentes. Modifié le 8 février par Lazer
TitiXsi Posté(e) le 8 février Signaler Posté(e) le 8 février (modifié) Ça permet d'évaluer et de donner la valeur d'une commande qui peut être passée en string. Je me suis sûrement mal exprimé... Bref.. le backquote est très utile dans ces cas là . [Hors sujet off] Édit suite à ton édit, c'est claire que ç'est différents Modifié le 8 février par TitiXsi
Lazer Posté(e) le 8 février Signaler Posté(e) le 8 février Oui voilà tu l'as dit, "une commande" passée en string, pas un "nom de variable" manipulé en string Le truc, c'est que quelque soit le langage de programmation, tu ne peux pas jouer avec le nom des variables qui est défini lors de la compilation du programme, c'est à dire avant son lancement. Durant l'exécution du programme, le nom des variables n'existe même pas, ce sont juste des emplacements mémoires, à des adresses bien précises, que le CPU va aller lire/écrire. C'est pour cela que je t'ai indiqué qu'on utilise les Tables en LUA, on peut manipuler leur contenu à loisir avec des index. Ces index peuvent être de type numérique (entier à partir de 1 en LUA, ou à partir de 0 dans de nombreux autres langages), ou bien de type chaine de caractère (string) Et là, cet index de type string, on peut le manipuler, c'est tout à fait possible. Par ex : local myTable = { myIndex_1 = "Hello", myIndex_2 = "World", } for i = 1, 2 do local ton_index_en_string_devant_le_prisunic = "myIndex_" .. i print("nom de l'index : ", ton_index_en_string_devant_le_prisunic) local value = myTable[ton_index_en_string_devant_le_prisunic] print("valeur de l'index : ", value) end Ce qui se rapproche un peu de ce que tu cherchais à faire initialement, un peu plus lourd à manipuler, mais fonctionnel (j'ai pas testé ce bout de code donc j'espère qu'il n'y a pas d'erreur de syntaxe, mais c'est pour expliquer le principe)
TitiXsi Posté(e) le 8 février Signaler Posté(e) le 8 février Sympa la référence au prisunic . J'ai utilisé la table indiquée plus haut et ça fonctionne impeccablement. Je passe juste 2 paramètres au lieu d'un seul, pas dramatique. Merci Sinon pour en revenir au sujet, si tu as une idée pour la qa déclarée en device de type Switch, je suis preneur, sinon, ça restera comme ça sans arrêt possible.
Lazer Posté(e) le 8 février Signaler Posté(e) le 8 février Ah désolé j'ai loupé ton message concernant le QA switch J'ai regardé, mais je ne comprends pas ce qui te pose problème ? Je ne sais pas si j'ai compris ce que tu cherches à faire, mais j'aurais procédé différemment : - Une loop infinie - les fonctions turnOn et turnOff activent une variable true/false - lors de chaque exécution, la loop vérifie la valeur de la variable, et si true, alors effectue l'action. Plus simple et efficace ainsi je pense.
TitiXsi Posté(e) le 9 février Signaler Posté(e) le 9 février (modifié) C'est ce que j'ai fait en premier, mais je me suis rendu compte que lorsque la fonction est sur le Time Out, le bouton du device n'est pas opérant... Je referai des tests demain avec un truc plus simple et je posterai le fichier. Modifié le 9 février par TitiXsi
TitiXsi Posté(e) le 9 février Signaler Posté(e) le 9 février Il y a 8 heures, TitiXsi a dit : C'est ce que j'ai fait en premier, mais je me suis rendu compte que lorsque la fonction est sur le Time Out, le bouton du device n'est pas opérant... Je referai des tests demain avec un truc plus simple et je posterai le fichier. Je viens de comprendre.. Quel buse... La case "Appareil désactivé" était cochée... Punaise, je comprenais pas pourquoi avec un nouveau device tout propre c'était ok, mais pas avec l'autre ... Bref, si ca peut aider, je partage un morceau de code qui fait le job local loop_value_sec = 5 ---------------------------------------------------------------------------------------------------- -- check locales variables ---------------------------------------------------------------------------------------------------- print("----------------START-".._ID.."_"..Main_Device.."--------------------") --================================================================================================-- -- Functions -- --================================================================================================-- local function loop() if (hub.getValue(plugin.mainDeviceId,"state") == true) then tools:trace("Run Loop") -- loop then setTimeout(loop,1000*loop_value_sec) -- secondes end end function QuickApp:turnOn() self:debug("binary switch turned on") self:updateProperty("value", true) loop() end function QuickApp:turnOff() self:debug("binary switch turned off") self:updateProperty("value", false) end --================================================================================================-- -- MAIN -- --================================================================================================-- function QuickApp:onInit() self:debug("onInit") self:turnOn() end
jang Posté(e) le 10 février Signaler Posté(e) le 10 février Problems: 1. You set 'value' but test 'state' 2. If you click 'off' -> 'on' quickly you may end up with 2 running loops... I think @laser meant something like this (but here we use the property instead of a local var) local function loop() if (hub.getValue(plugin.mainDeviceId,"value") == true) then print("Run Loop action") end -- loop setTimeout(loop,1000*loop_value_sec) -- secondes end loop() function QuickApp:turnOn() self:debug("binary switch turned on") self:updateProperty("value", true) end function QuickApp:turnOff() self:debug("binary switch turned off") self:updateProperty("value", false) end 1
TitiXsi Posté(e) le 10 février Signaler Posté(e) le 10 février Jang, you have torally right! It's m'y Bad
Fred.domotique Posté(e) le 10 juin Signaler Posté(e) le 10 juin Bonjour, J'essai de réaliser un premier QA pour la gestion de mon jardin entre arrosage auto, robot de tonte et associé à la météo et aussi au prévision, 1er objectif est qu'il récupère mes données de mon pluviomètre Netatmo (pluie de la journée) le stock dans une variable du QA. (Cette partie fonctionne). 2nd objectif variable avec le cumul des précipitations sur 7 jours, (je coince déjà...) enfaite dans le code ci joint la fonction updateCumulPluie7J semble faire le boulot mais à la lecture des variables journalières il lit 0 alors que j'ai des données différentes 0.1 - 1.1. Mon soucis est donc dans la lecture de mes variables pour faire leurs total. Avez vous une idée pour un débutant en QA... Citation -- Définir les identifiants local moduleID = 602 -- Remplacez 602 par l'ID de votre module local QA_ID = 756 -- Remplacez 756 par l'ID de votre QuickApp -- Fonction pour lire la valeur du module local function readModuleValue() local value = fibaro.getValue(moduleID, "value") return tonumber(value) or 0 end -- Fonction pour lire la valeur d'une variable QA local function readQAVariable(variableName) local value = fibaro.getValue(QA_ID, variableName) return tonumber(value) or 0 end -- Définir les variables pour chaque jour de la semaine local dailyVariables = { [1] = "Cumul_pluie_dim", -- Dimanche [2] = "Cumul_pluie_lun", -- Lundi [3] = "Cumul_pluie_mar", -- Mardi [4] = "Cumul_pluie_mer", -- Mercredi [5] = "Cumul_pluie_jeu", -- Jeudi [6] = "Cumul_pluie_ven", -- Vendredi [7] = "Cumul_pluie_sam" -- Samedi } -- Fonction pour mettre à jour la variable Cumul_pluie_7J local function updateCumulPluie7J() local total = 0 for _, variableName in pairs(dailyVariables) do total = total + readQAVariable(variableName) end fibaro.call(QA_ID, "setVariable", "Cumul_pluie_7J", tostring(total)) end -- Fonction pour mettre à jour la variable de QA local function updateQAVariable(dayOfWeek, value) local variableName = dailyVariables[dayOfWeek] if variableName then fibaro.call(QA_ID, "setVariable", variableName, tostring(value)) -- Mettre à jour le cumul des 7 jours après chaque mise à jour journalière updateCumulPluie7J() else fibaro.debug("Error", "Invalid day of the week: " .. tostring(dayOfWeek)) end end -- Fonction pour planifier l'exécution à 09h10 local function scheduleNextRun() local currentDate = os.date("*t") local targetTime = os.time({year=currentDate.year, month=currentDate.month, day=currentDate.day, hour=9, min=42, sec=10}) local delay if os.time() >= targetTime then targetTime = targetTime + 86400 -- Ajouter un jour en secondes si 09h10 est déjà passé end delay = targetTime - os.time() fibaro.setTimeout(delay * 1000, function() local moduleValue = readModuleValue() local currentDayOfWeek = os.date("*t", os.time()).wday updateQAVariable(currentDayOfWeek, moduleValue) scheduleNextRun() -- Replanifier pour le jour suivant end) end -- Initialisation et planification de la première exécution à 09h10 scheduleNextRun() function QuickApp:onInit() self:debug("onInit") end
jojo Posté(e) le 10 juin Signaler Posté(e) le 10 juin Les variables locales ne sont pas dispo dans les autres fonctions. l'instruction pour lire une variable du QA (encours) est : self:getVariable("NOM_DE_LA_VARIABLE") -- La lecture de la valeur d'une variable existante j'ai lu jusqu'ici total = total + readQAVariable(variableName) je mettrais ceci : total = total + self:readQAVariable(variableName)
Fred.domotique Posté(e) le 11 juin Signaler Posté(e) le 11 juin Merci Jojo pour l'indication, pour le moment avec cette modification j'ai encore une erreur. Mais je vais fouiller sur cette piste. Citation [11.06.2024] [08:52:50] [ERROR] [QUICKAPP756]: timer handler failed with error: ./include/main.lua:32: attempt to index a nil value (global 'self')
Fred.domotique Posté(e) le 11 juin Signaler Posté(e) le 11 juin (modifié) il y a une heure, Fred.domotique a dit : Merci Jojo pour l'indication, pour le moment avec cette modification j'ai encore une erreur. Mais je vais fouiller sur cette piste. Je pense que la construction global ne dois pas être correct. Ci dessous le code qui fonctionne pour incrémenter chaque jour le cumul de mon pluviomètre dans les variables "Cumul_plui_lun" "....._mar" etc.. Comment rajouterais tu une fonction qui cumul les 7 jours dans une nouvelle variable nommé "Cumul_pluie_J" Citation -- Définir les identifiants local moduleID = 602 -- Remplacez 602 par l'ID de votre module local QA_ID = 756 -- Remplacez 756 par l'ID de votre QuickApp -- Fonction pour lire la valeur du module local function readModuleValue() local value = fibaro.getValue(moduleID, "value") return tonumber(value) or 0 end -- Définir les variables pour chaque jour de la semaine local dailyVariables = { [1] = "Cumul_pluie_dim", -- Dimanche [2] = "Cumul_pluie_lun", -- Lundi [3] = "Cumul_pluie_mar", -- Mardi [4] = "Cumul_pluie_mer", -- Mercredi [5] = "Cumul_pluie_jeu", -- Jeudi [6] = "Cumul_pluie_ven", -- Vendredi [7] = "Cumul_pluie_sam" -- Samedi } -- Fonction pour mettre à jour la variable de QA local function updateQAVariable(dayOfWeek, value) local variableName = dailyVariables[dayOfWeek] if variableName then fibaro.call(QA_ID, "setVariable", variableName, tostring(value)) else fibaro.debug("Error", "Invalid day of the week: " .. tostring(dayOfWeek)) end end -- Fonction pour planifier l'exécution à 09h10 local function scheduleNextRun() local currentDate = os.date("*t") local targetTime = os.time({year=currentDate.year, month=currentDate.month, day=currentDate.day, hour=9, min=58, sec=00}) local delay if os.time() >= targetTime then targetTime = targetTime + 86400 -- Ajouter un jour en secondes si 09h10 est déjà passé end delay = targetTime - os.time() fibaro.setTimeout(delay * 1000, function() local moduleValue = readModuleValue() local currentDayOfWeek = os.date("*t", os.time()).wday updateQAVariable(currentDayOfWeek, moduleValue) scheduleNextRun() -- Replanifier pour le jour suivant end) end -- Initialisation et planification de la première exécution à 09h10 scheduleNextRun() function QuickApp:onInit() self:debug("onInit") end Merci Modifié le 11 juin par Fred.domotique
Fred.domotique Posté(e) le 12 juin Signaler Posté(e) le 12 juin Je me répond sur une solution trouvé ce jour. En test pour le moment. Citation -- Définir les identifiants local moduleID = 602 -- Remplacez 602 par l'ID de votre module local QA_ID = 756 -- Remplacez 756 par l'ID de votre QuickApp -- Fonction pour lire la valeur du module local function readModuleValue() local value = fibaro.getValue(moduleID, "value") return tonumber(value) or 0 end -- Définir les variables pour chaque jour de la semaine local dailyVariables = { [1] = "Cumul_pluie_dim", -- Dimanche [2] = "Cumul_pluie_lun", -- Lundi [3] = "Cumul_pluie_mar", -- Mardi [4] = "Cumul_pluie_mer", -- Mercredi [5] = "Cumul_pluie_jeu", -- Jeudi [6] = "Cumul_pluie_ven", -- Vendredi [7] = "Cumul_pluie_sam" -- Samedi } -- Fonction pour mettre à jour la variable de QA local function updateQAVariable(dayOfWeek, value) local variableName = dailyVariables[dayOfWeek] if variableName then fibaro.call(QA_ID, "setVariable", variableName, tostring(value)) else fibaro.debug("Error", "Invalid day of the week: " .. tostring(dayOfWeek)) end end -- Fonction pour calculer le cumul des précipitations sur 7 jours local function cumul_7J(self) -- Lecture des Variables journalières local Cumul_pluie_lun = tonumber(self:getVariable("Cumul_pluie_lun")) or 0 local Cumul_pluie_mar = tonumber(self:getVariable("Cumul_pluie_mar")) or 0 local Cumul_pluie_mer = tonumber(self:getVariable("Cumul_pluie_mer")) or 0 local Cumul_pluie_jeu = tonumber(self:getVariable("Cumul_pluie_jeu")) or 0 local Cumul_pluie_ven = tonumber(self:getVariable("Cumul_pluie_ven")) or 0 local Cumul_pluie_sam = tonumber(self:getVariable("Cumul_pluie_sam")) or 0 local Cumul_pluie_dim = tonumber(self:getVariable("Cumul_pluie_dim")) or 0 -- Ecriture de la Variable de Cumul à 7 Jours local cumul_7J = Cumul_pluie_lun + Cumul_pluie_mar + Cumul_pluie_mer + Cumul_pluie_jeu + Cumul_pluie_ven + Cumul_pluie_sam + Cumul_pluie_dim self:setVariable("Cumul_pluie_7J", tostring(cumul_7J)) -- Lecture de Variable de Cumul et affichage debug local statut = self:getVariable("Cumul_pluie_7J") self:debug("Cumul_pluie_7J", "text", statut) end -- Fonction pour planifier l'exécution à 23h58 local function scheduleNextRun(self) local currentDate = os.date("*t") local targetTime = os.time({year=currentDate.year, month=currentDate.month, day=currentDate.day, hour=23, min=58, sec=00}) local delay if os.time() >= targetTime then targetTime = targetTime + 86400 -- Ajouter un jour en secondes si 23h58 est déjà passé end delay = targetTime - os.time() fibaro.setTimeout(delay * 1000, function() local moduleValue = readModuleValue() local currentDayOfWeek = os.date("*t", os.time()).wday updateQAVariable(currentDayOfWeek, moduleValue) cumul_7J(self) -- Exécuter la fonction cumul_7J après mise à jour scheduleNextRun(self) -- Replanifier pour le jour suivant end) end -- Initialisation et planification de la première exécution à 23h58 function QuickApp:onInit() self:debug("onInit") scheduleNextRun(self) cumul_7J(self) -- Appeler la fonction cumul_7J lors de l'initialisation end
Messages recommandés