Wykonanie reguły OH...
 
Powiadomienia
Wyczyść wszystko

Wykonanie reguły OH nie zmienia stanu item.

8 Wpisów
3 Użytkownicy
2 Likes
219 Wyświetleń
(@adamadamowski)
Wpisów: 37
Kontrybutor
Autor tematu
 

Witam.

Zrobiłem proste urządzenie do sterowania jasnością 2 kanałowej lampy LED przy pomocy PWM z ESP8266.

Items i things mam napisane w plikach. PWM jest sterowany z reguły w OH i to działa idealnie tak jak chciałem. Problem jest w tym że przy zmianie wartości PWM przy pomocy reguły nie zmienia się położenie suwaka item w OH, proszę pomóżcie bo nie wiem co jest źle. Ten PWM konfigurowałem w plikach na wzór switcha który robiłem wcześniej i działa bez zarzutu. Poniżej wrzucam pliki z OH.

things:

 Thing topic aqacomp "Akwarium"
        {
                Channels:
                        Type dimmer : Left_White        "Lewe Białe"            [stateTopic="stat/aqacomp/channel1", commandTopic="cmnd/aqacomp/channel1", min=0, max=100, on="ON", off="OFF"]
                        Type dimmer : Left_Colour       "Lewe Kolorowe"         [stateTopic="stat/aqacomp/channel2", commandTopic="cmnd/aqacomp/channel2", min=0, max=100, on="ON", off="OFF"]
        }

items:

Dimmer  Left_White      "Akwarium Lewe Białe"   <light> {channel="mqtt:topic:broker:aqacomp:Left_White"}
Dimmer  Left_Colour     "Akwarium Lewe Kolorowe" <light> {channel="mqtt:topic:broker:aqacomp:Left_Colour"}

rules:

rule "LEFT_UP"

when
        Time cron "0 00 12 * * ?"

then
        val mqttActions = getActions("mqtt","mqtt:broker:broker")

//BIAŁE:
        mqttActions.publishMQTT("cmnd/aqacomp/channel1","2")
        Thread::sleep(138000)
        mqttActions.publishMQTT("cmnd/aqacomp/channel1","4")
        Thread::sleep(138000)
        mqttActions.publishMQTT("cmnd/aqacomp/channel1","18")
        Thread::sleep(138000)
        mqttActions.publishMQTT("cmnd/aqacomp/channel1","36")
        Thread::sleep(138000)
        mqttActions.publishMQTT("cmnd/aqacomp/channel1","54")
        Thread::sleep(138000)
        mqttActions.publishMQTT("cmnd/aqacomp/channel1","72")
        Thread::sleep(138000)
        mqttActions.publishMQTT("cmnd/aqacomp/channel1","100")
        Thread::sleep(138000)

//KOLOR:
        mqttActions.publishMQTT("cmnd/aqacomp/channel2","2")
        Thread::sleep(138000)
        mqttActions.publishMQTT("cmnd/aqacomp/channel2","4")
        Thread::sleep(138000)
        mqttActions.publishMQTT("cmnd/aqacomp/channel2","18")
        Thread::sleep(138000)
        mqttActions.publishMQTT("cmnd/aqacomp/channel2","36")
        Thread::sleep(138000)
        mqttActions.publishMQTT("cmnd/aqacomp/channel2","54")
        Thread::sleep(138000)
        mqttActions.publishMQTT("cmnd/aqacomp/channel2","72")
        Thread::sleep(138000)
        mqttActions.publishMQTT("cmnd/aqacomp/channel2","100")

end


rule "LEFT_DOWN"

when
        Time cron "0 30 21 * * ?"

then
        val mqttActions = getActions("mqtt","mqtt:broker:broker")

//BIAŁE:
        mqttActions.publishMQTT("cmnd/aqacomp/channel1","72")
        Thread::sleep(138000)
        mqttActions.publishMQTT("cmnd/aqacomp/channel1","54")
        Thread::sleep(138000)
        mqttActions.publishMQTT("cmnd/aqacomp/channel1","36")
        Thread::sleep(138000)
        mqttActions.publishMQTT("cmnd/aqacomp/channel1","18")
        Thread::sleep(138000)
        mqttActions.publishMQTT("cmnd/aqacomp/channel1","4")
        Thread::sleep(138000)
        mqttActions.publishMQTT("cmnd/aqacomp/channel1","2")
        Thread::sleep(138000)
        mqttActions.publishMQTT("cmnd/aqacomp/channel1","1")
        Thread::sleep(5000)


