anybodyHome

  • 6 Odpowiedzi
  • 6135 Wyświetleń

0 użytkowników i 1 Gość przegląda ten wątek.

*

Offline Pokemon

  • * 13
  • 0
  • Nazwa i wersja ID: Fibaro HC2 4.1
anybodyHome
« dnia: Luty 18, 2017, 06:45:22 pm »
Witam
Chciałem utworzyć scenę która sprawdza obecność w domu . Skopiowałem kod z forum fibaro napisany przez kolegę TRAKTOR69
https://forum.fibaro.com/index.php?/topic/16652-baza-podstawowych-skrypt%C3%B3w-w-praktyce-poradnik/
który wygląda jak poniżej lecz pojawia mi się następujący błąd jak w załączniku

--[[
%% autostart
%% properties
%% globals
--]]


-- Functions -----------------------------------------------------------------

  function maximum (a)
     local mi           -- maximum key
     local m = 1           -- maximum value
     for i,val in pairs(a) do
      val = a
      if val > m then
         mi = i
         m = val
       end
     end
     return mi
   end


------------------------------------------------------------------------------
while true do

delay = 30 * 60     -- zwłoka
maxId = 300         -- maksymana ilośc wszystkich urządzeń
motionSensors = {}  -- deklaracja tablicy w którą wpszemy Id sensora i czas jego naruszenia

for i = 1, maxId, 1 do

  if fibaro:getType(i) == "motion_sensor"   -- jeżeli typ urzadzenia to sensor ruchu
     then
      motionSensors = fibaro:getModificationTime(i,"value")  -- to ustaw klucz tabeli jako id i wartosc jako czas naruszenia
  end
end


lastMotionID = maximum(motionSensors)
lastMotionTime = motionSensors[lastMotionID]



fibaro:debug("Ostatnie naruszenie  (Id - czas): "..lastMotionID.."   -    "..os.date("%H:%M", lastMotionTime))

now = os.time()

fibaro:debug("Teraz jest: "..os.date("%H:%M",now))


fibaro:debug( "Od ostatniego naruszenia minęło: "..math.floor((now-lastMotionTime)/60).."min. i "..(  (now-lastMotionTime)-math.floor((now-lastMotionTime)/60)*60  ).." sek.")


if (now-lastMotionTime) > delay
   then
   fibaro:setGlobal("anybodyHome", "0")
   fibaro:debug("Ustawiam anybodyHome na wartość 0")
   else
   fibaro:setGlobal("anybodyHome", "1")
   fibaro:debug("Ustawiam anybodyHome na wartość 1")
   fibaro:debug("---------------------------------------------------")
end

 fibaro:sleep(60 * 1000)
end
*

Offline vandi

  • * 20
  • 6
Odp: anybodyHome
« Odpowiedź #1 dnia: Wrzesień 08, 2017, 03:34:45 pm »
Na forum Fibaro na pewno znalazłeś rozwiązanie ;)
Nie mniej jednak wstawiam delikatnie poprawioną wersję tamtego skryptu.
Skrypt zamiast za każdym razem wyszukiwać które z urządzeń to czujniki ruchu, pobiera listę ze zmiennej tablicowej "Id"
W załączniki malutkie VD. małe ale przydatne :)
Pozdrawiam
--[[
%% autostart
--]]

if fibaro:countScenes() > 1 then fibaro:abort() end
local id = {
  1493,14,94,1512,1511,22,1508,
  }
local opoznienie = 60*60   
local czujnikiRuchu = {} 
function maximum (a)local mi; local m = 1; for i,val in pairs(a) do val = a[i]; if val > m then mi = i; m = val end end return mi end
function tikTak()
for i, j in pairs (id) do
czujnikiRuchu[j] = fibaro:getModificationTime(j,'value') 
end
nazwaOstNarUrz = fibaro:getName(maximum(czujnikiRuchu))
czasOstNaruszenia = czujnikiRuchu[maximum(czujnikiRuchu)]
print('Ostatnie naruszenie  (Nazwa - czas): '..nazwaOstNarUrz..'   -    '..os.date('%H:%M', czasOstNaruszenia))
teraz = os.time()
print('Teraz jest: '..os.date('%x',teraz))
print('Od ostatniego naruszenia minęło: '..math.floor((teraz-czasOstNaruszenia)/60)..'min. i '..(  (teraz-czasOstNaruszenia)-math.floor((teraz-czasOstNaruszenia)/60)*60  )..' sek.')
if (teraz-czasOstNaruszenia) > opoznienie then
fibaro:setGlobal('anybodyHome', '0')
print('Ustawiam anybodyHome na wartość 0')
print('---------------------------------------------------')
else
fibaro:setGlobal('anybodyHome', nazwaOstNarUrz ..' ' .. os.date('%H:%M', czasOstNaruszenia) )
end
setTimeout(tikTak, 60*1000) end
if fibaro:getSourceTrigger()['type'] == 'autostart' then tikTak() end

« Ostatnia zmiana: Wrzesień 09, 2017, 09:05:14 am wysłana przez vandi »
*

Offline Pokemon

  • * 13
  • 0
  • Nazwa i wersja ID: Fibaro HC2 4.1
Odp: anybodyHome
« Odpowiedź #2 dnia: Wrzesień 16, 2017, 10:28:58 am »
Wielkie dzięki za pomoc wygląda na to że wszystko działa OK.
Jutro posprawdzam to na scenkach.
*

Offline wojtas810

  • *** 205
  • 3
  • Nazwa i wersja ID: wojtas810
Odp: anybodyHome
« Odpowiedź #3 dnia: Wrzesień 16, 2017, 01:58:28 pm »
Super Działa przy okazji też skorzystałem :)  :)
*

Offline Lesław

  • ** 40
  • 1
  • Nazwa i wersja ID: HC2 4.550
Odp: anybodyHome
« Odpowiedź #4 dnia: Wrzesień 25, 2017, 10:29:17 pm »
To chyba kwestia filozofii :)
Pierwotna wersja sceny jest bardziej "automatyczna", bo nie trzeba dopisywać ID nowych MSów, ewentualnie zmieniać usuniętych/dodanych z nowym ID.
Zdaje się też że nie obciąża jakoś bardzo centrali, stąd ja zostaje przy swoim. Wygoda :)
*

Offline Pokemon

  • * 13
  • 0
  • Nazwa i wersja ID: Fibaro HC2 4.1
Odp: anybodyHome
« Odpowiedź #5 dnia: Wrzesień 26, 2017, 11:17:54 am »
Tak zgadza się, lecz ten skrypt nie działa jak wcześniej pisałem. Jeżeli masz poprawiony i u ciebie działa to proszę podeślij go to sprawdzę.
*

Offline wojtas810

  • *** 205
  • 3
  • Nazwa i wersja ID: wojtas810
Odp: anybodyHome
« Odpowiedź #6 dnia: Październik 18, 2017, 07:52:54 pm »
ja mam to oczywiście z Innego Forum bo tu Ci nikt bez $$$ nie pomoże :) - albo mnie w prywatnej wiadomości o "trolowanie" oskarża - a prawda w oczy kole :) więc u mnie są dwie rzeczy
VD masz w załączniku i scena

tu proszę kod :  - zauważyłem tylko ze lepiej i nie zacina sie jak jest VD i scena w tym samym pokoju:

w pozycji local ID - podstawiasz swoje numery urządzeń które mają być sprawdzane
Jest jeszcze z I N N E G O   - forum fajny darmowy VD pokazu jacy wszystkie ( przepraszam Scena ) wszystkie numerki ID uradzeń i scen i powiadomień i numerów Użytkowników dla sprawniejszego poruszania się.

--[[
%% autostart
--]]

if fibaro:countScenes() > 1 then fibaro:abort() end
local id = {
     154,17,320,322,100,298,300,242,233,
      }
local opoznienie = 60*60   
local czujnikiRuchu = {} 
function maximum (a)local mi; local m = 1; for i,val in pairs(a) do val = a; if val > m then mi = i; m = val end end return mi end
function tikTak()
   for i, j in pairs (id) do
   czujnikiRuchu[j] = fibaro:getModificationTime(j,'value') 
   end
   nazwaOstNarUrz = fibaro:getName(maximum(czujnikiRuchu))
   czasOstNaruszenia = czujnikiRuchu[maximum(czujnikiRuchu)]
   print('Ostatnie naruszenie  (Nazwa - czas): '..nazwaOstNarUrz..'   -    '..os.date('%H:%M', czasOstNaruszenia))
   teraz = os.time()
   print('Teraz jest: '..os.date('%x',teraz))
   print('Od ostatniego naruszenia minęło: '..math.floor((teraz-czasOstNaruszenia)/60)..'min. i '..(  (teraz-czasOstNaruszenia)-math.floor((teraz-czasOstNaruszenia)/60)*60  )..' sek.')
   if (teraz-czasOstNaruszenia) > opoznienie then
      fibaro:setGlobal('anybodyHome', '0')
      print('Ustawiam anybodyHome na wartość 0')
      print('---------------------------------------------------')
   else
      fibaro:setGlobal('anybodyHome', nazwaOstNarUrz ..' ' .. os.date('%H:%M', czasOstNaruszenia) )
   end
   setTimeout(tikTak, 60*1000) end
if fibaro:getSourceTrigger()['type'] == 'autostart' then tikTak() end



UWAGA
SCENA I VD oczywiście są z innego forum więc nie mogę zgodnie z regulaminem wskazać linka i bezpośredniego autora bo spowoduje do oburzenie. Zaznaczam iż nie jest to także mojego autorstwa
« Ostatnia zmiana: Październik 18, 2017, 10:01:57 pm wysłana przez wojtas810 »