Zauważyłem, że jedną z najtrudniejszych rzeczy w nowej centrali - HC3 jest zrozumienie kodu odpowiedzialnego za wywołanie sceny napisanej w języku Lua. Dlatego napisałem poniższy post celem edukacji i dobrego zrozumienia co to jest trigger, a co to jest warunek i jak są razem powiązane. Wszystko jest opisane w oryginalnej instrukcji FIBARO (link poniżej), którą skróciłem do najprostszej formy. Mam nadzieję, że zrozumiałej. Czekam na Twoją opinię i uwagi, które możesz umieścić pod postem.
Pełna instrukcja FIBARO: https://manuals.fibaro.com/home-center-3-lua-scenes/
Poniżej opis i wyjaśnienia dla omówionego zagadnienia sterowania Dimmer po wykryciu ruchu. Patrz filmy serii nr. 1120 https://www.portal.ztechnikazapanbrat.pl/filmpagescollection/1120
Wyzwalacze (triggers) i warunki (conditions) sceny zapisanej można opisać następująco:
Jeżeli urządzenie o adresie 55 z parametrem “lastBreached” przyjmie dowolną wartość (“anyValue”) oraz jest godzina pomiędzy 15:00, a 6:00 rano, to wywołaj scenę.
Aby zrozumieć definiowanie dowolnie złożonych zapisów uruchamiających scenę należy wprowadzić następujące definicje i zasady.
Warunki mogą być dwóch typów (oba mylnie w j.ang są nazywane „conditions”)
- pierwszy warunek z zapisem w kodzie “isTrigger = true” - nazywać będę wyzwalaczem (trigger)
- drugi typ to warunek bez zapisu “isTrigger” lub jawnie z podaniem “isTrigger = false” - nazwać będę warunkiem (condition).
Oba powyższe typy mogą występować wiele razy i być dowolnie ze sobą powiązane co daje bardzo duże możliwości określenia, kiedy scena ma zostać wywołana.
Wyzwalacz (Trigger)
Fragment kodu będący triggerem jest non-stop analizowany przez procesor centrali HC3. To właśnie ten kod będący triggerem sceny jest zdarzeniem, dla którego może nastąpić wywołanie sceny. Można umieszczać wiele triggerów, oddzielonych od siebie przecinkiem "," i każdy w osobnej parze nawiasów {}.
Zapis “isTrigger = true” (w pierwszym fragmencie kodu oznaczonym kolorem żółtym) oznacza, że jest to trigger. Zadaniem tego triggera jest to, aby centrala cały czas obserwowała, kiedy nastąpiła zmiana parametru “lastBreached” urządzenia o adresie 55.
Uwaga: aby scena została wywołana musi być przynajmniej jeden trigger. Brak podania zapisu isTrigger = true” będzie oznaczać wartość domyślną, czyli stan przeciwny „isTrigger = false”, co identyfikuje fragment kodu jako niebędący triggerem, a dodatkowym warunkiem wywołania sceny.
Fragment kodu będący triggerem są równoznaczne z tym, co podawane było po znaku ‘%% properties” lub „%% events” lub "%% globals" itp. w centrali HC2. W przypadku centrali HC3 jest możliwość zawężenia tiggera np. tylko do zmiany wartości parametru „value” np. na wartość "true", co będzie odpowiadać załączeniu światła.
Warunek (condition)
Dodatkowo centrala HC3 umożliwia podanie warunku dodatkowego niebędącego triggerem. W ten sposób możemy dodać założenia dodatkowe, jakie muszą być spełnione celem wywołania sceny. Dodatkowe warunki mogą być w ogóle niezwiązane z urządzeniem lub parametrem określonym przez trigger. Tutaj mam dwa warunki dodatkowe (oznaczone na zielono) oba dotyczą czasu i co najważniejsze nie są to triggery bo nie mają zapisu „isTrigger = true”. Jeśli byłyby one zdefiniowane jako triggery oznaczałoby to tyle, że scena byłaby wywoływana co minutę od 15:00 do 6:00, a to nie miałoby sensu, prawda?
Zarówno trigger, jak i warunek musi być zdefiniowany wewnątrz nawiasów klamrowych {} i oddzielone od siebie przecinkami ‘,’ , a wszystkie łącznie zamknięte słowem kluczowym „conditions = { }”, co zostało zobrazowane kolorem pomarańczowym poniżej.
Operatory i (all), lub (any)
Do łączenia zależności logicznych pomiędzy triggerami i warunkami służą operatory ‘i’ (all) oraz ‘lub’ (any).
Jeśli występuje więcej niż jeden trigger lub warunek zamknięty słowem kluczowym „conditions = { … }” to przed lub po nim musi pojawić się definicja mówiąca jak mają być łączone zdefiniowane triggery, warunki pomiędzy sobą poprzez słowo kluczowe: operator = „all” lub operator = „any”. Podany operator (w poniższym przykładzie kolor fioletowy) odnosi się do wszystkich triggerów, warunków zamkniętych klauzulą „conditions = { }”. Jeśli mam 3 warunki oznaczone jako A, B, C i chcemy, aby logika pomiędzy nimi była następująca: A i (B lub C) to należy je rozdzielić. Trzeba zdefiniować dwa niezależne operatory logiczne, tak jak ma to miejsce w poniższym przykładzie.

Kod który można skopiować do centrali HC3
{
operator = "all",
conditions = {
{
type = "device",
id = 55,
property = "lastBreached",
operator = "anyValue",
isTrigger = true
},
{
operator = "any",
conditions = {
{
type = "date",
property = "cron",
operator = "match>=",
value = {"00", "15", "*", "*", "*", "*"},
isTrigger = false
},
{
type = "date",
property = "cron",
operator = "match<=",
value = {"00", "6", "*", "*", "*", "*"},
isTrigger = false
}
}
}
}
}