//KOLOR:
        mqttActions.publishMQTT("cmnd/aqacomp/channel2","72")
        Thread::sleep(138000)
        mqttActions.publishMQTT("cmnd/aqacomp/channel2","54")
        Thread::sleep(138000)
        mqttActions.publishMQTT("cmnd/aqacomp/channel2","36")
        Thread::sleep(138000)
        mqttActions.publishMQTT("cmnd/aqacomp/channel2","18")
        Thread::sleep(138000)
        mqttActions.publishMQTT("cmnd/aqacomp/channel2","4")
        Thread::sleep(138000)
        mqttActions.publishMQTT("cmnd/aqacomp/channel2","2")
        Thread::sleep(138000)
        mqttActions.publishMQTT("cmnd/aqacomp/channel2","1")

end
 
Dodane : 27/12/2023 1:42 pm
adrian
(@adrian)
Wpisów: 3982
Szefu Admin Zasłużony dla Forum, Patron Strony
 

@adamadamowski

tak na czuja to wpisałbym na końcu tej serii wysłanych MQTT dla Białej

Left_White.postUpdate(100)

po tej drugiej serii dla Kolor

Left_Colour.postUpdate(100)

W drugiej regule analogicznie

....
Left_White.postUpdate(1)
.....
Left_Colour.postUpdate(1)
 
Dodane : 27/12/2023 4:31 pm
(@adamadamowski)
Wpisów: 37
Kontrybutor
Autor tematu
 

Może jeszcze jedna rzecz którą zauważyłem, kiedy zmieniam wartość item suwakiem w OH to zmienia się wartość w aplikacji na smartfonie i w drugą stronę również działa poza tym ESP publikuje te wartości w temacie cmnd/aqacomp/CHANNEL1

 
Dodane : 27/12/2023 6:03 pm
(@ldywicki)
Wpisów: 78
Kontrybutor
 

@adamadamowski OH rozróżnia dwie rzeczy - stan i komendę. Także ma to niebagatelne znaczenie jeśli idzie o pisanie reguł. W momencie w którym reguła wchodzi w interakcję z itemem poprzez `postUpdate` zmienia ona stan itemu, ale sam sygnał nie zostanie przekazany do kanału (a przynajmniej nie powinien). Aby sprowokować interakcję z urządzeniem należy korzystać z metody `sendCommand`, która powinna spowodować wysłanie polecenia. Dlatego też binding MQTT rozróżnia state topic i command topic, ponieważ w inny sposób nie można określić czy OH otrzymuje informację o zmianie stanu czy też ktoś wysłał żądanie wykonania takowej zmiany.

 
Dodane : 27/12/2023 8:29 pm
adrian
(@adrian)
Wpisów: 3982
Szefu Admin Zasłużony dla Forum, Patron Strony
 

tylko tutaj jak czytam problem, reguła zmienia wartości w urządzeniu poprzez wysłanie tych MQTT z opóźnieniem (zakładam, że jakiś wizualny efekt) - i działa, a w samym OH wartość jest nieruszona (no bo jak, jak idą same MQTT) dlatego zasugerowałem postUpdate żeby aktualizować tylko stan w OH po wysłaniu tych wszystkich MQTT w sekwencji.

 
Dodane : 27/12/2023 9:03 pm
ldywicki reacted
(@adamadamowski)
Wpisów: 37
Kontrybutor
Autor tematu
 
Left_White.postUpdate(...)

Działa doskonale. Serdecznie dziękuję.

 

 
Dodane : 27/12/2023 10:15 pm
adrian reacted
(@ldywicki)
Wpisów: 78
Kontrybutor
 

Ok, dla części itemów/kanałów można ustawić autoupdate (metadane na poziomie itemu), który zrobi to na poziomie "core". Powoduje to, że OH automatycznie zakłada że wysłane komendy powinny być docelowymi stanami itemów, bez czekania na odpowiedź bindingu/urządzenia.

 
Dodane : 27/12/2023 10:52 pm
(@adamadamowski)
Wpisów: 37
Kontrybutor
Autor tematu
 

Wrócę jeszcze do tematu.

Na tą chwilę zdecydowałem się na sendCommad i jedna linijka kodu zastępuje dwie, bardzo mi to pasuje i mam akualizację stanu a appce.

Moja tasmota obsługuje dodatkowo kolory. w konsoli wpisuję np.

color 00500000

i na kanale drugim mam jasność odpowiadającą wartości 50 w hex a jak wysłać taką komendę przy pomocy sendCommand z reguły OH.

Próbowałem wiele różnych wersji których już nie jestem nawet w stanie powtórzyć.

Proszę podpowiedzcie coś.

 
Dodane : 31/12/2023 12:09 am
Udostępnij: