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
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)
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
@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.
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.
Left_White.postUpdate(...)
Działa doskonale. Serdecznie dziękuję.
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.
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ś.