teXXmo (Azure) IoT Button, recenzja prawdziwa

Ostrzeżenie dotyczące treści: Wpis może być nieodpowiedni dla niektórych użytkowników z powodu możliwość obrazy uczyć poprzez nieodpowiednie słownictwo, brak poprawności politycznej czy też porostu szczerość autora.

Bohaterem dzisiejszego wpisu jest teXXmo IoT Button.

Zastanawiałem się jak zacząć tą recenzję i jednym słusznym sposobem jest odniesienie się do sposobu zakupu.

Dziś o tym jak 38 fan bojów MS (w tym ja) dało się złapać na demo z konferencji. W trakcie keynota na Build 2018 jedno z dem o IoT pokazywało pewien prosty gadżet w praktyce. Był to Azure IoT Button, a dokładnie teXXmo IoT Button, certyfikowany dla Azure. Niedługo po sesji w ogólnym podjaraniu nastąpiła inicjatywa grupowego zakupu nowego gadżetu, która się niestety powiodła. Po kliku tygodniach oczekiwania, 12 czerwca odebrałem wyczekiwany gadżet. Tego samego dnia wieczorem już wiedziałem, że 28,45 EUR zostało wyrzucone w błoto.

Jak już wiadomo, że pieniądze w błoto to przyda się trochę przykładów i wniosków zostawić dla potomności.

Unboxing (dosłownie wyjmowanie z pudełka)

teXXmo (Azure) IoT Button Unboxing

W opakowaniu znajdziemy 2 kartki i upragniony przycisk. Na początku zajmijmy się kartkami. Jak się okazuję twórcy tej zabawki brali wzorowy przykład z Majfrendów z AliExpress. Na stronie produkt jest w trzech opcjach kolorystycznych, a po otwarciu jak się okazuje nawet w 5 ;-) Tylko drobny haczyk – opcje kolorystyczne dotyczą naklejki na górę urządzenia :-D

teXXmo (Azure) IoT Button bez obudowy

Dzięki uprzejmości Emila (dzięki za zdjęcia!), możemy również zobaczyć unboxing środka. Ze względu na konstrukcję, obudowę można otworzyć tylko raz. Jak widać na zdjęciu baterie są polutowane na pająka – produkty za pięć dolców z Chin już często są lepiej wykonane.

Konfiguracja

Postępując zgodnie z instrukcją idzie bez problemu. Konfiguracja odbywa się poprzez stronę. Trzeba przytrzymać odpowiednią ilość czasu guzik i urządzenia przełącza się w tryb AP dzięki, któremu możemy połączyć się z urządzeniem i przeprowadzić konfigurację.

Panel konfiguracyjny teXXmo (Azure) IoT Button

Ciekawą rzeczą jest USER Json. W tym miejscu można dokleić własne statyczne (sic!!!) dane do wysłania :-(. Domyślnie ten syf wysyła coś takiego.

{"UniqueID": "84:0D:8E:44:6A:8F","Order_ID": "1234"}

Dla porównania AWS IoT Button wysyła coś takiego.

{
 "serialNumber": "GXXXXXXXXXXXXXXXXX",
 "batteryVoltage": "3333mV",
 "clickType": "SINGLE | DOUBLE | LONG"
}

W tym miejscu odbywa się rozczarowanie. W przeciwieństwie do przycisku z logiem Amazon to badziewie wysyła tylko, że był klik wraz z USER Json i tyle, gdzie w AWS rozpoznaje typ naciśnięcia. Urządzenia od Amazon kosztuję 20 USD i jest wykonane o niebo lepiej…

Jak się okazuje teXXmo udostępnia źródła jak i schemat obudowy na githubie. Zajrzałem, więc w źródła, żeby zobaczyć, jak to działa. Do programowania teXXmo wybrało mikro penisa, przepraszam micropython, spodziewałem się C/C++ (albo Arduino), a nie języka sponsorowanego z pomocy dla powodzian czy inną zbiórkę na Kickstarterze. Dodatkowo sam sposób obsługi przycisku w kodzie nie zachwyca… Nie wiem, może to urok mikro penisa…

Wykorzystanie

Przejdziemy do praktyki. Emil w ABŚ pokazuje, jak użyć przycisku z pomocą IoT Hub, Functions i Logic App, czyli dokładnie jak na Build.

Pierwsze pytanie w trakcie oglądania demo na Build i wspólnego komentowania z kolegą Marcinem, było: Czemu taka rzeźba z Functions? Nie można zrobić tego bez duct tape w postaci Functions? Sprawdźmy to.

Azure Logic App nie posiada konektora do Azure IoT Hub, ale posiada za to możliwość czytania z Event Hub. Azure IoT Hub posiada możliwość wpięcia się do niego jak do Event Hub – tak zwany Event Hub-compatible endpoint. Na poniższym zrzucie ekranu przykład jak dostać się do danych dostępowych do tego endpointu.

Konfiguracja Event Hub-compatible endpoint

Teraz czas na Logic App. Konfigurujemy trigger dla Event Huba manualnie.

Konfiguracja Event Hub trigger w Logic App

I tu przechodzi wyjaśnienie czemu na Build byłą użyta taśma. Trigger w Logic Apps działa w trybie pullowania, czyli zamiast nasłuchiwać jak Function i praktycznie po pojawieniu się widomości z urządzenia wystartować, to pobiera sobie wiadomości co ustalony interwał i je obrabia. Jeśli ustawmy nasłuchiwanie co 15 sekund (co szału nie robi) to za samo nasłuchiwanie zapłacimy około 22 EUR na miesiąc.

Mając już wiadomość z urządzenia, można przykładowo poinformować świat, że się udało kliknąć poprzez status na Twitterze.

Logic App i wysyłane Tweeta

Męczyło mnie jak osiągnąć obsługę kliku kliknięci jak robi to produkt Amazonu. Z brakiem obsługi długich pogodziłem się po przeczytaniu kodu źródłowego, ale oprócz taśmy w zestawie inżyniera jest też przecież opaska zaciskowa (albo jak kto woli trytytka), tutaj w postaci Stream Analytics. Stream Analytics będzie karmione (input) wiadomościami bezpośrednio z IoT Hub.

Azure Stream Analytics pozwala na analizę napływających zdarzeń z różnych usług Azure z wykorzystaniem bardzo prostego języka podobnego do SQL z obsługą logiki czasowej.

Do wykrycia wielu kliknięć może posłużyć analiza z wykorzystaniem Session window. Deklaracja ta grupuje zdarzenia po oknie czasowym zgodnie z parametrami, czyli jednostką czasu, jaki jest maksymalny odstęp pomiędzy komunikatami oraz ile trwa maksymalnie sesja. Rysunek poniżej wyjaśnia działanie Session Window.

Rysunek wyjaśnia działanie Session Window

W tym wypadku wykorzystanie wygląda tak:

SELECT UNIQUEID as Device, COUNT(*) as Click
FROM [IoT] TIMESTAMP BY EVENTENQUEUEDUTCTIME
GROUP BY UNIQUEID, SESSIONWINDOW(second, 20, 60)

W praktyce, żeby to zadziałało grupujemy po UNIQUEID(czyli adres fizyczny urządzenia) oraz session window trwającym maksymalnie 60 sekund i odstępem pomiędzy wiadomościami nie dłuższym niż 20 sekund. Tutaj kolejna łyżka dziegciu – to nie jest klikanie kilka razy z rzędu tylko przyciskamy i czekamy, aż wyśle i znowu przyciskamy i czekamy ;-) Taki urok oprogramowania tego badziewia, który wyłącza go od razu po wysłaniu wiadomości do IoT Huba.

Na wyjściu z takiego działającego zapytania otrzymamy wiadomości (wiersze) z kolumną Device i Click.

Efekt działania zapytania w Stream Analytics

Jednym z wyjść obsługiwanych przez Stream Analytics jest Azure Functions. Wystarczy, że posiadamy funkcję typu najzwyklejszy http trigger i może ona przyjąć dane z Stream Analytics. W przykładzie, żeby nie męczyć się z obsługą batchy ustawiłem, że wielkość batcha jest równe 1 ;-)

Dostanie się do takiego obiektu jest proste. Wystarczy zaczytać zawartość wywołania i sprawdzić co mamy w środku.

dynamic dataArray = await req.Content.ReadAsAsync<object>();
log.Info($"Value is {dataArray[0].ToString()}");

Wynik tego kodu to:

2018-06-15T23:59:43.108 [Info] Value is {
  "device": "84:0D:8E:44:6A:8F",
  "click": 2
}

Mając już taką wiadomość można robić co chcemy w kodzie. Lepszy przykład spinania Stream Analytics z Functions wraz z opisem znajduję się w dokumentacji.

Sonoff S20

Gniazdo sieciowe 230 V o mocy 2300 W zdalnie sterowane za pomocą WiFi lub głosu. W celu połączenia się przez sieć należy pobrać aplikację eWeLink na smartfona. Dzięki Amazon Alexa oraz Google Assistant gniazdem można sterować głosem. Za pomocą aplikacji można również ustawić godzinę włączenia lub wyłączenia gniazda np. można podłączyć ekspres do kawy, który rano zrobi nam ciepłą kawę zanim wstaniemy z łóżka.

Sonoff S20

Na ostatni test wziąłem na tapet integrację magicznego przycisku z opisanym powyżej gniazdkiem Sonoff S20(w wersji z oryginalnym oprogramowaniem). Zróbmy ten tytułowy internet rzeczy. Okazało się, że jest to jeszcze większe druciarstwo niż z wykrywaniem ilości kliknięć.

Przypływ wygląda następująco:

Przycisk -> IoT HUB -> Stream Analytics -> Functions -> IFTTT -> ewelink -> Sonoff S20

Oryginalne oprogramowanie S20 nie wystawia, żadnego cywilizowanego API, ale przynajmniej daje integrację na platformie IFTTT (if this, then that). Oczywiście nie jest tak wspaniale. Producent ewelink nie zrobił akcji przełącz jak inni tylko mamy osobno włącz i wyłącz. IFTTT nie winie za brak możliwości sprawdzenia stanu, bo ta usługa ma inną filozofie od samego początku i nie ma rozbudowanych akcji po za trigger i potem akcja.

Czyli jedno naciśniecie przycisku włącza, a dwa wyłączają.

Tak prezentuje się konfiguracja jednej z akcji w IFTTT.

Konfiguracja ifttt

Dokumentacja jak używać webhook w IFTTT dostępna jest po zalogowaniu tutaj.

Co nie podoba mi się w teXXmo IoT Button

Azure za to dostaje małego minusa za konektor do Event Hub w Logic App. Usługa Logic App sama w sobie jest super i co ciekawe np. taki Event Grid potrafi być w Logic App uruchamiany jak Functions.

Co kupić lepiej?

Szczerze nie polecam tego gadżetu. Przy tej cenie to pieniądze wyrzucone w błoto. Zamiast niego można zakupić ciekawsze rzeczy.

Poniżej klika przykładów urządzeń, które sam posiadam i nie przeklinam ich tak jak opisanego przycisku: