Cuprins:

FlowerCare și Nymea pentru salvarea plantelor mele: 5 pași
FlowerCare și Nymea pentru salvarea plantelor mele: 5 pași

Video: FlowerCare și Nymea pentru salvarea plantelor mele: 5 pași

Video: FlowerCare și Nymea pentru salvarea plantelor mele: 5 pași
Video: Bunu Dökün Orkideler Bol Cicek Açsin Saglikli Kök Ve Canlı Sert Yaprak Çikarsin 2024, Iulie
Anonim
FlowerCare și Nymea to Rescue My Plants
FlowerCare și Nymea to Rescue My Plants

Se murdăresc mâinile la conectarea senzorilor de îngrijire a plantelor la casa mea inteligentă open source existentă. O prezentare generală privind dezvoltarea pluginurilor pentru nymea.

Povestea

La fel ca mulți alți jucători și hackeri, suferă și eu de faptul că hacking-ul pe lucruri îmi ocupă atât de mult timp, încât uit ocazional să-mi ud plantele. După ce Monstera Deliciosa a suferit încă o dată de sol uscat, am decis să văd dacă pot face ceva pentru a-mi aminti când este sete.

O cercetare rapidă pe web mi-a atras atenția asupra Xiaomi FlowerCare, cunoscută și sub numele de MiCare sau PlantCare. Este un dispozitiv Bluetooth cu consum redus de energie și unele cercetări de bază au relevat că protocolul său pare a fi destul de ușor de înțeles. În timp ce Xiaomi nu pare să ofere nicio specificație publică, a existat încă un pic de inginerie inversă pe internet pentru acest dispozitiv. Așa că am decis să comand una dintre acestea.

Câteva zile mai târziu a fost livrat și, bineînțeles, am început să mă joc cu el imediat. Am verificat pe scurt aplicația care vine cu ea, dar după cum probabil puteți ghici, utilizarea acesteia în configurarea sa implicită nu a fost niciodată planul meu. Bineînțeles, acest lucru trebuie să fie integrat cu configurarea mea de casă inteligentă existentă. După cum am descris și aici, folosesc nymea ca soluție pentru casă inteligentă (Da, puteți chiar să vedeți Monstera într-una dintre imaginile de acolo:)). Din păcate, nymea nu a acceptat acel senzor încă, așa că a pornit un IDE.

Pasul 1: Încărcarea unui plugin pentru plugin

Încărcarea unui plug-in de plugin
Încărcarea unui plug-in de plugin
Încărcarea unui plug-in de plugin
Încărcarea unui plug-in de plugin
Încărcarea unui plug-in de plugin
Încărcarea unui plug-in de plugin

Deci, primul lucru pe care l-am făcut a fost să copiez pluginul existent Texas Instruments Sensor Tag, mi s-a părut suficient de similar cu ceea ce am presupus că ar trebui să funcționeze și pentru dispozitivul FlowerCare. După redenumirea de bază a lucrurilor din plugininfo.json și am comentat cea mai mare parte a codului pluginului sensortag, am fost gata să încărc noul plug stub.

Așa cum era de așteptat, descoperirea ar arăta deja senzorul imediat și îmi va permite să îl adaug în sistem. Desigur, nu ar produce date semnificative în acest moment.

Pasul 2: Găsirea datelor pe senzor

Găsirea datelor pe senzor
Găsirea datelor pe senzor

Ca la orice dispozitiv Bluetooth LE, primul lucru pe care doriți să-l faceți este să aflați despre serviciile pe care le oferă și caracteristicile acestora. Undeva acolo, datele reale sunt ascunse. Cu o imprimare rapidă de depanare care a trecut prin toate serviciile descoperite și am imprimat caracteristicile lor, am fost în punctul în care am putut compara informațiile pe care le-am găsit pe internet cu ceea ce raportează dispozitivul.

void FlowerCare:: onServiceDiscoveryFinished () {BluetoothLowEnergyDevice * btDev = static_cast (sender ()); qCDebug (dcFlowerCare ()) << "au uuide de serviciu" controller () -> createServiceObject (sensorServiceUuid, this); connect (m_sensorService, & QLowEnergyService:: stateChanged, this, & FlowerCare:: onSensorServiceStateChanged); connect (m_sensorService, & QLowEnergyService:: caracteristicăRead, this, & FlowerCare:: onSensorServiceCharacteristicRead); m_sensorService-> discoverDetails (); } void FlowerCare:: onSensorServiceStateChanged (const QLowEnergyService:: ServiceSate & state) {if (state! = QLowEnergyService:: ServiceDiscovered) {return; } pentru fiecare (const QLowEnergyCharacteristic & caracteristică, m_sensorService-> caracteristici ()) {qCDebug (dcFlowerCare ()). nospace () <"<< caracteristică.uuid (). toString () <<" ("<< caracteristică.handle () << "Nume:" << caracteristică.nume () << "):" << caracteristică.valor () << "," << caracteristică.valor (). ToHex (); foreach (const QLowEnergyDescriptor & descriptor, caracteristică.descriptors ()) {qCDebug (dcFlowerCare ()). nospace () <"<< descriptor.uuid (). toString () <<" ("<< descriptor.handle () <<" Name: "<< descriptor.name () << "):" << descriptor.value () << "," << descriptor.value (). toHex (); }}}

Versiunea firmware-ului și nivelul bateriei au fost ușoare. Am putut vedea deja valorile corespunzătoare tipărite în această primă încercare de listare a datelor. Valorile reale ale senzorului sunt ascunse puțin mai adânc acolo, dar combinându-le cu datele de pe internet a indicat imediat unde să îl găsesc și mai ales cum să-l citesc.

void FlowerCare:: onSensorServiceCharacteristicRead (const QLowEnergyCharacteristic & caractéristice, const QByteArray & value) {qCDebug (dcFlowerCare ()) << "Caracteristică citire" << QString:: number (caractéristice.handle (), 16) temp; qint8 sări; stream >> sari; quint32 lux; flux >> lux; qint8 umiditate; curent >> umezeala; qint16 fertilitate; flux >> fertilitate; emit terminat (m_batteryLevel, 1,0 * temp / 10, lux, umiditate, fertilitate); }

Unind acest lucru, pluginul a început deja să producă date semnificative.

Pasul 3: Atingeri de finisare

Finisaje
Finisaje

Deci, practic a funcționat acum, cu toate acestea, o problemă a rămas încă acolo. Senzorul FlowerCare, spre deosebire de Texas Instruments SensorTag, ar renunța la conexiunea Bluetooth după câteva secunde. Totuși, având în vedere cazul de utilizare, acest lucru nu pare să fie o problemă, deoarece este destul de fiabil în răspunsul la încercările de conectare. Având în vedere că, în mod normal, o plantă nu aspiră un litru de apă în câteva minute, ci mai degrabă zile, nu pare necesar să rămâi conectat tot timpul. De asemenea, acest lucru ar descărca destul de mult bateria. Așa că am decis să adaug un PluginTimer care să reconecteze senzorul la fiecare 20 de minute și să preia date din acesta. Dacă, dintr-un anumit motiv, senzorul nu va răspunde la încercarea de conectare, codul va porni un alt cronometru care încearcă să se reconecteze în fiecare minut din acel moment până când reușește să obțină datele. Apoi, s-ar întoarce pentru a prelua date din intervalul de 20 de minute din nou. Dacă dispozitivul nu reușește să se conecteze de două ori la rând (adică, după 20 + 1 minute), acesta va fi marcat offline în sistem și utilizatorul poate fi alertat despre acesta.

void DevicePluginFlowercare:: onPluginTimer () {foreach (FlowerCare * flowerCare, m_list) {if (--m_refreshMinutes [flowerCare] <= 0) {qCDebug (dcFlowerCare ()) << Adresa "Reîmprospătare" (); flowerCare-> refreshData (); } else {qCDebug (dcFlowerCare ()) << Adresa „Nu reîmprospătează” () << „Următoarea reîmprospătare în„ << m_refreshMinutes [flowerCare] << „minute”; } // Dacă am avut două sau mai multe încercări de conectare eșuate, marcați-l ca deconectat dacă (m_refreshMinutes [flowerCare] <-2) {qCDebug (dcFlowerCare ()) << "Nu s-a putut actualiza pentru" << (m_refreshMinutes [flowerCare] * -1) <setStateValue (flowerCareConnectedStateTypeId, false); }}}

Cu această strategie, nymea părea acum să furnizeze date perfect fiabile de la acest senzor.

Pasul 4: Utilizarea acestuia în contextul mai mare

Folosind-o în contextul mai mare
Folosind-o în contextul mai mare
Folosind-o în contextul mai mare
Folosind-o în contextul mai mare

Obținerea valorilor de la senzor nu este însă atât de utilă, aș fi putut folosi și aplicația originală pentru asta. Acum să facem câteva lucruri inteligente cu el.

Nymea acceptă trimiterea notificărilor push, fie la telefoane cu nymea: aplicație instalată, fie prin PushBullet. Deci, lucrul evident de făcut este să-mi trimit câteva notificări push ori de câte ori umiditatea solului scade sub 15%. Este destul de ușor să configurați acest lucru în aplicație. Ca premisă, fie aveți nevoie de un cont în nymea: cloud, fie pe PushBullet. Pentru notificările push nymea: cloud este suficient să activați nymea: cloud pe nymea: core și în nymea: app. De îndată ce ambele sunt conectate, va apărea automat o notificare. Pentru PushBullet adăugați un lucru nou în sistem, veți găsi PushBullet în lista de acolo. Vă va solicita cheia API pe care o obțineți atunci când vă înscrieți la PushBullet. Odată ce aveți o notificare push în nymea, puteți crea o regulă.

Desigur, puteți face orice altceva doriți … Puteți, de asemenea, să aprindeți o lumină pentru a reflecta valorile senzorilor sau puteți utiliza pluginul HTTP commander pentru a posta valorile senzorului pe un server de pe internet, de exemplu. Nu am o supapă de apă care poate fi controlat digital (încă), dar bineînțeles, dacă aveți așa ceva și nu este încă acceptat de nymea, adăugarea unui plugin pentru asta ar fi mai degrabă similară cu aceasta.

Pasul 5: Închiderea cuvintelor

Cuvinte de închidere
Cuvinte de închidere

Pluginul flowercare a fost acceptat în amonte până acum și dacă aveți unul dintre acestea, este gata să fie utilizat acum cu nymea. Cu toate acestea, sper că acest articol ar putea fi de interes dacă cineva dorește să adauge suport pentru alte dispozitive. Ar trebui să fie o descriere generală a modului de construire a propriului plugin pentru nymea.

Dacă doriți doar să construiți această configurație acasă, tot ce aveți nevoie este senzorul FlowerCare, un Raspberry Pi, imaginea comunității nymea (include pluginul pentru îngrijirea florilor până acum) și nymea: aplicație disponibilă în magazinele de aplicații. De asemenea, până acum Monstera Deliciosa este din nou fericită și așa cum ați fi văzut în capturi de ecran, am obținut un al doilea dintre acei senzori pentru a urmări și sănătatea pomului meu de lămâie. Pentru aceasta, îmi trimit o notificare push ori de câte ori îngheață afară, astfel încât să o pot aduce în timpul iernii în siguranță.

Recomandat: