Innehållsförteckning:

FlowerCare och Nymea för att rädda mina växter: 5 steg
FlowerCare och Nymea för att rädda mina växter: 5 steg

Video: FlowerCare och Nymea för att rädda mina växter: 5 steg

Video: FlowerCare och Nymea för att rädda mina växter: 5 steg
Video: ACELE EDİN,VAKTİ GEÇİYOR! NERGİS BAKIMI VE ÇOĞALTILMASI, NERGİS SOĞANI, NERGİS SOĞANI NASIL DİKİLİR 2024, Juli
Anonim
FlowerCare och Nymea för att rädda mina växter
FlowerCare och Nymea för att rädda mina växter

Får smutsiga händer när jag ansluter växtvårdssensorer till mitt befintliga smarta hem med öppen källkod. En genomgång om plugin -utveckling för nymea.

Berättelsen

Som många andra pysslare och hackare lider jag också av problemet att hacka på saker tar så mycket av min tid att jag ibland glömmer att vattna mina växter. Efter att min Monstera Deliciosa återigen led av torr jord, bestämde jag mig för att se om jag kan göra något åt det för att påminna mig när det är törstigt.

En snabb forskning på webben uppmärksammade Xiaomi FlowerCare, även känd som MiCare eller PlantCare. Det är en Bluetooth Low Energy -enhet och en del grundläggande forskning visade att dess protokoll verkar vara ganska lätt att förstå. Även om Xiaomi inte verkar ge några offentliga specifikationer, har det varit ganska lite omvänd teknik på internet för den här enheten än. Så jag bestämde mig för att beställa en av dem.

Några dagar senare levererades det och jag började naturligtvis leka med det direkt. Jag kollade kort på appen som följer med, men som du säkert kan gissa var det aldrig min plan att använda den i standardinställningen. Naturligtvis måste detta integreras med min befintliga installation av smarta hem. Som beskrivs här använder jag nymea som min smarta hemlösning (Ja, du kan till och med se Monstera på en av bilderna där:)). Tyvärr stödde nymea inte den sensorn ännu, så det var på sin plats att elda upp lite IDE.

Steg 1: Ladda en plugin -plugg

Att ladda ett plugin -stopp
Att ladda ett plugin -stopp
Att ladda ett plugin -stopp
Att ladda ett plugin -stopp
Att ladda en plugin -plugg
Att ladda en plugin -plugg

Så det första jag gjorde var att kopiera det befintliga pluginprogrammet för Texas Instruments Sensor Tag, det verkade tillräckligt likt det jag antog skulle fungera även för FlowerCare -enheten. Efter det grundläggande namnet på saker i plugininfo.json och kommenterade bort det mesta av sensortag -pluginens kod var jag redo att ladda den nya plugin -stubben.

Som förväntat skulle upptäckten redan visa sensorn direkt och tillåta mig att lägga till den i systemet. Naturligtvis skulle det inte ge några meningsfulla data vid denna tidpunkt.

Steg 2: Hitta data på sensorn

Hitta data på sensorn
Hitta data på sensorn

Som med alla andra Bluetooth LE -enheter är det första du vill göra att ta reda på vilka tjänster den erbjuder och deras egenskaper. Någonstans där inne är de faktiska uppgifterna dolda. Med ett snabbt felsökningsutskrift över alla upptäckta tjänster och utskrift av deras egenskaper var jag på den punkt där jag kunde jämföra informationen jag hittade på internet med vad enheten faktiskt rapporterar.

void FlowerCare:: onServiceDiscoveryFinished () {BluetoothLowEnergyDevice *btDev = static_cast (sender ()); qCDebug (dcFlowerCare ()) << "har serviceuuider" controller ()-> createServiceObject (sensorServiceUuid, detta); connect (m_sensorService, & QLowEnergyService:: stateChanged, this, & FlowerCare:: onSensorServiceStateChanged); connect (m_sensorService, & QLowEnergyService:: characteristicRead, 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 () <"<< character.uuid (). toString () <<" ("<< character.handle () << "Namn:" << karakteristisk.namn () << "):" << karakteristisk.värde () << "," << karakteristisk.värde (). ToHex (); föreach (const QLowEnergyDescriptor & descriptor, karakteristisk.descriptors ()) {qCDebug (dcFlowerCare ()). nospace () <"<< descriptor.uuid (). toString () <<" ("<< descriptor.handle () <<" Namn: "<< descriptor.name () << "):" << descriptor.value () << "," << descriptor.value (). toHex (); }}}

Firmwareversionen och batterinivån var enkla. Jag kunde redan se de motsvarande värdena tryckta i detta allra första försök att lista uppgifterna. De faktiska sensorvärdena är dolda lite djupare där inne, men att kombinera det med data från internet påpekade omedelbart var man kan hitta det och särskilt hur man läser det.

