Domotique et API Freebox Domotique et API Freebox
Menu

Domotique et API Freebox

6 mai 2017 - Domotique
Domotique et API Freebox

Domotique et API Freebox

En domotique il est bien de pourvoir détecter la présence d’une personne dans la maison.

Mais comment détecter la présence ?

Détecteur de mouvtéléphone wifiement ! Je détecte les mouvements mais c’est peut être le chat et c’est qui qui est la ?

Et si je pouvais détecter la présence d’une personne (de son téléphone) par sa connexion au réseau wifi !!!

Quand je suis chez moi j’ai mon téléphone et il se connecte à ma box par le Wifi 🙂

Et avec l’API de ma Freebox je vais détecter cette connexion et l’utiliser dans ma domotique. Pour mon cas je vais éteindre mon DashScreen quand je sors et le rallumer à mon retour. Même un peu avant mon arrivé car ma connexion est détectée avant que je rentre chez moi.

Dans cette article je vais vous expliquer comment utiliser l’API Freebox en Python et détecter un appareil connecter sur cette box. A vous d’utiliser cela dans votre installation et aussi d’utiliser l’API Freebox qui permet de tout faire. Je vous invite à aller voir la notice pour en savoir plus : https://dev.freebox.fr/sdk/os/

Avant de pouvoir utiliser l’API Freebox il y a deux chose à faire. Connaitre la version utiliser dans votre box et créer une API sur votre box afin d’avoir un ticket. Pour cela il faut être connecté en local. Ensuite l’API pourra être utiliser en extérieur avec votre domain de votre box.

Pour connaitre la version de l’API : http://mafreebox.freebox.fr/api_version vous allez avoir quelque chose comme cà :

{"uid":"9e7d99af9bca5d8d77c8cfb2c026ee97","https_available":true,"https_port":13613,"device_name":"Freebox Server","api_version":"4.0","api_base_url":"\/api\/","device_type":"FreeboxServer1,1"}

La chose importante c’est la version ici 4

Pour créer l’application dans la box j’ai écrit un code en Python. Il faudra le lancer une seul fois. Il faudra sur la Freebox valider cette application en cliquant sur la flèche de droite et vous aurez votre ticket à garder pour la suite :

import requests
import json

payload = {'app_id': 'fr.freebox.testapp', 'app_name': 'Test App', 'app_version': '4', 'device_name': 'Test appi'}

payload = json.dumps(payload)
r = requests.post("http://mafreebox.freebox.fr/api/v4/login/authorize/", data=payload)

print r.text

Pour le valeur de payload vous pouvez mettre comme bon vous semble sauf pour la version où il faut reprendre la version récupérer plus haut.

Validation API Freebox

Dans votre FreeboxOS vous pouvez aller dans le menu Paramètre de la Freebox(mode avancé) / Gestion des accès(en bas) / Application

Api FreeboxMaintenant nous allons pouvoir utiliser cette application en local et en extérieur !!! avec notre ticket.

Il faudra demander un autre ticket de session et lancer une requêtes en POST ou GET suivant les cas.

Pour commencer on demande avec notre ticket d’application un tickets de session nous permettant une connexion sans mot de passe.

Pour cela j’ai écrit un code en Python qui utilise la librairie requests permettant des requètes faciles 🙂

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import requests
import json
import hmac
import hashlib

def connexion_post(method,data=None,headers={}):
    url = "http://mafreebox.freebox.fr3/api/v4/"+method
    if data: data = json.dumps(data)
    return json.loads(requests.post(url, data=data, headers=headers).text)

def connexion_get(method, headers={}):
    url = "http://mafreebox.freebox.fr/api/v4/"+method
    return json.loads(requests.get(url, headers=headers).text)
	
def mksession():
    token = "64nBG+BDJejukbvjfdbvjfskdbgdfskmjbvsmdflqlnsnlfHyf3e2JU9E" 
    challenge=connexion_get("login/")["result"]["challenge"]
    data={
    	  "app_id": "fr.freebox.testapp",
      	"password": hmac.new(token,challenge,hashlib.sha1).hexdigest()
    }
    return connexion_post("login/session/",data)["result"]["session_token"]

session_token = mksession() #création session API Freebox

Dans ce code j’ai d’abord fait deux fonctions pour pouvoir faire les requêtes POST ou GET. Pour l’URL j’ai laissé l’URL en local pour passer en extérieur il faudra mettre le domaine de votre Freebox et je suis en version 4 de l’API.

Ensuite j’ai une fonction mksession qui va nous retourner notre ticket de session. Il faut mettre votre ticket de votre application (token) et le nom de votre application (app_id).

BTCClicks.com Banner

Avec ce ticket je vais pouvoir lancer mes requêtes suivant mes besoin. Dans mon cas je veux savoir si mon téléphone est connecté.

Pour cela je lance cette fonction en passant en argument mon ticket de session:

def recherche_app(session_token):
    method = "lan/browser/pub/"
    resultat =  connexion_get(method, headers={"X-Fbx-App-Auth": session_token})
    #recherche dans resultat des élements connectés avec le adresse MAC
    for val in resultat["result"]:
		for  val2  in val["l2ident"].values():
			if val2 == "28:5A:EB:83:25:8C":
			telephone = val["active"]  
    return telephone 

Cette fonction lance une requête GET avec une méthode : lan/browser/pub/ et mon ticket de session. Ensuite dans le résultat de la requête (JSON) je cherche l’adresse IMAC de mon téléphone.

Vous pouvez récupérer cette adresse dans votre Freebox OS menu périphérique réseau.

Et en retour j’ai une variable telephone qui est soir True ou False suivant la présence ou non de mon téléphone 🙂

Pour la suite à vous de voir suivant vos besoins. Vous trouverez sur ce lien https://github.com/Michelgard/API_Freebox_V4 l’ensemble du code.

Bon amusement avec l’API Freebox

Certains liens que vous trouverez dans cet article sont des liens affiliés. C’est à dire que je peux toucher une commission si vous vous procurez un des produits présentés. Mais si j’en parle dans ce blog c’est que c’est un bon outil !