Aanwezigheidsdetectie met Fibaro HC?

Garfield

New UniFier
Berichten
7
Waarderingsscore
3
Punten
3
Zijn er hier mensen die een vorm van aanwezigheidsdetectie aan de praat hebben gekregen in een Fibaro HomeCenter?
Ik zie hier wel een topic op het forum over aanwezigheidsdetectie in combinatie met een Homey, maar ik ben op zoek naar iets vergelijkbaars voor het Fibaro systeem.
 

Garfield

New UniFier
Berichten
7
Waarderingsscore
3
Punten
3
  • Topicstarter Topicstarter
  • #5
Ik heb geen Homeseer, maar een Fibaro; een plug-in die Edwin noemt kan ik niet vinden. De route via NodeRed en MQTT lijkt me een beetje een omweg. Daarbij; ik heb ze beiden niet draaien.
Maar het zou toch wel mogelijk moeten zijn om eens in de zoveel tijd de UniFi Controller te vragen of een bepaald device aanwezig is in het netwerk?
 

SDeath

UniFier
Berichten
40
Waarderingsscore
39
Punten
18
Locatie
Noord-Holland
Ja dit is mogelijk, mocht je nog interesse hebben hierin.
Ik heb een HC3 met hierin aanwezigheid detectie in LUA/QA.
Dit is zonder tussenstappen mogelijk, direct vanuit de HC3 naar de controller.
In ieder geval met een losse VM controller op Debian.
Maar ik denk dat de rest hetzelfde werkt.
 

Francois

New UniFier
Berichten
21
Waarderingsscore
5
Punten
3
Voor homeseer is een plugin die integreert met unifi controller. Afhankelijk van de hoeveelheid AP's kun je tracken waar een cliënt zich bevind. Je kunt dus ook zien als iemand thuis komt en op basis daarvan events starten in homeseer.
Hi Edwin,

Heb jij toevallig de naam van de Homeseer plugin? Is dit een HS4 of legacy plugin?

Ben even aan het rondkijken, sinds het aanzetten van MFA is de koppeling met Nodered een beetje een uitdaging 🤔
 

Garfield

New UniFier
Berichten
7
Waarderingsscore
3
Punten
3
  • Topicstarter Topicstarter
  • #10
Ja dit is mogelijk, mocht je nog interesse hebben hierin.
Ik heb een HC3 met hierin aanwezigheid detectie in LUA/QA.
Dit is zonder tussenstappen mogelijk, direct vanuit de HC3 naar de controller.
In ieder geval met een losse VM controller op Debian.
Maar ik denk dat de rest hetzelfde werkt.
Ja, zeker nog interesse!
Ik heb hier zelf nog een HC2 draaien, dus QA’s werken niet, maar met LUA kom ik een eind. De controller is hier een CloudKey 2+. Zo te zien dus net wel een andere situatie als bij jou.
Kan je ongeveer vertellen hoe je het aan de praat hebt gekregen?
 

SDeath

UniFier
Berichten
40
Waarderingsscore
39
Punten
18
Locatie
Noord-Holland
Ik heb het ook niet zelf verzonnen hoor (in dit geval niet in ieder geval). ;-)
Op het Fibaro forum staat deze voor de HC2:
Maar daar heeft diegene wat problemen mee zo te zien.
Ik heb deze gebruikt volgens mij:
Weet je hoe een Quickapp werkt?

Dit is de Quickapp code:
function QuickApp:setPresenceStatus(status) self:trace("setPresenceStatus() called: ", status) if status == "Away" then self:updateProperty('value', true) else self:updateProperty('value', false) end self:updateView("presenceStatus", "text", status) end function QuickApp:loginUnifi() if self.cookie == nil then self.http:request(self.controller .. "api/login", { options = { checkCertificate = false, method = 'POST', data = json.encode({ ['username'] = self.login, ['password'] = self.password }) }, success = function(response) if response.status == 200 then self.cookie = response.headers['Set-Cookie'] self:debug("loginUnifi() succeed") else self:error("loginUnifi() failed: ", json.encode(response.data)) end end, error = function(error) self:error("loginUnifi() failed: ", json.encode(error)) end }) end end function QuickApp:checkMacUnifi() local macInfo, lastSeen if self.cookie ~= nil then self.http:request(self.controller .. "api/s/" .. self.site .. "/stat/user/" .. self.mac, { options = { checkCertificate = false, method = 'GET', headers = { ['Cookie'] = self.cookie } }, success = function(response) if response.status == 200 then self:trace("checkMacUnifi() succeed") macInfo = json.decode(response.data) if macInfo['meta']['rc'] == "ok" then lastSeen = macInfo['data'][1]['last_seen'] if (lastSeen ~= nil) and ((os.time() - lastSeen) < self.awaydelay) then self:setPresenceStatus("Home") else self:setPresenceStatus("Away") end else self:setPresenceStatus("Away") end else self.cookie = nil self:error("checkMacUnifi() failed: ", json.encode(response.data)) end end, error = function(error) self.cookie = nil self:error("checkMacUnifi() failed: ", json.encode(error)) end }) end end function QuickApp:mainLoop() self:loginUnifi() self:checkMacUnifi() fibaro.setTimeout(self.frequency * 1000, function() self:mainLoop() end) end function QuickApp:onInit() self.controller = self:getVariable("controller") assert(self.controller ~= "", "controller is not set") if string.sub(self.controller, -1) ~= "/" then self.controller = self.controller .. "/" end self.site = self:getVariable("site") assert(self.site ~= "", "site is not set") self.login = self:getVariable("login") assert(self.login ~= "", "login is not set") self.password = self:getVariable("password") assert(self.password ~= "", "password is not set") self.frequency = self:getVariable("frequency") assert(self.frequency ~= "", "frequency is not set") self.frequency = tonumber(self.frequency) assert(self.frequency ~= nil, "frequency is not a number") self.mac = string.lower(self:getVariable("mac")) assert(self.mac ~= "", "mac is not set") assert(string.match(self.mac, '^[0-9a-f][0-9a-f]:[0-9a-f][0-9a-f]:[0-9a-f][0-9a-f]:[0-9a-f][0-9a-f]:[0-9a-f][0-9a-f]:[0-9a-f][0-9a-f]$') ~= nil, "mac address format is incorrect") self.awaydelay = tonumber(self:getVariable("away delay")) if self.awaydelay == nil then self:debug("onInit(): away delay equals frequency") self.awaydelay = self.frequency end self:setPresenceStatus("Unknown") self.cookie = nil self.http = net.HTTPClient({ timeout = 3000 }) self:mainLoop() end

Dit zijn de variabele die in de Quickapp worden gedefineerd, deze zul je in de HC2 LUA moeten defineren:
controller (String variable): https://[ip adres]:8443/
site (String variable): default
login (String variable): [username] | Unifi Administrator die je in de controller aanmaakt.
password (String variable): [wachtwoord]
frequency (String variable): 10
mac (String variable): [Mac adres van device]
away delay (String variable): 600
 

SDeath

UniFier
Berichten
40
Waarderingsscore
39
Punten
18
Locatie
Noord-Holland
Ja dit is mogelijk, mocht je nog interesse hebben hierin.
Ik heb een HC3 met hierin aanwezigheid detectie in LUA/QA.
Dit is zonder tussenstappen mogelijk, direct vanuit de HC3 naar de controller.
In ieder geval met een losse VM controller op Debian.
Maar ik denk dat de rest hetzelfde werkt.
Ik heb nog wel wat problemen dit op de UDM Pro SE werkend te krijgen.
De endpoints zijn wat anders maar hij geeft aan dat er geen kloppende login gegevens zijn.
Ik heb speciaal in de UDM Pro SE UI een extra user aangemaakt, maar dit lijkt niet te werken.
Ik moet er nog eens een keer induiken.
Dit is de aangepaste code voor een UDM Pro (SE):
Code:
function QuickApp:setPresenceStatus(status)
    self:trace("setPresenceStatus() called: ", status)
    if status == "Away" then
        self:updateProperty('value', true)
    else
        self:updateProperty('value', false)
    end
    self:updateView("presenceStatus", "text", status)
end
function QuickApp:loginUnifi()
    if self.cookie == nil then
        self.http:request(self.controller .. "api/auth/login", {
            options = {
                checkCertificate = false,
                method = 'POST',
                data = json.encode({
                    ['username'] = self.login,
                    ['password'] = self.password
                })
            },
            success = function(response)
                if response.status == 200 then
                    self.cookie = response.headers['Set-Cookie']
                    self:debug("loginUnifi() succeed")
                else
                    self:error("loginUnifi() failed: ", json.encode(response.data))
                end
            end,
            error = function(error)
                self:error("loginUnifi() failed: ", json.encode(error))
            end
        })
    end
end
function QuickApp:checkMacUnifi()
    local macInfo, lastSeen
    if self.cookie ~= nil then
        self.http:request(self.controller .. "proxy/network/api/s/" .. self.site .. "/stat/user/" .. self.mac, {
            options = {
                checkCertificate = false,
                method = 'GET',
                headers = {
                    ['Cookie'] = self.cookie
                }
            },
            success = function(response)
                if response.status == 200 then
                    self:trace("checkMacUnifi() succeed")
                    macInfo = json.decode(response.data)
                    if macInfo['meta']['rc'] == "ok" then
                        lastSeen = macInfo['data'][1]['last_seen']
                        if (lastSeen ~= nil) and ((os.time() - lastSeen) < self.awaydelay) then
                            self:setPresenceStatus("Home")
                        else
                            self:setPresenceStatus("Away")
                        end
                    else
                        self:setPresenceStatus("Away")
                    end
                else
                    self.cookie = nil
                    self:error("checkMacUnifi() failed: ", json.encode(response.data))
                end
            end,
            error = function(error)
                self.cookie = nil
                self:error("checkMacUnifi() failed: ", json.encode(error))
            end
        })
    end
end
function QuickApp:mainLoop()
    self:loginUnifi()
    self:checkMacUnifi()
    fibaro.setTimeout(self.frequency * 1000, function()
        self:mainLoop()
    end)
end
function QuickApp:onInit()
    self.controller = self:getVariable("controller")
    assert(self.controller ~= "", "controller is not set")
    if string.sub(self.controller, -1) ~= "/" then
        self.controller = self.controller .. "/"
    end
    self.site = self:getVariable("site")
    assert(self.site ~= "", "site is not set")
    self.login = self:getVariable("login")
    assert(self.login ~= "", "login is not set")
    self.password = self:getVariable("password")
    assert(self.password ~= "", "password is not set")
    self.frequency = self:getVariable("frequency")
    assert(self.frequency ~= "", "frequency is not set")
    self.frequency = tonumber(self.frequency)
    assert(self.frequency ~= nil, "frequency is not a number")
    self.mac = string.lower(self:getVariable("mac"))
    assert(self.mac ~= "", "mac is not set")
    assert(string.match(self.mac, '^[0-9a-f][0-9a-f]:[0-9a-f][0-9a-f]:[0-9a-f][0-9a-f]:[0-9a-f][0-9a-f]:[0-9a-f][0-9a-f]:[0-9a-f][0-9a-f]$') ~= nil, "mac address format is incorrect")
    self.awaydelay = tonumber(self:getVariable("away delay"))
    if self.awaydelay == nil then
        self:debug("onInit(): away delay equals frequency")
        self.awaydelay = self.frequency
    end
    self:setPresenceStatus("Unknown")
    self.cookie = nil
    self.http = net.HTTPClient({ timeout = 3000 })
    self:mainLoop()
end
 
Bovenaan