Witam,
próbuję utworzyć regułę która ma po zadanym czasie wyłączyć oświetlenie, zmienić etykietę przycisku (etykieta ma zawierać nazwe i pozostały czas do wyłączenia) lub przy wcześniejszym wyłączeniu zatrzymać odliczanie
rule "DzienTest" when Item OswDzien received command then var count = 0 var mincount = 0 if (OswDzien.state == ON) { count = 120 createTimer(now.toInstant().plusMillis(120000).atZone(now.zone), [ | OswDzien.sendCommand(OFF) ] ) while(count >= 0) { //DzienTest.postUpdate(count) mincount = (count / 60) OswDzien.setLabel("Dzienny "+ mincount + " min") count = count - 1 Thread::sleep(1000) if (OswDzien.state == OFF) { count = 0 OswDzien.setLabel("Dzienny ") } } } end
Reguła częściowo działa...
po czasie wyłącza oświetlenie, zmienia etykietę ale muszę ręcznie odświeżać stronę bo się sama nie aktualizuje i przy wyłączeniu ręcznym oświetlenia nie zmienia etykiety na "Dzienny ;)" tylko "Dzienny 0 min"
Co muszę i jak zmienić?
w którym OH UI to wyświetlasz?
ok, dam znać wieczorem - mam coś podobnego zrobione dla bramy wjazdowej - pokazuje ile czasu zostało do automatycznego zamknięcia bramy
@szpila86 ok, jestem długi dzień
Więc tak, raczej nie zrealizujesz (łatwo) swojego pomysłu, tak jak sobie zaplanowałeś. Ograniczenia Basic UI
Basic UI nie nasłuchuje zmian zrobionych przez setLabel więc trzeba rzeźbić w czym brązowym i śmierdzącym
Jeśli korzystkach z Basic UI na iOS (iPhone, iPad) to jest szansa zrobić tak jak potrzebujesz. Na Android nie mam, jak sprawdzić, ale podejrzewam, że będzie problem. Basic UI przez przeglądarkę raczej nie do zrobienia.
Nagrałem takie wideło z obsługi mojej bramy garażowej, która zlicza czas. Zrobiłem też poglądowo na szybo labelkę z zmieniającym się tekstem - ale taj napisałem, nie będzie ta labelka działała przez przeglądarkę, a na android to nie wiem
Zliczenie pokaże się w tym filmie po jakiś 25 sek- jak brama się otworzy - wtedy odpala się zliczanie. A później zlicza w dół od 90 sek do 0 sek - jeszcze po drodze zmienia kolory.
- Pierwsza możliwość dla Ciebie: to ta linijka (item) "Czas do zamknięcia" - będzie Ci działać ba telefonie i w przeglądarce
- Druga linijka (item): Brama zamknie się za (czyli tak jak chcesz) będzie działać tylko na iOS (może android)
Rozważ czy zamiast labelki nie będzie dla Ciebie okay ta pierwsza opcja, druga to rzeźba.
Daj znać to odpowiednio przygotuję Ci przykładową obsługę tego
Pozdrawiam, adrian
Dzięki
może być i pojawiający się item 1 tylko czy loga nie zawali...?
Przy okazji jeśli chodzi o pliki rules można mieć ich wiele czy lepiej mieć większość w jednym czy 2?
@szpila86 daj mi chwilę - spróbuje przerobić Twój kod.
A na Twoje pytanie o regułach odpowiem screenshot'em
Heheh czyli jak mam niewiele mniej to nie zrobię krzywdy OH 😀
Spokojnie idę do dzieci więc dziś nic nie zrobię
items
Switch OswDzien "Dzienny" Number OswDzienLicznikSekund "Dzienny [%d sek]" <time> Number OswDzienLicznikMinut "Dzienny [%d min]" <time>
var Number poIluSekundachWylaczyc = 120 var Number licznikSekund = 0 var Number licznikMinut = 0 var Timer oswietlenieCounter = null rule "DzienTest" when Item OswDzien changed then if (OswDzien.state==ON) { licznikSekund = poIluSekundachWylaczyc licznikMinut = (licznikSekund / 60) OswDzienLicznikSekund.sendCommand(licznikSekund) OswDzienLicznikMinut.sendCommand(licznikMinut) /* Usuwa Timer jeśli istnieje */ if (oswietlenieCounter !== null) { oswietlenieCounter.cancel() oswietlenieCounter = null } oswietlenieCounter = createTimer(now.plusSeconds(1), [ licznikSekund = licznikSekund - 1 licznikMinut = (licznikSekund / 60) OswDzienLicznikSekund.sendCommand(licznikSekund) OswDzienLicznikMinut.sendCommand(licznikMinut) if (licznikSekund > 1) { oswietlenieCounter.reschedule(now.plusSeconds(1)) } else if (OswDzien.state != OFF) { OswDzien.sendCommand(OFF) } ]) } else { /* Usuwa Timer po ręcznym lub automatycznym wyłączeniu */ if (oswietlenieCounter !== null) { oswietlenieCounter.cancel() oswietlenieCounter = null } } end
Default item=OswDzien Default item=OswDzienLicznikSekund visibility=[OswDzien==ON] Default item=OswDzienLicznikMinut visibility=[OswDzien==ON]
Hmm o takim podejściu nie pomyślałem 😉
kwestia zmiennych globalnych... pasuje żeby nie były globalne wtedy będzie to dla mnie bardziej uniwersalne a nawet będę mógł mieć obok siebie kilka takich reguł do kilku włączników z takimi samymi nazwami. Po wklejeniu tego kodu powoduje mi błąd.
[ERROR] [.internal.handler.ScriptActionHandler] - Script execution of rule with UID 'test-1' failed: The name 'OswDzienLicznikSekund' cannot be resolved to an item or type; line 16, column 7, length 21 in test
Co do błędu Item’y dodałeś jak u góry ?
Tak ale w Rules jest a w item nie mam odwołania bo tu akurat nie muszę mieć sek to nie powinno mimo to działać? Skoro skrypt jest sam sobie programem a items to tylko zapytanie?
I jeszcze jak tutaj ze zmiennych globalnych zrobić lokalne żeby nie było problemów z timerem gdy deklaracje przeniosę do reguły?
Da się jakoś ustalić żeby odlicznie nie szło do pliku z log? Dużo tego będzie bez potrzeby
Nie wiem co tam zmodyfikowales w rules. U mnie w rules jest odwołanie do item sekund i item musi istnieć żeby działało.
Jeśli Usuwasz item to musisz zmodyfikować items, sitemap, rules
A w błędzie masz wyraźnie napisane, ze reguła korzysta z item który nie istnieje.
—-
jesli nie chcesz korzystać z globalnych - wtedy musisz zrobić to pewnie podobnie jak zrobiłeś z usypianiem reguły.
przy czym tutaj wprowadzasz drobne niekontrolowane (raczej) zamieszanie w oH3
- wciskasz osDzienne
- odpala się timer na 120sek
- wyłączasz osDziennie ręcznie -timer dalej tam żyje swoim życiem bo to osobny wątek
- jak włączasz drugi raz osDzienne a nie skończył się jeszcze poprzedni timer
- odpali się drugi timer rownolegle
i co tam będzie dalej sie działo to ze świecą
Moze Ci działa, bo nigdy nie będzie sytuacji przełączenia 2 lub więcej razy przycisku w ciągu 120sek
Ale jesli tak to nie wiem czy masz opanowane sytuacje graniczne hm…. nie sadze 😉
Super 😉 to muszę sobie to nagiąć nie co pod siebie i zostawić resztę jak była items przywrócę a w mapie nie wyświetlę i po problemie.
Jeszcze zostanie powalczyć z sterowaniem w roletach bo mam zamiar dodać krańcówkę na wał żeby podawała impulsy co krawędź wału czyli około 5 impulsów na otwarcie/zamknięcie i na tej podstawie zrobić uchylanie i info gdzie jest roleta
@szpila86 nie no moższ usunąć ten item OswDzienLicznikSekund tylko usuń też cały kod z reguły, gdzie jest wystąpienie OswDzienLicznikSekund