Aller au contenu

Les variables dans un Quick App


Krikroff

Messages recommandés

L'idée ici est partager nos retours d' expérience sur l'utilisation des variables dans les Quick App.

 

Nous connaissons tous pour la plupart l'existence des variables globales mais le HC3 dans les Quick App apporte une nouvelle notion de variable au niveau du QA.

Cela va considérablement simplifier la vie du développeur et du l'utilisateur au quotidien.

 

L'utilisation est très simple et repose sur 2 méthodes:

 

La création ou la mise à jour d'une variable existante :

self:setVariable("NOM_DE_LA_VARIABLE", "VALEUR_DE_LA_VARIABLE")

> le set se charge de créer la variable si elle n'existe pas, bien joué Fibaro

 

La lecture de la valeur d'une variable :

self:getVariable("NOM_DE_LA_VARIABLE")

Avouons le c'est difficile de faire plus simple ;)

 

Les variables ainsi ajoutées sont visibles depuis l'onglet "Variables" au niveau du périphérique, comme ceci:

 

QA_Vars.PNG.b894a88805317514e3175686a24bbe22.PNG

 

QA_Vars2.PNG.d6a8c861d5ad4de801164ef92a7c671f.PNG

 

Ou bien encore en interrogeant l' API via le SWAGGER intégré au Home Center ...

  • Like 2
  • Upvote 1
Lien vers le commentaire
Partager sur d’autres sites

Utiliser une variable d'un Quick App comme trigger d'une scène en effet ce n'est pas possible, je trouve que c'est cohérent.

 

En revanche avec un peu d'huile de coude il est parfaitement possible d’accéder et d'utiliser une variable d'un QA depuis une scène, voici comment:

 

-- Description: retrieve a quick app variable by name
-- arg: [id] (integer): > QA device ID
-- arg: [name] (string): QA variable name
-- arg: [cs] (boolean): Search is case sensitive or not
-- Return: The QA variable value or nil
do
function getQuickAppVariable(id, name, cs)
    assert(tonumber(id),"getQuickAppVariable(id, name), arg [id] must be a number")
    assert(type(name)=="string","getQuickAppVariable(id, name), arg [name] must be a string")
    local v, r = api.get(string.format("/devices/%s", id)).properties.quickAppVariables, nil
    if (not cs) then name = name:lower() end
    for i=1, #v do
        local search = v[i].name
        if (not cs) then search = v[i].name:lower() end
        if (search == name) then
            r = v[i].value
            break
        end
    end
    return r
end
end

et pour l'utiliser

local value = getQuickAppVariable(941, "IP_Address")
print(value)

:60:

  • Like 4
  • Thanks 1
Lien vers le commentaire
Partager sur d’autres sites

  • 3 semaines après...
Le 28/03/2020 à 19:41, Krikroff a dit :

il est parfaitement possible d’accéder et d'utiliser une variable d'un QA depuis une scène, voici comment:

ça marche nickel ce code !!!

 

merci encore !!!

Modifié par jjacques68
Lien vers le commentaire
Partager sur d’autres sites

  • 4 semaines après...
  • 11 mois après...

Hello pouvez vous m'expliquer ce qu'il ne va pas:

 

Il n'est pas possible de récupérer un variable dans une fonction?

function AffichageJour()
if self:getVariable("OuvAutoMardi") == "OUI" then v= v .."Ma " end
self:updateView("lblJour", "text", v)
end


function QuickApp:onInit()
AffichageJour()
end
[15.04.2021] [22:51:13] [ERROR] [QUICKAPP29]: QuickApp crashed
[15.04.2021] [22:51:13] [ERROR] [QUICKAPP29]: main.lua:21: attempt to index a nil value (global 'self')

 

Lien vers le commentaire
Partager sur d’autres sites

Rien à voir avec les variables.

 

Ta fonction AffichageJour n'est pas membre de QuickApp, donc self est inconnu à l'intérieur de celle-ci => attempt to index a nil value (global 'self')

 

Toujours bien prendre le temps de lire le message d'erreur, ce n'est pas toujours clair, mais dans le cas présent ça l'est :)

 

Il faut donc lui passer self en paramètre :

function AffichageJour(self)
	if self:getVariable("OuvAutoMardi") == "OUI" then v= v .."Ma " end
	self:updateView("lblJour", "text", v)
end


function QuickApp:onInit()
	AffichageJour(self)
end

 

Si tu avais mis n'importe quelle autre fonction, pas exemple self:debug() tu aurais eu la même erreur.

  • Like 2
Lien vers le commentaire
Partager sur d’autres sites

  • 9 mois après...

Bonjour,

 

J'aurai besoin d'un peu daide pour afficher une variable local de ma HC3 dans un quickapp.

image.thumb.png.a686f67ed74bbe66666554ec4796c8f7.png

J'ai donc créé un QuickApp de Temperature sensor et mis ca dedans mais ça n'a pas l'air de marcher

function QuickApp:onInit()
    self:debug("onInit")

    self:getVariable("Temp_Piscine")
end

Auriez-vous un peu de temps ou des liens qui sont bien pour apprendre à creer des quickapp ?

 

En vous remerciant

Lien vers le commentaire
Partager sur d’autres sites

Attention, ton Temp_Piscine n'est pas une variable, mais un label du QuickApp. Cela n'est pas le sujet de ce topic qui traitait à l'origine des variables du QuickApp, qu'on retrouve dans l'onglet présenté sur la capture d'écran de Krikroff.

 

Les labels servent à afficher des informations, pour l'utilisateur.

Cela se fait avec la fonction updateProperty(), voir la documentation officielle : https://manuals.fibaro.com/home-center-3-quick-apps/

Lire un label n'a que peu d'intérêt, voire même aucun. Les valeurs des labels ne sont pas persistants, contrairement à ce qui était le cas sur les VD de la HC2.

 

La doc officielle n'est pas très détaillé, et surtout assez peu didactique.

Il faut bidouiller par mal pour finir par comprendre la logique des QA.
 

Il n'y a pas de tutoriel complet à ma connaissance, en tout cas pas sur le forum, si ce n'est plusieurs discussions plus ou moins poussées autour de différents sujets.

Si tu veux devenir un dieu du QuickApp, que tu as pas mal de temps à y investir, et que tu lis l'anglais, je te conseille le topic de @jang sur le forum officiel : https://forum.fibaro.com/topic/49113-hc3-quickapps-coding-tips-and-tricks/

Lire en particulier les 4 (longs) messages sur l'anatomie d'un QuickApp (Part 1 à 4) et de leurs enfants (voir table des matières du 1er post)

Il y a un début très théorique sur les notions de bases du LUA, indispensable pour bien comprendre comment sont construits les QuickApps, avant d'aborder des aspects plus pratiques.

  • Thanks 1
Lien vers le commentaire
Partager sur d’autres sites

  • 3 semaines après...

Bonjour,

dans mon QA, sur appui du BP j'ai une erreur

sur " main.lua:64: attempt to concatenate a boolean value (local 'screenOn') "

 

la valeur True ou False s'affiche bien dans le panneau variable du QA face à "Etat_Ecran" mais ne veut pas l'afficher dans mon Label 2

à l'aide please !!!! :(  :D

 

PS: la ligne 64:

self:updateView("Lbl2", "text", "Etat Ecran = "..screenOn.."..")

 

--- Lire etat tablette
--====
function QuickApp:Etat_TAB()
local http = net.HTTPClient()
http:request("http://192.168.1.17:2323/?type=json&cmd=home&password=xxxxx",{
        options={
            headers = {Accept = "application/json"}, method = 'GET'}, success = function(response)
            --self:debug("response status:", response.status) 
            --self:debug("headers:", response.headers["Content-Type"]) 
            apiResult = response.data
            print(apiResult)
            jsonTable = json.decode(apiResult) -- JSON decode from api to lua-table
                     
            ----------------------------------------------
            -- Récupération des données
            ----------------------------------------------
             local currentPageUrl = jsonTable.currentPageUrl -- Get the values
            self:debug("Page actuelle: ", currentPageUrl)
           
            local screenOn = jsonTable.screenOn -- Get the values
            self:debug("Etat_Ecran: ", screenOn)
            
            ----------------------------------------------
            -- Création des variables de QuickApp création ou la mise à jour d'une variable
            ----------------------------------------------
            self:setVariable("Page actuelle", currentPageUrl)
            self:setVariable("Etat_Ecran", screenOn)

            --==  lecture de la valeur d'une variable  
            -- self:getVariable("NOM_DE_LA_VARIABLE")
                        
            --afficher données dans label
            self:updateView("Lbl1", "text", "Page actuelle = "..currentPageUrl .. "..")
            self:updateView("Lbl2", "text", "Etat Ecran = "..screenOn.."..")
            --self:updateProperty("Lbl2", "Etat Ecran = "..screenOn".."")
           
            end,
            error = function(error)
            self:debug('error: ' .. json.encode(error))
        end        
    })
end
--=========

 

Lien vers le commentaire
Partager sur d’autres sites

Un booléen ne peut pas subir une concaténation comme une chaîne de caractères, il est nécessaire de changer le type en string : tostring ou encore faire un string.format

Lien vers le commentaire
Partager sur d’autres sites

Merci @Krikroff 

oui en effet, c'est mieux ainsi

 local screenOn = jsonTable.screenOn -- Get the values
 -- convertir en chaine caracteres
 local myString = tostring(screenOn)
self:debug("Etat_Ecran: ", screenOn)
self:setVariable("Etat_Ecran", myString)
self:updateView("Lbl2", "text", "Etat Ecran = "..myString.."")

 

Lien vers le commentaire
Partager sur d’autres sites

Hello a tous, 

 

Je ne sais pas si c'est le bon endroit ou pas. 

Je voudrais savoir comment fait on pour lire la valeur d'un label dans un QuickApp ?? 

 

Je ne trouve que la fonction UpdateView... Il y a peut être un ReadView ou équivalent ?? 

Lien vers le commentaire
Partager sur d’autres sites

Hello a tous, 
 
Je ne sais pas si c'est le bon endroit ou pas. 
Je voudrais savoir comment fait on pour lire la valeur d'un label dans un QuickApp ?? 
 
Je ne trouve que la fonction UpdateView... Il y a peut être un ReadView ou équivalent ?? 
Je crois que tu devrais changer ton approche sur hc3
On ne stock plus les valeurs dans les labels

Sur hc2 on le faisait pour continuer les limitations des vd

Envoyé de mon BLA-L29 en utilisant Tapatalk

Lien vers le commentaire
Partager sur d’autres sites

  • 4 semaines après...
--================================
function QuickApp:BTN_PRESENT()
self:updateProperty("value",true)
self:setVariable("statut", "present") -- on renseigne la variable
self:getVariable("statut") --on lit la variable
print ("etat:",statut)
self:debug(statut)
self:updateView("Lbl1", "text", statut) -- on affiche la variable dans label
--self:updateView("Lbl1", "text", "Status: "..statut)
--self:updateView("Lbl1", "text", "prez" )
end

function QuickApp:BTN_ABSENT()
self:updateProperty("value",false) -- on change le statut du QA
self:setVariable("statut", "absent") --on modifie variable
self:getVariable("statut") --on lit la variable
print ("etat:",statut)
self:debug(statut)
self:updateView("Lbl1", "text", statut) -- on affiche la variable dans label
--self:updateProperty("satut", statut)
--self:updateView("Lbl1", "text", "Abs" )

end

Hello,

dans un QA, via 2 BTN je modifie une variable "statut" (present/absent), une fois modifiée, je souhaite la récupérer pour l'afficher dans un label (recuperer la valeur de la variable et non pas comme dans le code ici afficher un text)

comment afficher une variable dans un label?

merci

 

nota: le print et le debug m'affiche rien et nil

j'essaie de comprendre (il doit y avoir une notion de variable dans QA ou fonction () ..... ) :20:

Modifié par flamalex
Lien vers le commentaire
Partager sur d’autres sites

Il faut faire un set pour stocker une variable
Il faut faire un get pour récupérer la valeur de la variable
Il faut faire un update view pour afficher la valeur dans un label
Je te conseille de jeter un œil sur la doc que fibaro a fait

Envoyé de mon BLA-L29 en utilisant Tapatalk

Lien vers le commentaire
Partager sur d’autres sites

Oui, dans mes commentaires du code ci dessus, on retrouve ces notions de lecture, écriture, affichage

mais pour l’affichage de la variable dans le label, rien ne fonctionne

d’ou l’objet de ma question

 

dans la doc j’ai ceci, mais ils font référence à une variable globale (ce n’est pas mon cas)

https://manuals.fibaro.com/home-center-3-lua-scenes/

 

et avec la doc QA je ne suis pas plus avancé (ça me parait être simple pourtant, un bon de 8ans en arrière avec hc2, mm question)

https://manuals.fibaro.com/home-center-3-quick-apps/
 

Modifié par flamalex
Lien vers le commentaire
Partager sur d’autres sites

la solution

--================================
function QuickApp:BTN_PRESENT()
self:updateProperty("value",true)
self:setVariable("statut", "present") -- on renseigne la variable
self.statut = self:getVariable("statut") --on lit la variable
print ("etat:",self.statut)
self:debug(self.statut)
self:updateView("Lbl1", "text", self.statut) -- on affiche la variable dans label
end

function QuickApp:BTN_ABSENT()
self:updateProperty("value",false) -- on change le statut du QA
self:setVariable("statut", "absent") --on modifie variable
self.statut = self:getVariable("statut") --on lit la variable
print ("etat:",self.statut)
self:debug(self.statut)
self:updateView("Lbl1", "text", self.statut) -- on affiche la variable dans label
end

c'etait le self

est il possible de faire plus simple? 

ici le statut s'actualise, dans le label, lorsque je clique sur un BTN, n'est il pas possible (de le sortir) que le statut s'actualise automatiquement lorsqu'il change de statut?

 

Lien vers le commentaire
Partager sur d’autres sites

Autrement tu peux aussi utiliser les variables globales cela existe toujours même si avec les variables QA on les utilisent beaucoup moins
Mon QA jours fériés utilisent 2 variables globales
D'ailleurs il faudrait que je jui donne un coup de jeune mais je suis pas motivé

Envoyé de mon BLA-L29 en utilisant Tapatalk

  • Like 1
Lien vers le commentaire
Partager sur d’autres sites

×
×
  • Créer...