Aller au contenu
ericl78

QA remote

Recommended Posts

Bonjour,

 

Je viens de créer un QA remote pour gérer ma clim.

Sous ma HC2, tout fonctionne à merveille, mais je migre sous hc3 et désire faire la même chose.

Je voudrais récupérer les boutons presser en mode CentralSceneEvent et l'utiliser pour déclencher une scene.

Voici mon QA remote :

image.thumb.png.44fbc1afc44bed4391c6c8c39d07758d.png

 

Au niveau de la scène, voilà ce que j'ai :

 

image.png.d7a6bb2c4444b2771db6f846398ff5ad.png

 

Mais , lorsque je clique sur un bouton de mon QA, voici la réponse du tracking :

image.png.8125c8a03d586913797b72fa53196681.png

 

Je débute complètement sur HC3, merci d'avance pour votre aide

 

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Euh... je voudrais bien t'aider, mais je ne comprends rien à ce que tu as fait

 

J'ai l'impression que tu as mélangé le code de la scène et du Quickapp....

 

Tu veux faire quoi en fait ?

Expliqué simplement.

On verra ensuite comment traduire ça en "langage Fibaro", c'est à dire s'il faut utiliser une scène, un QA, ou les deux (et le code LUA qui va avec)

Partager ce message


Lien à poster
Partager sur d’autres sites

bonsoir et merci d'avance

 

Voilà ce que j'ai sous ma HC2 :

image.png.ce03054e8cf9c30c2211db055a14f0ef.png

 

Associé à cela : (pour exemple si je clique sur 18°)

image.png.a67d1eff4c1f1c9c6d2486b45f129e09.png

 

Je désire faire la même chose sur ma HC3

J'ai donc créé un QA remote comme ceci

 

image.png.48b9cd6edc6c2f326e6128a5a6c221b3.png

 

Avec le script suivant dans mon QA remote :

 

 

-- Remote controller type have no actions to handle
 
-- Method for emitting central scene events. Default value for keyAttribute is "Pressed" 
-- Sample usage: self:emitCentralSceneEvent(1, "Pressed")
function QuickApp:emitCentralSceneEvent(keyId, keyAttribute)
    if keyAttribute == nil then
        keyAttribute = "Pressed"
    end
 
    local eventData = {
        type = "centralSceneEvent",
        source = self.id,
        data = {
            keyAttribute = keyAttribute,
            keyId = keyId
        }
    }
    api.post("/plugins/publishEvent", eventData)
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")
 
    -- Setup supported keys and attributes of the device
    -- Scenes will display possible triggers according to these values
    self:updateProperty("centralSceneSupport",  {
        { keyAttributes = { "Pressed","Released","HeldDown","Pressed2","Pressed3" }, keyId = 1 },
        { keyAttributes = { "Pressed","Released","HeldDown","Pressed2","Pressed3" }, keyId = 2 },
        { keyAttributes = { "Pressed","Released","HeldDown","Pressed2","Pressed3" }, keyId = 3 },
        { keyAttributes = { "Pressed","Released","HeldDown","Pressed2","Pressed3" }, keyId = 4 },
        { keyAttributes = { "Pressed","Released","HeldDown","Pressed2","Pressed3" }, keyId = 5 },
        { keyAttributes = { "Pressed","Released","HeldDown","Pressed2","Pressed3" }, keyId = 6 },
        { keyAttributes = { "Pressed","Released","HeldDown","Pressed2","Pressed3" }, keyId = 7 },
        { keyAttributes = { "Pressed","Released","HeldDown","Pressed2","Pressed3" }, keyId = 8 },
        { keyAttributes = { "Pressed","Released","HeldDown","Pressed2","Pressed3" }, keyId = 9 },
        { keyAttributes = { "Pressed","Released","HeldDown","Pressed2","Pressed3" }, keyId = 10 },
        { keyAttributes = { "Pressed","Released","HeldDown","Pressed2","Pressed3" }, keyId = 11 },
        { keyAttributes = { "Pressed","Released","HeldDown","Pressed2","Pressed3" }, keyId = 12 },
    })
