Rules + setLabel + ...
 
Powiadomienia
Wyczyść wszystko

openHAB [Rozwiązany] Rules + setLabel + pętla

szpila86
(@szpila86)
Brygadzista

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ć?

Autor tematu Dodane : 24/10/2021 5:55 pm
adrian
(@adrian)
Prezes Zasłużony dla Forum, Patron Strony

w którym OH UI to wyświetlasz?

Dodane : 25/10/2021 10:17 am
szpila86
(@szpila86)
Brygadzista

@adrian OH3 

Autor tematu Dodane : 25/10/2021 10:28 am
adrian
(@adrian)
Prezes Zasłużony dla Forum, Patron Strony

@szpila86 

?

Dodane : 25/10/2021 10:40 am
szpila86
(@szpila86)
Brygadzista

@adrian

Autor tematu Dodane : 25/10/2021 12:49 pm
adrian
(@adrian)
Prezes Zasłużony dla Forum, Patron Strony

ok, dam znać wieczorem - mam coś podobnego zrobione dla bramy wjazdowej - pokazuje ile czasu zostało do automatycznego zamknięcia bramy

Dodane : 25/10/2021 1:56 pm
adrian
(@adrian)
Prezes Zasłużony dla Forum, Patron Strony

@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

Dodane : 25/10/2021 8:56 pm
szpila86
(@szpila86)
Brygadzista

@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?

Autor tematu Dodane : 25/10/2021 9:08 pm
adrian
(@adrian)
Prezes Zasłużony dla Forum, Patron Strony

@szpila86 daj mi chwilę - spróbuje przerobić Twój kod.

A na Twoje pytanie o regułach odpowiem screenshot'em

image
Dodane : 25/10/2021 9:11 pm
szpila86
(@szpila86)
Brygadzista

@adrian 

Heheh czyli jak mam niewiele mniej to nie zrobię krzywdy OH 😀

Spokojnie idę do dzieci więc dziś nic nie zrobię

Autor tematu Dodane : 25/10/2021 9:15 pm
adrian
(@adrian)
Prezes Zasłużony dla Forum, Patron Strony

items

Switch OswDzien "Dzienny"
Number OswDzienLicznikSekund "Dzienny [%d sek]" <time>
Number OswDzienLicznikMinut  "Dzienny [%d min]" <time>
 
rules
 
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
 
sitemap
 
  Default item=OswDzien
  Default item=OswDzienLicznikSekund visibility=[OswDzien==ON]
  Default item=OswDzienLicznikMinut visibility=[OswDzien==ON]
Dodane : 25/10/2021 10:59 pm
szpila86
(@szpila86)
Brygadzista

@adrian 

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
Autor tematu Dodane : 26/10/2021 6:26 am
adrian
(@adrian)
Prezes Zasłużony dla Forum, Patron Strony

Co do błędu Item’y dodałeś jak u góry ?

Dodane : 26/10/2021 9:02 am
szpila86
(@szpila86)
Brygadzista

@adrian 

Nie dałem tylko wyświetlania sekund w itemach i mapie reszta bez zmian. 

Spróbuje restartu

Autor tematu Dodane : 26/10/2021 9:38 am
adrian
(@adrian)
Prezes Zasłużony dla Forum, Patron Strony

@szpila86 no ale właśnie błąd masz ze nie ma item od sekund 

Dodane : 26/10/2021 10:28 am
szpila86
(@szpila86)
Brygadzista

@adrian 

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

Autor tematu Dodane : 26/10/2021 10:37 am
adrian
(@adrian)
Prezes Zasłużony dla Forum, Patron Strony

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 😉

 

 

Dodane : 26/10/2021 11:28 am
szpila86
(@szpila86)
Brygadzista

@adrian 

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 

Autor tematu Dodane : 26/10/2021 11:44 am
adrian
(@adrian)
Prezes Zasłużony dla Forum, Patron Strony

@szpila86 nie no moższ usunąć ten item OswDzienLicznikSekund tylko usuń też cały kod z reguły, gdzie jest wystąpienie OswDzienLicznikSekund

Dodane : 26/10/2021 7:53 pm
szpila86
(@szpila86)
Brygadzista

@adrian 

Rozumiem ale w tej postaci mam jedną regułę do kilku rzeczy a wyświetlam co potrzebuję 😀

Autor tematu Dodane : 26/10/2021 8:23 pm
adrian polubień
Udostępnij: