Scene: Online/Offline via UniFi controller

riro
Medlem
Posts: 52
Joined: 27 Mar 2017, 11:02
7
Location: Falun
Contact:

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)
riro
Medlem
Posts: 52
Joined: 27 Mar 2017, 11:02
7
Location: Falun
Contact:

Typ så här:
Image
User avatar
Texan
Medlem
Posts: 169
Joined: 25 Dec 2015, 15:07
8

:D

Tackar!
Robert
Medlem
Posts: 346
Joined: 17 Oct 2013, 22:40
11

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.
Robert
Medlem
Posts: 346
Joined: 17 Oct 2013, 22:40
11

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å.
riro
Medlem
Posts: 52
Joined: 27 Mar 2017, 11:02
7
Location: Falun
Contact:

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?
Robert
Medlem
Posts: 346
Joined: 17 Oct 2013, 22:40
11

Ändrar jag t.ex ip-adressen och skriver tillbaka samma igen och klickar på spara så uppdaterar den scriptet i main.
riro
Medlem
Posts: 52
Joined: 27 Mar 2017, 11:02
7
Location: Falun
Contact:

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?
Robert
Medlem
Posts: 346
Joined: 17 Oct 2013, 22:40
11

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.
Robert
Medlem
Posts: 346
Joined: 17 Oct 2013, 22:40
11

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.
User avatar
Texan
Medlem
Posts: 169
Joined: 25 Dec 2015, 15:07
8

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.
riro
Medlem
Posts: 52
Joined: 27 Mar 2017, 11:02
7
Location: Falun
Contact:

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)
riro
Medlem
Posts: 52
Joined: 27 Mar 2017, 11:02
7
Location: Falun
Contact:

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)
Robert
Medlem
Posts: 346
Joined: 17 Oct 2013, 22:40
11

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.
riro
Medlem
Posts: 52
Joined: 27 Mar 2017, 11:02
7
Location: Falun
Contact:

Den raden kommer man till om PHP-sidan returnerar något som är kortare än 100 tecken (då har något gått snett)
User avatar
Bamsefar
Z-Wave Kung
Posts: 1268
Joined: 25 Nov 2013, 15:06
11
Location: Stockholm

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:
Kör Home Assistant efter totalt nederlag för HomeSeer :twisted: :twisted: :mrgreen:
Robert
Medlem
Posts: 346
Joined: 17 Oct 2013, 22:40
11

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:
User avatar
Texan
Medlem
Posts: 169
Joined: 25 Dec 2015, 15:07
8

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.
Robert
Medlem
Posts: 346
Joined: 17 Oct 2013, 22:40
11

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
User avatar
Bamsefar
Z-Wave Kung
Posts: 1268
Joined: 25 Nov 2013, 15:06
11
Location: Stockholm

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!
Kör Home Assistant efter totalt nederlag för HomeSeer :twisted: :twisted: :mrgreen:
Post Reply