Sommario:

FlowerCare e Nymea per salvare le mie piante: 5 passaggi
FlowerCare e Nymea per salvare le mie piante: 5 passaggi

Video: FlowerCare e Nymea per salvare le mie piante: 5 passaggi

Video: FlowerCare e Nymea per salvare le mie piante: 5 passaggi
Video: Questo COSO da 14€ ti dice in TEMPO REALE come SALVARE le tue PIANTE! 2024, Luglio
Anonim
FlowerCare e Nymea per salvare le mie piante
FlowerCare e Nymea per salvare le mie piante

Sporcarsi le mani collegando i sensori per la cura delle piante alla mia casa intelligente open source esistente. Una guida allo sviluppo di plugin per nymea.

La storia

Come molti altri armeggiatori e hacker, anch'io soffro del problema che l'hacking delle cose richiede così tanto del mio tempo che a volte mi dimentico di annaffiare le mie piante. Dopo che la mia Monstera Deliciosa ha sofferto ancora una volta di terreno arido, ho deciso di vedere se posso fare qualcosa per ricordarmi quando ha sete.

Una rapida ricerca sul web ha portato la mia attenzione sullo Xiaomi FlowerCare, noto anche come MiCare o PlantCare. È un dispositivo Bluetooth Low Energy e alcune ricerche di base hanno rivelato che il suo protocollo sembra essere abbastanza facile da capire. Sebbene Xiaomi non sembri fornire alcuna specifica pubblica, c'è stata ancora un po' di reverse engineering su Internet per questo dispositivo. Così ho deciso di ordinarne uno.

Pochi giorni dopo è stato consegnato e ovviamente ho iniziato a giocarci subito. Ho controllato brevemente l'app fornita con esso, ma come probabilmente puoi immaginare, utilizzarlo nella sua configurazione predefinita non è mai stato il mio piano. Ovviamente questo deve essere integrato con la mia configurazione di casa intelligente esistente. Come descritto anche qui, sto usando nymea come soluzione per la mia casa intelligente (Sì, puoi persino individuare il Monstera in una delle immagini lì:)). Purtroppo, nymea non supportava ancora quel sensore, quindi era necessario avviare un po' di IDE.

Passaggio 1: caricamento di uno stub del plug-in

Caricamento di uno stub del plugin
Caricamento di uno stub del plugin
Caricamento di uno stub del plugin
Caricamento di uno stub del plugin
Caricamento di uno stub del plugin
Caricamento di uno stub del plugin

Quindi la prima cosa che ho fatto è stata copiare il plug-in Texas Instruments Sensor Tag esistente, sembrava abbastanza simile a quello che pensavo dovesse funzionare anche per il dispositivo FlowerCare. Dopo la ridenominazione di base delle cose nel plugininfo.json e commentando la maggior parte del codice del plugin sensortag, ero pronto per caricare il nuovo stub del plugin.

Come previsto, la scoperta mostrerebbe già subito il sensore e mi consentirebbe di aggiungerlo al sistema. Ovviamente non produrrebbe alcun dato significativo a questo punto.

Passaggio 2: ricerca dei dati sul sensore

Ricerca di dati sul sensore
Ricerca di dati sul sensore

Come con qualsiasi dispositivo Bluetooth LE, la prima cosa che vuoi fare è informarti sui servizi che offre e sulle loro caratteristiche. Da qualche parte lì dentro i dati reali sono nascosti. Con una rapida stampa di debug che esegue il ciclo su tutti i servizi rilevati e stampa le loro caratteristiche, sono arrivato al punto in cui ho potuto confrontare le informazioni che ho trovato su Internet con ciò che il dispositivo riporta effettivamente.

void FlowerCare::onServiceDiscoveryFinished(){ BluetoothLowEnergyDevice *btDev = static_cast(sender()); qCDebug(dcFlowerCare()) << "disponi di uuid di servizio" controller()->createServiceObject(sensorServiceUuid, this); 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() < " << caratteristica.uuid().toString() << " (" << caratteristica.handle() << " Nome: " << caratteristica.nome() << "): " << caratteristica.valore() << ", " << caratteristica.valore().toHex(); foreach (const QLowEnergyDescriptor &descriptor, caratteristica.descriptors()) { qCDebug(dcFlowerCare()).nospace() < " << descriptor.uuid().toString() << " (" << descriptor.handle() << " Nome: " << descriptor.name() << "): " << descriptor.value() << ", " << descriptor.value().toHex(); } } }

La versione del firmware e il livello della batteria erano facili. Potevo già vedere i valori corrispondenti stampati in questo primissimo tentativo di elencare i dati. I valori effettivi del sensore sono nascosti un po' più in profondità, ma combinandoli con i dati da Internet ha subito indicato dove trovarlo e soprattutto come leggerlo.

void FlowerCare::onSensorServiceCharacteristicRead(const QLowEnergyCharacteristic &characteristic, const QByteArray &value){ qCDebug(dcFlowerCare()) << "Lettura caratteristica" << QString::number(characteristic.handle(), 16) temp; qint8 salta; flusso >> salta; quint32 lux; flusso >> lux; qint8 umidità; flusso >> umidità; qint16 fertilità; ruscello >> fertilità; emetti finito (m_batteryLevel, 1.0 * temp / 10, lux, umidità, fertilità); }

Mettendo insieme questo, il plugin ha già iniziato a produrre dati significativi.

Passaggio 3: ritocchi finali

Finiture
Finiture

Quindi fondamentalmente ha funzionato ora, tuttavia, un problema era ancora rimasto lì. Il sensore FlowerCare, contrariamente al SensorTag di Texas Instruments, interromperebbe la connessione Bluetooth dopo pochi secondi. Considerando il caso d'uso, tuttavia, questo non sembra essere un problema in quanto è abbastanza affidabile nel rispondere ai tentativi di connessione. Dato che normalmente una pianta non aspira un litro d'acqua in pochi minuti, ma in giorni, non sembra necessario rimanere sempre connessi. Anche questo consumerebbe parecchio la batteria. Quindi ho deciso di aggiungere un PluginTimer che riconnettesse il sensore ogni 20 minuti e recuperasse i dati da esso. Se, per qualche motivo, il sensore non rispondesse al tentativo di connessione, il codice avvierà un altro timer che tenterà di riconnettersi ogni minuto da quel momento in poi fino a quando non riesce a ottenere i dati. Quindi tornerà a recuperare nuovamente i dati nell'intervallo di 20 minuti. Se il dispositivo non riesce a connettersi due volte di seguito (ovvero, dopo 20 + 1 minuti), verrà contrassegnato offline nel sistema e l'utente può essere avvisato.

void DevicePluginFlowercare::onPluginTimer(){ foreach (FlowerCare *flowerCare, m_list) { if (--m_refreshMinutes[flowerCare] <= 0) { qCDebug(dcFlowerCare()) << "Refreshing" address(); flowerCare->refreshData(); } else { qCDebug(dcFlowerCare()) << Indirizzo "Non aggiornato"() << " Prossimo aggiornamento tra" << m_refreshMinutes[flowerCare] << "minuti"; } // Se abbiamo avuto 2 o più tentativi di connessione falliti, contrassegnalo come disconnesso if (m_refreshMinutes[flowerCare] < -2) { qCDebug(dcFlowerCare()) << "Impossibile aggiornare per"<< (m_refreshMinutes[flowerCare] * -1) <setStateValue(flowerCareConnectedStateTypeId, false); } } }

Con questa strategia nymea ora sembrava fornire dati perfettamente affidabili da questo sensore.

Passaggio 4: utilizzarlo in un contesto più ampio

Usarlo in un contesto più ampio
Usarlo in un contesto più ampio
Usarlo in un contesto più ampio
Usarlo in un contesto più ampio

Anche solo ottenere i valori dal sensore non è molto utile, avrei anche potuto usare l'app originale per quello. Ora facciamo alcune cose intelligenti con esso.

Nymea supporta l'invio di notifiche push, sia ai telefoni con nymea:app installata, sia tramite PushBullet. Quindi la cosa più ovvia da fare è inviarmi alcune notifiche push ogni volta che l'umidità del suolo scende al di sotto del 15%. È piuttosto facile configurarlo nell'app. Come prerequisito hai bisogno di un account in nymea:cloud o su PushBullet. Per le notifiche push basate su nymea:cloud è sufficiente abilitare nymea:cloud su nymea:core e in nymea:app. Non appena entrambi sono collegati, apparirà automaticamente una notifica. Per PushBullet aggiungi una nuova cosa nel sistema, troverai PushBullet nell'elenco lì. Ti chiederà la chiave API che ottieni quando ti registri con PushBullet. Una volta che hai una notifica push in nymea, puoi creare una regola.

Ovviamente puoi fare qualsiasi altra cosa tu voglia… Può anche accendere un po' di luce per riflettere i valori del sensore, o usare il plugin del commander HTTP per inviare i valori del sensore a un server su Internet, ad esempio. Non ho una valvola per l'acqua che può essere controllato digitalmente (ancora) ma ovviamente, se hai una cosa del genere e non è ancora supportata da nymea, aggiungere un plug-in sarebbe piuttosto simile a questo.

Passaggio 5: parole di chiusura

Parole di chiusura
Parole di chiusura

Il plugin flowercare è stato accettato a monte ormai e se ne hai uno è pronto per essere usato con nymea ora. Tuttavia, spero che questo articolo possa essere di interesse se qualcuno desidera aggiungere il supporto per altri dispositivi. Dovrebbe essere una guida dettagliata su come creare il proprio plugin per nymea.

Se vuoi semplicemente creare questa configurazione a casa tua, tutto ciò di cui hai bisogno è il sensore FlowerCare, un Raspberry Pi, l'immagine della community nymea (che ora include il plug-in per la cura dei fiori) e nymea: app che è disponibile negli app store. Inoltre, finora la mia Monstera Deliciosa è di nuovo felice e come potresti aver visto negli screenshot, mi sono procurato un secondo di quei sensori per monitorare anche la salute del mio albero di limoni. Per quello mi invio una notifica push ogni volta che fuori fa freddo così posso portarlo in sicurezza durante l'inverno.

Consigliato: