Aller au contenu
Lazer

Détection de présence avec points d'accès Wi-Fi Ubiquiti Unifi

Recommended Posts

Détection de présence avec points d'accès Wi-Fi Ubiquiti Unifi

 

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

 

 

Prérequis :

  • Une ou plusieurs borne(s) Ubiquiti Unifi (gamme UAP)
  • Logiciel Unifi Controller opérationnel sur une machine (VM, NAS, etc)
  • Des appareils connectés sur le réseau IP en Wi-Fi

 

Installation :

 

  • Dans Unifi Controller, créer un utilisateur dédié avec des droits en Read-Only :

    large.screenshot-unifi-controler-admin-u
     
  • Dans Unifi Controller, récupérer l'adresse MAC de tous les appareils à surveiller :

    large.screenshot-unifi-controler-client-
     
  • Télécharger le code LUA en pièce jointe
     
  • Dans la HC2, créer une nouvelle scène
     
  • Copier/coller le code LUA dans cette scène
     
  • Modifier le début du code LUA de la scène comme suit :
    -- User variables
    local URL = "https://192.168.1.1:8443"
    local username = "User"
    local password = "Password"
    local intervalle = 60
    local LAN_Devices = {
    	{
    		mac = "00:00:00:00:00:00", -- Sony Xperia Z2
    		vg = "Unifi_LAN_XperiaZ2"
    	},
    	{
    		mac = "00:00:00:00:00:00", -- Samsung Galaxy S4 Mini
    		vg = "Unifi_LAN_S4mini"
    	}
    }
     
    • URL : chemin d'accès à l'interface Web de Unifi Controller
    • username : nom d'utilisateur créé précédemment
    • password : mot de passe de cet utilisateur
    • intervalle : rafraichissement toutes les 60 secondes
    • LAN_Devices :
      • mac : adresse MAC des périphériques Wi-Fi à surveiller
      • vg : variable globale qui contient le timestamp Unix de la dernière fois que l'appareil a été vu sur le réseau (ces variables globales seront automatiquement créées au démarrage de la scène)
         
  • Sauvegarder la scène, et affecter une icône, par exemple :

    large.clap_ubiquiti.png.274361072e22b44f

     
  • Sur la HC2, créer une autre scène contenant le code LUA suivant, à adapter en fonction de vos besoins :
     
    --[[
    %% autostart
    %% properties
    %% globals
    Unifi_LAN_XperiaZ2
    Unifi_LAN_S4mini
    --]]
    
    function Check()
    
    	local delay = 3600*12
    
    	local timestamp = os.time()
    	local Unifi_LAN_XperiaZ2 = tonumber(fibaro:getGlobalValue("Unifi_LAN_XperiaZ2"))
    	local Unifi_LAN_S4mini   = tonumber(fibaro:getGlobalValue("Unifi_LAN_S4mini"))
    	local PresenceChristophe = fibaro:getGlobalValue("PresenceChristophe")
    
    	if Unifi_LAN_XperiaZ2 < timestamp - delay and Unifi_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 Unifi_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.
     

    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.


    Remarque : c'est exactement le même code que la scène de détection de présence via Freebox, il est donc possible d'utiliser la même scène pour détecter des appareils via la Freebox et les bornes Unifi simultanément.

 

 

Problème connu :

 

  • Si dans le debug de la scène vous avez le message d'erreur "sslv3 alert handshake failure" ou "wrong version number" :
    [DEBUG] 00:00:00: httpClient:request() : Error : sslv3 alert handshake failure
    Alors c'est que la HC2 n'accepte pas la suite de chiffrement proposée par le serveur Web de l'Unifi Controller, et tente de se connecter en SSLv3, qui est un vieux protocole peu sécurisé et bloqué.

    Mon Unifi Controller est installé dans une VM sous Debian 9, voici la procédure :

    Modifier le fichier system.properties :
    vi /var/lib/unifi/system.properties
    Notes :
    - sur Synology, le fichier se trouve dans /var/packages/Unifi Controller 5/target/data/system.properties => Voir tuto de Nico plus bas dans la page.
    - sur Windows, le fichier se trouve dans C:\Users\XX YOUR USER NAME\Ubiquiti UniFi\data\system.properties => Merci Sebcbien

    Ajouter les suites de chiffrement comme suit, ce qui aura pour conséquence de résoudre le problème de la HC2 qui n'arrive pas à se connecter, et d'augmenter la sécurité globale de l'interface Web de Unifi Controller :
    unifi.https.ciphers=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_DHE_RSA_WITH_AES_256_CBC_SHA
    unifi.https.sslEnabledProtocols=TLSv1.2,TLSv1.1,TLSv1
    Puis redémarrer le démon Unifi Controller :
    service unifi restart
    Puis redémarrer la scène sur la HC2.

 

 

Compatibilité avec Unifi Dream Machine et Cloud Key v2 (basés sur Unifi OS) :

 

Voir le message de @PdB en page 13 :

 

Et également le script modifié partagé par @Nico en page 16 :

 

 

Monitoring des 2 scènes avec le Watchdog :

{type = "Scene", id = 1, match = {text="GetDevices", interval=2*60}, no_match = {text=""}, count=1, restart=true, notification = {"push", "email"}},        -- Unifi
{type = "Scene", id = 6, match = {text="", interval=0},              no_match = {text=""}, count=1, restart=true, notification = {"push", "email", "sms"}}, -- Présence

 

 

Téléchargement :

 

 

Modifié par Lazer
  • Upvote 4

Partager ce message


Lien à poster
Partager sur d’autres sites

Excellent @Lazer, encore merci

Perfect. 

 

Tu passes par 2 scènes ? Une tu ne pouvais pas ? 

Modifié par pepite

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci @Lazer, je vais regarder , si ok pour toi, comment je pourrais mettre celà dans ma LD. C'est du lourd ...

Partager ce message


Lien à poster
Partager sur d’autres sites

@Pepite ; oui 2 scène, c'est plus propre, je sépare la scène Unfi de la scène de détection de présence, qui sont 2 choses qui n'ont rien à voir (même si j'ai besoin de la première pour faire fonctionner la 2nde).

C'était pareil pour la Freebox (le VD Freebox, et la scène de détection de présence)

L'énorme avantage, est que la scène de détection de présence peut prendre plusieurs sources... donc des VG issues de la Freebox, de l'Unifi, et pourquoi pas d'autres trucs plus tard).

 

@Jojo : l'API n'est pas documentée, mais voici un lien pour t'aider :

http://bartsimons.me/playing-around-with-the-ubiquiti-unifi-controller/

Comme tu le verras, l'astuce consiste à se connecter pour récupérer un Cookie, qui est ensuite injecté dans les requêtes suivantes. Attention, comme pour le SID de Synology, ce cookie peut expirer de temps en temps, il faut donc gérer son renouvellement.

  • Upvote 2

Partager ce message


Lien à poster
Partager sur d’autres sites

Hum tu me sors ça ce soir :):) Vais voir, test ce soir ou demain soir :)

Partager ce message


Lien à poster
Partager sur d’autres sites

Bon, test encours, et bien sûr j'ai le souci de SSL. Me reste à trouver comment modifier ça sur une version Unifi en paquet sur le Syno.

Partager ce message


Lien à poster
Partager sur d’autres sites

Bon, fichier trouvé, cette partie est ok. Par contre cela bloque désormais sur : Error : status=400 après le get devices puis login puis nbeed to login and new cookie...

Partager ce message


Lien à poster
Partager sur d’autres sites

@Nico, pourrais tu SVP nous partager ta solution pour Synology, car nous sommes plusieurs à utiliser ce paquet. Merci

Envoyé de mon Nexus 5 en utilisant Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites

Yes, c'est prévu, dès que c'est 100% opérationnel je vous donne tout, Lazer pourra le mettre en post 2. Pour l'instant je butte sur cette erreur 400, j'attends son retour, à moins qu'il y ait une doc des codes retours.

Partager ce message


Lien à poster
Partager sur d’autres sites

Sur Wikipedia tu as les codes http, pour le 400 ça donne :

- Bad Request

- La syntaxe de la requête est erronée.

 

Etonnant, il faudrait que tu actives le debug=true et que tu m'envoie le Debug complet

Partager ce message


Lien à poster
Partager sur d’autres sites

Oups sorry, je ne savais pas que c'était le 400 HTTP, je pensais que c'était la réponse Ubiquiti au niveau connexion. Je regarde cela ce soir et te ferai une trace si je ne trouve pas. Merci.

Partager ce message


Lien à poster
Partager sur d’autres sites

Lazer, ci dessous l'erreur détaillée si cela te parle...

 

Erreur.jpg

Partager ce message


Lien à poster
Partager sur d’autres sites

Hum, étrange ça... il n'arrive même pas à faire le login

 

Est ce que tu es certain de :

- l'URL et le port pour accéder à l'interface de Unifi ?

- le login et password utilisé ?

 

Tu as quelle version du Controller ?

 

Est-ce que tu peux faire un login via l'interface Web avec les outils de debug du navigateur activé pour voir la requête qui est envoyée (normalement du POST) et les datas associées ?

Partager ce message


Lien à poster
Partager sur d’autres sites

salut 

bravo pour le boulot

moi j ai juste un petit problème :

[DEBUG] 22:08:32: 03/07/2017 : Autostart infinite loop...
[DEBUG] 22:08:32: line 18: attempt to compare nil with number

 

merci

 

Partager ce message


Lien à poster
Partager sur d’autres sites

J'ai trouvé !!

La double quote autour du login avait disparu... Raté de copié/collé. Sorry Christophe. Donc moi c'est ok, ça fonctionne !! Nickels. Je vais du coup attaquer après le film la partie utilisation de la détection !!! Yes.

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Sinon pour ceux utilisant le paquet Ubiquiti natif pour Syno. Pour modifier le fichier system.properties, il faut :

-Soit ce connecter en SSH sur le Syno, et naviguer, VI, bref, truc de GNU :)

-Soit lancer WinSCP (Vive Windows), et se connecter sur son Syno, toujours port 22, utilisateur root et mot de passe de l'admin du Syno (Bien activer le SSH dans les paramètres du Syno si ce n'est pas déjà fait). De là :

1. Faire répertoire du haut (Car par défaut vous arrivez dans un sous-répertoire)

2. Naviguer dans /var/packages/Unifi Controller 5/target/data

3. Vous tombez sur le fichier system.properties

4. Clique droit éditer le fichier

5. Coller les 2 lignes de Lazer. Vous constaterez qu'elles y sont déjà partiellement, mais en commentaires

6. Enregistrer puis quitter WinSCP

7. Aller dans le gestionnaire des paquets du Syno, et sur le paquet Ubiquiti, stop puis start

 

Et voilà, c'est tout.

  • Upvote 3

Partager ce message


Lien à poster
Partager sur d’autres sites

Bon, j'ai commencé à mettre en place, par contre autant au niveau connexion c'est instantané, autant niveau déconnexion Wifi, c'est plus long. C'est comme si le pooling prenait un peu de temps. Car si on clique sur reconnect manuellement au niveau du contrôleur Unifi, la déconnexion est instantanément détectée. Par contre j'ai pas trouvé comment augmenter la fréquence de ce pooling. Maintenant ce n'est pas bloquant, le point important était la connexion lors de l'arrivée à la maison.

Partager ce message


Lien à poster
Partager sur d’autres sites
Il y a 11 heures, CharlesO a dit :

salut 

bravo pour le boulot

moi j ai juste un petit problème :

[DEBUG] 22:08:32: 03/07/2017 : Autostart infinite loop...
[DEBUG] 22:08:32: line 18: attempt to compare nil with number

 

merci

 

salut

j'ai regler le probleme

merci

 

Partager ce message


Lien à poster
Partager sur d’autres sites

@Nico je ne suis pas certain de bien comprendre, est-ce que tu as réduit le paramètre delay dans la scène de détection de présence ?

Partager ce message


Lien à poster
Partager sur d’autres sites

Oui, ça j'ai tout réglé aux petits oignions. D'ailleurs ne pas descendre trop bas, car les timestamps ne sont pas si fin sur la remonté du contrôleur Ubiquiti, il peut y avoir 15-20s entre 2 timestamps, du coup 5 s ça ne le fait pas, car cela fait du n'importe quoi.

 

Non, moi je parlais du délai de pooling de la borne elle même. Fais un test : Tu connectes ton téléphone en Wifi sur ta borne, au niveau du contrôleur, dans la seconde ton téléphone apparaît, et donc la remonté vers la HC2 peut être instantané. Maintenant coupe le WIFI sur ton tél, pour simuler ton départ. Et rafraîchi ta vue des devices sur le contrôleur, tu verras que ton téléphone reste là encore un petit moment,, je dirai entre 1 et 3 minutes, j'ai pas trop mesuré. Ensuite rallumes ton WIFI, il sera reconnu de suite puis coupe le de nouveau. Et la dans la vue des devices, tu cliques à côté de ton device sur refresh, et là de suite la borne détecte qu'il n'est plus là et il disparaît de la liste.

Du coup, je ne sais pas trop comment cela fonctionne : Soit la borne pool en faisant ce refresh en auto toutes les x secondes, soit je ne sais pas. Et ce délai entre 2 pool d'un device, j'aurai aimer le diminuer.

Partager ce message


Lien à poster
Partager sur d’autres sites

OK maintenant c'est très clair.

 

Je n'ai pas testé ce cas de figure, car comme je le précise bien, la détection de présence pour moi n'est utilise que sur des très long délais, plus de 12 heures pour ma part, afin de détecter mes déplacement professionnels, donc absent de la maison le soir.

 

Je n'ai pas recopié le paragraphe que j'avais fait sur le tuto de détection de présence avec la Freebox, mais le revoici pour rappel :

 

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.

 

 

Perso, dans ma domotique, c'est du 100% de fiabilité, ou alors je ne fais pas.
Aujourd'hui, je ne peux garantir à 100% que mon smartphone est connecté au Wifi, donc je ne fais pas ce genre de détection.

Partager ce message


Lien à poster
Partager sur d’autres sites

Oui tout à fait. Mais moi par exemple c'est pour des scénarios :

-Plus personne à la maison, est ce que l'alarme est mise ? Non, alors interactiv push permettant de mettre l'alarme directement

-Plus personne à la maison, et portail ouvert, c'est pas normal, interativ push permettant de le fermer

 

Etc. Donc cela n'est jamais l'élément principale, mais nous sert de fonction d'alerte supplémentaire. Et cela fonctionne vraiment super bien. Et comme dit, plus on arrive à diminuer le délai, plus les interactions sont rapides.

Partager ce message


Lien à poster
Partager sur d’autres sites

Oui en alerte supplémentaire c'est acceptable :)

 

Après on pourrait imaginer ajouter la détection Bluetooth du téléphone, ou une balise Bluetooth attachée au porte clé, la localisation GPS du smartphone, etc.... mais on retombe dans exactement les mêmes biais que j'ai cité concernant le Wi-Fi.

A l'heure actuelle, et tant qu'on n'aura pas de puce RFID implantée sous la peau, je ne connais pas de méthode fiable à 100% et réactive instantanément.

 

Partager ce message


Lien à poster
Partager sur d’autres sites

×