Ldfa Posté(e) le 30 décembre 2019 Posté(e) le 30 décembre 2019 JEROME du site 66BIS est l’auteur originel de ce script fonctionnant avec domoticzje l’ai adapté à mon propre usage.mode debbuggingAPI V4Stockage 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 lastupdateutilisation de l’activation/désactivation de l’alarme du script ideAlarm il vous faut créer trois variables de type chaînefreebox_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 virgulefreebox_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 http://pon.fr/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 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 http://pon.fr/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 local content = f:read("*all") return content -- 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) -- 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) -- 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) 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 if otherdevices[peripherique.primary_name] == 'On' then commandArray [peripherique.primary_name]='Off' voir_les_logs("--- --- --- [FREEBOX] DesActivation de : " .. peripherique.primary_name .." --- --- --- ",debugging) end return etatSmartphone 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) 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 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 return etatPeripheriques -- 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 Afficher l’article complet
Messages recommandés
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.