Project Things od Mozilla. Implementacja standardu WoT dla inteligentnego domu

Jednym z najgorętszych tematów ostatnich lat w świecie IT, poza blockchainem i sztuczną inteligencją, jest zdecydowanie Internet Rzeczy, czyli IoT (Internet of Things). W tym artykule opiszę pokrótce propozycję standardowego protokołu komunikacji i definicji urządzeń IoT stworzonego przez W3C i proponowaną implementację tego standardu stworzoną przez Mozilla Foundation.


Grzegorz Hołdys. Software Developer w Sii PolskaProgramista-majsterkowicz. Za dnia koduje w Javie dla wielkich korporacji, po godzinach buduje mniej lub bardziej przydatne elektroniczne gadżety i udziela się w projektach Open Source. Jak nie siedzi przy biurku to jeździ rowerem albo fotografuje.


Szybki rozwój rynku IoT spowodował sporą fragmentację technologii, jako że każdy producent tworzył własne protokoły komunikacyjne i rozwiązania. Fragmentacja ta utrudniała dalszy rozwój, stąd dość szybko pojawiły się inicjatywy standaryzacji protokołów komunikacji między urządzeniami IoT. Jeden z tych standardów został zaproponowany przez W3C (World Wide Web Consortium) i nosi nazwę Web of Things (WoT). Standard ten jest nadal w trakcie opracowywania, ale znane już są podstawowe założenia. Istnieją też propozycje specyfikacji API.

WoT nie tworzy nowych protokołów czy technologii, a jedynie zbiera istniejące już rozwiązania w spójną całość. I tak każda Rzecz (Thing) wchodząca w skład WoT powinna wystawiać po HTTP RESTowe API, które umożliwia wywoływanie funkcji owej Rzeczy, a także zbieranie z niej danych. Językiem wymiany danych jest oczywiście JSON. Podstawowa komunikacja z urządzeniem powinna odbywać się według klasycznego wzorca zapytanie-odpowiedź (request-response), ale można też wykorzystywać mechanizm subskrypcji poprzez WebSockets.

Pojęcie Rzeczy jest dość elastyczne – może być to cokolwiek czym można jakoś sterować poprzez ustawianie właściwości lub wywoływanie akcji i co udostępnia jakieś informacje o swoim stanie. I tu na scenę wchodzi Mozilla Foundation ze swoim projektem – Project Things. Projekt ten to próba stworzenia implementacji standardu WoT ze szczególnym naciskiem na obszar inteligentnych domów. W jego skład wchodzą trzy części:

  • Things Gateway: Bramka do WoT pozwalająca zarządzać Rzeczami w lokalnej sieci i udostępniająca je przez internet,
  • Things Cloud: Kolekcja usług IoT w chmurze,
  • Things Framework: Zbiór bibliotek, dzięki którym można podłączyć Rzecz do sieci WoT, czyli stworzyć dla niej webowe API zgodne z Web Things API.

Sercem rozwiązania Mozilli jest Bramka (Gateway). Od strony oprogramowania ma ona postać serwera NodeJS ze specjalną aplikacją webową, ale zamiast instalować ten serwer na zwykłym komputerze, Mozilla proponuje wykorzystanie Raspbery Pi. Na stronie projektu dostępny jest obraz specjalnej wersji Raspbiana z oprogramowaniem Bramki. Wystarczy pobrać ten obraz, zapisać go na karcie microSD i uruchomić „Malinkę”. Oficjalnie, wymagana jest wersja trzecia RPi, ale możliwe jest uruchomienie Bramki na starszych wersjach, a także na Raspberry Pi Zero. Podczas pierwszego uruchomienia niezbędna będzie konfiguracja, dzięki której nasza Bramka będzie dostępna nie tylko w sieci lokalnej, ale także globalnie w domenie mozilla-iot.org (poprzez tunel SSL). Dla każdej Bramki można zdefiniować nazwę subdomeny, pod którą będzie publicznie widoczna. Dzięki temu nawet jeśli nie mamy publicznego adresu IP, nasza Bramka będzie dostępna przez internet. Oczywiście dostęp do niej będzie chroniony hasłem.

Po zalogowaniu, wejdziemy do aplikacji webowej pozwalającej na zarządzanie podłączonymi do naszej Bramki urządzeniami. Interfejs jest prosty, przejrzysty i nieźle działa na smartfonach. Pozwala przeglądać podłączone Rzeczy, sterować nimi, wyszukiwać nowe Rzeczy w sieci lokalnej, a także projektować proste automaty sterujące podłączonymi urządzeniami. Można też stworzyć schemat własnego mieszkania i porozmieszczać na nim ikony różnych Rzeczy podłączonych do Bramki. Wszystko wizualnie.

Można też instalować wtyczki (Add-on), które umożliwiają dodawanie urządzeń niezgodnych ze standardem Web Things API. Np. dzięki takiej wtyczce możemy sterować przez Bramkę urządzeniem podłączonym do naszego RPi przez GPIO. Wtyczki można pisać w JavaScripcie, Pythonie i Rust przy czym najwięcej przykładów powstało w tym pierwszym. Things Framework, czyli biblioteka ułatwiająca pisanie serwerów wystawiających do sieci pojedyncze Rzeczy, dostępna jest w pięciu wersjach językowych. Mamy zatem JavaScript, Pythona, Rusta, Javę i Arduino (czyli C++).

Do niedawna wersja na Arduino działała właściwie tylko na urządzeniach ESP8266, ale obecnie wspiera także ESP32 oraz urządzenia kompatybilne z biblioteką WiFi101. Na GitHubie dostępnych jest sporo przykładów zarówno wtyczek, jak i API dla konkretnych urządzeń. Projekt jest obecnie w wersji 0.7 i jest już całkiem dojrzały. Posiada nawet wsparcie dla kamer IP (choć eksperymentalne) i inteligentnego asystenta, któremu można wydawać komendy językiem (jakby) naturalnym.

W tym miejscu warto zaznaczyć, że Things Gateway jest dedykowane dla inteligentnego domu. Jednak już Things Framework (a także samo Web of Things) nie ogranicza się do zastosowań domowych i może być wykorzystywany jako uniwersalny mechanizm wystawiania RESTowego API dla dowolnego urządzenia nawet niekoniecznie podłączonego do internetu. Możliwości jest wiele.

Postanowiłem zastosować Mozilla IoT do projektu kompletnie niezwiązanego z domem. Pracuję obecnie nad „sliderem” do „timelapsów” (aluminiowa szyna, po której silnik krokowy powoli przesuwa aparat i co parę sekund pstryka zdjęcie). Chciałem mieć możliwość konfiguracji urządzenia ze smartfona przez WiFi, więc oparłem mój „slider” o mikrokontroler z modułem WiFi z możliwością wystawiania własnego punktu dostępowego (padło na Adafruit Feather M0 z ATWINC1500, ale jakiś ESP też by mógł być). Do firmware-u urządzenia dodałem standardową bibliotekę Arduino WiFi101, do tego dorzuciłem webthing-arduino z projektu Mozilla IoT, zdefiniowałem w kodzie punkt dostępowy i swoją Rzecz i voilà – mogłem ustawiać parametry pracy „slidera” ze smartfona (trzeba było jeszcze napisać aplikację na smartfona, ale to w końcu tylko kilka suwaków i klient REST więc da się szybko ogarnąć). Jako że API urządzenia jest RESTowe to można je wywoływać z ogólnodostępnych narzędzi takich jak Postman, a w prostych przypadkach nawet z przeglądarki. Pozwala to zupełnie oddzielić proces tworzenia urządzenia od procesu tworzenia klienta, a także zautomatyzować testy integracyjne. Bardzo wygodna rzecz.

Mój projekt wykorzystuje tylko bibliotekę z Things Framework (webthing-arduino). Nie podłączam „slidera” do Bramki, gdyż niewiele by mi to dało. Jakbym jednak bardzo uparł się, by wykorzystać Bramkę to miałbym dwa wyjścia:

1. Postawić Bramkę na Raspberry Pi 3 i zmodyfikować kod „slidera” tak, aby zamiast wystawiać własny punkt dostępowy łączył się z punktem wystawionym przez „Malinkę”. Bramka nie musiałaby być częścią urządzenia, ale musiałaby być w zasięgu WiFi.

2. Wbudować Raspberry Pi z Bramką w urządzenie. W tym podejściu nie byłoby komunikacji między Rzeczą, a Bramką po WiFi. Zamiast tego trzeba by stworzyć wtyczkę do Bramki, która definiowałaby „slider” jako Rzecz i komunikowała się z mikrokontrolerem poprzez jakiś niskopoziomowy protokół komunikacji (pewnie SPI albo I2C). Mikrokontroler byłby nadal potrzebny do sterowania silnikiem krokowym i robienia zdjęć, ale zniknęłaby potrzeba tworzenia dedykowanego klienta na smartfona. UI Bramki by w pełni wystarczył do ustawienia parametrów pracy „slidera”.

Tworzenie wtyczek jest dość proste – wystarczy znać trochę Node.js wraz z bibliotekami do SPI/I2C i wzorować się na którymś z przykładów dostępnych na profilu Mozilla IoT na GitHub. A przykłady są różne, bo można tu znaleźć wtyczki do sterowania żarówkami Philips Hue albo gniazdkami TP Link Smart Plug. Są też wtyczki pozwalające na komunikację z urządzeniami działającymi poprzez Zigbee czy inne protokoły radiowe. Projekt się dynamicznie rozwija więc przykładowych wtyczek powinno szybko przybywać.

Jeśli interesuje Was temat IoT albo chcecie uzyskać możliwość kontroli przez internet własnego urządzenia, to Project Things może być wart Waszej uwagi.

Zapraszamy do dyskusji

Patronujemy

 
 
More Stories
Znajdź złoty środek między swobodą i eksperymentowaniem. Historia Łukasza Mikołajczaka