Communication en Lua avec la centrale MyFox

myfoxAPILua

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

Informations et sources

Cette entrée a été publiée dans Domotique, Contrôleurs, Surveillance, Alarme and taguée , . Placez un signet sur le permalien.

7 Responses to Communication en Lua avec la centrale MyFox

  1. cHELENE

    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

    Reply
    • Laurent Post author

      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

      Reply
  2. cHELENE

    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

    Reply
    • cHELENE

      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

      Reply
      • Laurent Post author

        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 que statut().

        Reply

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *