Aller au contenu
jojo

fonctions dans fonction

Recommended Posts

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

 

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites

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)

Partager ce message


Lien à poster
Partager sur d’autres sites

@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

 

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

  • Like 2

Partager ce message


Lien à poster
Partager sur d’autres sites

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".

  • Like 1
  • Thanks 1

Partager ce message


Lien à poster
Partager sur d’autres sites

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 :98:

  • Thanks 1

Partager ce message


Lien à poster
Partager sur d’autres sites
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)

Partager ce message


Lien à poster
Partager sur d’autres sites

Cela permet déjà de corriger la ligne :

self:debug("Function Consigne") -- déjà erreur à cette ligne car il ne connait pas self ...

 

  • Thanks 1

Partager ce message


Lien à poster
Partager sur d’autres sites
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 :98:

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

Partager ce message


Lien à poster
Partager sur d’autres sites
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 (...)

?

Partager ce message


Lien à poster
Partager sur d’autres sites
self:Consigne (Room, Mode, Chauf_Maison_Mode)

 

  • Thanks 1

Partager ce message


Lien à poster
Partager sur d’autres sites

@Barelle ah ben oui, bravo, au moins toi tu as lu les commentaires du code LUA :13:

 

@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 :

 

 

EDIT : vous êtes trop rapides, vous faites les questions et les réponses !

 

Modifié par Lazer
  • Thanks 1

Partager ce message


Lien à poster
Partager sur d’autres sites

merci, je dois aller m'occuper de mes autres amis

  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites
Il y a 20 heures, Lazer a dit :

@Barelle ah ben oui, bravo, au moins toi tu as lu les commentaires du code LUA :13:

 

@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 :

 

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 ...

Partager ce message


Lien à poster
Partager sur d’autres sites

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 :

  1. la fonction Consigne (...) est définie APRES son appel
  2. 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.

Partager ce message


Lien à poster
Partager sur d’autres sites
il y a 59 minutes, jojo a dit :

mon code s'exécute sans erreur malgré que :

  1. 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.

:wub:

  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites
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é par Lazer

Partager ce message


Lien à poster
Partager sur d’autres sites

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 _

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

Partager ce message


Lien à poster
Partager sur d’autres sites

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).

Partager ce message


Lien à poster
Partager sur d’autres sites

J'ai lu, et j'ai mal au crane.

C'est vraiment une box pour programmeurs quand même, je trouve ;)

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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

 

  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites

×