Aller au contenu
Krikroff

Les variables dans un Quick App

Recommended Posts

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

Partager ce message


Lien à poster
Partager sur d’autres sites

Et d'après ce que j'ai compris, on ne peut pas accéder à ces variables (QA) depuis une scène.

Et ni les utiliser comme trigger de scènes.

 

Elles n'ont pas la portée du VG.

Modifié par jjacques68

Partager ce message


Lien à poster
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

Partager ce message


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

Partager ce message


Lien à poster
Partager sur d’autres sites

ca fait un peu beaucoup pour récupérer une valeur je crois que je vais rester avec des VG dans mes scènes

Partager ce message


Lien à poster
Partager sur d’autres sites

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

 

Partager ce message


Lien à poster
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

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
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

Partager ce message


Lien à poster
Partager sur d’autres sites

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

 

Partager ce message


Lien à poster
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

Partager ce message


Lien à poster
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.."")

 

Partager ce message


Lien à poster
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 ?? 

Partager ce message


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

as tu regardé ceci (puis passer par une variable)

 

Merci pour l'info ! Je vais utiliser les variables alors 

Partager ce message


Lien à poster
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

Partager ce message


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

Partager ce message


Lien à poster
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

Partager ce message


Lien à poster
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

Partager ce message


Lien à poster
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?

 

Partager ce message


Lien à poster
Partager sur d’autres sites

je vais dire peutêtre une bêtise, mais sers toi que et uniquement que du status du QA !

Pas besoin de variable...

Partager ce message


Lien à poster
Partager sur d’autres sites

@jjacques68 Non tu as raison, (ça serait plus « propre ») mais comment récupérer le statut du QA dans gea ou une scène ?

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Fibaro call

Envoyé de mon BLA-L29 en utilisant Tapatalk

  • Like 2

Partager ce message


Lien à poster
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

Partager ce message


Lien à poster
Partager sur d’autres sites

×