Sterowanie klimatyzacją przez MQTT – Avatto S08 i Tasmota

Sezon letni co prawda jeszcze daleko, ale po pierwsze lepiej się do niego przygotować z wyprzedzeniem, a po drugie klimatyzatory nie tylko chłodzą, ale też grzeją. W tym wypadku tak naprawdę bardziej chodzi o grzanie i wykorzystanie nadwyżki energii z fotowoltaiki z przewymiarowanej instalacji. Oczywiście nie u mnie, bo ja jestem pod kreską na razie.

Avatto S08

Znamy więc cel – skrypty „inteligentnego domu”, działające na Raspberry Pi, mają sterować klimatyzatorem Mitsubishi Electric z serii MSZ, bez modułu „internetowego”. Najlepiej gdyby odbywało się to w pełni lokalnie, żeby uniezależnić się od usług chmurowych. Dodatkowo dobrze byłoby wykorzystać protokołu MQTT, żeby zachować standard, łatwość integracji i wysoką dostępność.

W swoim domu, do sterowania urządzeniami w salonie, włączając w to klimatyzację Fujitsu, używam Broadlinka RM3 mini, który sprawdza się świetnie, ale jest już przestarzałym modelem. Oczywiście nie ma żadnego powodu, dla którego nowe urządzenie miałoby się ograniczać do sterowania klimatyzatorem. Na pewno bez problemu obsłużymy projektor, telewizor czy kino domowe. W tym wpisie jednak skupiamy się na klimatyzacji, bo to konkretne zadanie, które mamy do wykonania.

Avatto S08

Tym razem wybrałem jednak jeszcze tańsze urządzenie. Prawdę mówiąc najtańsze dostępne w tamtym czasie – Avatto S08. To co mnie przekonało do tego wyboru, to budowa urządzenia. Jest to po prostu, nieco upraszczając, układ ESP8266 (TYWE3S), z diodami świecącymi w podczerwieni, odbiornikiem Ir i kilkoma innymi elementami. Obecność układu ESP8266 podpowiada od razu, że komunikacja będzie się odbywać przez WiFi.

Avatto S08 od środka – układ TYWE3S

Avatto S08 jest zgodne z ekosystemem Tuya SmartLife, ale jak już pisałem, użycie chmury zupełnie mnie nie interesuje. Zamiast tego postanowiłem użyć Tasmoty. Oczywiście rozwiązaniem byłoby też napisanie własnego oprogramowania, albo wręcz zbudowanie urządzenia w oparciu o moduł ESP od podstaw, co też nie jest trudne. Przy tej cenie warto jednak wybrać gotowe rozwiązanie.

Tasmota

Jest to projekt, który dostarcza alternatywne oprogramowanie dla urządzeń zbudowanych na bazie układu ESP8266. Jakich? Przeróżnych „smart” przełączników, „żarówek”, listew zasilających, sterowników do rolet, czy choćby naszych własnych. Wachlarz jest naprawdę duży.

Tasmoty używamy więc wtedy, kiedy nie do końca podoba nam się funkcjonalność i sposób łączenia lub automatyzacji zapewniony przez producenta urządzenia. Żegnamy się z oryginalnym oprogramowaniem i wgrywamy nowe. Od tego momentu nie możemy już liczyć na jakiekolwiek wsparcie producenta czy dostarczanych przez niego aplikacji i musimy sobie radzić sami.

Gdy już jesteśmy przy Tasmocie, warto od razu pobrać właściwy plik binarny ze strony z dystrybucjami. Ja wybrałem tasmota-ir.bin. Będzie on później potrzebny.

Wgrywanie alternatywnego oprogramowania

Oczywiście Tasmota nie jest jedynym możliwym wyborem, a podobnych projektów jest przynajmniej kilka. W opisany tutaj sposób jesteśmy w stanie wgrać praktycznie dowolne oprogramowanie. Trzeba tylko posiadać właściwy plik bin z wsadem. Ten jednak zdążyliśmy już pobrać.

Pierwszą czynnością przy próbie wymiany oprogramowania jest zwykle skorzystanie z pomocy Tuya-convert. Jest to program, który próbuje zmienić zawartość pamięci urządzenia przez wi-fi. Tzw. aktualizacja OTA (over-the-air) to całkiem popularna funkcja w świecie ESP8266. Niestety producentom urządzeń nie bardzo zależy na tym, żeby użytkownicy korzystali z innego oprogramowania, więc zazwyczaj blokują taką możliwość. Tuya-convert opiera się więc o luki w bezpieczeństwie, które są regularnie łatane. Z tego też powodu podstawowym zaleceniem jest, żeby przed operacją nie łączyć nowej zabawki z chmurą, aby nie zaktualizowała firmware. Gdy już to się stanie, szanse na użycie konwertera znacząco spadają. I zapewne z tego powodu w moim przypadku nie udało się przeprowadzić tej operacji.

Nic jednak straconego, bo jest jeszcze drugi sposób. Gdy mamy fizyczny dostęp do układu ESP8266, zawsze jesteśmy w stanie wgrać do niego oprogramowanie. Czasem tylko wymaga to mniej lub więcej zachodu. W przypadku Avatto wszystkie piny, które są używane do „flashowania” są ładnie wyprowadzone, co ułatwia sprawę.

Wyprowadzenia do programowania ESP8266

Aby przeprowadzić operację, potrzebny będzie konwerter portu szeregowego na TTL. Bardzo ważne jest, żeby obsługiwał napięcie 3,3V, bo z takim pracuje ESP8266 i nie toleruje 5V. Mój adapter ma zworkę, którą wybieram właściwe napięcie.

Konewrter USB-ttl i układ ESP-01

Płytka niestety wymaga albo przygotowania odpowiedniego styku na docisk, albo po prostu dolutowania przewodów na czas programowania. Ja wybrałem tę drugą opcję, ponieważ to operacja jednorazowa. Gdybym miał zaprogramować dużo urządzeń, to pewnie podszedłbym do tego inaczej.

Potrzebujemy więc 3V3, GND, I00, RX i TX. I00, czyli GPIO0 należy zewrzeć z masą przy podaniu napięcia, żeby wprowadzić ESP8266 w tryb programowania. Cały proces opisywałem już zresztą kilka late temu na przykładzie wpisu o ESP-01.

Po podłączeniu wyżej wymienionych wejść do konwertera, w pierwszej kolejności należy uruchomić proces czyszczenia pamięci:

$ sudo python3 ./esptool.py --port /dev/ttyUSB0 erase_flash
esptool.py v2.0-beta1
./esptool.py:2023: DeprecationWarning: inspect.getargspec() is deprecated since Python 3.0, use inspect.signature() or inspect.getfullargspec()
operation_args,,,_ = inspect.getargspec(operation_func)
Connecting….
Detecting chip type… ESP8266
Uploading stub…
Running stub…
Stub running…
Erasing flash (this may take a while)…
Chip erase completed successfully in 2.9s
Hard resetting…

Jak widać cała operacja przebiegła poprawnie i szybko. Można więc przejść do właściwego programowania:

$ sudo python3 ./esptool.py --port /dev/ttyUSB0 write_flash 0x000000 tasmota-ir.bin
esptool.py v2.0-beta1
./esptool.py:2023: DeprecationWarning: inspect.getargspec() is deprecated since Python 3.0, use inspect.signature() or inspect.getfullargspec()
operation_args,,,_ = inspect.getargspec(operation_func)
Connecting….
Detecting chip type… ESP8266
Uploading stub…
Running stub…
Stub running…
Attaching SPI flash…
Configuring flash size…
Auto-detected Flash size: 2MB
Flash params set to 0x0030
Compressed 589920 bytes to 407381…
Wrote 589920 bytes (407381 compressed) at 0x00000000 in 36.2 seconds (effective 130.3 kbit/s)…
Hash of data verified.

Układ został zaprogramowany. Można więc go odłączyć od konwertera i podłączyć normalnie do zasilania.

Konfiguracja Tasmoty

Po uruchomieniu urządzenia, powinno ono udostępnić sieć WiFi z nazwą zaczynającą się od „Tasmota”. Łączymy się z nią i przeglądarce www wpisujemy adres „http://192.168.4.1„. Powinniśmy mieć możliwość ustawienia naszej domowej sieci, a nawet sieci zapasowej, jeżeli jest taka potrzeba. Możemy też od razu nadać urządzeniu jakąś przyjazną nazwę hosta, jak choćby ir1.

Po zapisaniu konfiguracji, urządzenie powinno się zrestartować i próbować połączyć z ustawioną siecią bezprzewodową. Ponieważ adres zostanie nadany z użyciem protokołu DHCP przez router, należy odnaleźć jego adres IP. Następnie możemy się ponownie połączyć z interfejsem konfiguracyjnym.

Najważniejsze jest dla nas ustawienie, na którym wyjściu mamy nasz nadajnik IR (GPIO14) oraz gdzie znajduje się odbiornik (GPIO5). Statusowa dioda led, czy przycisk są już zdecydowanie mniej ważne.

Ponieważ założeniem było, że chcemy komunikować się przez MQTT, pozostała do skonfigurowania jeszcze jedna zakładka. Należy podać adres i port brokera oraz dane logowania, pamiętając też o unikalności identyfikatora klienta. Zależnie od używanego przez nas schematu nazewnictwa kanałów/tematów, musimy też ustawić właściwe, np. dom/ir1. Po kolejnym restarcie urządzenie powinno połączyć się z serwerem MQTT. Jeżeli to nastąpiło, to główną konfigurację możemy uznać za zakończoną, choć warto jeszcze ustawić hasło do interfejsu web Tasmoty.

Sterowanie klimatyzatorem przez MQTT

Dla sprawdzenia, co nasze urządzenie wysyła przez MQTT, najlepiej połączyć się klientem z naszego komputera czy też Raspberry Pi. Załóżmy, że chcemy nasłuchiwać wszystkich komunikatów z kanałów zawierających ir1 w ciągu. Jeżeli mamy zainstalowane narzędzie klienckie Mosquitto, możemy to zrobić poniższą komendą:

$ mosquitto_sub -h 192.168.1.2 -v -t "+/ir1/+"

Od razu powinniśmy dostać informacje, że urządzenie zgłosiło się online, a po pewnym czasie także cykliczny komunikat ze statusem:

dom/ir1/LWT Online
dom/ir1/STATE {"Time":"2021-01-24T11:46:28","Uptime":"0T22:10:11","UptimeSec":79811,"Vcc":3.439,"Heap":26,"SleepMode":"Dynamic","Sleep":50,"LoadAvg":19,"MqttCount":1,"Wifi":{"AP":1,"SSId":"MojDom","BSSId":"76:4C:27:83:41:3C","Channel":1,"RSSI":78,"Signal":-61,"LinkCount":1,"Downtime":"0T00:00:05"}}

Skierujmy teraz pilota klimatyzacji na nasz odbiornik i naciśnijmy przycisk włączania. Powinniśmy otrzymać przez MQTT informacje o odebranym kodzie:

dom/ir1/RESULT {"IrReceived":{"Protocol":"MITSUBISHI_AC","Bits":144,"Data":"0x23CB260100200809304A00000000000000C0","Repeat":0,"IRHVAC":{"Vendor":"MITSUBISHI_AC","Model":-1,"Mode":"Heat","Power":"On","Celsius":"On","Temp":25,"FanSpeed":"Medium","SwingV":"Highest","SwingH":"Middle","Quiet":"Off","Turbo":"Off","Econo":"Off","Light":"Off","Filter":"Off","Clean":"Off","Beep":"Off","Sleep":-1}}}

Jaki widać kod został poprawnie rozpoznany, łącznie z producentem urządzenia klimatyzacyjnego. Warto wiedzieć, że większość systemów klimatyzacji za każdym razem, gdy pilot wysyła jakąkolwiek komendę do klimatyzatora, to przekazuje też całą konfigurację. Mimo więc, że jest to tylko sygnał włączenia, to od razu wiemy, że urządzenie uruchomi się w trybie grzania, z ustawioną temperaturą 25 stopni Celsjusza i średnim nawiewem.

Oczywiste też powinno być, że skoro jesteśmy w stanie odczytywać kody różnych nadajników, to możemy też sterować dowolnymi funkcjami inteligentnego domu z użyciem choćby pilota od telewizora. Może to być przydatne w innych scenariuszach.

Spróbujmy jednak włączyć klimatyzator publikując odpowiedni komunikat:

$ mosquitto_pub -h 192.168.2.2 -t "dom/ir1/cmnd/IRhvac" -m '{"Vendor":"MITSUBISHI_AC","Model":-1,"Mode":"Heat","Power":"On","Celsius":"On","Temp":24,"FanSpeed":"Low","SwingV":"Highest","SwingH":"Middle","Quiet":"Off","Turbo":"Off","Econo":"Off","Light":"Off","Filter":"Off","Clean":"Off","Beep":"Off","Sleep":-1}'

W tym momencie powinniśmy usłyszeć krótkie piknięcie klimatyzatora, po którym nastąpi rozruch i nagrzewanie pomieszczenie do 24 stopni, przy niskim poziomie obrotów wentylatora. Dodatkowo na kanale dom/ir1/RESULT pojawi się potwierdzenie odebrania polecenia.

Możliwe scenariusze

Skoro mamy komendę, która robi to co chcemy, możemy więc bez problemu sterować klimatyzatorem z poziomu skryptów shell. Oczywiście, gdy zależy nam na bardziej złożonych automatyzacjach, dużo lepszym wyborem będzie wykorzystanie systemu, który używamy do automatyki domowej. Można sobie wtedy wyobrazić bardzo dużo różnych zastosowań.

Możemy wyłączać chłodzenie lub grzanie w momencie gdy ktoś otworzy okno. Albo, gdy w pomieszczeniu nie ma nikogo. Mając informacje z instalacji fotowoltaicznej, możemy chłodzić pomieszczenia, tylko gdy mamy nadprodukcję prądu, zwiększając poziom autokonsumpcji (niektórym osobom na tym bardzo zależy). Inną opcją jest wyłączenie ogrzewania gazowego na jakiś czas lub zakręcenie inteligentnych głowic grzejnikowych w wybranym połączeniu i włączenie ogrzewania klimatyzacją, gdy na zewnątrz temperatura jest sprzyjająca dobremu współczynnikowi COP.

Na pewno bardzo przydatną opcją jest też uruchamianie chłodzenia latem, gdy wracamy do domu. Szczególnie po dłuższej nieobecności. Wtedy wchodzimy do schłodzonego pomieszczenia, unikając jednocześnie silnego nawiewu zimnego powietrza.

Możliwych scenariuszy jest bardzo wiele. Wszystko zależy od naszej fantazji, a przede wszystkim potrzeb.

Podsumowanie

W obecnych czasach, właściwie każdy klimatyzator może zostać wyposażony w moduł internetowy i umożliwia zdalne sterowanie z użyciem dedykowanej aplikacji. Po pierwsze jednak, nie zawsze zamknięte rozwiązania łatwo integrują się z naszymi systemami automatyki. Po drugie, niektórzy producenci bardzo wysoko wyceniają takie moduły, podczas gdy, jak widać na przykładzie Avatto S08, mamy na rynku tanie, uniwersalne alternatywy. Nie mówiąc już o tym, że dzięki Avatto możemy sterować także innymi urządzeniami.

Ten wpis został opublikowany w kategorii Inteligentny Dom i oznaczony tagami , , , , , , , . Dodaj zakładkę do bezpośredniego odnośnika.

2 odpowiedzi na Sterowanie klimatyzacją przez MQTT – Avatto S08 i Tasmota

  1. Przemek pisze:

    Bardzo ciekawy artykuł. Nie wiedziałem o tym urządzeniu.

    PS. Sam używam Home Assistant i przydatnym byłoby dodać gniazdko z pomiarem mocy lub jakieś Shelly z pomiarem mocy, po to żeby zwracać stan urządzenia do Home Assistanta i wiedzieć czy urządzenie jest włączone a przy okazji liczyć ile energii zużywa.

  2. Pawel pisze:

    Czesc,
    Czy kiedy zrobie wg twojej instrukcji bede mogł wydawac komendy tylko za pomocą skryptów ?
    Chce osiągnąc cos takiego w HA : Czujnik temperatury/wigotnosci sparowany juz z HA wykrywa jaka wartosc, wtedy na klimie ktorej zaadoptowałem twoje rozwiazanie załacza sie lub wyłacza klima. Czy da rade zrobic automatyzacje z poziomu node reda ?

    Dzieki

Skomentuj Przemek Anuluj pisanie odpowiedzi

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *