Jump to content

Welcome to Smart Home Forum by FIBARO

Dear Guest,

 

as you can notice parts of Smart Home Forum by FIBARO is not available for you. You have to register in order to view all content and post in our community. Don't worry! Registration is a simple free process that requires minimal information for you to sign up. Become a part of of Smart Home Forum by FIBARO by creating an account.

 

As a member you can:

  •     Start new topics and reply to others
  •     Follow topics and users to get email updates
  •     Get your own profile page and make new friends
  •     Send personal messages
  •     ... and learn a lot about our system!

 

Regards,

Smart Home Forum by FIBARO Team


  • 0

Scena światło - właczenie i wyłączenie po 60s


zibko1

Question

Witam wszystkich adaptowałem z forum poniższą scenę działa dobrze jednak chciałbym jak włączę światło wyłącznikiem to mi nie zgaśnie po 60s

--[[
%% properties 
 
423 value
19 value
 
%% globals 
 
--]] 
-----------------------------------------------------------------------------
fibaro:debug("SCENE START --------------------------")
fibaro:debug("sceneInstance: "..fibaro:countScenes())
if fibaro:countScenes() > 1 
 then 
 fibaro:debug("SCENE ABORT --------------------------") 
 fibaro:abort() 
 end
-----------------------------------------------------------------------------
 
-- sensor ruchu
local sensorID = 19
 
-- światło sufit
local lightID =  423
 
local delay =  60
local lumen =  200
local timeStart = '19:59'  
local timeStop = '06:00'  
 
 
--  Functions  ---------------------------------------------------------------
 
-- funkcja zamienia czas w formacie tekstowym "HH:MM" lub os.date("*t") na liczbę minut od północy 
 
function toMinutes(czasHHMM) 
  local a 
  if type(czasHHMM) == "string" 
    then 
    a = tonumber(string.sub(czasHHMM, 1, 2)) * 60 + tonumber(string.sub(czasHHMM, 4, 5)) 
    else    
    a = tonumber(czasHHMM.hour) * 60 + tonumber(czasHHMM.min) 
    end 
  return a 
end
 
 
------------------------------------------------------------------------------
 
local minStart = toMinutes(timeStart)
local minStop = toMinutes(timeStop)
local minNow = toMinutes(os.date("*t"))
 
local sensorMoved = (tonumber(fibaro:getValue(sensorID, "value")) > 0)
local isLightOn = (tonumber(fibaro:getValue(lightID, "value")) > 0)
 
fibaro:debug("isLightOn: "..tostring(isLightOn))
fibaro:debug("sensorMoved: "..tostring(sensorMoved))
 
------------------------------------------------------------------------------
 
local isTime
 
if (minStop >= minStart) 
  then 
  if (minNow >= minStart) and (minNow <= minStop)
     then 
     isTime = true 
     else 
     isTime = false
     end
  elseif (minStop <= minStart)
     then 
     if (minNow <= minStart) and (minNow >= minStop)
       then 
       isTime = false 
       else 
       isTime = true
       end
  end
fibaro:debug("isTime: "..tostring(isTime))
 
 
-- zapalanie światła --------------------------------------------------------
 
if sensorMoved  and isTime
  then 
  fibaro:call(lightID, "turnOn")
  fibaro:debug("Action: turnOn")  
  end
 
if sensorMoved  and (not isTime)
  then 
  fibaro:call(lightID, "turnOn")
  fibaro:debug("Action: turnOn")  
  end
 
 
-- gaszenie światła ---------------------------------------------------------
 
if isLightOn 
  then
 
  local turnOffTime = os.time() + delay
 
  while turnOffTime > os.time() 
    do 
    if tonumber(fibaro:getValue(sensorID, "value")) > 0
      then 
      turnOffTime = os.time() + delay
      end  
    fibaro:debug("DELAY: "..tostring(turnOffTime - os.time()))
    fibaro:sleep(1000)
    
 -- sprawdzenie czy światło wyłączone ręcznie podczas trwania zwłoki   
    local isLightOnInLoop = (tonumber(fibaro:getValue(lightID, "value")) + tonumber(fibaro:getValue(lightID, "value")) > 0)
    if not isLightOnInLoop 
      then
      fibaro:debug("SCENE ABORT --------- LIGHT TURNED OFF MANUALLY ---------") 
      fibaro:abort() 
      end
    
  end       
fibaro:call(lightID, "turnOff") 
fibaro:debug("Action: turnOff")   
  
end

Link to comment
Share on other sites

Recommended Posts

  • 0

To jeszcze tylko dodać sterowanie uzależnione od poziomu podającego światła i będzie kompletna.

Link to comment
Share on other sites

  • 0
4 hours ago, eustachy said:

Masz rację, zmieniłem na poprawną nazwę zmiennej. teraz po zastosowaniu Twojego kodu mam następujący debug:

[DEBUG] 18:42:59: źródło: 91
[DEBUG] 18:42:59: scena numer: 1
[DEBUG] 18:42:59: unexpected error! aborting
[DEBUG] 18:42:59: --------- aborting ----------

 

 

Ok, czyli Twoja scena jest wywoływana przez urządzenie o ID = 91. Nie wiem co to jest, ale dla sceny jest to urządzenie nieznane (sensor ruchu ma ID 93), więc scena nie wie co ma zrobić.

Teraz sprawdź jeszcze numery ID urządzeń.

Jeśli  chcesz, to możesz też sprawdzać gdzie i czym jest urządzenie o ID 93 za pomocą poniższego kodu, umieszczonego jako przycisk urządzenia wirtualnego, po naciśnięciu przycisku "debug":

Please login or register to see this code.

 

Edited by hoomee
lapsus/literówka
Link to comment
Share on other sites

  • 0

93, to po pierwszym zweryfikowaniu kodu od Ciebie ( jak zauważyłem błąd) to sprawdziłem jeszcze raz id urządzeń i zamieniłem na poprawne:

93 (błednie wześniej użyty czujnik LUX) w motion sensorze)

Please login or register to see this code.

 

I dwa poprawnie wstawione:

91

Please login or register to see this code.

77

Please login or register to see this code.

 

Link to comment
Share on other sites

  • 0
2 hours ago, wiesiekr said:

To jeszcze tylko dodać sterowanie uzależnione od poziomu podającego światła i będzie kompletna.

 

Masz na myśli poziom oświetlenia w tle? To się da zrobić ;)

Mam jedną scenę, która jest zależna od poziomu światła. Tyle, że najpierw trzeba skonfigurować czujkę, żeby raportowała mniejszą zmianę lub robiła to częściej, co może wpłynąć na żywotność baterii.

W odpowiednich miejscach trzeba dodać poniższy kod (ew. zamiast "if" dodać go gdzieś jako "or"). Myślę, że łatwo znaleźć gdzie dokładnie ;)


 

Please login or register to see this code.

 

Link to comment
Share on other sites

  • 0
12 minutes ago, eustachy said:

I dwa poprawnie wstawione:

91

Please login or register to see this code.

77

Please login or register to see this code.

 

czyli 91 i 77 powinno teraz działać.

 

Zmienna globalna musi mieć dwie wartości: "true" i "false" (bez cudzysłowów). Inaczej scena nie będzie wiedziała jak ją interpretować.

Edited by hoomee
dodatkowe wyjaśnienie
Link to comment
Share on other sites

  • 0

No i ten debug jest od tych wartości:

Please login or register to see this code.

 

Link to comment
Share on other sites

  • 0

ok. edytowałem mój powyższy post, bo w międzyczasie zrozumiałem co miałeś na myśli ;)

sprawdź zmienną globalną, bo musi mieć predefiniowane wartości, żeby scena je rozumiała.

 

To właśnie jest "fajne" w programowaniu (nie jestem programistą), że jest tysiąc rzeczy o których nie da się pomyśleć wcześniej i wychodzą dopiero w testach :)

Link to comment
Share on other sites

  • 0

Pomyślałem o tym, zanim napisałem poprzedniego posta..:

 

Please login or register to see this attachment.

Link to comment
Share on other sites

  • 0

ok. Nie wiem co się dzieje, ale zróbmy jak w dowcipie - wysiądźmy z tego samochodu i wsiądźmy jeszcze raz ;)

 

W poniższym kodzie dodałem bramkę na zmienną globalną (gdyby nie była jak trzeba). Wklej całość u siebie, zrestartuj HC2, poruszaj się przed sensorem i sprawdź debug. Zobaczymy co z tego wyniknie ;)

 

Please login or register to see this code.

 

Edited by hoomee
Link to comment
Share on other sites

  • 0

Zgodnie z dowcipem powinniśmy to zrobić 3 razy :). No ale:

[DEBUG] 23:48:35: line 120: ')' expected near '!'
[DEBUG] 23:48:41: line 120: ')' expected near '!'

 
Link to comment
Share on other sites

  • 0

Masz rację coś nie tak ze zmienną

[DEBUG] 00:09:38: --------- debugging ----------
[DEBUG] 00:09:38: źródło: 91
[DEBUG] 00:09:38: scena numer: 1
[DEBUG] 00:09:38: problem ze zmienną globalną
[DEBUG] 00:09:38: nie jest ani true ani false

 
 
Może gdzieś w kodzie została stara nazwa..
Link to comment
Share on other sites

  • 0

W kodzie sceny zawsze była "manualOn", możesz jeszcze sprawdzić dokładnie w panelu zmiennych, albo od razu

- usunąć zmienną globalną całkowicie,

- zrestartować HC2,

- dodać zmienną jeszcze raz,

- zrestartować HC2

- i sprawdzić wtedy.

 

Alternatywnie zmienić nazwę tej zmiennej, którą masz na coś głupiego (np. "nieDziala") i dodać nową zmienną "manualOn", a w przyszłości tę starą po prostu wyrzucić.

Link to comment
Share on other sites

  • 0

Ok, spróbuję jutro z rana. Bardzo Ci dziękuję za poświęcony czas i wiedzę. Dam znać jutro.

Link to comment
Share on other sites

  • 0

Please login or register to see this code.

Lepiej - choć to nie prawda, światło nie było zapalone :)

Link to comment
Share on other sites

  • 0

:) ale zmienna była ustawiona na true. Scena o tym nie wie.

Wystarczy zapalić i zgasić światło i będzie dobrze, bo scena sprawę wyjaśni.

Link to comment
Share on other sites

  • 0

Witam dziękuje kolegą za scenę z tego tematu - działa mi bardzo dobrze lecz  mam prośbę w pomocy edycji tej sceny

któraś 2 czujników ruchu  aktywna - włącz światło w godz 7-22 na 50% mocy - 22-7 na 5% mocy czas 30s     - to mam zrobione edytując wszą scenę

światło ręcznie zapalone zapala na 100% mocy zawsze i na czas 15 min

 

ewentualnie jeżeli jest możliwość to reguluje się automatycznie aby było np 50 lux - chodź to nie koniecznie bardziej zależy mi na 1 części

 

--[[
%% properties 
100      value
83       value
67       value
%% globals 
--]] 

local sensorID = 83
local sensorID = 100                -- sensor ruchu
local lightID = 67                      -- światło sufit
local delay = 30                       -- opóźnienie gaszenia w sekundach 
local nightStartsat = 22           -- początek ciszy nocnej
local dayStartsat = 6               -- koniec ciszy nocnej
local lightDay = 50                  -- moc światła w dzień
local lightNight = 5                  -- moc światła w nocy
---- nie edytuj poniżej tej linii -------------------------------------------
local startSource = fibaro:getSourceTrigger()
-----------------------------------------------------------------------------
-- reakcja na ruch
-- czy nie za dużo instancji
if ( (startSource.deviceID == sensorID) and (fibaro:countScenes() > 1) )
  then
    fibaro:debug("--------- debugging ----------") 
    fibaro:debug("za dużo scen: "..fibaro:countScenes())
    fibaro:debug("źródło: "..startSource.deviceID)
    fibaro:debug(fibaro:getGlobal("manualOn1"))
    fibaro:debug("scena numer: "..fibaro:countScenes())
    fibaro:debug("--------- aborting ----------") 
    fibaro:abort() 
-- czy globalna zmienna mówi, że światło włączone ręcznie 
elseif ( (startSource.deviceID == sensorID) and (tostring(fibaro:getGlobal("manualOn1")) == "true") )
  then
    fibaro:debug("--------- debugging ----------") 
    fibaro:debug("światło było zapalone ręcznie")
    fibaro:debug("źródło: "..startSource.deviceID)
    fibaro:debug(fibaro:getGlobal("manualOn1"))
    fibaro:debug("scena numer: "..fibaro:countScenes())
    fibaro:debug("--------- aborting ----------") 
    fibaro:abort() 
elseif( (startSource.deviceID == sensorID) and (tostring(fibaro:getGlobal("manualOn1")) == "false") )
  then
  local sensorMoved = (tonumber(fibaro:getValue(sensorID, "value")) > 0)
  local isLightOn = (tonumber(fibaro:getValue(lightID, "value")) > 0)
  fibaro:debug("--------- debugging ----------")
  fibaro:debug("źródło: "..startSource.deviceID)
  fibaro:debug("scena numer: "..fibaro:countScenes())
  fibaro:debug("isLightOn: "..tostring(isLightOn))
  fibaro:debug("sensorMoved: "..tostring(sensorMoved))
-- zapalanie światła
  if sensorMoved 
    then 
    if ( (tonumber(os.date("%H")) >= nightStartsat) or (tonumber(os.date("%H")) < dayStartsat) )
      then
        fibaro:call(lightID, "setValue", lightNight)
        fibaro:debug("Jest noc, natężenie światła: "..lightNight)
        fibaro:sleep(1000)
        fibaro:debug("koniec sceny")
    elseif ( (tonumber(os.date("%H")) >= dayStartsat) and (tonumber(os.date("%H")) < nightStartsat) )
      then
        fibaro:call(lightID, "setValue", lightDay)
        fibaro:debug("Jest dzień, natężenie światła: "..lightDay)
        fibaro:sleep(1000)
        fibaro:debug("koniec sceny")
    else
      fibaro:debug(os.date("%H"))
      fibaro:debug("dziwny błąd, aborting")
      fibaro:abort() 
    end
  end
-- gaszenie światła 
  if isLightOn 
    then 
      local turnOffTime = os.time() + delay
      while turnOffTime > os.time() 
      do 
        if (tonumber(fibaro:getValue(sensorID, "value")) > 0)
          then 
          turnOffTime = os.time() + delay
        end  
      fibaro:debug("DELAY: "..tostring(turnOffTime - os.time()))
      fibaro:sleep(1000)
      end
-- sprawdzenie czy światło wyłączone ręcznie podczas trwania zwłoki (zmienna globalna) 
    if (tostring(fibaro:getGlobal("manualOn")) == "true")
      then 
      fibaro:debug("--------- debugging ----------")
      fibaro:debug("SCENE ABORT -----------MANUAL ON ACTIVATED---------------") 
      fibaro:abort() 
    end
    fibaro:call(lightID, "turnOff")
    fibaro:debug("Action: turnOff") 
  end 
elseif ( startSource.deviceID == lightID ) 
  then
  fibaro:debug("--------- debugging ----------") 
  fibaro:debug("wywołanie światłem")
  fibaro:debug("źródło: "..startSource.deviceID)
  fibaro:debug("scena numer: "..fibaro:countScenes())
--  fibaro:sleep(1000)
  local sensorMoved = (tonumber(fibaro:getValue(sensorID, "value")) > 0)
  if ( (fibaro:countScenes() == 1) or (not sensorMoved) )
    then
    if (tonumber(fibaro:getValue(lightID, "value")) > 0)
      then
      fibaro:debug("--------- debugging ----------") 
      fibaro:debug("zapalenie ręczne")
      fibaro:debug("źródło: "..startSource.deviceID)
      fibaro:debug("scena numer: "..fibaro:countScenes())
      fibaro:setGlobal("manualOn", "true")
      fibaro:abort()
    elseif (tonumber(fibaro:getValue(lightID, "value")) == 0)
    then
      fibaro:debug("--------- debugging ----------") 
      fibaro:debug("zgaszenie")
      fibaro:debug("źródło: "..startSource.deviceID)
      fibaro:debug("scena numer: "..fibaro:countScenes())
      fibaro:setGlobal("manualOn", "false")
      fibaro:abort()
    end
  end
elseif ( (tostring(fibaro:getGlobal("manualOn")) ~= "true") and 
         (tostring(fibaro:getGlobal("manualOn")) ~= "false") )
  then
      fibaro:debug("--------- debugging ----------") 
      fibaro:debug("źródło: "..startSource.deviceID)
      fibaro:debug("scena numer: "..fibaro:countScenes())
      fibaro:debug("problem ze zmienną globalną")
      fibaro:debug("nie jest ani true ani false")
      fibaro:abort()
elseif startSource["type"] == "other"
  then
    fibaro:debug("--------- debugging ----------") 
    fibaro:debug("Scena wywołana ręcznie")
    fibaro:debug("Zapal światło lub aktywuj czujnik ruchu")
    fibaro:debug("koniec sceny")
else
    fibaro:debug("--------- debugging ----------") 
    fibaro:debug("źródło: "..startSource.deviceID)
    fibaro:debug("scena numer: "..fibaro:countScenes())
    fibaro:debug("unexpected error! aborting")
    fibaro:debug("--------- aborting ----------")
    fibaro:abort()
end
 

 

z góry dziekuje i pozdrawiam 

Link to comment
Share on other sites

  • 0

W Twojej scenie są dwie zmienne: "manualOn" i "manualOn1" 

Nie bardzo wiem dlaczego.

Jeśli chodzi o zapalenie światła na 100% to można to zautomatyzować w scenie dość łatwo, ale wtedy stracisz całkowicie możliwość ustawienia mniejszego natężenia - scena zawsze nadpisze natężenie. Z mojego punktu widzenia lepiej jest po prostu użyć dwuklika (automatycznie 100%). 

Automatyczne gaszenie po 15 minutach powinno też dać się zrobić - sprawdzę jak usiądę przy komputerze.

Link to comment
Share on other sites

  • 0

Witam 

dziekuje za odpowiedz 

 

dwie zmienne to przypadek - chodź obie są prawdziwe ( podwójnie utworzone )

 

to bym poprosił bym tylko podpowiedź jak zrobić że światło ręcznie włączone zgaśnie po 15 min 

 

dziekuje pozdrawiam 

 

 

Link to comment
Share on other sites

  • 0

Ok. Obie są prawdziwe, ale mogą mieć różny stan, więc scena (odwołując się do różnych wartości) może "podejmować" złe decyzje ;) Proponuję wybrać jedną a tę drugą usunąć.

 

Tak jak pisałem nie polecam zapalania światła na 100 procent sceną, bo można to łatwo osiągnąć prztyczkiem w ścianie lub z aplikacji. Niemniej jest to możliwe dlatego podaję receptę :)

 

Wśród zmiennych na początku sceny należy dodać dwie linie:

Please login or register to see this code.

a w samej scenie w tym miejscu:

 

    if (tonumber(fibaro:getValue(lightID, "value")) > 0)
      then
      fibaro:debug("--------- debugging ----------") 
      fibaro:debug("zapalenie ręczne")
      fibaro:debug("źródło: "..startSource.deviceID)
      fibaro:debug("scena numer: "..fibaro:countScenes())
      fibaro:setGlobal("manualOn", "true")
      fibaro:abort()
    elseif (tonumber(fibaro:getValue(lightID, "value")) == 0)
    then

 

czerwoną linijkę (czyli fibaro:abort() ) należy zastąpić poniższym kodem:

Please login or register to see this code.

 

Uwagi:

1) Aby ustawić tylko bezwarunkowe opóźnienie ale nie włączać automatycznie światła na 100% wystarczy pominąć pierwszą zmienną (manualLight) i pierwszą linijkę kodu powyżej (tam, gdzie ta zmienna występuje).

2) gaszenie nie jest do końca bezwarunkowe, bo sprawdza czy czujnik ruchu nie jest wzbudzony a jeśli jest, to przedłuża czas o 30 sekund.

Ja nie korzystam z takiego rozwiązania, więc nie będę miał możliwości testowania tej sceny.

 

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...