void FlowerCare:: onSensorServiceCharacteristicRead (const QLowEnergyCharacteristic & characterist, const QByteArray & value) {qCDebug (dcFlowerCare ()) << "Characteristic read" << QString:: number (character.handle (), 16) temp; qint8 hoppa; ström >> hoppa över; quint32 lux; ström >> lux; qint8 fukt; ström >> fukt; qint16 fertilitet; ström >> fertilitet; avge färdigt (m_batteryLevel, 1,0 * temp / 10, lux, fukt, fertilitet); }

Genom att sätta ihop detta började pluginet redan producera meningsfulla data.

Steg 3: Finisher

Finputsning
Finputsning

Så det fungerade i princip nu, men en fråga var fortfarande kvar där. FlowerCare -sensorn skulle, i motsats till Texas Instruments SensorTag, avbryta Bluetooth -anslutningen efter några sekunder. Med tanke på användningsfallet verkar det dock inte vara ett problem eftersom det är ganska tillförlitligt när det gäller att svara på anslutningsförsök. Med tanke på att en växt normalt inte suger upp en liter vatten inom några minuter, utan snarare dagar, verkar det inte nödvändigt att hålla kontakten hela tiden. Detta skulle också tömma batteriet ganska mycket. Så jag bestämde mig för att lägga till en PluginTimer som skulle ansluta sensorn igen var 20: e minut och hämta data från den. Om sensorn av någon anledning inte skulle svara på anslutningsförsöket, startar koden en annan timer som försöker återansluta varje minut från den punkten tills den lyckas få data. Sedan skulle det gå tillbaka för att hämta data om 20 minuters intervall igen. Om enheten misslyckas med att ansluta två gånger i rad (det vill säga efter 20 + 1 minuter), skulle den markeras offline i systemet och användaren kan varnas om det.

void DevicePluginFlowercare:: onPluginTimer () {foreach (FlowerCare *flowerCare, m_list) {if (--m_refreshMinutes [flowerCare] <= 0) {qCDebug (dcFlowerCare ()) << "Refreshing" -adress (); flowerCare-> refreshData (); } annat {qCDebug (dcFlowerCare ()) << "Uppfriskar inte" -adress () << "Nästa uppdatering om" << m_refreshMinutes [flowerCare] << "minuter"; } // Om vi hade två eller flera misslyckade anslutningsförsök, markera det som bortkopplat om (m_refreshMinutes [flowerCare] <-2) {qCDebug (dcFlowerCare ()) << "Det gick inte att uppdatera för" << (m_refreshMinutes [flowerCare] * -1) <setStateValue (flowerCareConnectedStateTypeId, false); }}}

Med denna strategi tycktes nymea nu leverera perfekt tillförlitliga data från denna sensor.

Steg 4: Använda det i större sammanhang

Använd det i större sammanhang
Använd det i större sammanhang
Använd det i större sammanhang
Använd det i större sammanhang

Att bara få värden från sensorn är inte så mycket användbart, men jag kunde också ha använt den ursprungliga appen för det. Låt oss nu göra några smarta saker med det.

Nymea stöder att skicka push -meddelanden, antingen till telefoner med nymea: app installerad eller via PushBullet. Så det uppenbara är att skicka mig några push -meddelanden när jordfuktigheten faller under 15%. Det är ganska enkelt att ställa in det i appen. Som en förutsättning behöver du antingen ett konto i nymea: cloud eller på PushBullet. För nymea: molnbaserade push -meddelanden är det tillräckligt för att aktivera nymea: cloud på nymea: core och i nymea: app. Så snart båda är anslutna visas en avisering automatiskt. För att PushBullet lägger till en ny sak i systemet, hittar du PushBullet i listan där. Det kommer att be dig om API -nyckeln du får när du registrerar dig med PushBullet. När du väl har en push -anmälan i nymea kan du skapa en regel.

Självklart kan du göra vad du vill … Kan också tända lite ljus för att återspegla sensorvärden, eller använda HTTP -kommandon -plugin för att posta sensorvärden till en server på internet till exempel. Jag har ingen vattenventil som kan styras digitalt (ännu) men naturligtvis, om du har en sådan sak och det inte stöds av nymea än, skulle ett plugin för det vara ganska lika än detta.

Steg 5: Avslutande ord

Avslutande ord
Avslutande ord

Flowercare -plugin har nu accepterats uppströms och om du har en av dem är den redo att användas med nymea nu. Jag hoppas dock att den här artikeln kan vara av intresse om någon vill lägga till stöd för andra enheter. Det borde vara en genomgång om hur du bygger ditt eget plugin för nymea.

Om du bara vill bygga den här installationen hemma är allt du behöver är FlowerCare -sensorn, en Raspberry Pi, nymea -communitybilden (den innehåller blomma vård -plugin nu) och nymea: app som finns i appbutiker. Än så länge är min Monstera Deliciosa glad igen och som du kanske har sett på skärmdumparna har jag skaffat mig en andra av dessa sensorer för att spåra hälsan på mitt citronträd också. För den skickar jag mig push -meddelande när det fryser ute så att jag kan ta det genom vintern på ett säkert sätt.

Rekommenderad: