Problématique
La centrale d’alarme MyFox possède une API permettant d’interagir avec elle. Sa mise en œuvre n’est cependant pas triviale. Nous allons voir ici comment interagir avec elle en Lua.
Préliminaires
La première étape consiste à obtenir le Client ID et Client Secret. Pour cela s’identifier sur son compte. Penser à noter le Site Id qui figure sous la forme d’un nombre à la fin de l’adresse, puis aller dans la rubrique Mon compte, puis tout en bas dans Paramètres avancés cliquer sur le lien Cliquez ici pour utiliser l’API Myfox.
Une fois sur la page myfox api cliquer sur l’onglet My Applications et s’identifier à nouveau et dans
You don’t have any personal identifiers, enable
your personal Myfox API, cliquer sur enable
pour obtenir les Client ID et Client Secret.
Le code en Lua
Avant d’aller plus loin, vérifiez que vous disposez bien des 5 informations suivantes :
- L’identifiant du compte Myfox (une adresse courriel) à reporter à la place de
<identifiant>
- Le mot de passe du compte Myfox à reporter à la place de
<mot de passe>
- Le Client ID à reporter à la place de
<Client ID>
- Le Client Secret à reporter à la place de
<Client Secret>
- L’identifiant de votre installation Myfox à reporter à la place de
<Site Id>
Pour communiquer avec l’API, il faut acquérir un jeton avec acquerirJeton()
.
Ce jeton est valable 1 heure et peut être rafraîchit avec renouvelerJeton()
.
statut()
propose un exemple d’interrogation qui permet de connaître l’état courant d’armement de l’alarme Myfox.
-- Installation de luasec pour le https -- sudo apt-get install libssl1.0.0 libssl-dev -- sudo luarocks install luasec OPENSSL_LIBDIR=/usr/lib/x86_64-linux-gnu (Ubuntu) -- sudo luarocks install luasec OPENSSL_LIBDIR=/usr/lib/arm-linux-gnueabihf (Raspberry Pi) local https = require("ssl.https") local identifiant = '<identifiant>' local motDePasse = '<mot de passe>' local clientID = '<Client ID>' local clientSecret = '<Client Secret>' local siteId = '<Site Id>' local access_token = nil local refresh_token = nil local echeance = nil -- Request access token function acquerirJeton() local url = 'https://api.myfox.me/oauth2/token' local post = string.format('grant_type=password&client_id=%s&client_secret=%s&username=%s&password=%s', clientID, clientSecret, identifiant, motDePasse) local body, code = https.request(url, post) assert(code == 200) access_token, refresh_token = string.match(body, '"access_token":"([^"]*)".*"refresh_token":"([^"]*)"') end -- Refreshing an expired access_token function renouvelerJeton() local url = 'https://api.myfox.me/oauth2/token' local post = string.format('grant_type=refresh_token&refresh_token=%s&client_id=%s&client_secret=%s', refresh_token, clientID, clientSecret) local body, code = https.request(url, post) assert(code == 200) access_token, refresh_token = string.match(body, '"access_token":"([^"]*)".*"refresh_token":"([^"]*)"') end -- Statut de l'alarme : 'disarmed', 'partial' ou 'armed' function statut() local url = string.format('https://api.myfox.me:443/v2/site/%s/security?access_token=%s', tostring(siteId), access_token) local body, code = https.request(url) assert(code == 200) local statut = string.match(body, '"statusLabel":"([^"]*)"') return statut end |
Bonjour,
Peut-on utiliser ce code LUA dans la home center 2 de Fibaro ?
Pour avoir un retour d’état de la centrale Myfox dans la box Fibaro ?
Merci,
Ln
Bonjour,
Il s’agit de Lua standard. La particularité est qu’il faut pouvoir effectuer une requête en https. C’est la raison de la ligne
local https = require("ssl.https")
. Cela nécessite d’installer une librairie. Je ne sais pas si c’est possible sur la HC2 de Fibaro. Mais peut-être que Fibaro possède déjà une librairie permettant d’effectuer des requêtes en https.Il vous faut donc vous renseigner sur le moyen de faire des requêtes en https sur la HC2.
Cordialement, Laurent
Bonjour,
Le https est bien pris en charge dans les modules virtuels, mais pas dans les scènes de la Home Center 2 de Fibaro (LUA).
Afin de mieux comprendre votre code, quelle méthode choisir: le POST ou le GET ?
Merci,
Ln
Je me suis mal exprimée.
Comment le code fait-il pour acquérir ou renouveller un jeton ? un déclenchement ?
La fonction statut doit-elle être aussi déclenchée ?
A terme, ce l’objectif étant de lancer le changement du statu (activé, désactivée ou partielle) …
Merci,
Ln
Pour acquérir un jeton, il faut faire :
acquerirJeton()
Ensuite, il faut faire un :
renouvelerJeton()
périodiquement (toutes les 45 minutes par exemple). De mémoire, un jeton expire au bout de 1 heure s’il n’est pas renouvelé.Si le jeton expire, il faut refaire un
acquerirJeton()
.Dans ce billet
statut()
donne un exemple de code pour interagir avec la centrale. Pour armer ou désarmer, il faut regarder l’API afin de savoir quelle requête envoyer probablement sur le même principe questatut()
.https.request(url, post)
correspond à une requête de type post.https.request(url)
correspond à une requête de type get.cf. http://w3.impa.br/~diego/software/luasocket/http.html
Merci Laurent de ces claires explications ;)