Aller au contenu
MAM78

Push d'une valeur depuis un appareil externe vers un QuickApp

Recommended Posts

@Lazer pourrais-tu STP me donner un exemple de requête HTTP de sollicitation de ton Quick App via la fonction push.

 

histoire de ne pas trop polluer le sujet sur les Quick App Child, je pose ma question ici ;)

 

J'ai fais quelques essais, sans résultat probant :

 

http://xxx.xxx.xxx.xxx/api/callAction?deviceID=290&push={"value":true}

http://xxx.xxx.xxx.xxx/api/callAction?deviceID=290&push=true

http://xxx.xxx.xxx.xxx/api/callAction?deviceID=290&name=push&"value":true

http://xxx.xxx.xxx.xxx/api/callAction?deviceID=290&name=push{"value":true}

 

 

Modifié par MAM78

Partager ce message


Lien à poster
Partager sur d’autres sites

Le topic du QuickApp Surveillance Station n'est pas du tout le bon endroit pour en parler, car en l'occurrence on ne Push rien vers ce QA (c'est du polling pur)

La fonction push() existe belle et bien, mais pour un usage purement interne au QA (même si elle est exposée donc accessible via l'API, quel intérêt à part foutre la grouille : forcer le statut d'une caméra qui ne correspond plus à son état réel.... :rolleyes:)

 

Bref je sépare ton message pour créer un nouveau topic de discussion général

Partager ce message


Lien à poster
Partager sur d’autres sites

Ok pour la séparation. J'ai posté sur le sujet surveillance station puisque tu la mis en oeuvre dans ce Quick App ;) et évidemment pas non plus celui sur les Child puisque non spécifique à ce sujet.

 

Bien évidement, ce n'est pas pour l'utiliser dans ton via Surveillance Station. Mais pour une autre utilisation.

 

Tu pourrais STP néanmoins m'éclairer sur la bonne syntaxe HTTP pour la bonne sollicitation de l'action Push avec les paramètres qui vont bien.

Partager ce message


Lien à poster
Partager sur d’autres sites

Alors, voici la solution que je propose (je l'utilise dans mes différents QuickApps).

 

 

Soit un QuickApp (dans le parent ou bien dans les enfants) qui expose la fonction suivante :

function QuickApp:push(value, attribute)
	-- ...
	self:updateProperty(attribute or "value", value)
	-- ...
end

 

Rappel de sécurité : on commence par créer un utilisateur dédié sur la HC3, avec un mot de passe spécifique, et on lui donne les droits d'accès à ce QuickApp.

Dans cet exemple, l'utilisateur s'appellera "IPX800" et le mot de passe "Password" (c'est mal :ph34r:)

 

On va ensuite configurer l'appareil distant pour qu'il puisse accéder à l'API HTTP afin d'appeler la fonction push() en passant les arguments en paramètres.

 

Note : la suite n'a rien de spécifique aux QuickApps ou à la HC3, c'était déjà comme cela sur la HC2 (et donc la HC-Lite) pour n'importe quel module Z-Wave, Plugin, Module Virtuel, Scène, ... bien sûr ils n'ont pas de fonction push(), mais des fonctions turnOn(), pressButton(), etc.

 

Dans cet exemple on partira du principe que le module porte l'ID 123.

 

 

  • Avec une requête de type GET :
/api/callAction?deviceID=123&name=push&arg1=1

L'argument prend ici la valeur "1", mais ça pourrait être n'importe quel nombre, chaine de caractère, valeur binaire true/false, etc.... ce qui compte, c'est qu'on sache interpréter cette valeur, et surtout qu'elle corresponde au type de la propriété value du QuickApp.

 

Remarque : ce n'est PAS la méthode recommande par Fibaro, et elle n'est d'ailleurs plus documentée. Elle est conservé pour des raisons historiques, car c'était l'API initialement disponible dans la v3 de la HC2 (et peut être même la v1.... j'en sais rien je n'étais pas né :D )

Cela dit elle nous arrange bien, car la méthode GET a l'avantage d'être totalement universelle, c'est à dire qu'elle fonctionne aussi bien dans la barre d'adresse de notre navigateur préféré, que depuis les appareils limités comme ceux proposés par GCE Electronics (malgré toutes leurs qualités)

 

En pratique dans l'interface Web de l'IPX800 ça donne ça : on remarque qu'il y a 2 valeurs, selon si on fait un ON ou un OFF, c'est la seule différence entre les 2 requêtes :

image.png.945600c04dbe8697c364253cd1760315.png

 

 

 

  • Avec une requête POST :
/api/devices/132/push/1

Avec en données :

{"args":[1]}

Même remarque que précédemment, l'argument prend ici la valeur "1", mais ça pourrait être n'importe quel nombre, chaine de caractère, valeur binaire true/false, etc.... ce qui compte, c'est qu'on sache interpréter cette valeur, et surtout qu'elle corresponde au type de la propriété value du QuickApp.

On peut aussi spécifier plusieurs arguments, séparés par des virgules.

 

Remarque : c'est la méthode recommandée par Fibaro depuis la HC2 v4 et documentée dans le Swagger de la HC3 : /swagger?urls.primaryName=devices

Inconvénient, elle est plus difficile à tester depuis un navigateur Web, car il faut utiliser une extension spécifique (Postman)

 

En pratique ça donne ça avec une requête curl (depuis n'importe quelle ligne de commande Shell) :

curl --request POST --user 'IPX800:Password' --data '{"args":[1]}' http://192.168.1.1/api/devices/123

 

 

 

PS : tu es vraiment trop impatient, tu ne laisses même pas le temps de rédiger la réponse.... :P

 

  • Like 2

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci, j'ignorais que tu allait nous nous faire un super Tuto :60:  :13:

 

Modifié par MAM78

Partager ce message


Lien à poster
Partager sur d’autres sites

Pour compléter, cette méthode push() fait un peu plus que la simple ligne présentée dans l'exemple.

Elle affiche des logs, réalise des tests de validité de la variable donnée, des éventuelles transformations (par exemple 1 et 0 deviennent true et false), etc

 

Donc en pratique, j'utilise également cette fonction push() en interne dans le QuickApp.

Par exemple, à chaque interrogation régulière (Polling) du périphérique distant, la propriété du module est mise à jour au travers de cette fonction.

Il suffit de l'appeler de la manière suivante :

self:push(value)

Ou bien encore :

for _, child in pairs(self.childDevices) do
	child:push(value)
end

 

Mais je m'en sert également pour mettre les modules en état mort si la connexion réseau est perdue :

self:push(true, "dead")

 

On fait ce qu'on veut après....

 

 

 

J'ai fait un tuto, oui en question sorte.

Disons qu'une longue explication reprenant les bases me semblait nécessaire tant les discussions partaient dans tous les sens, sans vraiment comprendre le pourquoi du comment.

 

 

Partager ce message


Lien à poster
Partager sur d’autres sites

oh punaise ça c'est la top classe (sans jeux de mots) ce petit tuto.

Faudrait pas le perdre !

 

merci !

Modifié par jjacques68

Partager ce message


Lien à poster
Partager sur d’autres sites

×