Aller au contenu
henri-allauch

Passage de de paramêtres vers une fonction dans un QA

Recommended Posts

Inspiré à l'époque par ce sujet j'utile sur HC2

 structure = {     
        D1 = "Donnée 1", 
        D2 = "Donnée 2",  
        D3 = "Donnée 3",            
        D4 = "Donnée 4" ,   
        D4 = "Donnée 5",   
        D5 = "Donnée 6",        
        D6 = "Donnée 7"         
    } 
    --Depuis une scene lance une autre scene avec le json en argument 
    local ToScene = 22
    fibaro:startScene(ToScene, { {json = json.encode(structure)} }  )

    --Dans Scene 22 :
        -- récupérer la structure passée en paramêtres par la scène appelante
        if (Params) then
            for k, v in ipairs(Params) do
                if (v.json) then 
                Param = json.decode(v.json) 
             end
        end
        print (Param.D1 )
        print (Param.D2 )
        ...

   

 

 Comment faire en HC3 ???

 


    --Depuis une scene je souhaite envoyé le json à une fonction dans un QuickApp   
    ToQuickApp = 25
    fibaro.call(ToQuickApp, "LaFonctionInQa",  json.encode(structure)  )

    Le QuickApp Signale  
    [DEBUG] [QA_XXXXX_25]:  onAction: {"args":[{"D1":"Donnée 1","D2":"Donnée 2","D3":"Donnée 2", .....}],"actionName":"LaFonctionInQa","deviceId":25}
    [DEBUG] [QA_NOTIFICATIONS_33]: /usr/share/lua/5.3/json/decode.lua:74: bad argument #1 to 'match' (string expected, got table)

    --IL attend une chaine et pas un tableau Donc Pas OK

    

 

 Une solution existe ? Ou il faudra passer un par un les éléments   Ce qui fonctionne correctement  mais moins pratique

  fibaro.call(ToQuickApp, "LaFonctionInQa",  stucture.D1,  stucture.D2, stucture.D3 , ...  )

 

Partager ce message


Lien à poster
Partager sur d’autres sites

C'est bien compliqué tout ça, si tu veux envoyer un tableau à une fonction d'un QuickApp, il suffit de lui envoyer.......  un tableau :D

-- Depuis une scene je souhaite envoyer le json à une fonction dans un QuickApp
ToQuickApp = 25
fibaro.call(ToQuickApp, "LaFonctionInQa", structure)

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci, j'avais et j'ai réessayé mais je n'arrive pas à récupérer dans le QA

Je m'y prend mal certainement

 

Scene: 
 structure = {     
        D1 = "Donnée 1", 
        D2 = "Donnée 2",  
        D3 = "Donnée 3",            
        D4 = "Donnée 4" ,   
        D4 = "Donnée 5",   
        D5 = "Donnée 6",        
        D6 = "Donnée 7"         
    } 
    fibaro.call( QA_Notification, "NotifierFromScene2", structure)

QA:
function QuickApp:NotifierFromScene2(Params)
       self:warning(Params)
       self:warning(Params.D1)
end

[27.02.2021] [17:45:43] [DEBUG] [QA_NOTIFICATIONS_33]: onAction: {"actionName":"NotifierFromScene2","deviceId":33,"args":["table: 0xffff500dcf00"]}
[27.02.2021] [17:45:43] [WARNING] [QA_NOTIFICATIONS_33]: table: 0xffff500dcf00
[27.02.2021] [17:45:43] [WARNING] [QA_NOTIFICATIONS_33]: nil

--------------------

function QuickApp:NotifierFromScene2(Params)
       Param = json.decode(Params)  
       self:warning(Param.D1)
end

Résultat;
[27.02.2021] [17:37:15] [DEBUG] [QA_NOTIFICATIONS_33]: onAction: {"args":["table: 0xffff600b3a10"],"actionName":"NotifierFromScene2","deviceId":33}
[27.02.2021] [17:37:15] [DEBUG] [QA_NOTIFICATIONS_33]: /usr/share/lua/5.3/json/decode/util.lua:35: 'Hexadecimal' denied by option set 'number.hex' @ character: 8 0:8 [0] line: table: 0
[27.02.2021] [17:37:15] [ERROR] [QUICKAPP33]: QuickApp crashed
[27.02.2021] [17:37:15] [ERROR] [QUICKAPP33]: Unknown error occurred: handleJsonRpc

 

Partager ce message


Lien à poster
Partager sur d’autres sites

C'est étrange... après je n'ai jamais fait d'appel depuis une scène (uniquement des appels entre QuickApps), ça se comporte peut être différemment

 

Ton 2nd test avec json.decode est clairement inutile, puisque c'est bien un tableau que tu dois récupèrer, pas une string... d'ailleurs la preuve, ça plante.

 

Tu peux tenter de parcourir le contenu de la table Params avec une boucle for k, v in pairs(Params) pour voir ce qu'elle contient

Partager ce message


Lien à poster
Partager sur d’autres sites

function QuickApp:NotifierFromScene2(Params)

        for k, v in pairs(Params) do
            self:warning(k)
            self:warning(v)
        end
end

[27.02.2021] [18:19:52] [DEBUG] [QA_NOTIFICATIONS_33]: onAction: {"actionName":"NotifierFromScene2","args":["table: 0xffff7c0fc050"],"deviceId":33}
[27.02.2021] [18:19:52] [DEBUG] [QA_NOTIFICATIONS_33]: ./include/main.lua:189: bad argument #1 to 'for iterator' (table expected, got string)
[27.02.2021] [18:19:52] [ERROR] [QUICKAPP33]: QuickApp crashed
[27.02.2021] [18:19:52] [ERROR] [QUICKAPP33]: Unknown error occurred: handleJsonRpc

Partager ce message


Lien à poster
Partager sur d’autres sites

mais... c'est pas possible... au message précédent tu avais bien une table :huh:

 

EDIT mais non en fait, tu avais une string contenant la chaine "table: 0xffff500dcf00", donc une information totalement inexploitable

 

C'est fou ça, on dirait que le passage de paramètres depuis une scène ne fonctionne pas.

Tu peux tester depuis un autre QA ?

 

Modifié par Lazer

Partager ce message


Lien à poster
Partager sur d’autres sites

Oui c'est pareil 

 

[27.02.2021] [18:34:33] [DEBUG] [QA_TEST_42]: onAction: {"args":["table: 0xffff740b2750"],"deviceId":42,"actionName":"TestParam"}
[27.02.2021] [18:34:33] [DEBUG] [QA_TEST_42]: ./include/main.lua:24: bad argument #1 to 'for iterator' (table expected, got string)
[27.02.2021] [18:34:33] [ERROR] [QUICKAPP42]: QuickApp crashed
[27.02.2021] [18:34:33] [ERROR] [QUICKAPP42]: Unknown error occurred: handleJsonRpc

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Le meme appel depuis un QA ca marche bien

[27.02.2021] [18:45:42] [DEBUG] [QA_NOTIFICATIONS_33]: onAction: {"args":[{"D6":"Donnée 7","D5":"Donnée 6","D3":"Donnée 3","D4":"Donnée 5","D1":"Donnée 1","D2":"Donnée 2"}],"deviceId":33,"actionName":"NotifierFromScene2"}
[27.02.2021] [18:45:42] [WARNING] [QA_NOTIFICATIONS_33]: D6
[27.02.2021] [18:45:42] [WARNING] [QA_NOTIFICATIONS_33]: Donnée 7
[27.02.2021] [18:45:42] [WARNING] [QA_NOTIFICATIONS_33]: D5
[27.02.2021] [18:45:42] [WARNING] [QA_NOTIFICATIONS_33]: Donnée 6
[27.02.2021] [18:45:42] [WARNING] [QA_NOTIFICATIONS_33]: D3
[27.02.2021] [18:45:42] [WARNING] [QA_NOTIFICATIONS_33]: Donnée 3
[27.02.2021] [18:45:42] [WARNING] [QA_NOTIFICATIONS_33]: D4
[27.02.2021] [18:45:42] [WARNING] [QA_NOTIFICATIONS_33]: Donnée 5
[27.02.2021] [18:45:42] [WARNING] [QA_NOTIFICATIONS_33]: D1
[27.02.2021] [18:45:42] [WARNING] [QA_NOTIFICATIONS_33]: Donnée 1
[27.02.2021] [18:45:42] [WARNING] [QA_NOTIFICATIONS_33]: D2
[27.02.2021] [18:45:42] [WARNING] [QA_NOTIFICATIONS_33]: Donnée 2

 

Partager ce message


Lien à poster
Partager sur d’autres sites

AH ben voilà, ça marche entre QA alors, tu me disais au message précédent que non

Je préfère ça :)

 

 

Sinon la méthode bourrin qui fonctionne, en passant par l'API HTTP :

URL :

/api/devices/25/action/NotifierFromScene2

Type de requête : POST

Tableau de données :

{
	args = [
		{
			D1 = "Donnée 1"
		},
		{
			D2 = "Donnée 2"
		}
	]
}

Soit une fois encodé en JSON :

{"args":[{"D1":"Donnée 1"},{"D2":"Donnée 2"}]}

Tu n'as plus qu'à coder ça en LUA dans ta scène.

 

Et la fonction du QuickApp qui récupère les données du tableau :

function QuickApp:NotifierFromScene2(...)
	for _, v in ipairs({...}) do
		if type(v) == "table" then
			if v.D1 then
				self:debug(v.D1)
			elseif v.D2 then
				self:debug(v.D2)
			else
				-- ...
			end
		end
	end
end

 

Partager ce message


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

AH ben voilà, ça marche entre QA alors, tu me disais au message précédent que non

Je préfère ça :)

 

J'avais mal lu donc j'ai fait de la scène vers un autre QA et donc erreur aussi

Le dernier essai de QA a QA est OK c'est rassurant

 

J'ai trois Solutions la méthode BOURIN comme tu dit

Une fonction dans les scenes qui transforme la structure en chaine et le QA récepteur reconstitue la structure  

Ou remplacer si possible les scenes par des QA  pour travailler de QA

Peut être aussi qu'il aura une correction par Fibaro

 

J'ai du temps j'explore les difficultés que j'aurais en premier pour me faire une idée

En tout cas merci de ton aide

 

La semaine prochaine je vais installer ton Domochart, mais je n'ai pas encore inclus de device ( sauf les QA NetAtmo )

et si je peuxi je vais essayer aussi de remplacer des fake devices qui reçoivent des valeurs KW depuis une appli python qui lit un CurentCost par des QA

 

Pour domochart de la HC2 j'avais intégré des faux ID de devices pour des sondes 1 wire extérieures renseignées  avec une appli python qui charge la base avec des données d'un réseau 1-Wire ( hors Hc2 )

je remplacerai ce bazzar par 2 smartImplant pour récupérer les sondes ( seul pb le remplacement s'une sonde c'est la reconfig du device complet )

J'avais customisé ton appli ( Php et Script ) chose que je ne ferais plus pour pouvoir suivre les évolutions de ton produit

 

 

 

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Perso j'en suis arrivé à la conclusion que les scènes ne servent quasiment plus à rien sur HC3 (contrairement à la HC2)

Les QuickApps savent faire tout ce que savent faire les scènes, et même bien plus... donc le choix est vite fait. Même GEA est devenu un QA pour le coup !!

 

En tout cas tu as raison de tester, c'est pas évident au début, ça permet de se familiariser, d'explorer les possibilités, découvrir les limites.

 

Les Fake-devices, clairement ça n'a plus aucun intérêt, il suffit de se faire autant de QuickApp qu'on veut, avec le bon type, la bonne unité, etc. Intégration native dans la HC3 :)

Et tous les QA sont pris en compte par DomoCharts, ça simplifie tout.

Partager ce message


Lien à poster
Partager sur d’autres sites

ça me parle ce problème...

je fais une rapide recherche...

Modifié par jjacques68

Partager ce message


Lien à poster
Partager sur d’autres sites

j'avais le même soucis, transmettre une table depuis une scène vers un QA :

 

et je fais un json.encode(MaTable) dans la scène quand j'appelle la méthode du QA.

 

EDIT : et pas de json.en/decode() dans le QA.

Modifié par jjacques68

Partager ce message


Lien à poster
Partager sur d’autres sites

mais comme dit @Lazer, les scènes ne servent plus.

J'en ai plus que ... 4. En attente d'être converti en QA.

Je les utilise pour tester vite fait du code, ou pondre un truc temporairement à l'arrache :) 

Partager ce message


Lien à poster
Partager sur d’autres sites

oui je suis convaincu mais je n'ai pas pu tester un QA déclenché par un device ( j'ai pas de device inclus )

si ca marche alors je n'aurais plus de scène je pense

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Voilà, le déclenchement par trigger, c'est bien là la seule fonctionnalité exclusive aux scènes.

 

Et encore, avec un QuickApp, on peut utiliser l'API refreshStates et arriver au même résultat (voir exemple d'implémentation dans GEA, tout en bas du fichier main)

Mais ça reste plus complexe à mettre en œuvre, donc pour le semi-débutant qui veut juste coder quelques lignes de LUA rapides, il reste plus simple de créer une scène avec un trigger.

  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites

×