Indholdsfortegnelse:

FlowerCare og Nymea for at redde mine planter: 5 trin
FlowerCare og Nymea for at redde mine planter: 5 trin

Video: FlowerCare og Nymea for at redde mine planter: 5 trin

Video: FlowerCare og Nymea for at redde mine planter: 5 trin
Video: Propagate hibiscus flowers from flower buds 2024, Juli
Anonim
FlowerCare og Nymea for at redde mine planter
FlowerCare og Nymea for at redde mine planter

Får hænderne beskidt på at tilslutte planteplejesensorer til mit eksisterende open source -smart hjem. En gennemgang af plugin -udvikling til nymea.

Historien

Som mange andre tinkerere og hackere lider jeg også af det problem, at hacking på ting tager så meget af min tid, at jeg lejlighedsvis glemmer at vande mine planter. Efter min Monstera Deliciosa igen led af tør jord, besluttede jeg mig for at se, om jeg kan gøre noget ved det for at minde mig om, når det er tørstigt.

En hurtig research på nettet henledte min opmærksomhed på Xiaomi FlowerCare, også kendt som MiCare eller PlantCare. Det er en Bluetooth Low Energy -enhed, og nogle grundlæggende undersøgelser afslørede, at dens protokol ser ud til at være ret let at forstå. Selvom Xiaomi ikke ser ud til at levere nogen offentlige specifikationer, har der været en del reverse engineering på internettet for denne enhed endnu. Så jeg besluttede at bestille en af dem.

Et par dage senere blev det leveret, og jeg begyndte selvfølgelig at lege med det med det samme. Jeg tjekkede kort den app, der følger med den, men som du sikkert kan gætte, var det aldrig min plan at bruge den i standardopsætningen. Selvfølgelig skal dette integreres med mit eksisterende smart home setup. Som beskrevet her bruger jeg nymea som min smart home løsning (Ja, du kan endda se Monstera på et af billederne der:)). Desværre understøttede nymea ikke den sensor endnu, så det var på sin plads at fyre lidt IDE op.

Trin 1: Få en plugin -stub indlæst

Få en plugin -stub indlæst
Få en plugin -stub indlæst
Få en plugin -stub indlæst
Få en plugin -stub indlæst
Få en plugin -stub indlæst
Få en plugin -stub indlæst

Så det første, jeg gjorde, var at kopiere det eksisterende Texas Instruments Sensor Tag -plugin, det lignede nok nok det, jeg antog også skulle fungere for FlowerCare -enheden. Efter den grundlæggende omdøbning af ting i plugininfo.json og kommentering af det meste af sensortag -plugins kode var jeg klar til at indlæse den nye plugin -stub.

Som forventet ville opdagelsen allerede vise sensoren med det samme og give mig mulighed for at tilføje den til systemet. Det ville naturligvis ikke producere nogen meningsfulde data på dette tidspunkt.

Trin 2: Find data på sensoren

Find data på sensoren
Find data på sensoren

Som med enhver Bluetooth LE -enhed er det første, du vil gøre, at finde ud af om de tjenester, den tilbyder og deres egenskaber. Et eller andet sted derinde er de faktiske data skjult. Med en hurtig fejlfinding udskriver looping over alle de opdagede tjenester og udskriver deres egenskaber, jeg var på det punkt, hvor jeg kunne sammenligne de oplysninger, jeg fandt på internettet, med hvad enheden rent faktisk rapporterer.

void FlowerCare:: onServiceDiscoveryFinished () {BluetoothLowEnergyDevice *btDev = static_cast (sender ()); qCDebug (dcFlowerCare ()) << "have service uuids" controller ()-> createServiceObject (sensorServiceUuid, dette); connect (m_sensorService, & QLowEnergyService:: stateChanged, this, & FlowerCare:: onSensorServiceStateChanged); connect (m_sensorService, & QLowEnergyService:: functionalRead, this, & FlowerCare:: onSensorServiceCharacteristicRead); m_sensorService-> discoverDetails (); } void FlowerCare:: onSensorServiceStateChanged (const QLowEnergyService:: ServiceSate & state) {if (state! = QLowEnergyService:: ServiceDiscovered) {return; } foreach (const QLowEnergyCharacteristic & character, m_sensorService-> features ()) {qCDebug (dcFlowerCare ()). nospace () <"<< karakteristisk.uuid (). toString () <<" ("<< karakteristisk.håndtag () << "Navn:" << karakteristisk.navn () << "):" << karakteristisk.værdi () << "," << karakteristisk.værdi (). TilHex (); foreach (const QLowEnergyDescriptor & descriptor, karakteristisk.descriptors ()) {qCDebug (dcFlowerCare ()). nospace () <"<< descriptor.uuid (). toString () <<" ("<< descriptor.handle () <<" Navn: "<< descriptor.name () << "):" << descriptor.value () << "," << descriptor.value (). toHex (); }}}

Firmwareversionen og batteriniveauet var let. Jeg kunne allerede se de tilsvarende værdier trykt i dette allerførste forsøg på at liste dataene. De faktiske sensorværdier er skjult lidt dybere derinde, men at kombinere det med dataene fra internettet påpegede straks, hvor man kan finde det og især hvordan man læser det.

