Spisu treści:

FlowerCare i Nymea ratują moje rośliny: 5 kroków
FlowerCare i Nymea ratują moje rośliny: 5 kroków

Wideo: FlowerCare i Nymea ratują moje rośliny: 5 kroków

Wideo: FlowerCare i Nymea ratują moje rośliny: 5 kroków
Wideo: 🚑🌿 POGOTOWIE ROŚLINNE- Na ratunek EPIPREMNUM 2024, Listopad
Anonim
FlowerCare i Nymea ratują moje rośliny
FlowerCare i Nymea ratują moje rośliny

Brudne ręce przy podłączaniu czujników do pielęgnacji roślin do mojego istniejącego inteligentnego domu typu open source. Przewodnik po tworzeniu wtyczek dla Nymea.

Historia

Jak wielu innych majsterkowiczów i hakerów, ja też cierpię z powodu tego, że hakowanie zajmuje mi tyle czasu, że czasami zapominam o podlewaniu roślin. Po tym, jak moja Monstera Deliciosa po raz kolejny cierpiała na suchą glebę, postanowiłem sprawdzić, czy mogę coś z tym zrobić, aby przypomnieć mi, kiedy jest spragniony.

Szybkie rozeznanie w sieci zwróciło moją uwagę na Xiaomi FlowerCare, znane również jako MiCare lub PlantCare. Jest to urządzenie Bluetooth Low Energy, a niektóre podstawowe badania wykazały, że jego protokół wydaje się dość łatwy do zrozumienia. Chociaż wydaje się, że Xiaomi nie udostępnia żadnych publicznych specyfikacji, w Internecie pojawiło się jeszcze sporo inżynierii wstecznej dla tego urządzenia. Postanowiłem więc zamówić jeden z nich.

Kilka dni później został dostarczony i oczywiście od razu zacząłem się nim bawić. Krótko sprawdziłem dołączoną do niego aplikację, ale jak zapewne się domyślasz, używanie jej w domyślnej konfiguracji nigdy nie było moim planem. Oczywiście musi to być zintegrowane z moją istniejącą konfiguracją inteligentnego domu. Jak również tutaj opisano, używam nymea jako mojego inteligentnego rozwiązania domowego (tak, Monstera można zobaczyć na jednym ze zdjęć:)). Niestety, Nymea nie wspierała jeszcze tego czujnika, więc odpalenie jakiegoś IDE było w porządku.

Krok 1: Wczytanie wtyczki wtyczki

Wczytywanie kodu pośredniczącego wtyczki
Wczytywanie kodu pośredniczącego wtyczki
Wczytywanie kodu pośredniczącego wtyczki
Wczytywanie kodu pośredniczącego wtyczki
Wczytywanie kodu pośredniczącego wtyczki
Wczytywanie kodu pośredniczącego wtyczki

Więc pierwszą rzeczą, którą zrobiłem, było skopiowanie istniejącej wtyczki Texas Instruments Sensor Tag, wydawało się wystarczająco podobne do tego, co zakładałem, że powinno działać również na urządzeniu FlowerCare. Po podstawowej zmianie nazwy rzeczy w plugininfo.json i zakomentowaniu większości kodu wtyczki sensortag byłem gotowy do załadowania nowego stuba wtyczki.

Zgodnie z oczekiwaniami odkrycie od razu pokazałoby czujnik i pozwoliłoby dodać go do systemu. Oczywiście w tym momencie nie dałoby to żadnych znaczących danych.

Krok 2: Znajdowanie danych na czujniku

Znajdowanie danych na czujniku
Znajdowanie danych na czujniku

Podobnie jak w przypadku każdego urządzenia Bluetooth LE, pierwszą rzeczą, którą chcesz zrobić, to dowiedzieć się o oferowanych przez nie usługach i ich cechach. Gdzieś tam ukryte są rzeczywiste dane. Dzięki szybkiemu debugowaniu wydruków w pętli po wszystkich wykrytych usługach i wydrukowaniu ich charakterystyk byłem w miejscu, w którym mogłem porównać informacje, które znalazłem w Internecie, z tym, co faktycznie raportuje urządzenie.

void FlowerCare::onServiceDiscoveryFinished(){ BluetoothLowEnergyDevice *btDev = static_cast(sender()); qCDebug(dcFlowerCare()) << "mieć identyfikatory UUID usług" controller()->createServiceObject(sensorServiceUuid, this); connect(m_sensorService, &QLowEnergyService::stateChanged, to, &FlowerCare::onSensorServiceStateChanged); connect(m_sensorService, &QLowEnergyService::characteristicRead, this, &FlowerCare::onSensorServiceCharacteristicRead); m_sensorService->odkryjSzczegóły(); } void FlowerCare::onSensorServiceStateChanged(const QLowEnergyService::ServiceSate &state) { if (stan != QLowEnergyService::ServiceDiscovered) { return; } foreach (const QLowEnergyCharacteristic &characteristic, m_sensorService->characteristics()) { qCDebug(dcFlowerCare()).nospace() < " << charakterystyka.uuid().toString() << " (" << charakterystyka.handle() << " Nazwa: " << charakterystyka.nazwa() << "): " << charakterystyka.wartość() << ", " << charakterystyka.wartość().toHex(); foreach (const QLowEnergyDescriptor &descriptor, charakterystyka.descriptors()) { qCDebug(dcFlowerCare()).nospace() < " << descriptor.uuid().toString() << " (" << descriptor.handle() << " Nazwa: " << deskryptor.name() << "): " << deskryptor.value() << ", " << deskryptor.value().toHex(); } } }

Wersja oprogramowania i poziom naładowania baterii były łatwe. Już przy pierwszej próbie zestawienia danych mogłem zobaczyć odpowiednie wartości. Rzeczywiste wartości czujników są tam ukryte nieco głębiej, ale połączenie ich z danymi z internetu od razu wskazało, gdzie je znaleźć, a zwłaszcza jak je odczytać.

void FlowerCare::onSensorServiceCharacteristicRead(const QLowEnergyCharacteristic &characteristic, const QByteArray &value){ qCDebug(dcFlowerCare()) << "Odczyt charakterystyki" << QString::number(characteristic.handle(), 16) temp; qint8 pomiń; strumień >> pomiń; kwint32 luksów; strumień >> luks; Qint8 wilgoć; strumień >> wilgoć; płodność qint16; strumień >> płodność; emituj zakończone(m_batteryLevel, 1.0*temp/10, lux, wilgotność, płodność); }

Podsumowując, wtyczka zaczęła już generować znaczące dane.

Krok 3: Wykończenie szlifów

Ostatnie poprawki
Ostatnie poprawki

Więc w zasadzie działało to teraz, jednak pozostał jeden problem. Czujnik FlowerCare, w przeciwieństwie do Texas Instruments SensorTag, zrywa połączenie Bluetooth po kilku sekundach. Jednak biorąc pod uwagę przypadek użycia, nie wydaje się to stanowić problemu, ponieważ jest dość niezawodne w reagowaniu na próby połączenia. Biorąc pod uwagę, że normalnie roślina nie zasysa litra wody w ciągu kilku minut, a raczej dni, nie wydaje się konieczne pozostawanie w kontakcie przez cały czas. Spowodowałoby to również znaczne rozładowanie baterii. Postanowiłem więc dodać PluginTimer, który będzie podłączał czujnik co 20 minut i pobierał z niego dane. Jeśli z jakiegoś powodu czujnik nie zareaguje na próbę połączenia, kod uruchomi kolejny timer, który będzie próbował ponownie połączyć się co minutę od tego momentu, aż do uzyskania danych. Następnie wróci, aby ponownie pobrać dane z 20-minutowego interwału. Jeśli urządzenie nie połączy się dwa razy z rzędu (czyli po 20+1 minutach), zostanie ono oznaczone w systemie offline, a użytkownik może zostać o tym ostrzeżony.

void DevicePluginFlowercare::onPluginTimer(){ foreach (FlowerCare *flowerCare, m_list) { if (--m_refreshMinutes[flowerCare] <= 0) { qCDebug(dcFlowerCare()) << "Odświeżanie" adresu(); FlowerCare->refreshData(); } else { qCDebug(dcFlowerCare()) << "Nie odświeżam" adres() << "Następne odświeżenie za" << m_refreshMinutes[flowerCare] << "minuty"; } // Jeśli mieliśmy 2 lub więcej nieudanych prób połączenia, oznacz je jako odłączony if (m_refreshMinutes[flowerCare] < -2) { qCDebug(dcFlowerCare()) << "Nie udało się odświeżyć dla"<< (m_refreshMinutes[flowerCare] * -1) <setStateValue(flowerCareConnectedStateTypeId, false); } } }

Dzięki tej strategii nymea wydawała się teraz dostarczać całkowicie wiarygodne dane z tego czujnika.

Krok 4: Używanie go w szerszym kontekście

Używanie go w szerszym kontekście
Używanie go w szerszym kontekście
Używanie go w szerszym kontekście
Używanie go w szerszym kontekście

Samo pobieranie wartości z czujnika nie jest jednak zbyt przydatne, mogłem też użyć do tego oryginalnej aplikacji. Teraz zróbmy z nim kilka mądrych rzeczy.

Nymea obsługuje wysyłanie powiadomień push, zarówno na telefony z zainstalowaną aplikacją nymea:app, jak i przez PushBullet. Więc oczywistą rzeczą do zrobienia jest wysyłanie sobie powiadomień push, gdy wilgotność gleby spadnie poniżej 15%. Konfiguracja tego w aplikacji jest dość łatwa. Jako warunek wstępny potrzebujesz konta w nymea:cloud lub w PushBullet. W przypadku powiadomień push opartych na nymea:cloud wystarczy włączyć nymea:cloud w nymea:core oraz w nymea:app. Gdy tylko oba zostaną połączone, automatycznie pojawi się powiadomienie. Aby PushBullet dodać nową rzecz w systemie, znajdziesz tam PushBullet na liście. Poprosi Cię o klucz API, który otrzymasz podczas rejestracji w PushBullet. Gdy masz już powiadomienie push w nymea, możesz utworzyć regułę.

Oczywiście możesz robić, co chcesz… Możesz też włączyć trochę światła, aby odzwierciedlić wartości z czujników, lub użyć wtyczki HTTP Commander, aby na przykład przesłać wartości z czujników na serwer w Internecie. Nie mam zaworu wodnego który może być sterowany cyfrowo (jeszcze), ale oczywiście, jeśli masz coś takiego i nie jest jeszcze obsługiwany przez nymea, dodanie wtyczki do tego byłoby raczej podobne niż to.

Krok 5: Słowa zamykające

Słowa zamykające
Słowa zamykające

Wtyczka flowercare została już zaakceptowana i jeśli masz jedną z nich, jest gotowa do użycia z nymea. Mam jednak nadzieję, że ten artykuł może zainteresować, jeśli ktoś chce dodać obsługę innych urządzeń. Powinien to być przewodnik po tym, jak zbudować własną wtyczkę dla nymea.

Jeśli chcesz po prostu zbudować tę konfigurację w swoim domu, wszystko, czego potrzebujesz, to czujnik FlowerCare, Raspberry Pi, obraz społeczności nymea (zawiera teraz wtyczkę do pielęgnacji kwiatów) i nymea:app, który jest dostępny w sklepach z aplikacjami. Ponadto, do tej pory moja Monstera Deliciosa jest znowu szczęśliwa i jak mogliście zobaczyć na zrzutach ekranu, zdobyłem drugi z tych czujników, aby śledzić zdrowie mojego drzewa cytrynowego. W tym przypadku wysyłam sobie powiadomienie push, gdy na dworze jest mróz, abym mógł bezpiecznie przeżyć zimę.

Zalecana: