Re: script présence non fiable
Publié : 30 mars 2017, 16:32
Oui il me semble que la geoloc n'est dispo que dans la version payante.
Reprenez le contrôle de votre domotique
https://easydomoticz.com/forum/
Pourrais tu m'en dire u peu plus? de quoi s'agit-il?papoo a écrit :j'ai trouvé mon bonheur via ma freebox. il y a certe un peu de latence mais c'est fiable. il me semble avoir vu un script similaire pour liveboxloops a écrit :.../...j'ai abandonné le gestion de présence par ping.
Code : Tout sélectionner
--[[source : https://sites.google.com/site/au66bis/domoticz/scripts-lua/script_time_network_status ]]--
--Procédure pour obtenir APPTOKEN http://easydomoticz.com/forum/viewtopic.php?f=7&t=289&p=5042&hilit=freebox#p5042
--Créer une variable "freebox_mac_adress_smartphones" avec les MAC ADDRESS des Smartphones. Le séparateur est ";"
freebox_mac_adress_smartphones=uservariables["freebox_mac_adress_smartphones"]
--Créer une variable freebox_appid dans domoticz pour stocker le appid
freebox_appid = uservariables["freebox_appid"]
--Créer une variable freebox_apptoken dans domoticz pour stocker le apptoken
freebox_apptoken=uservariables["freebox_apptoken"]
apiFreeboxv4="http://mafreebox.freebox.fr/api/v4"
apiDomoticz="http://127.0.0.1:8080/json.htm?"
-- Session Token
session_token=""
--
local patternMacAdresses = string.format("([^%s]+)", ";")
local debugging = false -- true pour voir les logs dans la console log Dz ou false pour ne pas les voir
--------------------------------------------
---------------- Fonctions -----------------
--------------------------------------------
function voir_les_logs (s, debugging) -- nécessite la variable local debugging
if (debugging) then
if s ~= nil then
print ("<font color='#f3031d'>".. s .."</font>")
else
print ("<font color='#f3031d'>aucune valeur affichable</font>")
end
end
end -- usage voir_les_logs("=========== ".. nom_script .." (v".. version ..") ===========",debugging)
-- Fonction de lecture du contenu d'un fichier
-- @param : chemin vers le fichier
-- @return le contenu du fichier
function readAll(file)
local f = io.open(file, "rb")
if(f == nil) then
return ""
else
local content = f:read("*all")
f:close()
return content
end
end
-- Fonction de la connexion à la Freebox
-- Authentification pour récupérer le tokenDeSession
function connectToFreebox()
voir_les_logs("Connexion a la Freebox",debugging)
local TMPDIR_CHALLENGE = "/tmp/challenge.tmp"
local TMPDIR_APPTOKEN = "/tmp/apptoken.tmp"
local TMPDIR_SESSIONTOKEN = "/tmp/sessiontoken.tmp"
-- CHALLENGE : Appel de login pour charger le challenge
os.execute("curl -s " .. apiFreeboxv4 .. "/login > " .. TMPDIR_CHALLENGE)
local json_challenge = JSON:decode(readAll(TMPDIR_CHALLENGE))
local challenge = json_challenge.result.challenge
voir_les_logs(" Challenge : " .. challenge,debugging)
-- APP TOKEN : Calcul du mot de passe
voir_les_logs("Calcul HMAC SHA1",debugging)
voir_les_logs(" AppToken : " .. freebox_apptoken,debugging)
os.execute("echo -n " .. challenge .. " | openssl dgst -sha1 -hmac " .. freebox_apptoken .. " | cut -c10-200 > " .. TMPDIR_APPTOKEN)
local password = readAll(TMPDIR_APPTOKEN)
password=password:gsub("\n", "")
voir_les_logs(" Password : " .. password,debugging)
-- CONNEXION Session Connect
local table_app_session = {}
table_app_session["app_id"]=freebox_appid
table_app_session["password"]=password
local json_app_session = JSON:encode_pretty(table_app_session)
-- connexion à la session
os.execute("curl -s -H \"Content-Type: application/json\" -X POST -d '" .. json_app_session .. "' " .. apiFreeboxv4 .. "/login/session/ > " .. TMPDIR_SESSIONTOKEN)
local json_session_token = JSON:decode(readAll(TMPDIR_SESSIONTOKEN))
session_token=json_session_token.result.session_token
voir_les_logs(" Session Token : " .. session_token,debugging)
end
-- Fonction de la déconnexion à la Freebox
function disconnectToFreebox()
local TMPDIR_DISCONNECT = "/tmp/challenge.tmp"
os.execute("curl -m 5 -s -H \"X-Fbx-App-Auth: " .. session_token .. "\" -X POST " .. apiFreeboxv4 .. "/login/logout > " .. TMPDIR_DISCONNECT)
local disconnect = readAll(TMPDIR_DISCONNECT)
--voir_les_logs(" Deconnexion Freebox API : " .. disconnect)
end
-- Fonction de recherche des périphériques connectés
-- Connexion à lan/browser/pub/ pour lister les périphériques
-- @param session_token : token de session Freebox
-- @return périphériques connectés ?
function getPeripheriquesConnectes()
local TMP_PERIPHERIQUES = "/tmp/peripheriques.tmp"
-- Appel sur la liste des périphériques
voir_les_logs("Recherche des peripheriques connus de la Freebox",debugging)
local commandeurl="curl -s -H \"Content-Type: application/json\" -H \"X-Fbx-App-Auth: " .. session_token .. "\" -X GET " .. apiFreeboxv4 .. "/lan/browser/pub/"
os.execute(commandeurl .. " > " .. TMP_PERIPHERIQUES)
local json_peripheriques = JSON:decode(readAll(TMP_PERIPHERIQUES))
local etatSmartphone = false
-- Liste des périphériques
for index, peripherique in pairs(json_peripheriques.result) do
for mac in string.gmatch(freebox_mac_adress_smartphones, patternMacAdresses) do
local peripherique_mac_adress = "ether-" .. mac:lower()
if(peripherique_mac_adress == peripherique.id)
then
voir_les_logs("Statut du peripherique [" .. mac .. "] : actif:" .. tostring((peripherique.active and peripherique.reachable)),debugging)
if(peripherique.active and peripherique.reachable) then
etatSmartphone = true
commandArray [peripherique.primary_name]='On'
print ("[FREEBOX] Activation de : " .. peripherique.primary_name .. "")
else
commandArray [peripherique.primary_name]='Off'
print ("[FREEBOX] DesActivation de : " .. peripherique.primary_name .. "")
end
end
end
end
return etatSmartphone
end
--------------------------------------------
-------------- Fin Fonctions ---------------
--------------------------------------------
commandArray = {}
time=os.date("*t")
if time.min ~= 0 then -- execution toutes les minutes sauf à xx:00
voir_les_logs("[FREEBOX] Statuts des peripheriques reseau Freebox",debugging)
-- Boucle principale
if( freebox_apptoken == nil or freebox_appid == nil or freebox_mac_adress_smartphones == nil ) then
error("[FREEBOX] Les variables {freebox_apptoken}, {freebox_appid}, {freebox_mac_adress_smartphones} ne sont pas définies dans Domoticz")
return 512
else
voir_les_logs("Test de presence des appareils d'adresses MAC (" .. freebox_mac_adress_smartphones .. ")",debugging)
voir_les_logs("Chargement de la librairie JSON",debugging)
JSON = (loadfile "/home/pi/domoticz/scripts/lua/JSON.lua")() -- one-time load of the routines
-- Connexion à la Freebox
connectToFreebox()
-- Recherche des périphériques connectés
peripheriques_up = getPeripheriquesConnectes()
-- Recherche des périphériques connectés mais HORS ALARME
--getPeripheriquesConnectes2()
-- Mise à jour de l'alarme
-- On vérifie d'abord si l'alarme n'est pas en manuel :
--[[local Manuel = uservariables['AlarmManuel']
if (Manuel == '0') then
updateAlarmeStatus(peripheriques_up)
else
logAlarme("L'alarme est forcée, aucun changement depuis ce script")
end]]--
-- Déconnexion à la Freebox
disconnectToFreebox()
end
end --if time
return commandArrayC'est ce que j'avais faitpapoo a écrit :@jeff :
mets le en dur dans le script ou relance la procedure pour obtenir un autre app token
Code : Tout sélectionner
os.execute("echo -n " .. challenge .. " | openssl dgst -sha1 -hmac " .. freebox_apptoken .. " | cut -c10-200 > " .. TMPDIR_APPTOKEN)
local password = readAll(TMPDIR_APPTOKEN)
password=password:gsub("\n", "")
voir_les_logs(" Password : " .. password,debugging)
-- CONNEXION Session Connect
local table_app_session = {}
table_app_session["app_id"]=freebox_appid
table_app_session["password"]=password
local json_app_session = JSON:encode_pretty(table_app_session)
-- connexion à la session
os.execute("curl -s -H \"Content-Type: application/json\" -X POST -d '" .. json_app_session .. "' " .. apiFreeboxv4 .. "/login/session/ > " .. TMPDIR_SESSIONTOKEN)
local json_session_token = JSON:decode(readAll(TMPDIR_SESSIONTOKEN))