void FlowerCare:: onSensorServiceCharacteristicRead (const QLowEnergyCharacteristic & character, const QByteArray & value) {qCDebug (dcFlowerCare ()) << "Karakteristisk læs" << QString:: number (character.handle (), 16) temp; qint8 spring; stream >> spring; quint32 lux; strøm >> lux; qint8 fugt; strøm >> fugtighed; qint16 frugtbarhed; strøm >> frugtbarhed; udsende færdig (m_batteryLevel, 1,0 * temp / 10, lux, fugt, frugtbarhed); }

Ved at sætte dette sammen begyndte pluginet allerede at producere meningsfulde data.

Trin 3: Efterbehandling

Efterbehandling
Efterbehandling

Så det fungerede stort set nu, men et problem var stadig tilbage der. FlowerCare -sensoren ville i modsætning til Texas Instruments SensorTag afbryde Bluetooth -forbindelsen efter et par sekunder. I betragtning af brugssagen synes dette dog ikke at være et problem, da det er ganske pålideligt til at reagere på forbindelsesforsøg. I betragtning af at en plante normalt ikke suger en liter vand inden for få minutter, men snarere dage, ser det ikke ud til at være nødvendigt at være forbundet hele tiden. Dette ville også tømme batteriet ret meget. Så jeg besluttede at tilføje en PluginTimer, som ville tilslutte sensoren igen hvert 20. minut og hente data fra den. Hvis sensoren af en eller anden grund ikke reagerer på forbindelsesforsøget, starter koden en anden timer, der forsøger at genoprette forbindelse hvert minut fra det tidspunkt, indtil den formår at få dataene. Derefter ville det gå tilbage for at hente data om intervallet på 20 minutter igen. Hvis enheden ikke opretter forbindelse to gange i træk (hvilket betyder, efter 20 + 1 minutter), vil den blive markeret offline i systemet, og brugeren kan blive advaret om det.

void DevicePluginFlowercare:: onPluginTimer () {foreach (FlowerCare *flowerCare, m_list) {if (--m_refreshMinutes [flowerCare] <= 0) {qCDebug (dcFlowerCare ()) << "Opfriskende" adresse (); flowerCare-> refreshData (); } ellers {qCDebug (dcFlowerCare ()) << "Ikke forfriskende" adresse () << "Næste opdatering om" << m_refreshMinutes [flowerCare] << "minutter"; } // Hvis vi havde 2 eller flere mislykkede forbindelsesforsøg, skal du markere det som frakoblet, hvis (m_refreshMinutes [flowerCare] <-2) {qCDebug (dcFlowerCare ()) << "Opdateringen mislykkedes for" << (m_refreshMinutes [flowerCare] * -1) <setStateValue (flowerCareConnectedStateTypeId, false); }}}

Med denne strategi syntes nymea nu at levere perfekt pålidelige data fra denne sensor.

Trin 4: Brug det i større sammenhæng

Brug det i større sammenhæng
Brug det i større sammenhæng
Brug det i større sammenhæng
Brug det i større sammenhæng

Bare det at få værdier fra sensoren er dog ikke så meget nyttig, jeg kunne også have brugt den originale app til det. Lad os nu gøre nogle smarte ting med det.

Nymea understøtter afsendelse af push -meddelelser, enten til telefoner med nymea: app installeret eller via PushBullet. Så den oplagte ting at gøre er at sende mig nogle push -notifikationer, når jordfugtigheden falder til under 15%. Det er ret let at konfigurere det i appen. Som forudsætning har du enten brug for en konto i nymea: cloud eller på PushBullet. For nymea: skybaserede push -notifikationer er det nok til at aktivere nymea: cloud på nymea: core og i nymea: app. Så snart begge er forbundet, vises der automatisk en meddelelse. For PushBullet tilføj en ny ting i systemet, du finder PushBullet på listen der. Det vil bede dig om den API -nøgle, du får, når du tilmelder dig PushBullet. Når du har en push -meddelelses ting i nymea, kan du oprette en regel.

Selvfølgelig kan du gøre hvad du vil … Kan også tænde noget lys for at afspejle sensorværdier, eller bruge HTTP -kommandor -plugin til f.eks. At sende sensorværdier til en server på internettet. Jeg har ikke en vandventil som kan styres digitalt (endnu), men selvfølgelig, hvis du har sådan noget, og det ikke er understøttet af nymea endnu, vil tilføjelse af et plugin til det være snarere ens end dette.

Trin 5: Luk ord

Afsluttende ord
Afsluttende ord

Flowercare -pluginet er nu blevet accepteret opstrøms, og hvis du har en af dem, er det klar til at blive brugt med nymea nu. Jeg håber dog, at denne artikel kan være af interesse, hvis nogen vil tilføje support til andre enheder. Det burde være en gennemgang om, hvordan du bygger dit eget plugin til nymea.

Hvis du bare vil bygge denne opsætning i dit hjem, er alt, hvad du behøver, FlowerCare -sensoren, en Raspberry Pi, nymea -community -billedet (det inkluderer plug -in til blomsterpleje nu) og nymea: app, der er tilgængelig i app -butikker. Også indtil videre er min Monstera Deliciosa glad igen, og som du måske har set på skærmbillederne, har jeg også fået mig en anden af disse sensorer til at spore mit citrontræs sundhed. Til den sender jeg mig selv push -besked, når det fryser udenfor, så jeg kan bringe det sikkert gennem vinteren.

Anbefalede: