Scene: Online/Offline via UniFi controller

av riro » 21 nov 2017, 08:48

Texan skrev: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. :)

Kod: Markera allt
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
 
Inlägg: 44
Blev medlem: 27 mar 2017, 11:02
Ort: Falun

av riro » 21 nov 2017, 08:50

Typ så här:
Bild
riro
Medlem
 
Inlägg: 44
Blev medlem: 27 mar 2017, 11:02
Ort: Falun

av Texan » 22 nov 2017, 01:38

:D

Tackar!
Texan
Medlem
 
Inlägg: 69
Blev medlem: 25 dec 2015, 15:07

av Robert » 25 nov 2017, 17:07

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
 
Inlägg: 304
Blev medlem: 17 okt 2013, 22:40

av Robert » 26 nov 2017, 23:35

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å.
Robert
Medlem
 
Inlägg: 304
Blev medlem: 17 okt 2013, 22:40

av riro » 29 nov 2017, 09:24

Robert skrev: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?
riro
Medlem
 
Inlägg: 44
Blev medlem: 27 mar 2017, 11:02
Ort: Falun

av Robert » 29 nov 2017, 18:01

Ändrar jag t.ex ip-adressen och skriver tillbaka samma igen och klickar på spara så uppdaterar den scriptet i main.
Robert
Medlem
 
Inlägg: 304
Blev medlem: 17 okt 2013, 22:40

av riro » 01 dec 2017, 07:51

Robert skrev:Ä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?
riro
Medlem
 
Inlägg: 44
Blev medlem: 27 mar 2017, 11:02
Ort: Falun

av Robert » 04 dec 2017, 22:36

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
 
Inlägg: 304
Blev medlem: 17 okt 2013, 22:40

av Robert » 05 dec 2017, 23:15

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.
Robert
Medlem
 
Inlägg: 304
Blev medlem: 17 okt 2013, 22:40

av Texan » 06 dec 2017, 00:08

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.
Texan
Medlem
 
Inlägg: 69
Blev medlem: 25 dec 2015, 15:07

av riro » 08 dec 2017, 11:11

Robert skrev: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):

Kod: Markera allt
local jsonResponse = json.decode(sResponse)
msgDebug("Red", sResponse) -- Alltså den här raden som ska läggas till :)
local jsonLength = tableLength(jsonResponse)
riro
Medlem
 
Inlägg: 44
Blev medlem: 27 mar 2017, 11:02
Ort: Falun

Dustin
Föregående

Återgå till Fibaro