end
 
 
Maintenant la question est :
Comment je récupère code touche (keyID) pour dérouler mon script dédié ?
Tout faire dans le QA, je pense que cela est possible, mais je n'ai pas trouvé de doc comment faire
Je pensais pouvoir déclencher une scéne LUA avec la commande Central SceneEvent qui pourrait récupérer mon KeyID mais cela ne fonctionne pas
 
HC2, je maitrise pas trop mal depuis 4 ans, mais HC3, cela change !
Merci d'avance pour ton aide
 

 

 

Partager ce message


Lien à poster
Partager sur d’autres sites

This QA shows up in the block scene editor for me

function QuickApp:onInit ()
    self:debug ("Remote")
    local inf = api.get("/devices/"..self.id).interfaces
    for _,i in ipairs(inf) do 
      if i=='zwaveCentralScene' then inf=nil; break end
    end
    if inf then inf[#inf+1]='zwaveCentralScene' self:addInterfaces(inf) end
    self:debug(json.encode(inf))
    self: updateProperty ( "centralSceneSupport" , {
        {keyAttributes = {  "Pressed" , "Released" , "HeldDown" , "Pressed2" , "Pressed3"  }, keyId =  1  },
        {keyAttributes = {  "Pressed" , "Released" , "HeldDown" , "Pressed2" , "Pressed3"  }, keyId =  2  },
        {keyAttributes = {  "Pressed" , "Released" , "HeldDown" , "Pressed2" , "Pressed3"  }, keyId =  3  },
        {keyAttributes = {  "Pressed" , "Released" , "HeldDown" , "Pressed2" , "Pressed3"  }, keyId =  4  },
        {keyAttributes = {  "Pressed" , "Released" , "HeldDown" , "Pressed2" , "Pressed3"  }, keyId =  5  },
        {keyAttributes = {  "Pressed" , "Released" , "HeldDown" , "Pressed2" , "Pressed3"  }, keyId =  6  },
        {keyAttributes = {  "Pressed" , "Released" , "HeldDown" , "Pressed2" , "Pressed3"  }, keyId =  7  },
        {keyAttributes = {  "Pressed" , "Released" , "HeldDown" , "Pressed2" , "Pressed3"  }, keyId =  8  },
        {keyAttributes = {  "Pressed" , "Released" , "HeldDown" , "Pressed2" , "Pressed3"  }, keyId =  9  },
        {keyAttributes = {  "Pressed" , "Released" , "HeldDown" , "Pressed2" , "Pressed3"  }, keyId =  10  },
        {keyAttributes = {  "Pressed" , "Released" , "HeldDown" , "Pressed2" , "Pressed3"  }, keyId =  11  },
        {keyAttributes = {  "Pressed" , "Released" , "HeldDown" , "Pressed2" , "Pressed3"  }, keyId =  12  },
    })
end

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Mais tu n'as pas besoin de passer par CentralSceneEvent ?!?

Ce que tu veux, c'est juste exécuter du code LUA après appui sur un bouton du QuickApp non ?

 

Dans ce cas il suffit d'associer une fonction dans le callback de chaque bouton

 

image.thumb.png.550ed4beedc9d25a9c3bc3ae4d6e8ae6.png

Partager ce message


Lien à poster
Partager sur d’autres sites
16 minutes ago, ericl78 said:

Yes right, it appears in the block scene but doesn't work!

It works very well for me. 

Does it show up in the block scene editor? The "Central Scene ID" option? 

Remote.fqa

Modifié par jang

Partager ce message


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

Mais tu n'as pas besoin de passer par CentralSceneEvent ?!?

Ce que tu veux, c'est juste exécuter du code LUA après appui sur un bouton du QuickApp non ?

 

Dans ce cas il suffit d'associer une fonction dans le callback de chaque bouton

 

image.thumb.png.550ed4beedc9d25a9c3bc3ae4d6e8ae6.png

 

Merci @lazer and thanks to @jang too for your assistance

 

Tout est ok maintenant.

Lazer, sais tu ou je pourrais trouver une doc plus complète sur la HC3 que les qqs pages sur leur site ?

 

Dernière question, pour faciliter ma migration, connaitrais tu la commande API qui me permettrait depuis ma HC2 de commander un QA remote ? du genre, pouvoir valider le bouton "1,2 ou ..." depuis ma HC2 ?

 

Dans tous les cas, sans des personnes comme toi (Lazer) nous pourrions galérer des heures, encore merci à toi et tous les contributeurs de ce forum.

 

Partager ce message


Lien à poster
Partager sur d’autres sites

C'est vrai que la documentation de Fibaro est succincte....

Mon sujet favori sur le forum officiel, de loin la meilleure source d'info pour comprendre le maximum sur les QuickApps, justement tenu par @jang :60:: HC3 QuickApps coding - tips and tricks

 

Il faut perdre l'habitude d'appeler des boutons. C'est une mauvaise habitude prise sur HC2 car on n'avait pas le choix sur HC2.

Mais sur HC3, les boutons ne servent que pour l'IHM (interface avec l'utilisateur, via le Web ou l'application mobile)

La bonne pratique c'est d'appeler directement la fonction qui va bien dans le QuickApp (cela peut très bien être la fonction de callback du bouton, mais il est plus propre de nommer différemment la fonction avec un nom parlant.... que le bouton appellera également)

Et c'est documenté par Fibaro dans le chapitre "Mapping actions to methods" de la doc sur les Quckapps, il faut appeler la méthode "call" :

fibaro.call(44, "myCustomAction", 10, "test")

Ou bien via l'API HTTP ce qui revient au même :

/api/callAction?deviceID=44&name=myCustomAction&arg1=10&arg2=test

On peut ainsi passer autant d'argument que nécessaire à la fonction ainsi implémentée dans le QuickApp :

function QuickApp:myCustomAction(arg1, arg2)
    self:debug("myCustomAction", arg1, arg2)
end

Et si je prend la suite de mon screenshot précédent, avec le bouton "Get devices" qui appelle la fonction buttonGetDevices_onReleased(), alors celle-ci se contente d'appeler à son tour la fonction myCustomAction() :

function QuickApp:buttonGetDevices_onReleased(event)
	self:myCustomAction()
end

Et surtout, on n'est pas dépendant d'un numéro de bouton qui changeait constamment sur la HC2, le truc infernal pour maintenir son code !!

 

La seule dépendance reste l'ID du QuickApp, mais celui-ci ne changera jamais tant qu'on ne le supprime pas, donc ça ne devrait pas trop poser de souci.

 

En alternative, on pourrait au choix :

- définir le callback du bouton directement sur myCustomAction() sans passer par buttonGetDevices_onReleased()

- appeler buttonGetDevices_onReleased() directement via l'API HTTP ou fibaro.call

 

=> d'où l'importance de bien nommer ses fonctions, car toute fonction définie dans QuickApp (qui est une table au sens LUA du terme) est automatiquement partagée avec le monde entier (elle est publique quoi), donc accessible depuis un autre QuickApp, une Scène, ou depuis l'extérieur via l'API HTTP.

Et cela s'applique aussi bien aux fonctions qu'on définie nous même, ou bien aux fonctions prédéfinies (et oui, par exemple pour le fun on peut injecter un message dans la zone de debug d'un QuickApp en appelant sa fonction debug() depuis n'importe où).

Mais on peut aller plus loin encore, par exemple redéfinir les fonctions prédéfinies (attention aux bêtises)... comme l'explique très bien @jang dans son super topic.

 

Bref, les QuickApp, je trouve ça vraiment génial pour développer, quand tu as connu les modules virtuels de la HC2, c'est le jour et la nuit.

Partager ce message


Lien à poster
Partager sur d’autres sites

×