Jak zapewne pamiętasz z poprzedniego artykułu, zmieniłam u siebie w mieszkaniu, używając narzędzi open-source i minimalnym kosztem finansowym, zwykłe oświetlenie w SMART oświetlenie. Gdy zobaczyłam, ile mam z tego korzyści, postanowiłam, że to nie będzie ostatnia rzecz, jaką zrobię.
W tym tekście skupię się na zmianie jeszcze-nie-smart urządzenia na takie smart! Zajmę się urządzeniem, które od kilku miesięcy jest włączone u mnie non stop i nie wyobrażam sobie, bym go nie miała. Sterylizator 4w1! Jeśli jesteś rodzicem, wiesz o czym piszę 😀
Z artykułu dowiesz się m.in.:
- dlaczego chciałam zmienić sterylizator w urządzenie smart,
- czego potrzebuję, by mieć smart urządzenie,
- jaki element zmienia zwykłe urządzenia w smart,
- jak przebiega integracja z aplikacjami,
- jaki jest pobór mocy w czasie,
- o algorytmie działania sterylizacji oraz wysyłania powiadomienia na telefon.
Zanim przejdę dalej, zdradzę Ci, co zmieniłam od ostatniego wpisu w domu, by był bardziej inteligentny. Ano wiatrak w łazience włącza/wyłącza się w zależności od wilgotności (tu oparłam się na odchyleniu i delcie z ostatnich pomiarów), steruję nawilżaczem przez telefon (robiłam reverse engineering), a pralka informuje mnie o zakończeniu prania.
Każda wymieniona modyfikacja śmiało może być opisana jako osobny artykuł. Z każdą miałam sporo problemów: od napisania poprawnego algorytmu po odczyty i pomijanie zakłóceń z urządzeń Wszystkie wiązały się z wieloma emocjami: od frustracji po ekscytację. Jeśli chcesz, bym podzieliła się moimi przygodami – zostaw komentarz i napisz, co Cię interesuje 🙂
Dlaczego chciałam zmienić sterylizator w urządzenie smart?
Przy niemowlęciu człowiek działa zadaniowo. Jak wykona wszystkie zadania, chce mieć spokój i odpowiednią ilość snu. A jak o czymś zapomina – ta harmonia jest zaburzona. Dlatego, jeśli mogę, wykorzystuję automatyzację, by ułatwić sobie życie i wykorzystać urządzenia, które mam. Posiadam sterylizator Neno 4w1.
Głównie korzystam z 3 funkcji:
- podgrzewania mleka/jedzenia,
- odmrażania jedzenia,
- sterylizacji.
I jak nie zapominam o podgrzewaniu, tak o końcu sterylizacji ZAWSZE, a następnie muszę ponownie sterylizować te same rzeczy, co skutkuje położeniem się spać o 23.30 lub później, a nie o 22.00 😉
Pomyślałam, że telefon mam zawsze przy sobie, więc warto by było, gdyby na komórkę docierały powiadomienia dotyczące końca sterylizacji. Ile czasu mogłabym zaoszczędzić dzięki temu!
I to był mój pierwszy cel – wysłanie powiadomienia z urządzenia na telefon.
Spoiler alert: na dzień pisania artykułu mogę już sterować sterylizatorem przez telefon (zarówno jako osobnym modułem jak i z powiadomień), co wymagało zmiany w hardware’rze. Jednak tu skupię się na jednej funkcjonalności.
Czego potrzebuję, by mieć smart urządzenie?
By stworzyć z takiego urządzenia urządzenie smart, należy albo zmienić w nim hardware albo dodać fizyczny element, który będzie monitorował pracę urządzenia i wysyłał informacje. W związku z tym, że chciałam to zrobić dobrze, szybko i tanio, wybrałam drugie rozwiązanie.
Zmiany, które musiały się wydarzyć:
- zakup urządzenia, które będzie potrafiło monitorować moc pobieraną przez docelowe urządzenie i będzie wysyłało dane,
- odpowiednia integracja urządzenia i aplikacji, abym miała dostęp do danych,
- zrozumienie logów, żeby zobaczyć, co jest wysyłane z urządzenia monitorującego,
- stworzenie algorytmu odpowiedzialnego za wysyłanie powiadomień na telefon.
Jak już wiesz z wcześniejszego artykułu, głównie interesuje mnie protokół Zigbee, a do sterowania Inteligentnym domem używam 4 aplikacji:
- HomeAssistant,
- Node-RED,
- Zigbee2MQTT,
- Mosquito.
Element zmieniający zwykłe urządzenia w smart
Zacznijmy od pierwszego punktu. Na rynku istnieją różne rozwiązania, jednak najprostszym jest zakup gniazdka-wtyczki. U mnie wybór padł na: wtyczkę ZigBee 16A z firmy RTX.
Na rynku istnieją wtyczki, które mają zarówno połączenie po WiFi, jak i ZigBee, jednak mnie interesuje wyłącznie protokół ZigBee. Dodatkowo, w momencie zakupu cena wynosiła 49 PLN.
Integracja z aplikacjami
Integracja ze sterylizatorem jest prosta – zwyczajnie między kontakt a urządzenie wpinasz wtyczkę. By dane były widoczne w aplikacji, należy skonfigurować odpowiednio Zigbee2MQTT wraz z gniazdkiem.
Patrząc na logi w Zigbee2MQTT, mogłam sprawdzić, jakie informacje są przesyłane i które z nich mogę wykorzystać, by osiągnąć swój cel.
Najważniejsza dla mnie informacja znajduje się pod parametrem power. Jest to ilości energii elektrycznej użytej w danym momencie [wyrażonej w watach]. Po konfiguracji wtyczka podpięta do sterylizatora powinna być widoczna zarówno w aplikacji HomeAssistant, jak i Node-RED.
Zatem czas na sprawdzenie jak sterylizator zachowuje się w dwóch trybach:
- podgrzewania jedzenia,
- sterylizacji.
Analiza poboru mocy przez urządzenie w czasie, czyli ile urządzenie bierze prądu
Zużycie prądu możesz sprawdzić albo w pojedynczych logach w Zigbee2MQTT albo w historii aplikacji HomeAssistant, gdzie znajdziesz wykres. Ja wybrałam wykres. Wchodząc w historię urządzenia oraz wybierając konkretny przedział czasowy, sprawdziłam charakterystykę działania sterylizatora. Oś pionowa wskazuje ilość energii elektrycznej [W], oś pozioma godzinę.
Co działo się w tych przedziałach czasowych? Urządzenie włączyłam dopiero ok. godziny 18:20, zatem woda w nim była w temperaturze pokojowej. Następnie włączyłam funkcję podgrzewania jedzenia. Nie wyłączyłam sterylizatora po wyjęciu butelki, a ok. godziny 20:40 zaczęłam sterylizację butelek.
Podsumowując: między 18:20 a 2:00 były użyte 2 funkcje:
- podgrzanie/utrzymanie wody w temperaturze 40 stopni C,
- sterylizacja, gdzie następuje podgrzanie wody do 100 stopni C, a następnie utrzymanie tej temperatury przez 10 minut.
Czy domyślasz się, które słupki za co odpowiadają? Przyjrzyjmy się im bliżej.
Podgrzewanie
Na wykresie między 18:20 a 18:40 można zauważyć, że przy włączeniu urządzenia, w którym woda ma mniejszą temperaturę niż 40 stopni C, następuje podgrzanie wody do tejże temperatury. Pobór mocy wynosi ok. 238 W. By utrzymać temperaturę, między 19:00 a 20:30 urządzenie co 10 minut grzeje wodę z mocą 118 W przez okres 2,5 minuty. Dodatkowo widać niestabilność stanu w trakcie przełączania (coś podobnego do szumu elektrycznego) w okolicach 19:20, 19:30 oraz 19:55.
Sterylizacja
W zależności od tego, jaka temperatura wody była w urządzeniu, długość cyklu może się różnić. Najlepiej widać to w przybliżeniu:
Można zauważyć, że woda ok. 22:00 była na tyle zimna, że sterylizator potrzebował więcej czasu, aby zakończyć cykl sterylizacji. O 22:28 (czyli ok. 7 minut po ostatniej akcji) urządzenie potrzebowało mniej czasu do wykonania swojej funkcji. Dodatkowo, by urządzenie zadziałało w funkcji sterylizacji, potrzebuje ok. 473 W przez dłuższy czas.
Dzięki powyższej analizie można zauważyć pewien wzorzec, który przyda nam się w stworzeniu algorytmu do wysłania powiadomień o zakończeniu sterylizacji.
Algorytm działania sterylizacji oraz wysłania powiadomień na telefon
Już wiemy, ile mocy pobiera urządzenie przy konkretnych akcjach i przez jaki czas. Zatem rozplanujmy, co będzie nam dodatkowo potrzebne, by stwierdzić, że sterylizacja została zakończona.
Mój plan był taki, aby zbierać informacje z ostatnich 4 minut i sprawdzić, czy wartość mocy była przez dłuższy czas powyżej 400 W, po czym zmieniła się na 0. I to by był dobry plan! Gdybym tylko miała pewność, że urządzenie wysyła co X sekund taką informację. Jednak po przeanalizowaniu logów z Zigbee2MQTT okazało się, że wtyczka wysyła informację raz co 2 sekundy, a innym razem co 2 minuty. Niezależnie od tego, czy urządzenie jest włączone, czy sterylizuje, czy podgrzewa.
Zatem zamiast opierać się na buforze czasowym, wybrałam opcję: ostatnie 10 wyników. Jak wiesz, lubię automatyzację w Node-RED i tu również wykorzystałam tę aplikację do stworzenia takiego algorytmu. Gotowy algorytm:
Wiedząc już, jakie są główne założenia, czas na zastanowienie się, co może pójść nie tak.
Dobry tester od razu patrzy na wartości brzegowe, zanim przejdzie do implementacji, gdyż mogą wystąpić szumy elektryczne (polecam z zapoznaniem się ze zjawiskiem debouncing). Na szczęście jest to znane zjawisko i w aplikacji do automatyzacji można łatwo je zredukować. Następnie, na podstawie jakiejś wartości powinniśmy wykrywać zmianę stanu. Jeśli przez 40 minut pobór mocy wynosi 473 W albo jeśli będą wahania poboru mocy, to już można stwierdzić, że nie jest to odpowiedni parametr. Jednak jednostka czasu już jak najbardziej tak.
Ostatnią kwestię stanowi sposób, w jaki wyliczymy, czy zmiana stanu była chwilowa (np. chwilowy spadek mocy), czy jednak akcja została zakończona. To zostanie oprogramowane w funkcji obliczenia stanu.
Wiemy, co należy zrobić, jesteśmy świadomi, co może pójść nie tak, zatem przejdźmy do konkretów!
Działania krok po kroku
Informacje z gniazdka są przesyłane do Zigbee2MQTT, więc Node-Red powinien zostać tak skonfigurowany, by móc je wykorzystać. W aplikacji mam kilka operacji dostosowanych do Zigbee2MQTT.
W momencie konfiguracji interesuje mnie operacja IN, która odpowiada za odbieranie wiadomości z kolejki. Poniższy rysunek przedstawia konfigurację aktywności.
Najważniejsze aspekty to: serwer (u mnie nazwany Mosquito), urządzenie (Sterylizator(TS011F_plug_1)), a następnie określenie, co interesującego wyciągniemy z logów. W tym przypadku wybrałam parametr power.
W związku z tym, że w dalszych krokach chciałam się opierać na parametrze czasowym, konieczna była modyfikacji dalej przesyłanej wiadomości. Używając operacji function i JavaScript, podmieniam wiadomość.
Rozszyfrowując powyższy kod:
- tworzę nową wiadomość z konkretnym ciałem,
- tworzę 3 parametry:
- power,
- timestamp,
- timechanges.
Najciekawszym z nich może być timechanges. Jest to parametr, który zostanie użyty w następnym kroku i odpowiada za eliminację nadmiaru zdarzeń.
Następnym krokiem jest debounce, czyli zmniejszenie szumu elektrycznego. W nim będę opierać się na stworzonym parametrze timechanges.
Dzięki temu biorę pod uwagę wiadomość ze sterylizatora nie młodszą niż 10 sekund od ostatniej. Mając już ustalone, które wartości są dla mnie ważne i jaka ma być ich częstotliwość, przechodzę do tematu ich zapamiętywania w tymczasowej pamięci. Wybieram 10 ostatnich.
W związku z powyższą konfiguracją są to wyniki po co najmniej 100 sekundach. Zatem czas wystarczający, by stwierdzić, czy sterylizacja została zakończona, czy nie.
Mając już dane, na których da się wykonywać operacje obliczeniowe, mogę użyć ponownie operacji function i napisać funkcję w JavaScript, która sprawdzi, czy ostatnia wiadomość zawiera wartość dla parametru power równą 0. Jak pamiętasz z wykresu, taka wartość jest wysyłana w momencie, gdy urządzenie przestało pracować.
Opisując powyższy kod:
- zapisuję ostatni wynik z pamięci podręcznej,
- jeśli równy jest 0, sprawdzam, dla ilu elementów moc była wyższa niż 400W,
- jeśli moc była wyższa, dodaję +1 do tymczasowego parametru,
- zliczam, ile wyników spełnia powyższe kryterium,
- jeśli przynajmniej 6 logów je spełnia, ustawiam nową wiadomość do przekazania dalej,
- w innym przypadku nie zwraca mi nic. Dzięki temu żadne powiadomienie nie przejdzie dalej.
Ostatnim krokiem jest przesłanie wiadomości na telefon. Za pomocą wtyczki HomeAssistant do aplikacji Node-RED mam operację nazwaną call service, która pozwala na wysłanie powiadomienia do HomeAssistant. Dzięki temu i zainstalowaniu aplikacji HomeAssistant na telefonie spełnię swój cel!
Dzięki danym zawartym w parametrze Data steruję tym, co zostanie wyświetlone na telefonie.
A teraz czas na ostatni krok! Zrzut z ekranu po zakończonej sterylizacji.
Podsumowanie
Cel został osiągnięty. Powyższy artykuł opisał instrukcję konfiguracji urządzeń, aplikacji oraz proces decyzyjny, by móc wysłać powiadomienie po zakończeniu sterylizacji. Teraz już śmiało mogę napisać, że mam kolejne smart urządzenie. Dodatkowo, dzięki informacjom przesłanym w logach, dokładnie wiem, ile urządzenie zużywa prądu. I tyle! 🙂
Jednak, by mieć jeszcze bardziej smart urządzenie umożliwiające sterowanie włączeniem konkretnych programów, musiałam zhackować hardware. Do tego mogłam użyć modułu NodeMCU lub znanego z poprzedniego artykułu, udanego, jednorazowego zakupu CC2531.
Kto to wie, kto to wie 😀
Czy artykuł o zmianie hardware’u i stworzeniu kolejnych algorytmów byłby dla Ciebie ciekawy? Daj znać w komentarzu! 🙂
Zostaw komentarz