jojo Posté(e) le 17 mai 2022 Signaler Partager Posté(e) le 17 mai 2022 Bonjour, J'essaie de découvrir lua programmation LUA dans les QA de la HC3. Moi qui était fier de mon coup, et bien zut ça ne marche pas. J'i cherché toute l'après-midi sans trouver pourquoi/ou était mon erreur. Le voici : -- Binary switch type should handle actions turnOn, turnOff -- To update binary switch state, update property "value" with boolean 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 -- To update controls you can use method self:updateView(<component ID>, <component property>, <desired value>). Eg: -- self:updateView("slider", "value", "55") -- self:updateView("button1", "text", "MUTE") -- self:updateView("label", "text", "TURNED ON") -- This is QuickApp inital method. It is called right after your QuickApp starts (after each save or on gateway startup). -- Here you can set some default values, setup http connection or get QuickApp variables. -- To learn more, please visit: -- * https://manuals.fibaro.com/home-center-3/ -- * https://manuals.fibaro.com/home-center-3-quick-apps/ function QuickApp:onInit() self:debug("onInit") -- IDs générés le : 16/05/22 à 21:50:36 id = { --Cuisine TMP_CUISINE = 23, --Salon TMP_SALON_SET = 99, TMP_SALON = 100, HUM_SALON = 101, --Hall d'entrée MVT_HALLENTREE_ENTREE = 54, LUX_HALLENTREE_ENTREE = 56, MVT_HALLENTREE_CUISINE = 32, --Ch Parents TMP_PARENTS = 29, --SdB RdC TMP_SDBRDC = 159, CHAUF_SDBRDC_RADIATEUR = 162, CHAUF_SDBRDC_THERMOSTAT = 161, --Dressing PRISE_DRESSING = 107, --Salle de jeux CHAUF_SDJ_THERMOSTAT = 114, CHAUF_SDJ_RADIATEUR = 148, NOISE_SDJ = 93, TMP_SDJ = 94, --Bureau CHAUF_BUREAU_THERMOSTAT = 111, NOISE_BUREAU = 86, TMP_BUREAU = 87, CHAUF_BUREAU_RADIATEUR = 150, PRISE_BUREAU = 104, --Ch Pauline CHAUF_PAULINE_RADIATEUR = 151, TMP_PAULINE = 119, CHAUF_PAULINE_THERMOSTAT = 143, --Ch Max CHAUF_MAX_RADIATEUR = 152, TMP_MAX = 127, CHAUF_MAX_THERMOSTAT = 144, PRISE_MAX = 142, --SdB Etage CHAUF_SDBETAGE_RADIATEUR = 153, TMP_SDBETAGE = 133, CHAUF_SDBETAGE_THERMOSTAT = 145, --Biblio CHAUF_BIBLIO_RADIATEUR = 154, TMP_BIBLIO = 137, CHAUF_BIBLIO_THERMOSTAT = 146, --Jardin HUM_EXTERIEUR = 91, HUSQVARNA_MOWER = 140, TMP_EXTERIEUR = 92, --Piscine GESTIONPISCINE = 171, --Chaufferie CHAUF_CIRCUL_ETAGE = 163, CHAUF_CHAUDIERE = 165, CHAUF_SOLAIRE = 164, GESTIONCHAUFFAGE = 172, CHAUF_ECS_THERMOSTAT = 158, CHAUF_CIRCUL_RDC = 160, TMP_TISUN = 155, CHAUF_ECS_RADIATEUR = 157, --Technical DOMOCHARTS = 166, GEA = 167, NETATMO_2_5_1 = 85, --Test TEMPERATURE_GEN = 168, QA_THERMOTST_COL = 170, LDSWITCH = 169, YR_WEATHER = 3, } Icones = { -- à vérifier Confort = 1007, SdB = 1010, ECS = 1008, Off = 1009 } RoomsConfort = {"SdJ", "Bureau", "Pauline", "Max", "SdBEtage", "Biblio", "SdBRdC", "ECS"} RoomsSdB = {"SdBRdC", "ECS"} RoomsECS = {"ECS"} RoomsOff = RoomsConfort end function QuickApp:GoogleThermo(Room, Mode) self:debug("QA GestionChauffage") self:debug("Param1/Room = "..Room) self:debug("Param2/Mode = "..Mode) Chauf_Maison_Mode, modificationTime = fibaro.getGlobalVariable("Chauf_Maison_Mode") self:debug("Chauf_Maison_Mode = " .. Chauf_Maison_Mode) Thermostat = "CHAUF_"..string.upper(Room).."_THERMOSTAT" Consigne (Room, Mode, Chauf_Maison_Mode) consigne = tonumber (consigne) self:debug("Consigne = " .. consigne) self:debug("Thermostat = " .. Thermostat) fibaro.call(id[Thermostat], "setHeatingThermostatSetpoint", consigne) end function Consigne (Room, Mode, Chauf_Maison_Mode) -- détermination de la consigne en fonction du mode de chauffage Found = false self:debug("Function Consigne") self:debug("Room = "..Room) self:debug("Mode = "..Mode) self:debug("Chauf_Maison_Mode = "..Chauf_Maison_Mode) if Chauf_Maison_Mode == "Confort" then for key, value in pairs(RoomsConfort) do -- Look for key inside entire table if key == Room then -- Your desired key you want to refrence Found = true end end elseif Chauf_Maison_Mode == "SdB" then for key, value in pairs(RoomsSdB) do -- Look for key inside entire table if key == Room then -- Your desired key you want to refrence Found = true end end elseif Chauf_Maison_Mode == "ECS" then for key, value in pairs(RoomsECS) do -- Look for key inside entire table if key == Room then -- Your desired key you want to refrence Found = true end end end if Found then consigne, modificationTime = self:getVariable("Ch"..Room..Mode) -- Con ou Eco else -- hors gel consigne = self:getVariable("ChMaisonHG") end end si une bonne âme savait me dire où j'ai merdé, afin d'éviter que je me pende / que je multiplie les lignes de code à l'"infini" (c'est pourquoi je voulais appeler une fonction dans une autre. A gagner : rien, sinon toute ma gratitude ... Jai regardé ceci, mais n'ai rien compris Lien vers le commentaire Partager sur d’autres sites More sharing options...
Lazer Posté(e) le 17 mai 2022 Signaler Partager Posté(e) le 17 mai 2022 C'est un peu long... et donc j'ai arrêté de lire après les 2 fonctions turnOn et turnOff, car celles-ci ne font rien ! (à part mettre à jour la valeur de la propriété value) Du coup, commençons pas le commencement, que cherches-tu à faire ? Ensuite ne peux tu pas simplifier ton code (= supprimer 99% des lignes...) pour nous partager la structure, ce que tu cherches à faire ? Cela sera plus facile de t'aiguiller. PS : pense à mettre la coloration syntaxique du LUA, car en plus d'être long, ce code est illisible pour mes pauvres yeux d'humains. 1 Lien vers le commentaire Partager sur d’autres sites More sharing options...
jojo Posté(e) le 18 mai 2022 Auteur Signaler Partager Posté(e) le 18 mai 2022 merci d'avoir pris le temps d'essayer de regarder, je fais tout comme demandé ce pm. Je n'avais pas vu (tes yeux vont 10000 fois mieux que les miens) qu'il y avait moyen de choisir la syntaxe quand on ajoute du code ... (=> déjà merci pour ce truc bien utile) Lien vers le commentaire Partager sur d’autres sites More sharing options...
jojo Posté(e) le 18 mai 2022 Auteur Signaler Partager Posté(e) le 18 mai 2022 @Lazer, MERCI de ton offre d'aide. Comme tu l'as senti, j'avais écrit ce post en grand désespoir le cause => à la va-vite. J'ai créé un QA de type Binary Switch afin de pouvoir (plus tard) utiliser les fonctions TurnOn() et TurnOff() pour modifier la VG du mode de chauffage de la maison (cfr un autre post auquel tu as répondu). Donc ce QA gère le chauffage de ma maison : en fonction de calendriers Google, il ajuste le consigne des thermostats virtuels qu'il faut. Evidemment, mes équipements dans mon code sont appelés par leur nom, et il retrouve leur id réel dans la table id={ ...} (merci au passage à Steven). J'ai augmenter la doc du code pour qu'il soit plus lisible. Est-ce bien le cas ? Merci en tout cas function QuickApp:onInit() self:debug("onInit") -- IDs générés le : 16/05/22 à 21:50:36 id = { --Cuisine TMP_CUISINE = 23, --... } -- pièces concernées par le mode de chaufffage de la maison : -- cfr Variable Globale "Chauf_Maison_Mode" : Confort | SdB | ECS | Off -- le mode ECS, est pour maintenir l'eau chaude samitaire à température -- le mode Off, quand ont est par exemple parti en vacances => tous les thermostat en hors gel et pas ECS -- les thermostats ne sont JAMAIS arrêtés, mais en température hors gel (donc en été, celà revient à les arrêter) RoomsConfort = {"SdJ", "Bureau", "Pauline", "Max", "SdBEtage", "Biblio", "SdBRdC", "ECS"} RoomsSdB = {"SdBRdC", "ECS"} RoomsECS = {"ECS"} RoomsOff = RoomsConfort end function QuickApp:GoogleThermo(Room, Mode) -- appelée par le GoogleScript (qui scanne un calendrier Google), pour savoir quelle pièce (Romm) -- à mettre dans quel mode de confage (Mode : Con (=Confort)| Eco (=température réduite) -- récupérer le statut de la VG avec Chauf_Maison_Mode Chauf_Maison_Mode, modificationTime = fibaro.getGlobalVariable("Chauf_Maison_Mode") -- génère le nom de l'équipemebt Thermostat Thermostat = "CHAUF_"..string.upper(Room).."_THERMOSTAT" -- c'est ici mon soucis : -- je souhaite appeller la fonction "Consigne" qui retournera à quelle température il faut chauffer -- quelle pièce (Room) en fonction du mode de chauufage demandé pour la pièe (Mode) -- et du mode de chauffage global de la maison (Chauf_Maison_Mode) Consigne (Room, Mode, Chauf_Maison_Mode) -- ensuite mettre la consigne de température du thermostat concerné à la valeur "consigne" consigne = tonumber (consigne) fibaro.call(id[Thermostat], "setHeatingThermostatSetpoint", consigne) end function Consigne (Room, Mode, Chauf_Maison_Mode) -- détermination de la consigne en fonction du mode de chauffage Found = false -- variable ouléenne à false self:debug("Function Consigne") -- déjà erreur à cette ligne car il ne connait pas self ... -- en fonction du mode de chauffage de la maison -- chercher le nom de la pièce dans le bonne table (RoomsConfort | RoomsSdB | ...) -- si pièce trouvée, variable booléenne à true; sinon elle reste à false if Chauf_Maison_Mode == "Confort" then for key, value in pairs(RoomsConfort) do -- Look for key inside entire table if key == Room then -- Your desired key you want to refrence Found = true end end elseif Chauf_Maison_Mode == "SdB" then for key, value in pairs(RoomsSdB) do -- Look for key inside entire table if key == Room then -- Your desired key you want to refrence Found = true end end elseif Chauf_Maison_Mode == "ECS" then for key, value in pairs(RoomsECS) do -- Look for key inside entire table if key == Room then -- Your desired key you want to refrence Found = true end end end if Found then -- la consigne du thermostat : consigne = valeur de la variable du QA -- le QA contient de nombreuses variables dont le nom est généré en fonction des infos reçues par le GoogleScript. consigne, modificationTime = self:getVariable("Ch"..Room..Mode) -- Con ou Eco else -- hors gel consigne = self:getVariable("ChMaisonHG") end end Lien vers le commentaire Partager sur d’autres sites More sharing options...
Lazer Posté(e) le 18 mai 2022 Signaler Partager Posté(e) le 18 mai 2022 Hum.... d'accord.... et donc c'est Google qui appelle ta fonction QuickApp:GoogleThermo() ? Ensuite tu dis que "ça ne marche pas", mais quel est le message d'erreur ? Je ne suis pas devin, et je t'avoue que je n'ai guère envie de recopier ton code LUA sur ma box pour le tester.... Autre chose, tu n'as quasiment aucune trace de debug dans ton log.... perso quand j'ai un bug que je ne comprends pas, je vais jusqu'à ajouter une ligne de debug entre chaque ligne, pour tracer ligne par ligne. Un peu fastidieux, mais vu qu'on n'a aucun outil de debug à disposition sur la HC3, on fait avec les moyens du bord. 2 Lien vers le commentaire Partager sur d’autres sites More sharing options...
Barelle Posté(e) le 18 mai 2022 Signaler Partager Posté(e) le 18 mai 2022 Déjà, remplacer : function Consigne (Room, Mode, Chauf_Maison_Mode) par function QuickApp:Consigne (Room, Mode, Chauf_Maison_Mode) ainsi la fonction consigne ne plantera plus et affichera bien "Function Consigne". 1 1 Lien vers le commentaire Partager sur d’autres sites More sharing options...
Lazer Posté(e) le 18 mai 2022 Signaler Partager Posté(e) le 18 mai 2022 Dans la mesure où Consigne() est déclarée en tant que variable globale, je ne pense pas que ça plante lors de l'appel de cette fonction ? Et même si ça n'est pas une bonne pratique (cf les discussions l'année dernière sur un topic quelque part...), ça simplifie l'écriture du code. Autrement il faudrait la déclarer en local, et surtout avant son appel. Mais là on va perdre @jojo, donc j'en reviens à la question : quel est le message d'erreur qui lui fait dire que "ça ne marche pas". De toute façon je n'ai encore jamais vu un QuickApp marcher perso, et encore moins ses enfants 1 Lien vers le commentaire Partager sur d’autres sites More sharing options...
jojo Posté(e) le 18 mai 2022 Auteur Signaler Partager Posté(e) le 18 mai 2022 il y a 40 minutes, Barelle a dit : Déjà, remplacer : function Consigne (Room, Mode, Chauf_Maison_Mode) par function QuickApp:Consigne (Room, Mode, Chauf_Maison_Mode) ainsi la fonction consigne ne plantera plus et affichera bien "Function Consigne". merci, c'est comme ça que j'avais fait au début, mais alors je ne savait pas l'appeler (j'avais une erreur). (j'ai des invité dans 10 min, donc j'essaierai demain) Lien vers le commentaire Partager sur d’autres sites More sharing options...
Barelle Posté(e) le 18 mai 2022 Signaler Partager Posté(e) le 18 mai 2022 Cela permet déjà de corriger la ligne : self:debug("Function Consigne") -- déjà erreur à cette ligne car il ne connait pas self ... 1 Lien vers le commentaire Partager sur d’autres sites More sharing options...
jojo Posté(e) le 18 mai 2022 Auteur Signaler Partager Posté(e) le 18 mai 2022 il y a 36 minutes, Lazer a dit : Dans la mesure où Consigne() est déclarée en tant que variable globale, je ne pense pas que ça plante lors de l'appel de cette fonction ? Et même si ça n'est pas une bonne pratique (cf les discussions l'année dernière sur un topic quelque part...), ça simplifie l'écriture du code. Autrement il faudrait la déclarer en local, et surtout avant son appel. Mais là on va perdre @jojo, donc j'en reviens à la question : quel est le message d'erreur qui lui fait dire que "ça ne marche pas". De toute façon je n'ai encore jamais vu un QuickApp marcher perso, et encore moins ses enfants je ne savais pas qu'il faudrait déclarer une fonction dans les variables globales ... avec mes 0.5/10 de vision, je n'ai pas lu tous les topics. Je fais les modifs et poste les messages d'erreur demain ou vendredi. Merci à vous 2 Lien vers le commentaire Partager sur d’autres sites More sharing options...
jojo Posté(e) le 18 mai 2022 Auteur Signaler Partager Posté(e) le 18 mai 2022 il y a 6 minutes, Barelle a dit : Cela permet déjà de corriger la ligne : self:debug("Function Consigne") -- déjà erreur à cette ligne car il ne connait pas self ... oui, merci, en effet, mais comment l'appeler ? QuickApp:Consigne (...) ? Lien vers le commentaire Partager sur d’autres sites More sharing options...
Barelle Posté(e) le 18 mai 2022 Signaler Partager Posté(e) le 18 mai 2022 self:Consigne (Room, Mode, Chauf_Maison_Mode) 1 Lien vers le commentaire Partager sur d’autres sites More sharing options...
Lazer Posté(e) le 18 mai 2022 Signaler Partager Posté(e) le 18 mai 2022 (modifié) @Barelle ah ben oui, bravo, au moins toi tu as lu les commentaires du code LUA @jojo attention il faudra que tu appelles ta fonction comme ceci du coup (avec l'ajout de self devant, car ta fonction sera un membre de QuickApp) : self:Consigne(Room, Mode, Chauf_Maison_Mode) Il y a beaucoup de discussions sur le forum, difficile de rattraper ton retard, le meilleur tuto pour comprendre les bases des QuickApp (avec rappel des notions importantes en LUA) c'est sur le forum officiel par @jang : https://forum.fibaro.com/topic/49113-hc3-quickapps-coding-tips-and-tricks/page/21/#comment-207742 https://forum.fibaro.com/topic/49113-hc3-quickapps-coding-tips-and-tricks/page/21/#comment-207789 https://forum.fibaro.com/topic/49113-hc3-quickapps-coding-tips-and-tricks/page/21/#comment-207833 https://forum.fibaro.com/topic/49113-hc3-quickapps-coding-tips-and-tricks/page/54/#comment-223530 EDIT : vous êtes trop rapides, vous faites les questions et les réponses ! Modifié le 18 mai 2022 par Lazer 1 Lien vers le commentaire Partager sur d’autres sites More sharing options...
jojo Posté(e) le 18 mai 2022 Auteur Signaler Partager Posté(e) le 18 mai 2022 merci, je dois aller m'occuper de mes autres amis 1 Lien vers le commentaire Partager sur d’autres sites More sharing options...
jojo Posté(e) le 19 mai 2022 Auteur Signaler Partager Posté(e) le 19 mai 2022 Il y a 20 heures, Lazer a dit : @Barelle ah ben oui, bravo, au moins toi tu as lu les commentaires du code LUA @jojo attention il faudra que tu appelles ta fonction comme ceci du coup (avec l'ajout de self devant, car ta fonction sera un membre de QuickApp) : self:Consigne(Room, Mode, Chauf_Maison_Mode) Il y a beaucoup de discussions sur le forum, difficile de rattraper ton retard, le meilleur tuto pour comprendre les bases des QuickApp (avec rappel des notions importantes en LUA) c'est sur le forum officiel par @jang : https://forum.fibaro.com/topic/49113-hc3-quickapps-coding-tips-and-tricks/page/21/#comment-207742 https://forum.fibaro.com/topic/49113-hc3-quickapps-coding-tips-and-tricks/page/21/#comment-207789 https://forum.fibaro.com/topic/49113-hc3-quickapps-coding-tips-and-tricks/page/21/#comment-207833 https://forum.fibaro.com/topic/49113-hc3-quickapps-coding-tips-and-tricks/page/54/#comment-223530 j'ai commencé à lire ton premier lien (merci pour m'avoir directement pointé au bon endroit, car nun post de 65 pages, je n'essaye même pas ... En tout cas, ce début m'a déjà permis de comprendre pour quoi une partie de mon code ne pouvait pas fonctionner ; ma fonction Condigne était définie après son appel. J'ai encore beaucoup à apprendre ... Lien vers le commentaire Partager sur d’autres sites More sharing options...
jojo Posté(e) le 19 mai 2022 Auteur Signaler Partager Posté(e) le 19 mai 2022 ok, j'avance, je n'ai plus d'erreur. effectivement définit function QuickApp:Consigne (Room, Mode, Chauf_Maison_Mode) et l'appeler comme ceci : self:Consigne (Room, Mode, Chauf_Maison_Mode) fait qu'elle tourne sans erreur. Mais ce qui est surprenant, à la lecture de ceci ( https://forum.fibaro.com/topic/49113-hc3-quickapps-coding-tips-and-tricks/page/21/#comment-207742), c'est que mon code s'exécute sans erreur malgré que : la fonction Consigne (...) est définie APRES son appel il n'y ait pas de return dans la fonction Consigne.... Maintenant j'ai un autre problème avec if Chauf_Maison_Mode == "Confort" then for key, value in pairs(RoomsConfort) do -- Look for key inside entire table if key == Room then -- Your desired key you want to refrence Found = true end end il ne trouve pas key == Room, bien que d'après le debug, tous les paramètres sont bien passés => je trouverai... Comme promis, recevez tous les 2 toute ma gratitude. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Lazer Posté(e) le 19 mai 2022 Signaler Partager Posté(e) le 19 mai 2022 il y a 59 minutes, jojo a dit : mon code s'exécute sans erreur malgré que : la fonction Consigne (...) est définie APRES son appel Normal, j'en parlais hier justement, dans un message un peu plus haut. Ta fonction Consigne() est définie comme une variable globale (car il n'y a pas de mot clé local devant) Et comme le contenu de la fonction QuickApp:GoogleThermo() est exécuté après que le compilateur LUA ait parcouru tout le fichier, alors la fonction Consigne() est bien connue au moment de son appel. Cependant, si tu l'avais déclaré en local comme ceci local function Consigne (Room, Mode, Chauf_Maison_Mode) -- blah blah blah end alors ça n'aurai pas fonctionné, car toute variable locale (les fonctions sont des variables en LUA) n'est connue qu'après sa déclaration. On a longuement parlé des variables locales et globales sur le forum, je ne me souviens plus du topic, de mémoire c'était avec @jjacques68. De façon générale, on peut dire que ce n'est pas une bonne pratique d'utiliser des variables globales, pour au moins 3 raisons : - on ne maitrise pas sa portée (puisque par définition elle est utilisable partout dans le code), donc elle peut entrer en collision avec une autre variable du même nom située dans une autre boucle, une autre fonction, un autre fichier, etc... gare aux bugs imprévisibles ! - plus lent à utiliser (car LUA doit parcourir la super table _G pour la retrouver) - consomme plus de RAM, car une variable globale n'est jamais purgée de la mémoire par le garbage collector, même si elle n'est plus jamais utilisée Cela dit, les variables globales sont plus simples à utiliser pour le débutant qui n'a pas saisi les subtilités de la portée des variables locales. Il y a un précis à ce sujet sur le forum : https://www.domotique-fibaro.fr/topic/1199-prã©cis-sur-les-variables-localesglobales/ Je t'aurais bien donné le code pour déclarer ta fonction en local au début du script, puis la définir plus loin, afin de l'utiliser correctement, mais elle aura besoin d'ajouter self en paramètre, donc au final la solution que tu as retenu de définir Consigne en tant que membre de QuickApp est beaucoup plus simple. Même si cela pose un nouveau problème (ou pas), car toutes les fonctions membres de de QuickApp sont automatiquement exportées, c'est à dire exécutables depuis l'extérieur du QuickApp. C'est à dire depuis un autre QuickApp, une scène, via l'API http, etc. Dans 99,99% des cas c'est sans conséquence, mais gare au petit malin qui voudrait s'amuser à exécuter une fonction pour voir ce que ça fait. il y a une heure, jojo a dit : il n'y ait pas de return dans la fonction Consigne.... Pas besoin à priori. Sans return, en LUA la fonction retourne nil, c'est à dire rien du tout. Cela ne pose aucun problème, inutile de mettre des return si on n'a aucune valeur intéressante à retourner. il y a une heure, jojo a dit : Comme promis, recevez tous les 2 toute ma gratitude. 1 Lien vers le commentaire Partager sur d’autres sites More sharing options...
Lazer Posté(e) le 19 mai 2022 Signaler Partager Posté(e) le 19 mai 2022 (modifié) il y a une heure, jojo a dit : Maintenant j'ai un autre problème avec if Chauf_Maison_Mode == "Confort" then for key, value in pairs(RoomsConfort) do -- Look for key inside entire table if key == Room then -- Your desired key you want to refrence Found = true end end il ne trouve pas key == Room, bien que d'après le debug, tous les paramètres sont bien passés => je trouverai... RoomsConfort est une table à index numériques car elle est définit comme ceci : RoomsConfort = {"SdJ", "Bureau", "Pauline", "Max", "SdBEtage", "Biblio", "SdBRdC", "ECS"} Par conséquent, dans ta boucle for, tu ne peux pas comparer key à la valeur de ta chaine de caractère Room. Il faut comparer value : if Chauf_Maison_Mode == "Confort" then for _, value in ipairs(RoomsConfort) do -- Look for value inside entire table if value == Room then -- Your desired value you want to refrence Found = true end end Note au passage que j'ai viré le key qui n'est pas utile (remplacé par un underscore _ qui est une convention en LUA pour désigner une variable qu'on n'utilise pas) Autre chose, j'ai utilisé ipairs() au lieu de pairs() car la table utilise des index numériques, et ça présente 2 avantages : boucle plus rapide, et index parcourus par ordre numérique (à contrario, pairs() n'est pas déterministe et parcoure les index dans un ordre imprévisible... c'est pénible parfois) Modifié le 19 mai 2022 par Lazer Lien vers le commentaire Partager sur d’autres sites More sharing options...
jojo Posté(e) le 19 mai 2022 Auteur Signaler Partager Posté(e) le 19 mai 2022 Merci pour ces infos très claires. Je vais regarder à mon code pour privilégier les variables locales. Quand tu is que les Globales sont visibles de partout, c'est de partout dans le QA ou également dans d'autres QA ? Pour la recherche dans la table, j'avais trouvé la même solution. Mais je vais regarder pour in pairs() et le _ Lien vers le commentaire Partager sur d’autres sites More sharing options...
Lazer Posté(e) le 19 mai 2022 Signaler Partager Posté(e) le 19 mai 2022 Les variables globales sont visibles de partout dans le même QA. Elles ne sont pas visibles depuis les autres QA. Que les variables soient globales ou locales, elles ne sont connues que dans la mémoire du processus qui exécute le QuickApp. Dans dans la HC3, chaque QA est un processus système (au niveau de Linux) Elles ne sont donc par persistantes, et perdus à chaque redémarrage du QA (sauvegarde, reboot de la box, etc) Ce qui est visible depuis les autres QA (et de façon générale depuis le monde entier via l'API), c'est : - les fonctions exportées (donc membres de QuickApp) - les propriétés du QuickApp (accessibles dans son JSON via /api/devices/ID).... donc la "value", mais aussi tout plein d'autres propriétés. - les variables persistantes du QuickApp (celles qui sont configurées dans l'onglet dédié de l'interface Web... et qui sont en réalité stockées dans les propriétés du QA, cf ligne juste au dessus) A ne pas confondre avec les Variables de la HC3 elle-même, accessible dans l'onglet Général de la box, qui sont accessibles de partout. On les utilisait massivement à l'époque de la HC2 (car c'était à peu près le seul moyen de stocker de l'information, y compris pour transmettre de l'information entre des VD ou Scènes), mais elles sont beaucoup moins utiles sur la HC3. Lien vers le commentaire Partager sur d’autres sites More sharing options...
jojo Posté(e) le 19 mai 2022 Auteur Signaler Partager Posté(e) le 19 mai 2022 Merci pour ce "cours privé". C'est en effet sympa de "regrouper" les variables : QA GestionChauffage, QA GestionPiscine, ... surtout si on put les voir/mettre à jour (?) depuis d'autres QA. J'utilise encore les variables globales, pour les variables prédéfinies (malheureusement, pas (encore) disponible au niveau des QA). Lien vers le commentaire Partager sur d’autres sites More sharing options...
Domodial Posté(e) le 13 octobre 2022 Signaler Partager Posté(e) le 13 octobre 2022 J'ai lu, et j'ai mal au crane. C'est vraiment une box pour programmeurs quand même, je trouve Lien vers le commentaire Partager sur d’autres sites More sharing options...
Lazer Posté(e) le 13 octobre 2022 Signaler Partager Posté(e) le 13 octobre 2022 Oui mais bon, tu n'as pas besoin de faire des fonctions dans des fonctions en LUA pour utiliser la box non plus hein Parce qu'avec ce même raisonnement un PC, un Mac, un iPhone, et même une calculatrice (HP48... souvenirs) ce ne sont que des appareils de programmeurs. Et pourtant on peut les utiliser de 1000 façons différentes. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Domodial Posté(e) le 13 octobre 2022 Signaler Partager Posté(e) le 13 octobre 2022 Ben...c'est certain que je vais pas faire des fonctions dans des fonctions. J'ai déjà du mal à comprendre comment sortir des données d'un QA pour qu'elles soient exploitables dans GEA. Des QA avec des variables OK, mais sans variables je ne comprends pas. Alors les fonctions mdrr Lien vers le commentaire Partager sur d’autres sites More sharing options...
jojo Posté(e) le 13 octobre 2022 Auteur Signaler Partager Posté(e) le 13 octobre 2022 facile d'exporter des infos d'un QA vers GEA. Dans ton QA, tu écris la valeur que tu veux dans une variable du QA : ensuite dans GEA (cfr doc) -- "VariableQuickApp" - "VariableQA" : Teste/modifie une variable d'un QuickApp -- SYNTAXE : {"VariableQuickApp!", <id_module>, <"nom_variable">, <"valeur">} -- CONDITIONS : GEA.add( {"VariableQuickApp!", 73, "MaVariable", ""}, 0, "Variable QuickApp #name# = #value#", {ACTIONS} ) -- Vérifie si la variable MaVariable du QuickApp 73 est différente d'une chaine vide GEA.add( {"VariableQuickApp+", 73, "MaVariable", 29}, 0, "Variable QuickApp #name# = #value# > 29", {ACTIONS} ) -- Vérifie si la variable MaVariable du QuickApp 73 est supérieure à 29 -- ACTIONS : GEA.add( {CONDITIONS}, 30, "", {"VariableQuickApp", 73, "MaVariable", "Ma Valeur"} ) -- Affecte la valeur "Ma Valeur" à la variable MaVariable du QuickApp 73 1 Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés