Aller au contenu

Messages recommandés

Posté(e)

Détection de présence avec la Freebox

 

Surveillance d'équipements réseaux connectés (smartphone, etc)

 

 

Prérequis :

  • Freebox v6 Revolution en mode routeur (par défaut)
  • Module virtuel Freebox Server de @Krkroff en version 0.1.1 minimum
  • Des appareils connectés sur le réseau IP (en Wi-Fi ou câble Ethernet)

 

Installation :

 

Télécharger le module virtuel Freebox et suivre les instructions de @Krikroff pour son installation : https://www.domotique-fibaro.fr/topic/328-plugin-freebox-v6/La dernière version connue à ce jour est la v0.1.1 : https://www.domotique-fibaro.fr/topic/328-plugin-freebox-v6/?page=9#comment-101866

 

 

Sur l'interface Web d'administration de Freebox OS, il faut aller dans la fenêtre Périphériques réseaux pour découvrir les adresses MAC des appareils à surveiller.

 

large.screenshot-freebox-peripherique-re

 

large.screenshot-freebox-peripherique-re


Modifier la Main Loop du module virtuel Freebox afin d'ajouter la surveillance d'équipements réseaux, voici la syntaxe (vous pouvez ajouter autant d'éléments que désiré)

  _lanDevice = {
    {
      mac = "00:00:00:00:00:00", -- Sony Xperia Z2 (ether-00:00:00:00:00:00)
      vg = "FbxV6_LAN_XperiaZ2"
    },
    {
      mac = "00:00:00:00:00:00", -- Samsung Galaxy S4 Mini
      vg = "FbxV6_LAN_S4mini"
    }
  },
  • mac : adresse MAC relevée sur la Freebox
  • vg : variable globale qui contient le timestamp Unix de la dernière fois que l'appareil a été vu sur le réseau... cela concerne donc aussi bien le Wi-Fi (sans-fil) que l'Ethernet (câble).

 

Sur la HC2, dans le panneau de variables, Pensez à créer vous-même les variables globales FbxV6_LAN_XXX choisies précédemment, ce n'est pas pris en charge automatiquement par le module virtuel Freebox.
 

large.screenshot-fibaro-hc2-panneau-vari

 

Créer également une autre variable prédéfinie PresenceXXX qui contiendra le statut de la présence, soit 0 ou 1 :

 

large.screenshot-fibaro-hc2-panneau-vari

 

Sauvegarder le module virtuel Freebox, qui va se connecter sur la Freebox et récupérer les informations de dernière connexion des périphériques réseaux surveillés. Les timestamps (valeur numérique) doivent apparaitre automatiquement dans les variables globales.

 

 

Sur la HC2, créer une scène contenant le code LUA suivant, à adapter en fonction de vos besoins :

--[[
%% autostart
%% properties
%% globals
FbxV6_LAN_XperiaZ2
FbxV6_LAN_S4mini
--]]

function Check()

	local delay = 3600*12

	local timestamp = os.time()
	local FbxV6_LAN_XperiaZ2 = tonumber(fibaro:getGlobalValue("FbxV6_LAN_XperiaZ2"))
	local FbxV6_LAN_S4mini   = tonumber(fibaro:getGlobalValue("FbxV6_LAN_S4mini"))
	local PresenceChristophe = fibaro:getGlobalValue("PresenceChristophe")

	if FbxV6_LAN_XperiaZ2 < timestamp - delay and FbxV6_LAN_S4mini < timestamp - delay then
		if PresenceChristophe == "1" then
			fibaro:debug(os.date('%d/%m/%Y').." : Absence détectée")
			fibaro:setGlobal("PresenceChristophe", "0")
		end
	else
		if PresenceChristophe == "0" then
			fibaro:debug(os.date('%d/%m/%Y').." : Présence détectée")
			fibaro:setGlobal("PresenceChristophe", "1")
		end
	end

end

local trigger = fibaro:getSourceTrigger()

if trigger["type"] == "autostart" then
	fibaro:debug(os.date('%d/%m/%Y').." : Autostart infinite loop...")
	while true do
		Check()
		fibaro:sleep(300*1000) -- 5 minutes
	end
elseif trigger["type"] == "global" then
	fibaro:debug("Global variable change : "..trigger['name'])
	Check()
elseif trigger["type"] == "other" then
	fibaro:debug(os.date('%d/%m/%Y').." : Started manually")
	Check()
elseif trigger["type"] == "property" then
	fibaro:debug(os.date('%d/%m/%Y').." : Property changed : ".. trigger['deviceID'].." => "..trigger['propertyName'])
else
	fibaro:debug(os.date('%d/%m/%Y').." : Unknown trigger : "..trigger["type"])
end

Dans l'en-tête, en trigger, on positionne les variables globales FbxV6_LAN_XXX

Pensez à modifier le code en fonction du nom des variables globales que vous avez choisi.

Comme on peut le voir, je monitore 2 téléphones, ce qui me permet d'améliorer la fiabilité de détection. Il faut juste modifier légèrement le code pour ne surveiller qu'un seul ou plusieurs appareils.

 

J'ai configuré un délai de détection de 12h, car cette scène me permet de détecter si je suis absent plus de 12h de la maison, donc que je suis en déplacement professionnel, c'est à dire que je ne passerai pas la nuit au domicile. Cela est très fiable.

 

Mais je considère qu'il n'est pas possible de faire de la détection de présence de courte durée par monitoring des smartphones, pour plusieurs raisons :

- le smartphone peut avoir été laissé à la maison pendant une absence, temporairement

- le smartphone peut être en panne de batterie temporairement

- le smartphone peut avoir le Wi-Fi désactivé temporairement

Donc ce type de détection de présence n'est pas adapté à des scénarios de mise en marche/arrêt d'alarme par exemple.

 

Ensuite, on peut utiliser la variable globale PresenceXXX dans des scénarios (Scènes, VD, GEA, etc)

 

Si on veut gérer la présence de plusieurs personnes, il suffit de créer plusieurs scènes et autant de variables globales correspondantes.

  • Upvote 5
Posté(e)

Marche pas chez moi, mode Bridge oblige :)

Mais beau VD. Même principe que celui de Seb (Mais le sien faisait une lecture ARP au niveau HC2 non) ?

Posté(e)

C'est une des raisons pour laquelle je repousse la mise en prod de mon routeur Ubiquiti, car il va falloir que j'adapte le code.

 

La lecture ARP n'est pas fiable, surtout avec les équipements iProut, car ceux-ci imposent la mise en veille du Wi-Fi pendant les périodes d'inactivité, afin de compenser l'extrême faiblesse des batteries que son fabricants implémente dedans :P

En effet, par définition, une table ARP est vidé régulièrement par la pile TCP/IP. Donc si l'appareil n'est pas en constante communication, il ne tarde pas à disparaitre des écrans radars.

Tandis que la Freebox mémorise le Timestamp de dernière visibilité de tous les équipements, donc on est certain de toujours les "voir" en interrogeant la Freebox, même si ils sont en veille ou éteints.

  • Upvote 1
Posté(e)

Merci @Lazerpour ce super tuto. Aussitôt lu, aussitôt installé. Par contre la ligne:

	if FbxV6_LAN_XperiaZ2 < timestamp - delay and FbxV6_LAN_S4mini < timestamp - delay then
doit être remplacée, par exemple, par la suivant si on a un seul téléphone?
	if FbxV6_LAN_iPhone == timestamp then
J'ai bon?
Posté(e)

Officiellement, ingénieur en génie logiciel Pascal :) Mais clairement, plus aucune flamme pour faire du code, je pense que tu l'as compris. Mais chef ça me va bien :)

  • Upvote 1
Posté(e)

@Nico pour la version Syno il faudra que tu t'y colles, aucun intérêt pour moi et puis je n'ai pas de routeur Syno pour tester.

 

@fredoold avec le "=" tu n'as quasiment aucune chance que ça fonctionne, ça serait un gros coup de chance que la boucle de la scène passe à la seconde près sur le timestamp de dernière détection du smartphone.

 

J'aurais donc plutôt écris cela ainsi :

	if FbxV6_LAN_iPhone < timestamp - delay then

 

  • Upvote 1
Posté(e)

A mon avis, ta variable

FbxV6_LAN_iPhone

  ne contient rien...

 

tu as probablement loupé une étape précédente du tuto

Posté(e)

Dès que celui-ci se déconnecte, instantanément.

La Freebox étant à la fois serveur DHCP et Gateway par défaut pour accéder à Internet, elle voit forcément l'ensemble des périphériques sur le réseau.

Donc elle sait exactement quand ceux-ci sont présents ou absents.

C'est très visible avec la station météo Netatmo, qui se connecte au Wifi pendant quelques secondes toutes les 10 minutes, puis se remet en veille.

Posté(e) (modifié)

Salut. Ça a l'air de fonctionner. Mon erreur était dût à un problème de "casse typographique".

Par contre, j'aurai aimé des petites précision, la condition:

if PresenceChristophe == "1" then
fibaro:debug(os.date('%d/%m/%Y').." : Absence détectée")
fibaro:setGlobal("PresenceChristophe", "0")

correspond bien au moment où le téléphone n'est pas connecté et la seconde:

if PresenceChristophe == "0" then
fibaro:debug(os.date('%d/%m/%Y').." : Présence détectée")
fibaro:setGlobal("PresenceChristophe", "1")

le moment où le téléphone est connecté, correct?

J'ai également supprimé tout ce qui est en rapport avec "local delay = 40*1000" car je voudrais un rafraîchissement toutes les 15 minutes avec le "fibaro:sleep(15*60*1000)" cela à l'air de fonctionner.

Les modifications apportés sont-elles correctes ou il faut revenir à la version de base?

Merci de vos précisions.

Modifié par fredokl
Pour plus de clarté
Posté(e)

PS : ton message est difficilement lisible, pense à mettre les balises <> (bouton sur la barre d'outil de l'éditeur) autour de ton code LUA.

 

Réponse : oui c'est correct.

 

Pour le delay, il suffisait de mettre la valeur 0 ce qui t'aurais évité de modifier toutes les lignes, mais le résultat est le même.

 

Attention à ne pas confondre le délai (delay) et le rafraichissement, car ce n'est pas cette scène qui le gère, mais le VD Freebox de Krikroff.

Le délai, c'est juste à partir de quand on prend la décision de décider si l'utilisateur est présent ou absent.

Comme je le disais dans le premier post, je considère qu'un délai trop faible n'est pas fiable, mais tu fais comme tu veux, tu expérimentes et tu verras bien si les fausses détections te conviennent ou pas.

×
×
  • Créer...