JEROME du site 66BIS est l’auteur originel de ce script fonctionnant avec domoticz
je l’ai adapté à mon propre usage.
mode debbugging
API V4
Stockage des fichiers temporaires sur la freebox.
Périphériques utilisés pour l’activation/désactivation automatique de l’alarme (iphones)
Périphériques connectés à surveiller hors alarme ( TV, tablettes, nas, …)
Mise à jour des périphériques sur domoticz seulement si changement d’état, pour limiter les logs et connaitre facilement le temps d’allumage via lastupdate
il vous faut créer trois variables de type chaîne
freebox_apptoken pour stocker votre apptoken (Procédure pour obtenir APPTOKEN)
freebox_mac_adress_smartphones pour stocker la listes des adresses MAC des périphériques utilisés pour l’activation/désactivation automatique de l’alarme séparées par un point virgule
freebox_mac_adress_surveillance pour stocker la listes des adresses MAC des périphériques connectés à surveiller hors alarme séparées par un point virgule
--[[ source : https://sites.google.com/site/au66bis/domoticz/scripts-lua/script_time_network_status https://easydomoticz.com/forum/viewtopic.php?f=10&t=3825&p=46712#p46712 /network-status-via-freebox-en-lua/ Procédure pour obtenir APPTOKEN http://easydomoticz.com/forum/viewtopic.php?f=7&t=289&p=5042&hilit=freebox#p5042 MAJ : 23/12/2017 ]]-- -------------------------------------------- ------------ Variables à éditer ------------ -------------------------------------------- local nom_script = "FreeBox Network Status" local version = "1.3" local debugging = true -- true pour voir les logs dans la console log Dz ou false pour ne pas les voir freebox_appid="Domoticz.app" --uservariables["freebox_appid"] -- 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"] freebox_mac_adress_surveillance=uservariables["freebox_mac_adress_surveillance"] -- Créer une variable "freebox_mac_adress_surveillance" avec les MAC ADDRESS des Smartphones N' entrant PAS en compte pour l'alarme. Le séparateur est ";" freebox_apptoken=uservariables["freebox_apptoken"] -- URL des API A CHANGER apiFreeboxv4="http://mafreebox.freebox.fr/api/v4" apiDomoticz="http://127.0.0.1:8080/json.htm?" -- Session Token session_token="" -------------------------------------------- ----------- Fin variables à éditer --------- -------------------------------------------- local patternMacAdresses = string.format("([^%s]+)", ";") -------------------------------------------- ---------------- Fonctions ----------------- -------------------------------------------- package.path = package.path..";/home/pi/domoticz/scripts/lua/fonctions/?.lua" require('fonctions_perso') 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 = "/media/Freebox/Trend/challenge.tmp" local TMPDIR_APPTOKEN = "/media/Freebox/Trend/apptoken.tmp" local TMPDIR_SESSIONTOKEN = "/media/Freebox/Trend/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 deconnexion à la Freebox function disconnectToFreebox() local TMPDIR_DISCONNECT = "/media/Freebox/Trend/challenge.tmp" --"/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() -- liste les périphériques utilisés pour l'activation/désactivation automatique de l'alarme local TMP_PERIPHERIQUES = "/media/Freebox/Trend/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 ".. peripherique.primary_name.." [" .. mac .. "] => actif:" .. tostring((peripherique.active and peripherique.reachable)),debugging) if(peripherique.active and peripherique.reachable) then etatSmartphone = true if otherdevices[peripherique.primary_name] == 'Off' then commandArray [peripherique.primary_name]='On' voir_les_logs("--- --- --- [FREEBOX] Activation de : " .. peripherique.primary_name .." --- --- --- ",debugging) end else if otherdevices[peripherique.primary_name] == 'On' then commandArray [peripherique.primary_name]='Off' voir_les_logs("--- --- --- [FREEBOX] DesActivation de : " .. peripherique.primary_name .." --- --- --- ",debugging) end end end end end return etatSmartphone end function getPeripheriquesConnectes2() -- liste les périphériques utilisés pour local TMP_PERIPHERIQUESHORSALARME = "/media/Freebox/Trend/peripheriques_hors_alarme.tmp" -- Appel sur la liste des périphériques voir_les_logs("Recherche des peripheriques connus de la Freebox (hors alarme)",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_PERIPHERIQUESHORSALARME) local json_other_peripheriques = JSON:decode(readAll(TMP_PERIPHERIQUESHORSALARME)) etatPeripheriques = false -- Liste des périphériques HORS ALARME for index, other_peripherique in pairs(json_other_peripheriques.result) do for mac in string.gmatch(freebox_mac_adress_surveillance, patternMacAdresses) do local other_peripherique_mac_adress = "ether-" .. mac:lower() if(other_peripherique_mac_adress == other_peripherique.id) then voir_les_logs("Statut du peripherique ".. other_peripherique.primary_name.." [" .. mac .. "] => actif:" .. tostring((other_peripherique.active and other_peripherique.reachable)),debugging) if(other_peripherique.active and other_peripherique.reachable) then etatPeripheriques = true if otherdevices[other_peripherique.primary_name] == 'Off' then commandArray [other_peripherique.primary_name]='On' voir_les_logs("--- --- --- [FREEBOX] Activation de : " .. other_peripherique.primary_name .." --- --- --- ",debugging) end else if otherdevices[other_peripherique.primary_name] == 'On' then commandArray [other_peripherique.primary_name]='Off' voir_les_logs("--- --- --- [FREEBOX] DesActivation de : " .. other_peripherique.primary_name .." --- --- --- ",debugging) end end end end end return etatPeripheriques end -- Mise à jour de l'alarme suivant le statut des périphériques -- @param : état des périphériques function updateAlarmeStatus(etat_peripheriques) local etatActuelAlarme=otherdevices['Security Panel'] voir_les_logs(" > Etat du panneau de securite = " .. etatActuelAlarme ,debugging) local SEUIL_ALARME = 1 -- temps en minute avant activation de l'alarme local TMPDIR_COMPTEUR_OUT = "/media/Freebox/Trend/compteur_smartphone_out.tmp" -- Activation de l'alarme au bout de X min if(not etat_peripheriques and etatActuelAlarme == "Normal") then --if(not etat_peripheriques) then compteurOff=readAll(TMPDIR_COMPTEUR_OUT) if(compteurOff == "") then compteurOff = 0 end compteurOff = compteurOff + 1 voir_les_logs(" > Compteur de mise en alarme = " .. compteurOff .. " / " .. SEUIL_ALARME,debugging) if(compteurOff >= SEUIL_ALARME) then voir_les_logs("Activation de l'alarme",debugging) commandArray[#commandArray+1] = {['Alarme Out']="On"} commandArray[#commandArray+1] = {['test presences']="Off"} compteurOff = 0 end os.execute("echo " .. compteurOff .. " > " .. TMPDIR_COMPTEUR_OUT) elseif(etat_peripheriques and etatActuelAlarme == "Arm Away") then -- Désactivation immédiate commandArray[#commandArray+1] = {['Alarme Out']="On"} commandArray[#commandArray+1] = {['test presences']="On"} voir_les_logs("Desactivation de l'alarme",debugging) os.execute("echo 0 > " .. TMPDIR_COMPTEUR_OUT) elseif(etat_peripheriques) then os.execute("echo 0 > " .. TMPDIR_COMPTEUR_OUT) commandArray[#commandArray+1] = {['test presences']="On"} voir_les_logs("Remise a zero du compte de l'alarme",debugging) end 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 or freebox_mac_adress_surveillance == nil ) then error("[FREEBOX] Les variables {freebox_apptoken}, {freebox_appid}, {freebox_mac_adress_smartphones}, {freebox_mac_adress_surveillance} ne sont pas definies dans Domoticz") return 512 else voir_les_logs("Test de presence des appareils d'adresses MAC (" .. freebox_mac_adress_smartphones .. ")",debugging) voir_les_logs("Test de presence des appareils d'adresses MAC (" .. freebox_mac_adress_surveillance .. ")",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 (HORS ALARME) getPeripheriquesConnectes2() updateAlarmeStatus(peripheriques_up) -- Déconnexion à la Freebox disconnectToFreebox() end end --if time return commandArray