Inhoudsopgave:

FlowerCare en Nymea om mijn planten te redden - Ajarnpa
FlowerCare en Nymea om mijn planten te redden - Ajarnpa

Video: FlowerCare en Nymea om mijn planten te redden - Ajarnpa

Video: FlowerCare en Nymea om mijn planten te redden - Ajarnpa
Video: Renskes Pratende Sensor om uitgedroogde planten te redden. 2024, November
Anonim
FlowerCare en Nymea om mijn planten te redden
FlowerCare en Nymea om mijn planten te redden

Handen vuil maken bij het aansluiten van plantenverzorgingssensoren op mijn bestaande open source smart home. Een overzicht van de ontwikkeling van plug-ins voor nymea.

Het verhaal

Net als veel andere knutselaars en hackers, heb ik ook last van het probleem dat het hacken van dingen zoveel van mijn tijd in beslag neemt dat ik af en toe vergeet mijn planten water te geven. Nadat mijn Monstera Deliciosa weer last had van droge grond, heb ik besloten om te kijken of ik er iets aan kan doen om me eraan te herinneren wanneer hij dorst heeft.

Een snel onderzoek op het web bracht mijn aandacht op de Xiaomi FlowerCare, ook wel bekend als MiCare of PlantCare. Het is een Bluetooth Low Energy-apparaat en wat basisonderzoek heeft uitgewezen dat het protocol vrij eenvoudig te begrijpen lijkt. Hoewel Xiaomi geen openbare specificaties lijkt te bieden, is er op internet nog behoorlijk wat reverse-engineering voor dit apparaat geweest. Dus besloot ik er een te bestellen.

Een paar dagen later werd het bezorgd en natuurlijk begon ik er meteen mee te spelen. Ik heb even de app bekeken die erbij hoort, maar zoals je waarschijnlijk wel kunt raden, was het nooit mijn plan om het in de standaardconfiguratie te gebruiken. Dit moet natuurlijk worden geïntegreerd met mijn bestaande smart home-opstelling. Zoals ook hier beschreven, gebruik ik nymea als mijn smart home-oplossing (Ja, je kunt de Monstera zelfs op een van de foto's daar zien:)). Helaas ondersteunde nymea die sensor nog niet, dus het opstarten van wat IDE was in orde.

Stap 1: Een plug-in-stub laden

Een plug-in-stub laden
Een plug-in-stub laden
Een plug-in-stub laden
Een plug-in-stub laden
Een plug-in-stub laden
Een plug-in-stub laden

Dus het eerste wat ik deed, was de bestaande Texas Instruments Sensor Tag-plug-in kopiëren, het leek voldoende op wat ik aannam dat ook voor het FlowerCare-apparaat zou moeten werken. Na het hernoemen van dingen in de plugininfo.json en het wegwerken van de meeste code van de sensortag-plug-in, was ik klaar om de nieuwe plug-in-stub te laden.

Zoals verwacht, zou de ontdekking de sensor al meteen laten zien en me in staat stellen om deze aan het systeem toe te voegen. Natuurlijk zou het op dit moment geen zinvolle gegevens opleveren.

Stap 2: Gegevens zoeken op de sensor

Gegevens zoeken op de sensor
Gegevens zoeken op de sensor

Zoals bij elk Bluetooth LE-apparaat, is het eerste wat u wilt doen te weten komen over de aangeboden diensten en hun kenmerken. Ergens daarin zijn de feitelijke gegevens verborgen. Met een snelle debug-afdruk die alle ontdekte services doorloopt en hun kenmerken afdrukt, was ik op het punt waar ik de informatie die ik op internet vond, kon vergelijken met wat het apparaat daadwerkelijk rapporteert.

ongeldig FlowerCare::onServiceDiscoveryFinished(){ BluetoothLowEnergyDevice *btDev = static_cast(sender()); qCDebug(dcFlowerCare()) << "service uuids hebben" controller()->createServiceObject(sensorServiceUuid, dit); 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 &characteristic, m_sensorService->characteristics()) { qCDebug(dcFlowerCare()).nospace() < " << karakteristieke.uuid().toString() << " (" << karakteristieke.handle() << " Naam: " << kenmerk.naam() << "): " << kenmerk.waarde() << ", " << kenmerk.waarde().toHex(); foreach (const QLowEnergyDescriptor &descriptor, kenmerk.descriptors()) { qCDebug(dcFlowerCare()).nospace() < " << descriptor.uuid().toString() << " (" << descriptor.handle() << " Naam: " << descriptor.name() << "): " << descriptor.value() << ", " << descriptor.value().toHex(); } } }

De firmwareversie en het batterijniveau waren eenvoudig. Ik kon de overeenkomstige waarden al zien afgedrukt in deze allereerste poging om de gegevens op te sommen. De werkelijke sensorwaardes zitten daar wat dieper in verstopt, maar door deze te combineren met de data van internet werd meteen duidelijk waar ze te vinden waren en vooral hoe ze te lezen.

void FlowerCare::onSensorServiceCharacteristicRead(const QLowEnergyCharacteristic &characteristic, const QByteArray &value){ qCDebug(dcFlowerCare()) << "Karakteristiek gelezen" << QString::number(characteristic.handle(), 16) temp; qint8 overslaan; streamen >> overslaan; quint32 lux; stroom >> lux; qint8 vocht; stroom >> vocht; qint16 vruchtbaarheid; stroom >> vruchtbaarheid; uitstoten afgewerkt (m_batteryLevel, 1.0 * temp / 10, lux, vocht, vruchtbaarheid); }

Door dit samen te voegen, begon de plug-in al zinvolle gegevens te produceren.

Stap 3: Afwerking

Afwerking
Afwerking

Dus het werkte nu in principe, maar er was nog steeds een probleem. De FlowerCare-sensor zou, in tegenstelling tot de Texas Instruments SensorTag, na enkele seconden de Bluetooth-verbinding wegvallen. Gezien de use-case lijkt dit echter geen probleem te zijn, omdat het behoorlijk betrouwbaar is in het reageren op verbindingspogingen. Aangezien een plant normaal gesproken geen liter water opzuigt binnen enkele minuten, maar dagen, lijkt het niet nodig om constant verbonden te blijven. Ook zou dit de batterij behoorlijk leegtrekken. Dus besloot ik een PluginTimer toe te voegen die de sensor elke 20 minuten opnieuw zou verbinden en er gegevens van zou ophalen. Als de sensor om de een of andere reden niet reageert op de verbindingspoging, start de code een andere timer die vanaf dat moment elke minuut opnieuw verbinding probeert te maken totdat het erin slaagt de gegevens te krijgen. Dan zou het teruggaan om opnieuw gegevens op te halen over het interval van 20 minuten. Als het apparaat twee keer achter elkaar geen verbinding kan maken (dat wil zeggen, na 20 + 1 minuut), wordt het in het systeem als offline gemarkeerd en kan de gebruiker hierover worden gewaarschuwd.

void DevicePluginFlowercare::onPluginTimer(){ foreach (FlowerCare *flowerCare, m_list) { if (--m_refreshMinutes[flowerCare] <= 0) { qCDebug(dcFlowerCare()) << "Vernieuwend" adres(); flowerCare->refreshData(); } else { qCDebug(dcFlowerCare()) << "Niet vernieuwend" adres() << " Volgende verversen over" << m_refreshMinutes[flowerCare] << "minuten"; } // Als we 2 of meer mislukte verbindingspogingen hebben gehad, markeer deze dan als verbroken if (m_refreshMinutes[flowerCare] < -2) { qCDebug(dcFlowerCare()) << "Kan niet vernieuwen voor"<< (m_refreshMinutes[flowerCare] * -1) <setStateValue(flowerCareConnectedStateTypeId, false); } } }

Met deze strategie leek nymea nu perfect betrouwbare gegevens van deze sensor te leveren.

Stap 4: Gebruik het in de grotere context

Het gebruiken in de grotere context
Het gebruiken in de grotere context
Het gebruiken in de grotere context
Het gebruiken in de grotere context

Alleen waarden van de sensor krijgen is echter niet zo handig, daar had ik ook de originele app voor kunnen gebruiken. Laten we er nu wat slimme dingen mee doen.

Nymea ondersteunt het verzenden van pushmeldingen, hetzij naar telefoons waarop nymea:app is geïnstalleerd, hetzij via PushBullet. Het ligt dus voor de hand om mezelf enkele pushmeldingen te sturen wanneer het bodemvocht onder de 15% daalt. Het is vrij eenvoudig om dat in de app in te stellen. Als voorwaarde heb je ofwel een account nodig in nymea:cloud of op PushBullet. Voor op nymea:cloud gebaseerde pushmeldingen is het voldoende om nymea:cloud in te schakelen op de nymea:core en in nymea:app. Zodra beide zijn verbonden, verschijnt er automatisch een melding. Voor PushBullet iets nieuws toevoegen in het systeem, daar vind je PushBullet in de lijst. Het zal u vragen om de API-sleutel die u krijgt wanneer u zich aanmeldt bij PushBullet. Zodra je een pushmelding hebt in nymea, kun je een regel maken.

Je kunt natuurlijk doen wat je nog meer wilt… Je kunt ook wat licht aanzetten om sensorwaarden weer te geven, of de HTTP-commander-plug-in gebruiken om bijvoorbeeld sensorwaarden naar een server op internet te posten. Ik heb geen waterklep die (nog) digitaal kan worden bestuurd, maar natuurlijk, als je zoiets hebt en het wordt nog niet ondersteund door nymea, zou het toevoegen van een plug-in vrij gelijkaardig zijn dan dit.

Stap 5: Slotwoorden

Slotwoorden
Slotwoorden

De plug-in voor bloemenverzorging is inmiddels upstream geaccepteerd en als je er een hebt, is deze nu klaar om te worden gebruikt met nymea. Ik hoop echter dat dit artikel van belang kan zijn als iemand ondersteuning voor andere apparaten wil toevoegen. Het zou een uitleg moeten zijn over hoe u uw eigen plug-in voor nymea kunt bouwen.

Als je deze opstelling gewoon bij je thuis wilt bouwen, heb je alleen de FlowerCare-sensor, een Raspberry Pi, de nymea-gemeenschapsafbeelding (deze bevat nu de plug-in voor bloemenverzorging) en nymea:app nodig die beschikbaar is in app-winkels. Tot nu toe is mijn Monstera Deliciosa weer gelukkig en zoals je misschien in de screenshots hebt gezien, heb ik mezelf een tweede van die sensoren gegeven om ook de gezondheid van mijn citroenboom te volgen. Daarvoor stuur ik mezelf een pushbericht als het buiten vriest, zodat ik hem veilig de winter door kan komen.

Aanbevolen: