Witam, mam problem z jedną sceną, jest dosyć prosta, ale cały czas wywala mi "przekroczony limit instancji". Scena ma za zadanie włączyć światło w kuchni po wykryciu ruchu i jeśli przez 180 sek. ruchu nie będzie to światło ma się wyłączyć. Jak można to inaczej rozwiązać ?

Rozumiem, że ma pan sceny nr. 349, 350, 351 które wykonują swoje rzeczy. One powinny mieć swoje warunki triggerowania, a tutaj określamy czy sceny 349,350,351 mogą być triggerowane czy nie.
chyba nie do końca o to mi chodziło,
mam zmienną predefiniowaną: Zmierzch_Aga (opcje: tak/nie) i chcę do poniższej sceny wprowadzić warunek, który będzie blokował scenę, kiedy zmienna będzie ustawiona jako "nie"
============================
--[[
%% properties
629 lastBreached
320 lastBreached
%% events
%% globals
--]]
--tylko jeden wątek/instance dopuść do wykonywania sceny
if fibaro:countScenes() > 1 then
fibaro:abort()
end
local SensorID1 = 629
local SensorID2 = 320
local breachedTime1 = fibaro:getValue(SensorID1, "lastBreached")
local breachedTime2 = fibaro:getValue(SensorID2, "lastBreached")
print(breachedTime, os.date("%c", breachedTime1, breachedTime2))
--załączam światło
print("załączam światło")
fibaro:call(449, "turnOn")
fibaro:call(452, "turnOn")
--odliczanie
local delay = 80
while os.time() < math.max(breachedTime1, breachedTime2) + delay do
print("odliczanie")
--odlicz czas 1 minuty
fibaro:sleep(2000) --ms
breachedTime1 = fibaro:getValue(SensorID1, "lastBreached")
breachedTime2 = fibaro:getValue(SensorID2, "lastBreached")
end
--wyłącz światło
print("wyłączam światło")
fibaro:call(449, "turnOff")
fibaro:call(452, "turnOff")
============================
dziękuję
Proszę bardzo :-)
Wszystko co pan ma w wykonaniu pętli if-then np.
print("uaktywniam secenę")
fibaro:setSceneEnabled(349, true)
fibaro:setSceneEnabled(350, true)
fibaro:setSceneEnabled(351, true)
proszę wstawić do funkcji:
setTimeout(
function()
...................
caly kod bedacy opozniony w wywolaniu
...................
end,
3*60*1000) --tu opoznienie 3 minuty bo czas podajemy w ms
Czy mogę prosić o dodanie do głównego kodu, załączania i wyłączania światła z opóźnieniem, warunku ze zmiennej predefiniowanej "tak" - scena działa, "nie" scena nie działa?
Oraz pytanie o aktywację bądź deaktywację scen bo coś nie mogę tego ogarnąć.
Scena aktywująca:
--[[
%% properties
%% weather
%% events
%% globals
Zmierzch_Aga
sceneID: 349
sceneID: 350
sceneID: 351
numberenabled: booleanvalue (true – enable scene, false – disable scene)
--]]
local startSource = fibaro:getSourceTrigger();
if (
( fibaro:getGlobalValue("Zmierzch_Aga") == "tak" )
or
startSource["type"] == "other"
)
then
print("uaktywniam secenę")
fibaro:setSceneEnabled(349, true)
fibaro:setSceneEnabled(350, true)
fibaro:setSceneEnabled(351, true)
end
Scena dezaktuwująca:
--[[
%% properties
%% weather
%% events
%% globals
Zmierzch_Aga
sceneID: 349
sceneID: 350
sceneID: 351
numberenabled: booleanvalue (true – enable scene, false – disable scene)
--]]
local startSource = fibaro:getSourceTrigger();
if (
( fibaro:getGlobalValue("Zmierzch_Aga") == "nie" )
or
startSource["type"] == "other"
)
then
print("deaktywuję secenę")
fibaro:setSceneEnabled(349, false)
fibaro:setSceneEnabled(350, false)
fibaro:setSceneEnabled(351, false)
end
---------------------------
pewnie można te sceny połączyć w jedną
Pozdrawiam
Cieszy mnie to, że wszystko działa tak jak pan sobie tego życzył.
Zastanawiając się dlaczego "any" dla warunku wschód/zachód można dojść do wniosku, że HC3 interpretuje warunek czasu tak samo, jak robił to HC2 tyle, że teraz robi to w tle (nie widzimy kodu pełnego).
Zatem gdy jest detekcja ruchu to scena sprawdza godzinę w sposób następujący:
dla wchodu: czas rzeczywisty np. 6:21. <. 7:15 (wschód słońca) LUB (ANY)
dla zachodu: czas rzeczywisty np. 6:21. > 18:25 (zachód słońca)
I tu od razu widać, że musi być warunek LUB (ANY), bo jeśli byłby warunek I (ALL) to zawsze wartość wyrażenia byłaby FALSE.
Panie Łukaszu dziękuję za pomoc. Wszystko działa tak jak tego oczekiwałem. Dodam tylko że jednak w warunkach czasu musi musi być ustawione any. testując nie zmieniłem dla trigerra na all co również Pan napisał. To powodowało że faktycznie scena uruchamiała się zawsze a że testowałem ją późnym wieczorem myślałem że wszystko ok. Po zmianie na all dla triggera scena przy all dla warunku czasu wogóle nie startowała. Teraz przy all dla triggera i any dla czasu wszystko działa wzorowo.
Jeszcze raz dziękuję - planuję jeszcze dodać funkcję aby po włączeniu włącznika ,,zamrozić wykonywanie sceny'' do czasu jego wyłączenia. Tu pozwolę sobie niebawem na dodatkowe konsultacje online z Panem.
ok, czyli tak jak sądziłem .... :-)
Czekam na sprawdzenie...
bardzo dziękuję. Będę testował. Na chwilę obecną miałem ustawiony warunek czasu na any i faktycznie scena się uruchamia w ciągu dnia. Będę testował na all.
No nie zupełnie... bo scena się wywoła nie zależnie od tego czy jest po zachodzie czy nie -> pierwsze "any" musi być "all", a drugie dla warunku czasu nie jestem pewien czy też nie powinno być "all". Ja bym dał "all" i jak nie będzie triggerować to "any"
Co do akcji to tak: - zmiany na grubo zaznaczyłem
print("Wywołuje scene.")
--[[
To jest przykładowa funkcja napisana do filmu DIY załączania światła po wykryciu detekcj ruchu
i wyłączenia z opóźnieniem.
Motion Sensors, Dimmer 2
Designed by Lukasz Gawryjolek
https://www.zTechnikaZaPanBrat.pl
]]--
local sensorID1 = xxx -- adres Motion Sensor 1
local sensorID2 = xxx -- adres Motion Sensor 2
local dimmerID = 28 -- adres Dimmer 2
local breachedTime1 = fibaro.getValue(sensorID1, "lastBreached")
local breachedTime2 = fibaro.getValue(sensorID2, "lastBreached")
print(breachedTime, os.date("%c", breachedTime1, breachedTime2))
--załączam światło
print("załączam światło")
fibaro.call(dimmerID, "setValue", 50)
--odliczanie
local delay = 30
while os.time() < math.max(breachedTime1, breachedTime2) + delay do
print("odliczanie")
fibaro.sleep(2000) --ms
breachedTime1 = fibaro.getValue(sensorID1, "lastBreached")
breachedTime2 = fibaro.getValue(sensorID2, "lastBreached")
end
fibaro.call(dimmerID, "setValue", 60)
fibaro.sleep(1000) --ms
--wyłącz światło
print("wyłączam światło")
fibaro.call(dimmerID, "setValue", 0)
czy coś w tym kierunku z drugim motion sensor o id 146.
Z drugą częścią kodu mogę mieć kłopot.
{ operator = "any", conditions = { { type = "device", id = 141, property = "lastBreached", operator = "anyValue", isTrigger = true },
{ type = "device", id = 146, property = "lastBreached", operator = "anyValue", isTrigger = true }, { operator = "any", conditions = { { type = "date", property = "sunset", operator = ">=", value = -30, isTrigger = false }, { type = "date", property = "sunrise", operator = "<=", value = 30, isTrigger = false } } } } }
Na podstawie przypadku z filmu nr. 1000 pt."Motion Sensor i Dimmer (Lua w HC2). Chciałbym aby światło załączało się tylko od zachodu do wschodu słońca. Czy poniższe warunki wyzwalacze będą ok.
Drugie pytanie to jak zmienić kod aby ruch był zbierany z dwóch czujek i scena załączała się po wyłapaniu ruchu obojętnie przez która czujkę.
Raczej będę miał problem z częścią kodu wywołującego akcję. Może ktoś pomóc.
{ operator = "all", conditions = { { type = "device", id = 141, property = "lastBreached", operator = "anyValue", isTrigger = true }, { operator = "any", conditions = { { type = "date", property = "sunset", operator = ">=", value = -30, isTrigger = false }, { type = "date", property = "sunrise", operator = "<=", value = 30, isTrigger = false } } } } }
I światło się nie zgasi jak jest naprawdę potrzebne bo jest ruch.
Dziękuję za pomoc, scena Lua zrobiona na przykładzie filmu działa bezbłędnie, jestem bardzo zadowolony :) pora na kolejne sceny z którymi już tak łatwo nie będzie bez ściągawki.
Witam serdecznie.
Bardzo mnie cieszy fakt, że już w pierwszych dniach po uruchomieniu forum pojawiają się pierwsze pytania techniczne, na które mogę udzielić odpowiedzi. Zanim przejdę do rozwiązania, chciałem zachęcić wszystkich użytkowników do udziału w dyskusji, gdyż poruszone tutaj zagadnienie jest często spotykane w praktyce.
Powyższy przykład działa w większości przypadków prawidłowo, ale jednak nie zawsze. Wynika to z faktu, w jaki sposób są wykonywane sceny i jak działa ich wywołanie. Otóż, gdy się przyjrzymy parametrowi wywołania sceny nr.2- wyłączającej światło widać, że jest ona wywoływana za każdym razem, kiedy czujnik ruchu jest nienaruszony, a dokładniej, kiedy zmieni wartość z naruszony -> nienaruszony. Tak się dzieje za każdym razem, kiedy czujnik ruchu wychwyci osobę. Oznacza, to, że kiedy się będziemy kręcić pod czujnikiem to czujnik non stop będzie wykrywał ruch, czyli załączał (trigerował) scenę nr. 1 i scenę nr.2.
O ile scena nr.1 się wykona błyskawicznie (brak tu opóźnienia - czasówki) i ponownie załączy wszystkie światła, o tyle scena nr.2 zachowa się inaczej (ma wstawione opóźnienie wynoszące 180s). Dla kodu centrali FIBARO oznacza to, że raz uruchomiona scena nr.2 jest aktywna i odlicza czas do wyłączenia wynoszący 180s. W tym czasie czujka ruchu wykrywa kolejny ruch i wywołuje (trigeruje) obie sceny ponownie. Scena nr.2 ponownie zaczyna się wykonywać i ponownie zaczyna odliczać czas do wyłączenia 180s.- całkiem nie potrzebnie, prawda?
Gdy w krótkim czasie to jest do 180s (odliczanych od pierwszego wywołania) scena zacznie wykonywać się przez 3-cią instancję (zostanie ponownie uruchomiona) - jest zgłaszany błąd przekroczenia ilości instancji, o której pan pisał. Oczywiście w ustawieniach sceny może pan podnieść limit instancji do 10, ale to nie jest rozwiązanie.
ROZWIĄZANIE
Należy tę scenę napisać w kodzie Lua i w jednej scenie zamieścić logikę załączania i wyłączenia z opóźnieniem oświetlenia. Dodatkowo koniecznie trzeba zapewnić (funkcja fibaro:abort()) aby tylko jedna instancja mogła wykonywać tą sceną.
Dokładnie taki sam przypadek bardzo szczegółowo omówiłem w serii filmów nr. 1000 pt."Motion Sensor i Dimmer (Lua w HC2)". Zachęcam do spokojnego obejrzenia 3 filmów i odpowiednio dostosowania udostępnionego kodu Lua do pana przypadku.
https://www.portal.ztechnikazapanbrat.pl/filmpagescollection/1000
Mam nadzieję, że wytłumaczyłem co jest przyczyną takiego zachowania i uda się panu osiągnąć zamierzony efekt już za pierwszym razem. Dla tych, co mają centralę HC3 jest bliźniacza seria filmów nr. 1100 o nazwie"Motion Sensor i Dimmer (Lua w HC3)", gdzie omawiam to samo zagadnienie dla nowej centrali.
https://www.portal.ztechnikazapanbrat.pl/filmpagescollection/1100