Page 2 of 3

Re: Scene: Online/Offline via UniFi controller

Posted: 21 Nov 2017, 08:48
by riro
Texan wrote:En funktion som jag kommer på är att kunna stänga/sätta på en lampa/enhet när en telefon blir synlig i nätet. Tyvärr så har jag ingen kunskap att få ihop en sådan lua scen, så om det är möjligt så vore jag tacksam.
Utan LUA-kunskap blir det jobbigt... men, ja uppdaterade scriptet så att den sätter en variabel med antalet som är online.
(Du måste skapa variabeln som är definerad som sGlobalVariableName )

Sen är det hyffsat enkelt att använda block's och reagera på antalet online. :)

Code: Select all

local doDebug = true
local sStatusOnline = "Online"
local sStatusOffline = "Offline"
local sGlobalVariableName = "DevicesOnline"
local iSleepSeconds = 182
--local mySettings = json.decode( tostring( fibaro:getGlobalValue("set_IDs") ) )

msgDebug = function (color, message)
  if doDebug then
    fibaro:debug("<span style='color: " .. color .. "'>" .. tostring(message) .. "</span>")
  end
end

tableLength = function (T)
   local c = 0
   for _ in pairs(T) do
     c = c + 1
   end
   return c
end

-- ------------------------------------------------------------------------------------------------------------------------
labels = {}
msgDebug("Orange", "Calling HC2 API for labels on device " .. tostring(fibaro:getSelfId()) )
local http = Net.FHttp("127.0.0.1", 11111)
local sResponse, status, err = http:GET("/api/devices/" .. tostring(fibaro:getSelfId()))
local jsonResponse = json.decode(sResponse)
for rowIndex, rowData in pairs(jsonResponse.properties.rows) do
  for buttonIndex, buttonData in pairs(rowData.elements) do
    msgDebug("Yellow", "Found label: " .. jsonResponse.properties.rows[rowIndex].elements[buttonIndex].name .. " (" .. jsonResponse.properties.rows[rowIndex].elements[buttonIndex].caption .. ")")
    labels[#labels+1] = jsonResponse.properties.rows[rowIndex].elements[buttonIndex].name
  end
end

msgDebug("Orange", "Calling UniFi API on " .. fibaro:getValue(fibaro:getSelfId(), 'IPAddress') )
local http = Net.FHttp(fibaro:getValue(fibaro:getSelfId(), 'IPAddress'), fibaro:getValue(fibaro:getSelfId(), 'TCPPort'))
local sResponse = http:GET("/unifi/")

local jsonResponse = json.decode(sResponse)
local jsonLength = tableLength(jsonResponse)
iOnline = 0

for p in pairs(labels) do
  msgDebug("Black", "")

  local label = labels[p]
  sLabel = "ui." .. label .. ".value"
  msgDebug("White", "Check device with label: " .. label)

  sValue = os.date("%Y-%m-%d %H:%M:%S") .. " / " .. sStatusOffline
  bOnline = false
  for r = 1, jsonLength do
    if (label ==  string.gsub("lbl" .. jsonResponse[r].mac, ":", "") ) then
      msgDebug("Green", "Online: " .. jsonResponse[r].mac .. " / " .. jsonResponse[r].name )
      sValue = tostring(os.date("%Y-%m-%d %H:%M:%S")) .. " / " .. sStatusOnline
      bOnline = true
      iOnline = iOnline + 1
    end
  end

  sCurrentValue = fibaro:getValue(fibaro:getSelfId(), sLabel)
  msgDebug("Orange", "Label, current value = " .. sCurrentValue)

  if bOnline then
    if string.find(sCurrentValue, sStatusOnline) then
      msgDebug("Gray", "Allready " .. sStatusOnline .. " status... no update!")
    else
      msgDebug("Yellow", sLabel .. " = " .. sValue)
      fibaro:call(fibaro:getSelfId(), "setProperty", sLabel, sValue)
    end
  else

    if string.find(sCurrentValue, sStatusOffline) then
      msgDebug("Gray", "Allready " .. sStatusOffline .. " status... no update!")
    else
      msgDebug("Yellow", sLabel .. " = " .. sValue)
      fibaro:call(fibaro:getSelfId(), "setProperty", sLabel, sValue)
    end
  end
end

msgDebug("Green", tostring(iOnline) .. " devices online, setting variable " .. sGlobalVariableName)
fibaro:setGlobal(sGlobalVariableName, iOnline)
-- ------------------------------------------------------------------------------------------------------------------------
msgDebug("Orange", "Done! Sleeping " .. tostring(iSleepSeconds) .. " seconds")
fibaro:sleep(iSleepSeconds * 1000)

Re: Scene: Online/Offline via UniFi controller

Posted: 21 Nov 2017, 08:50
by riro
Typ så här:
Image

Re: Scene: Online/Offline via UniFi controller

Posted: 22 Nov 2017, 01:38
by Texan
:D

Tackar!

Re: Scene: Online/Offline via UniFi controller

Posted: 25 Nov 2017, 17:07
by Robert
Up and running nu. Tack :)

Du skulle inte vilja utveckla scriptet lite? Hade varit trevligt om man kunde få en variabel för varje enhet.

Kanske inte för alla men för dom man vill ha. Då kan man starta scener och annat beroende på status om något är online eller offline.

Re: Scene: Online/Offline via UniFi controller

Posted: 26 Nov 2017, 23:35
by Robert
Hur kommer det sig att main loopen inte fungerar? Har jag missat något?

Den fungerar endast när jag sparar VD:n manuellt eller öppnar main loop debug fönstret och låter den gå.

Re: Scene: Online/Offline via UniFi controller

Posted: 29 Nov 2017, 09:24
by riro
Robert wrote:Hur kommer det sig att main loopen inte fungerar? Har jag missat något?

Den fungerar endast när jag sparar VD:n manuellt eller öppnar main loop debug fönstret och låter den gå.
Låter ju riktigt konstigt om den fungerar med debug-fönstret uppe men inte utan det... det fönstret ska (!?) inte göra någon skillnad mer än att debug-meddelanden skrivs ut.

Hur menar du med att den fungerar när du sparar manuellt?

Re: Scene: Online/Offline via UniFi controller

Posted: 29 Nov 2017, 18:01
by Robert
Ändrar jag t.ex ip-adressen och skriver tillbaka samma igen och klickar på spara så uppdaterar den scriptet i main.

Re: Scene: Online/Offline via UniFi controller

Posted: 01 Dec 2017, 07:51
by riro
Robert wrote:Ändrar jag t.ex ip-adressen och skriver tillbaka samma igen och klickar på spara så uppdaterar den scriptet i main.
Varje gång den har kört så somnar scriptet in i ungefär 3 minuter innan den gör något igen... kanske kan ha något med saken att göra?

Re: Scene: Online/Offline via UniFi controller

Posted: 04 Dec 2017, 22:36
by Robert
Har varit där och ändrat också. Både sänkt tiden samt tagit bort raden helt.

Funderar på om det kan ha något med denna rad.
[ERROR] 21:35:24: line 40: Expected value but found invalid token at character 1

Jag får den inte alltid. Kör server på en Windows burk med Win 10. Rättigheter finns där. Dock känns det som att den täpper till dom då och då.

Får forska vidare.

Re: Scene: Online/Offline via UniFi controller

Posted: 05 Dec 2017, 23:15
by Robert
Får bort felmeddelandet om jag tar bort en siffra från ip-numret och lägger till den igen samt sparar om VDn. Då rullar den på som vanligt igen men slutar att köras efter några timmar.

Re: Scene: Online/Offline via UniFi controller

Posted: 06 Dec 2017, 00:08
by Texan
Tyvärr kan jag inte hjälpa till speciellt mycket.
Allt fungerar klockrent för mig. Jag köpte mig en Raspberry Pi och installerad Unifi controller på den, fungerar tok bra.

Re: Scene: Online/Offline via UniFi controller

Posted: 08 Dec 2017, 11:11
by riro
Robert wrote:Får bort felmeddelandet om jag tar bort en siffra från ip-numret och lägger till den igen samt sparar om VDn. Då rullar den på som vanligt igen men slutar att köras efter några timmar.
Mysko... men om/när den ger upp, vad svarar webben då?


Det är ju långt från ordentlig felhantering i scriptet... så svarar webben fel så dör den.

För mer debug (kan nog generera en hel del skräp) kan man skicka ut allt i sResponse i debug-fönstret... typ så här (runt rad 40 i koden):

Code: Select all

local jsonResponse = json.decode(sResponse)
msgDebug("Red", sResponse) -- Alltså den här raden som ska läggas till :)
local jsonLength = tableLength(jsonResponse)

Re: Scene: Online/Offline via UniFi controller

Posted: 25 Dec 2017, 09:43
by riro
Då min också dog nu så har jag lagt till lite simpel felhantering...

Code: Select all

local doDebug = true
local sStatusOnline = "Online"
local sStatusOffline = "Offline"
local sGlobalVariableName = "DevicesOnline"
local iSleepSeconds = 182

msgDebug = function (color, message)
  if doDebug then
    fibaro:debug("<span style='color: " .. color .. "'>" .. tostring(message) .. "</span>")
  end
end

tableLength = function (T)
   local c = 0
   for _ in pairs(T) do
     c = c + 1
   end
   return c
end

-- ------------------------------------------------------------------------------------------------------------------------
labels = {}
msgDebug("Orange", "Calling HC2 API for labels on device " .. tostring(fibaro:getSelfId()) )
local http = Net.FHttp("127.0.0.1", 11111)
local sResponse, status, err = http:GET("/api/devices/" .. tostring(fibaro:getSelfId()))
local jsonResponse = json.decode(sResponse)
for rowIndex, rowData in pairs(jsonResponse.properties.rows) do
  for buttonIndex, buttonData in pairs(rowData.elements) do
    msgDebug("Yellow", "Found label: " .. jsonResponse.properties.rows[rowIndex].elements[buttonIndex].name .. " (" .. jsonResponse.properties.rows[rowIndex].elements[buttonIndex].caption .. ")")
    labels[#labels+1] = jsonResponse.properties.rows[rowIndex].elements[buttonIndex].name
  end
end

msgDebug("Orange", "Calling UniFi API on " .. fibaro:getValue(fibaro:getSelfId(), 'IPAddress') )
local http = Net.FHttp(fibaro:getValue(fibaro:getSelfId(), 'IPAddress'), fibaro:getValue(fibaro:getSelfId(), 'TCPPort'))
local sResponse = http:GET("/unifi/")

if string.len(sResponse) >= 100 then
  local jsonResponse = json.decode(sResponse)
  local jsonLength = tableLength(jsonResponse)
  iOnline = 0
  
  for p in pairs(labels) do
    msgDebug("Black", "")
  
    local label = labels[p]
    sLabel = "ui." .. label .. ".value"
    msgDebug("White", "Check device with label: " .. label)
  
    sValue = os.date("%Y-%m-%d %H:%M:%S") .. " / " .. sStatusOffline
    bOnline = false
    for r = 1, jsonLength do
      if (label ==  string.gsub("lbl" .. jsonResponse[r].mac, ":", "") ) then
        msgDebug("Green", "Online: " .. jsonResponse[r].mac .. " / " .. jsonResponse[r].name )
        sValue = tostring(os.date("%Y-%m-%d %H:%M:%S")) .. " / " .. sStatusOnline
        bOnline = true
        iOnline = iOnline + 1
      end
    end
  
    sCurrentValue = fibaro:getValue(fibaro:getSelfId(), sLabel)
    msgDebug("Orange", "Label, current value = " .. sCurrentValue)
  
    if bOnline then
      if string.find(sCurrentValue, sStatusOnline) then
        msgDebug("Gray", "Allready " .. sStatusOnline .. " status... no update!")
      else
        msgDebug("Yellow", sLabel .. " = " .. sValue)
        fibaro:call(fibaro:getSelfId(), "setProperty", sLabel, sValue)
      end
    else
  
      if string.find(sCurrentValue, sStatusOffline) then
        msgDebug("Gray", "Allready " .. sStatusOffline .. " status... no update!")
      else
        msgDebug("Yellow", sLabel .. " = " .. sValue)
        fibaro:call(fibaro:getSelfId(), "setProperty", sLabel, sValue)
      end
    end
  end
  
  msgDebug("Green", tostring(iOnline) .. " devices online, setting variable " .. sGlobalVariableName)
  fibaro:setGlobal(sGlobalVariableName, iOnline)
else
  msgDebug("Red", "API response to short... aborting!")
  msgDebug("Gray", "API response: " .. sResponse)
  msgDebug("Black", "")
end
-- ------------------------------------------------------------------------------------------------------------------------
msgDebug("Orange", "Done! Sleeping " .. tostring(iSleepSeconds) .. " seconds")
fibaro:sleep(iSleepSeconds * 1000)

Re: Scene: Online/Offline via UniFi controller

Posted: 25 Dec 2017, 22:44
by Robert
Vad hände?

Jag la till din nya kod. Vad säger denna rad?

Code: Select all

  msgDebug("Red", "API response to short... aborting!")
Fick den innan jag uppdaterade scriptet som vanligt, dvs tog bort en siffra från IP och la till igen och sparade om. Då försvann det.

Re: Scene: Online/Offline via UniFi controller

Posted: 03 Jan 2018, 17:28
by riro
Den raden kommer man till om PHP-sidan returnerar något som är kortare än 100 tecken (då har något gått snett)

Re: Scene: Online/Offline via UniFi controller

Posted: 04 Jan 2018, 09:01
by Bamsefar
Jag har en variant för UniFi också, om någon behöver någon annan variant så att säga. Jag har två system hemma, ett ASUS baserat (CheckIfHome osv) och sedan en pfSense/UniFi baserad som har en variant på CheckIfHome. Så om någon behöver något så kanske jag kan bidra :mrgreen:

Re: Scene: Online/Offline via UniFi controller

Posted: 05 Jan 2018, 00:23
by Robert
Nu kör jag iof inte pfSense. Hittade aldrig någon bra hårdvara så det blev en EdgeRouter istället för min Asus. Men om den endast körs på UniFi så är jag intresserad :)

Kör detta script nu men det fungerar endast en kort stund. Sen behöver scriptet uppdateras manuellt eller en omstart av HC2 för att fungera igen.
Bamsefar wrote:Jag har en variant för UniFi också, om någon behöver någon annan variant så att säga. Jag har två system hemma, ett ASUS baserat (CheckIfHome osv) och sedan en pfSense/UniFi baserad som har en variant på CheckIfHome. Så om någon behöver något så kanske jag kan bidra :mrgreen:

Re: Scene: Online/Offline via UniFi controller

Posted: 05 Jan 2018, 20:26
by Texan
Bamsefar wrote:Jag har en variant för UniFi också, om någon behöver någon annan variant så att säga. Jag har två system hemma, ett ASUS baserat (CheckIfHome osv) och sedan en pfSense/UniFi baserad som har en variant på CheckIfHome. Så om någon behöver något så kanske jag kan bidra :mrgreen:

Alltid trevligt när det postas sceners vi kan ta del av. Så jag är intresserad av pfSense/UniFi varianten.

Re: Scene: Online/Offline via UniFi controller

Posted: 05 Jan 2018, 23:50
by Robert
Texan wrote: Alltid trevligt när det postas sceners vi kan ta del av. Så jag är intresserad av pfSense/UniFi varianten.
Bamsefar har redan lagt upp den. Sök på pfSense så hittar du scriptet :)

Skickat från min ZTE A2017G via Tapatalk

Re: Scene: Online/Offline via UniFi controller

Posted: 09 Jan 2018, 21:05
by Bamsefar
Det hade jag glömt - att jag redan lagt upp den alltså :mrgreen: :mrgreen: :mrgreen:

Times Flies when you're having fun eller något liknande!