Innholdsfortegnelse:

FlowerCare og Nymea for å redde plantene mine: 5 trinn
FlowerCare og Nymea for å redde plantene mine: 5 trinn

Video: FlowerCare og Nymea for å redde plantene mine: 5 trinn

Video: FlowerCare og Nymea for å redde plantene mine: 5 trinn
Video: Irrigazione domotica fai da te con Home Assistant e ESP 2024, November
Anonim
FlowerCare og Nymea for å redde plantene mine
FlowerCare og Nymea for å redde plantene mine

Å bli skitten på å koble plantesorgssensorer til mitt eksisterende åpen kildekode -smarthjem. En gjennomgang av plugin -utvikling for nymea.

Historien

Som mange andre tinkerers og hackere, lider jeg også av problemet med at hacking på ting tar så mye av tiden min at jeg noen ganger glemmer å vanne plantene mine. Etter at Monstera Deliciosa igjen led av tørr jord, bestemte jeg meg for å se om jeg kan gjøre noe med det for å minne meg på når det er tørst.

En rask undersøkelse på nettet vekket min oppmerksomhet på Xiaomi FlowerCare, også kjent som MiCare eller PlantCare. Det er en Bluetooth Low Energy -enhet, og noen grunnleggende undersøkelser viste at protokollen ser ut til å være ganske lett å forstå. Selv om Xiaomi ikke ser ut til å gi noen offentlige spesifikasjoner, har det vært ganske mye reverse engineering på internett for denne enheten ennå. Så jeg bestemte meg for å bestille en av dem.

Noen dager senere ble den levert, og jeg begynte selvfølgelig å leke med den med en gang. Jeg sjekket kort ut appen som følger med, men som du sikkert kan gjette, var det aldri planen min å bruke den i standardoppsettet. Selvfølgelig må dette integreres med mitt eksisterende smarthusoppsett. Som beskrevet her bruker jeg nymea som min smarthusløsning (Ja, du kan til og med se Monstera på et av bildene der:)). Dessverre støttet nymea ikke den sensoren ennå, så det var på sin plass å fyre opp noen IDE.

Trinn 1: Få en pluginstubbe lastet

Få en pluginstubbe lastet
Få en pluginstubbe lastet
Få en pluginstubbe lastet
Få en pluginstubbe lastet
Få en pluginstubbe lastet
Få en pluginstubbe lastet

Så det første jeg gjorde var å kopiere den eksisterende Texas Instruments Sensor Tag -pluginen, den virket lik nok til det jeg antok skulle fungere for FlowerCare -enheten også. Etter den grunnleggende omdøpet av ting i plugininfo.json og kommenterte bort det meste av sensortag -plugin -koden, var jeg klar til å laste den nye plugin -stubben.

Som forventet vil oppdagelsen allerede vise sensoren med en gang og tillate meg å legge den til systemet. Selvfølgelig ville det ikke produsere noen meningsfylte data på dette tidspunktet.

Trinn 2: Finne data på sensoren

Finne data på sensoren
Finne data på sensoren

Som med alle Bluetooth LE -enheter, er det første du vil gjøre å finne ut om tjenestene den tilbyr og deres egenskaper. Et sted der inne er de faktiske dataene skjult. Med en rask feilsøkingsutskrift sløyfe over alle de oppdagede tjenestene og skrive ut deres egenskaper, var jeg på det tidspunktet hvor jeg kunne sammenligne informasjonen jeg fant på internett med det enheten faktisk rapporterer.

void FlowerCare:: onServiceDiscoveryFinished () {BluetoothLowEnergyDevice *btDev = static_cast (sender ()); qCDebug (dcFlowerCare ()) << "har service uuids" controller ()-> createServiceObject (sensorServiceUuid, dette); connect (m_sensorService, & QLowEnergyService:: stateChanged, this, & FlowerCare:: onSensorServiceStateChanged); connect (m_sensorService, & QLowEnergyService:: karakteristiskLes, dette, og FlowerCare:: onSensorServiceCharacteristicRead); m_sensorService-> discoverDetails (); } void FlowerCare:: onSensorServiceStateChanged (const QLowEnergyService:: ServiceSate & state) {if (state! = QLowEnergyService:: ServiceDiscovered) {return; } foreach (const QLowEnergyCharacteristic & characterizing, m_sensorService-> features ()) {qCDebug (dcFlowerCare ()). nospace () <"<< karakteristisk.uuid (). toString () <<" ("<< karakteristisk.håndtak () << "Navn:" << karakteristisk.navn () << "):" << karakteristisk.verdi () << "," << karakteristisk.verdi (). ToHex (); foreach (const QLowEnergyDescriptor & descriptor, karakteristisk.descriptors ()) {qCDebug (dcFlowerCare ()). nospace () <"<< descriptor.uuid (). toString () <<" ("<< descriptor.handle () <<" Name: "<< descriptor.name () << "):" << descriptor.value () << "," << descriptor.value (). toHex (); }}}

Fastvareversjonen og batterinivået var enkelt. Jeg kunne allerede se de tilsvarende verdiene trykt i dette aller første forsøket på å liste opp dataene. De faktiske sensorverdiene er skjult litt dypere der inne, men å kombinere den med dataene fra internett påpekte umiddelbart hvor du skal finne den og spesielt hvordan du kan lese den.

void FlowerCare:: onSensorServiceCharacteristicRead (const QLowEnergyCharacteristic & characteristic, const QByteArray & value) {qCDebug (dcFlowerCare ()) << "Characteristic read" << QString:: number (character.handle (), 16) temp; qint8 hoppe; strøm >> hopp; quint32 lux; strøm >> lux; qint8 fuktighet; strøm >> fuktighet; qint16 fruktbarhet; strøm >> fruktbarhet; avgir ferdig (m_batteryLevel, 1,0 * temp / 10, lux, fuktighet, fruktbarhet); }

Ved å sette dette sammen begynte pluginet allerede å produsere meningsfylte data.

Trinn 3: Etterbehandling

Finpuss
Finpuss

Så det fungerte i utgangspunktet nå, men et problem var fortsatt der. FlowerCare -sensoren ville, i motsetning til Texas Instruments SensorTag, avbryte Bluetooth -tilkoblingen etter noen få sekunder. Med tanke på brukstilfellet ser dette imidlertid ikke ut til å være et problem, da det er ganske pålitelig når det gjelder å svare på tilkoblingsforsøk. Gitt at en plante vanligvis ikke suger opp en liter vann i løpet av minutter, men heller dager, virker det ikke nødvendig å være tilkoblet hele tiden. Dette vil også tappe batteriet ganske mye. Så jeg bestemte meg for å legge til en PluginTimer som vil koble sensoren til igjen hvert 20. minutt og hente data fra den. Hvis sensoren av en eller annen grunn ikke reagerer på tilkoblingsforsøket, starter koden en annen timer som prøver å koble til igjen hvert minutt fra det tidspunktet til den klarer å hente dataene. Deretter vil den gå tilbake for å hente data om 20 -minuttersintervallet igjen. Hvis enheten ikke klarer å koble til to ganger på rad (det vil si etter 20 + 1 minutter), vil den bli merket frakoblet i systemet, og brukeren kan varsles om det.

void DevicePluginFlowercare:: onPluginTimer () {foreach (FlowerCare *flowerCare, m_list) {if (--m_refreshMinutes [flowerCare] <= 0) {qCDebug (dcFlowerCare ()) << "Refreshing" adresse (); flowerCare-> refreshData (); } annet {qCDebug (dcFlowerCare ()) << "Ikke forfriskende" adresse () << "Neste oppdatering om" << m_refreshMinutes [flowerCare] << "minutter"; } // Hvis vi hadde 2 eller flere mislykkede tilkoblingsforsøk, merker du det som frakoblet hvis (m_refreshMinutes [flowerCare] <-2) {qCDebug (dcFlowerCare ()) << "Kunne ikke oppdatere for" << (m_refreshMinutes [flowerCare] * -1) <setStateValue (flowerCareConnectedStateTypeId, false); }}}

Med denne strategien syntes nymea nå å levere helt pålitelige data fra denne sensoren.

Trinn 4: Bruk den i større sammenheng

Bruker det i større sammenheng
Bruker det i større sammenheng
Bruker den i større sammenheng
Bruker den i større sammenheng

Bare det å få verdier fra sensoren er ikke så nyttig, men jeg kunne også ha brukt den originale appen til det. La oss gjøre noen smarte ting med det.

Nymea støtter sending av push -varsler, enten til telefoner med nymea: app installert, eller via PushBullet. Så den åpenbare tingen å gjøre er å sende meg noen push -varsler når jordfuktigheten faller under 15%. Det er ganske enkelt å sette det opp i appen. Som en forutsetning trenger du enten en konto i nymea: cloud eller på PushBullet. For nymea: skybaserte push -varsler er det nok til å aktivere nymea: cloud på nymea: core og i nymea: app. Så snart begge er tilkoblet, vil det automatisk vises en varsling. For PushBullet, legg til en ny ting i systemet, du finner PushBullet på listen der. Det vil be deg om API -nøkkelen du får når du registrerer deg med PushBullet. Når du har en push -varsling i nymea, kan du opprette en regel.

Selvfølgelig kan du gjøre hva du vil … Kan også slå på noe lys for å reflektere sensorverdier, eller bruke HTTP -kommandor -pluginet for å legge sensorverdier til en server på internett for eksempel. Jeg har ikke en vannventil som kan styres digitalt (ennå), men selvfølgelig, hvis du har noe slikt og det ikke er støttet av nymea ennå, vil det å legge til et plugin for det være ganske likt enn dette.

Trinn 5: Avsluttende ord

Avsluttende ord
Avsluttende ord

Flowercare -pluginet har blitt akseptert oppstrøms nå, og hvis du har en av dem, er den klar til bruk med nymea nå. Imidlertid håper jeg denne artikkelen kan være av interesse hvis noen vil legge til støtte for andre enheter. Det bør være en gjennomgang om hvordan du bygger ditt eget plugin for nymea.

Hvis du bare vil bygge dette oppsettet hjemme, trenger du bare FlowerCare -sensoren, en Raspberry Pi, nymea community -bildet (det inkluderer plugin for blomsterpleie nå) og nymea: app som er tilgjengelig i appbutikker. Også, så langt er Monstera Deliciosa min lykkelig igjen, og som du kanskje har sett på skjermbildene, har jeg skaffet meg en annen av disse sensorene for å spore helsen til sitrontreet mitt også. For den sender jeg meg selv pushvarsling når det fryser ute, så jeg kan ta det trygt gjennom vinteren.

Anbefalt: