Dzień dobry, Potrzebuję w HC3 przygotować scenę, w której światło po załączeniu z przycisku zostanie wyłączone po 5 minutach, gdy motion sensor nie wykryje ruchu. W przypadku wykrycia ruchu światło pozostaje załączone (aż do momentu wystąpienia warunku o braku ruchu przez 5 min).
Chciałem to zrobić poprzez scenę blokową, gdyż nie mam żadnego doświadczenia w LUA, ale nie osiągnąłem sukcesu.
Cały dzień testowałem i tunowałem sobie aplikację.
Pojawiła się jeszcze jedna sprawa dotycząca logiki.
Jest ona konsekwencją przyjętych obecnie czynności.
Gdy wyłączy się światło poprzez przycisk - odliczanie czasu ciągle trwa i pojawiają się kłopoty - np. gdy naciśnie się przycisk jeszcze kolejny raz, aby światło załączyć. Nadal działa stara scena.
Wydaje się, że naciśnięcie przycisku podczas odliczania powinno wyłączyć światło oraz zakończyć scenę.
Niestety nie umiem tego sam napisać.
Hurra!
Wygląda, że wszystko działa!
Adres Motion Sensora był prawidłowy. Jak zmieniłem kod wg Pana wskazówek z punktów 1 i 2 to zaczęło działać prawidłowo.
Będę jeszcze testował i dam znać.
Bardzo bardzo dziękuję za pomoc!
dobrze mam rozwiazanie:
1) nalezy pobrac czas kiedy nastepuje wykonanie tej sceny
na samym poczatku po local dla adresu itp. prosze wpisac:
local now = os.time()
2) warunek pentli while zmienic na
while os.time()< math.max(now, breachedTime) + delay do
3) to ze czujnik nie rozpoznaje detekcji to chyba adres tego czujnika nie jest poprawny w definicji
local sensorID =92-- adres Motion Sensor
Panie Łukaszu, wprowadziłem Pana zmiany i jest już blisko sukcesu.
Mam 2 problemy:
- gdy załączam scenę z przycisku, a czujka ruchu nie była aktywna od jakiegoś czasu to scena wykonuje się w ciągu 1 sekundy:
[24.01.2022] [13:10:30] [DEBUG] [SCENE73]: załączam światło
[24.01.2022] [13:10:31] [DEBUG] [SCENE73]: wyłączam światło
Domyślam się, że breachedTime jest jakiś odległy i to powoduje pominięcie odliczania. Ten pierwszy breachedTime powinien być równy momentowi naciśnięcia przycisku. Dopiero kolejne odnoszą się do czasu wystąpienia ruchu (o ile nastąpi).
Druga sprawa jest taka, że mimo mojego machania rękami przed czujką ruchu (błyska LED, więc czujka mnie widziała) światło się wyłącza po 30 sekundach. Wygląda jakby pętla nie wyprowadzała funkcji na początek odliczania. Nie wiem jednak jaka może być tego przyczyna, gdyż wszystko jest identycznie jak u Pana w kodzie:
local sensorID = 92 -- adres Motion Sensor local dimmerID = 80 -- adres Conservatory Ceiling local breachedTime = fibaro.getValue(sensorID, "lastBreached") print(breachedTime, os.date("%c", breachedTime)) --załączam światło print("załączam światło") fibaro.call(80, 'setValue', 10) --odliczanie local delay = 30 while os.time() < breachedTime + delay do print("odliczanie") fibaro.sleep(2000) --ms breachedTime = fibaro.getValue(sensorID, "lastBreached") end fibaro.call(80, "setValue", 30) fibaro.sleep(1000) --ms --wyłącz światło print("wyłączam światło") fibaro.call(80, "setValue", 0)
Debug nie wykazuje błędów.
"Allow to restart a running scene" mam ustawione na "No", więc to nie jest źródło błędnego działania kodu.
[24.01.2022] [13:12:28] [DEBUG] [SCENE73]: 1643026338 Mon Jan 24 13:12:18 2022
[24.01.2022] [13:12:28] [DEBUG] [SCENE73]: załączam światło
[24.01.2022] [13:12:28] [DEBUG] [SCENE73]: odliczanie
[24.01.2022] [13:12:30] [DEBUG] [SCENE73]: odliczanie
[24.01.2022] [13:12:32] [DEBUG] [SCENE73]: odliczanie
[24.01.2022] [13:12:34] [DEBUG] [SCENE73]: odliczanie
[24.01.2022] [13:12:36] [DEBUG] [SCENE73]: odliczanie
[24.01.2022] [13:12:38] [DEBUG] [SCENE73]: odliczanie
[24.01.2022] [13:12:40] [DEBUG] [SCENE73]: odliczanie
[24.01.2022] [13:12:42] [DEBUG] [SCENE73]: odliczanie
[24.01.2022] [13:12:44] [DEBUG] [SCENE73]: odliczanie
[24.01.2022] [13:12:46] [DEBUG] [SCENE73]: odliczanie
[24.01.2022] [13:12:49] [DEBUG] [SCENE73]: wyłączam światło
Dziękuję bardzo.
Obrobię się z bieżącą pracą i zabiorę się za testy.
Pozdrawiam serdecznie!
kod powinien byc miejwiecej taki:
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 sensorID = 55 -- adres Motion Sensor
local dimmerID = 28 -- adres Dimmer 2
local breachedTime = fibaro.getValue(sensorID, "lastBreached")
print(breachedTime, os.date("%c", breachedTime))
--załączam światło
print("załączam światło")
fibaro.call(dimmerID, "setValue", 50)
--odliczanie
local delay = 30
while os.time() < breachedTime + delay do
print("odliczanie")
fibaro.sleep(2000) --ms
breachedTime = fibaro.getValue(sensorID, "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)
zgubiona zostala definicja i inicjacja zmiennej odczytujacej czas ostatniego poruszenia czujnika. W linii np 17 przed pentla while i po definicji sensorID trzeba dodac:
local breachedTime = fibaro.getValue(sensorID, "lastBreached")
To dotyczy linii z odliczaniem:
while os.time() < breachedTime + delay do print("odliczanie")
jesli to dotyczy miejsca tego
local breachedTime = fibaro.getValue(sensorID, "lastBreached")
to adres sensorID nie jest adresem np. Motion Sensor'a
To nie ma sensu pana pierwsza scena blokowa, prosze ja wylaczyc i calosc bedzie realizowane przez ten kod co byl na wideo przy czym warunek zalczenia sceny bedzie nacisniecie na pilocie i czas wylaczenia 'local delay = 5*60' czyli 5 minut.
Niech pan nie testuje przy czasach mniejszych od 20s bo Motion Sensor resetuje sie po wykryciu ruchu po 12 s czy jakos tak.
Co do warunku sceny to proponuje pana istniejaca scene automatycznie przekonwerowac na Lua i skopiowac jej trigger code.
Jestem już blisko, ale....
Wymyśliłem to tak, że naciśnięcie "pilota" uruchamia scenę (blokową), w której światło się zapala na 80% i wyłączy samoczynnie po 10 sekundach (dla potrzeb testów taki czas dałem, docelowo będzie to np. 5 min.).
Zrobiłem również drugą scenę w LUA - jak wyżej.
Warunkiem jej uruchomienia jest zdarzenie: czujka zauważa ruch oraz warunek, że światło jest już załączone. Wtedy światło zostaje uruchomione na 100% (do tej pory scena mi działa) a dalej już jak w Pańskiej scenie.
Niestety pierwsza scena nadal działa i wyłącza światło, więc nie mogę doczekać szczęśliwego zakończenia....
HC3 nie pozwala mi zapisać sceny w takiej konfiguracji.
Prawa strona wygląda tak:
local sensorID = 92 -- adres Motion Sensor
local dimmerID = 80 -- adres Lampy
--załączam światło
print("załączam światło")
fibaro.call(80, 'setValue', 100)
--odliczanie
local delay = 30
while os.time() < breachedTime + delay do
print("odliczanie")
fibaro.sleep(2000) --ms
breachedTime = fibaro.getValue(92, "lastBreached")
end
fibaro.call(80, "setValue", 30)
fibaro.sleep(1000) --ms
--wyłącz światło
print("wyłączam światło")
fibaro.call(80, "setValue", 0)
Prawa strona kodu sceny tak jak w moim przykładzie na filmie. Wyłączy swiatlo po określonym czasie od ostatnio wykrytego ruchu
Dziękuję za obszerną pomoc.
Obecnie mam kłopot ze zdefiniowaniem warunku/triggera.
Scena jest uruchamiana poprzez naciśnięcie przycisku.
Czujka ruchu na tym etapie nie ma znaczenia.
Dopiero później, gdy przez jakiś czas nie będzie ruchu, to ona da sygnał do wyłączenia światła.
Moje obecne "Conditions" są następujące:
{
conditions = { {
id = 35,
isTrigger = true,
operator = "==",
property = "centralSceneEvent",
type = "device",
value = {
keyAttribute = "Pressed",
keyId = 1
}
Intuicja mówi mi, że powinno się tam jednak coś znaleźć o czujce ruchu, coś co rozpocznie odliczanie do wyłączenia światłą lub do detekcji ruchu, która skasuje licznik. Nie wiem jednak co to miałoby być.
https://www.portal.ztechnikazapanbrat.pl/filmpagescollection/1100
Nawet film się nazywa HC3 wyłączenie światła …
Dziekuję!
Zaraz sprawdzę.
W LUA jest gotowy kod i wykład jak dziala co ustawic. Poświęciłem temu kilka filmów - nagrań dla wszystkich.