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 :
Dans Unifi Controller, récupérer l'adresse MAC de tous les appareils à surveiller :
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 :
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 :
Scene Ubiquiti Unifi v1.2.lua