Activation automatique de caméra en cas d'absence - Veralite, Freebox API, smartphone, bash
Par The WebMaster ! » 15 juin 2018 (13:05) - Domotique
Activer votre caméra wifi lorsque vous êtes absent, la désactiver à votre retour





Prérequis:
- Freebox V6, wifi personnel activé, mode routeur
- Smartphone avec wifi activé sur le réseau personnel.
- Caméra configurée
- Veralite [UI7] débloquée (accès ssh) - Attention, cela dévalide tout support commercial futur.
Note: La version OpenWrt de la Veralite étant bridée, j'ai été contraint de bricoler les json moi-même.
si vous êtes téméraire, vous pouvez faire évoluer le repo opkg vers http://downloads.openwrt.org/attitude_adjustment/12.09/ramips/rt3883/packages/ , mais vous risquez alors de manquer de place pour les updates de GetVera.com; mais c'est un autre sujet 
( cat /proc/cpuinfo )
- Interrupteur Zwave, avec la caméra branchée dessus. On nommera cette interrupteur "Camera"
L'obtention du numéro de périphérique de l'interrupteur peut s'obtenir sous le shell de la manière suivante:
wget -q -O - "http://127.0.0.1:3480/data_request?id=sdata&output_format=xml" | grep device | grep '"Camera"' | tr -d '"' | awk '{print $4}' | sed "s/id=//"
Obtention de l'adresse MAC de votre smartphone/tablette:
[à indiquer en dur dans le script, sur la ligne après le DEVNUM]
Script complet:
#!/bin/bash
# Gestion de la camera, en fonction de la presence ou absence de la tablette sur le reseau wifi
# A EXECUTER EN USER ROOT
# 1ere etape: on recupere le token de l'appli. Uniquement au 1er passagee.
if [ ! -f /root/params_app.json ]
then
echo { > /root/params_app.json
echo '"app_id": "Gestion_Camera",' >> /root/params_app.json
echo '"app_name": "Gestion_Camera",' >> /root/params_app.json
echo '"app_version": "0.0.1",' >> /root/params_app.json
echo '"device_name": "Veralite"' >> /root/params_app.json
echo } >> /root/params_app.json
fi
# On recupere l'app_token au premier passage - nécessite action sur la freebox
if [ ! -f /root/app_token.json ]
then
curl -s -H "Content-Type: application/json" --data @/root/params_app.json http://mafreebox.freebox.fr/api/v3/login/authorize/ > /root/app_token.json
fi
json=$(cat /root/app_token.json)
prop='app_token'
app_token=$(echo $json | sed -e 's/[":]//g' | awk -F $prop '{print $2}' | awk -F '[,}]' '{print $1}')
prop='track_id'
track_id=$(echo $json | sed -e 's/[":]//g' | awk -F $prop '{print $2}' | awk -F '[,}]' '{print $1}')
# app_token="app_token_sans_les_\"
echo app_token vaut [ ${app_token} ]
# app_token=$(echo $app_token | sed -e 's/\\//g' | sed -e 's/\///g')
app_token=$(echo $app_token | sed -e 's/\\//g')
echo app_token vaut maintenant [ ${app_token} ]
echo track_id vaut [ ${track_id} ]
status=""
# (2ème étape: Monitorer le track_id)
while [ "$status" != "granted" ]
do
curl -s -H "Content-Type: application/json" http://mafreebox.freebox.fr/api/v3/login/authorize/$track_id > /tmp/status.json
json=$(cat /tmp/status.json)
prop='status'
status=$(echo $json | sed -e 's/[":]//g' | awk -F $prop '{print $2}' | awk -F '[,}]' '{print $1}')
echo status vaut [ ${status} ]
sleep 5
done
rm -f /tmp/status.json
# 3ème étape: Obtenir un session_token, (challenge + app_token = password)
#on recupere le challenge
curl -s -H "Content-Type: application/json" http://mafreebox.freebox.fr/api/v3/login/ > /tmp/login.json
json=$(cat /tmp/login.json)
prop='challenge'
challenge=$(echo $json | sed -e 's/[":]//g' | awk -F $prop '{print $2}' | awk -F '[,}]' '{print $1}')
challenge=$(echo $challenge | sed -e 's/\\//g')
echo challenge vaut [ ${challenge} ]
rm -f /tmp/login.json
# Construction du password à partir du app_token + challenge
password=$(echo -n $challenge | openssl sha1 -hmac $app_token | cut -d '=' -f2 | sed 's/ //g')
echo password vaut [ ${password} ]
# 4ème étape: On ouvre la session
echo { > /tmp/credentials.json
echo '"app_id": "Gestion_Camera",' >> /tmp/credentials.json
echo '"password": "'$password'"' >> /tmp/credentials.json
echo } >> /tmp/credentials.json
# Pour voir le contenu de l'échange
#curl --trace-ascii -0 -d var=val http://mafreebox.freebox.fr/api/v3/login/session/
curl -s -H "Content-Type: application/json" --data @/tmp/credentials.json http://mafreebox.freebox.fr/api/v3/login/session/ > /tmp/session.json
json=$(cat /tmp/session.json)
prop='session_token'
session_token=$(echo $json | sed -e 's/[":]//g' | awk -F $prop '{print $2}' | awk -F '[,}]' '{print $1}')
echo session_token vaut [ ${session_token} ]
#sleep 3
#done
# Pareil, echapper les backslash !
session_token=$(echo $session_token | sed -e 's/\\//g')
echo session_token vaut [ ${session_token} ]
rm -f /tmp/session.json
# 5ème étape: Les actions à effectuer
# Recuperation donnees zwave du smartphone
# device prise camera, a recuperer, voir pus haut
DEVNUM=9
curl -s -H 'X-Fbx-App-Auth: '${session_token} -H "Content-Type: application/json" http://mafreebox.freebox.fr/api/v3/lan/browser/pub/ether-[ADRESSE MAC]
> /tmp/tablette.json
grep '"active":true' /tmp/tablette.json
# declenchement camera
Rc=$?
if [ $Rc -eq 0 ]
then
echo TABLETTE PRESENTE, on eteint
wget -O - "http://127.0.0.1:3480/data_request?id=lu_action&output_format=json&DeviceNum=${DEVNUM}&serviceId=urn:upnp-org:serviceId:SwitchPower1&action=SetTarget&newTargetValue=0">>/tmp/Gestion_Camera.log 2>&1
else
echo TABLETTE ABSENTE, on allume
wget -O - "http://127.0.0.1:3480/data_request?id=lu_action&output_format=json&DeviceNum=${DEVNUM}&serviceId=urn:upnp-org:serviceId:SwitchPower1&action=SetTarget&newTargetValue=1">>/tmp/Gestion_Camera.log 2>&1
fi
rm -f /tmp/tablette.json
rm -f /tmp/Gestion_Camera.log
# 6ème étape: Fermer la session (marche pas; normalement, en post, sans datas ? )
#wget --header='X-Fbx-App-Auth: '$session_token http://mafreebox.freebox.fr/api/v3/login/logout/ -O /tmp/logout.json
exit
Et pour finir, inscription dans la crontab, tous les quart d'heure:
*/15 * * * * /root/Gestion_Camera.sh>/tmp/Gestion_Camera.log 2>&1

