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