Page 2 sur 3

Re: script présence non fiable

Publié : 30 mars 2017, 16:32
par loops
Oui il me semble que la geoloc n'est dispo que dans la version payante.

Re: script présence non fiable

Publié : 31 mars 2017, 07:22
par francklek
oui c'est exact la geoloc n'est dispo que dans l'appli payante ( bon c'est pas trop cher et ça aide un peu les developpeurs) sinon il y a geofence une appli gratuite qui fait le job mais ça rajoute une appli dans le tel.

Re: script présence non fiable

Publié : 05 mai 2017, 16:23
par Fullgame
papoo a écrit :
loops a écrit :.../...j'ai abandonné le gestion de présence par ping.
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 livebox
Pourrais tu m'en dire u peu plus? de quoi s'agit-il?

Merci!

Re: script présence non fiable

Publié : 05 mai 2017, 18:16
par papoo
j'ai modifier un peu un code trouvé ici

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 commandArray

Re: script présence non fiable

Publié : 10 mai 2017, 13:44
par Fullgame
Merci bcp!

je vais chercher un équivalent pour Orange, à moins que tu ais une piste?

Re: script présence non fiable

Publié : 10 mai 2017, 21:14
par Jeff
Merci en test.
Ma freebox ne voyait déjà pas mon smartphone connecté !! Obligé de couper le wifi et réactiver, çà commence mal :(
PS : impossible de prendre mon freebox_apptoken par une variable, il contient un "+" et il 'ne veut pas ... :cry:

Re: script présence non fiable

Publié : 10 mai 2017, 21:57
par papoo
@jeff :
mets le en dur dans le script ou relance la procedure pour obtenir un autre app token

Re: script présence non fiable

Publié : 10 mai 2017, 22:01
par papoo

Re: script présence non fiable

Publié : 10 mai 2017, 22:41
par Jeff
papoo a écrit :@jeff :
mets le en dur dans le script ou relance la procedure pour obtenir un autre app token
C'est ce que j'avais fait ;)

Par contre j'ai vu que ca buggait mes scripts du type "script_variable" quand je faisais des modifs, la seule solution que j'ai trouvé c'est supprimer le script et le remettre, plus erreur en faisant cela, très étrange !

Re: script présence non fiable

Publié : 18 sept. 2017, 23:41
par neleloloi
Bonjour,

J'ai essayé d'intégrer ce script dans mon Domoticz.
Etant sous Windows 7, j'ai fais quelques adaptations pour le rendre compatible ...
Maintenant, j'arrive à obtenir le challenge mais le password ressort désespérément vide ... Il m'indique l'APP_TOKEN mais pas de création du fichier TEMP (Idem pour le SESSION_TOKEN) et j'obtiens le LOG Erreur suivant :

Error: EventSystem: in C:\Program Files\Domoticz\scripts\lua\script_time_NETWORK_STATUS.lua: ...iles\Domoticz\scripts\lua\script_time_NETWORK_STATUS.lua:77: attempt to index local 'json_session_token' (a nil value)

Je pense que le problème démarre aux lignes suivantes :

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))
   
La dernière ligne correspond à la ligne 77
Certaines lignes du script sont elles incompatibles avec WINDOWS ? Auriez vous une piste à me proposer ?

Merci d'avance pour vos réponses