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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 |
--[[ 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 |