Tabla de contenido:

FlowerCare y Nymea para rescatar mis plantas: 5 pasos
FlowerCare y Nymea para rescatar mis plantas: 5 pasos

Video: FlowerCare y Nymea para rescatar mis plantas: 5 pasos

Video: FlowerCare y Nymea para rescatar mis plantas: 5 pasos
Video: Consejos para revivir anturios marchitos | Cómo cultivar anturio rojo 2024, Mes de julio
Anonim
FlowerCare y Nymea para rescatar mis plantas
FlowerCare y Nymea para rescatar mis plantas

Ensuciarme las manos al conectar sensores de cuidado de plantas a mi hogar inteligente de código abierto existente. Un tutorial sobre el desarrollo de complementos para nymea.

La historia

Como muchos otros manipuladores y piratas informáticos, también estoy sufriendo el problema de que piratear cosas me ocupa tanto tiempo que de vez en cuando me olvido de regar mis plantas. Después de que mi Monstera Deliciosa volviera a sufrir de suelo seco, decidí ver si podía hacer algo al respecto para recordarme cuando tengo sed.

Una rápida búsqueda en la web me llamó la atención sobre Xiaomi FlowerCare, también conocido como MiCare o PlantCare. Es un dispositivo Bluetooth Low Energy y algunas investigaciones básicas revelaron que su protocolo parece ser bastante fácil de entender. Si bien Xiaomi no parece proporcionar ninguna especificación pública, todavía ha habido bastante ingeniería inversa en Internet para este dispositivo. Así que decidí pedir uno de esos.

Unos días después me lo entregaron y, por supuesto, comencé a jugar con él de inmediato. Revisé brevemente la aplicación que viene con él, pero como probablemente puedas adivinar, usarla en su configuración predeterminada nunca fue mi plan. Por supuesto, esto debe integrarse con la configuración de mi hogar inteligente existente. Como también se describe aquí, estoy usando nymea como mi solución de hogar inteligente (Sí, incluso puedes ver la Monstera en una de las imágenes allí:)). Lamentablemente, nymea aún no era compatible con ese sensor, por lo que era necesario activar un IDE.

Paso 1: Obtener un stub de complemento cargado

Obtener un código auxiliar de complemento cargado
Obtener un código auxiliar de complemento cargado
Obtener un código auxiliar de complemento cargado
Obtener un código auxiliar de complemento cargado
Obtener un código auxiliar de complemento cargado
Obtener un código auxiliar de complemento cargado

Entonces, lo primero que hice fue copiar el complemento existente de Texas Instruments Sensor Tag, parecía lo suficientemente similar a lo que asumí que también debería funcionar para el dispositivo FlowerCare. Después del cambio de nombre básico de las cosas en plugininfo.json y comentando la mayor parte del código del complemento sensortag, estaba listo para cargar el nuevo código auxiliar del complemento.

Como era de esperar, el descubrimiento ya mostraría el sensor de inmediato y me permitiría agregarlo al sistema. Por supuesto, no produciría ningún dato significativo en este momento.

Paso 2: búsqueda de datos en el sensor

Encontrar datos en el sensor
Encontrar datos en el sensor

Como ocurre con cualquier dispositivo Bluetooth LE, lo primero que quieres hacer es conocer los servicios que ofrece y sus características. En algún lugar de allí, los datos reales están ocultos. Con una impresión de depuración rápida recorriendo todos los servicios descubiertos e imprimiendo sus características, estaba en el punto en el que podía comparar la información que encontré en Internet con lo que el dispositivo realmente reporta.

void FlowerCare:: onServiceDiscoveryFinished () {BluetoothLowEnergyDevice * btDev = static_cast (remitente ()); qCDebug (dcFlowerCare ()) << "tener uuids de servicio" controlador () -> createServiceObject (sensorServiceUuid, esto); connect (m_sensorService, & QLowEnergyService:: stateChanged, this, & FlowerCare:: onSensorServiceStateChanged); connect (m_sensorService, & QLowEnergyService:: featureRead, this, & FlowerCare:: onSensorServiceCharacteristicRead); m_sensorService-> discoverDetails (); } void FlowerCare:: onSensorServiceStateChanged (const QLowEnergyService:: ServiceSate & state) {if (state! = QLowEnergyService:: ServiceDiscovered) {return; } foreach (const QLowEnergyCharacteristic & feature, m_sensorService-> features ()) {qCDebug (dcFlowerCare ()). nospace () <"<< feature.uuid (). toString () <<" ("<< feature.handle () << "Nombre:" << característica.nombre () << "):" << característica.valor () << "," << característica.valor (). ToHex (); foreach (const QLowEnergyDescriptor & descriptor, característica.descriptors ()) {qCDebug (dcFlowerCare ()). nospace () <"<< descriptor.uuid (). toString () <<" ("<< descriptor.handle () <<" Nombre: "<< descriptor.name () << "):" << descriptor.value () << "," << descriptor.value (). toHex (); }}}

La versión de firmware y el nivel de la batería fueron fáciles. Ya pude ver los valores correspondientes impresos en este primer intento de enumerar los datos. Los valores reales del sensor están ocultos un poco más allá, pero combinándolos con los datos de Internet inmediatamente indicaron dónde encontrarlos y especialmente cómo leerlos.

void FlowerCare:: onSensorServiceCharacteristicRead (const QLowEnergyCharacteristic & feature, const QByteArray & value) {qCDebug (dcFlowerCare ()) << "Lectura de característica" << QString:: number (feature.handle (), 16) temp; qint8 skip; secuencia >> saltar; quint32 lux; corriente >> lux; qint8 humedad; corriente >> humedad; qint16 fertilidad; arroyo >> fertilidad; emitir terminado (m_batteryLevel, 1.0 * temp / 10, lux, humedad, fertilidad); }

Al juntar esto, el complemento ya comenzó a producir datos significativos.

Paso 3: Toques finales

Últimos retoques
Últimos retoques

Así que básicamente funcionó ahora, sin embargo, todavía quedaba un problema allí. El sensor FlowerCare, a diferencia del SensorTag de Texas Instruments, interrumpiría la conexión Bluetooth después de unos segundos. Sin embargo, teniendo en cuenta el caso de uso, esto no parece ser un problema, ya que es bastante confiable para responder a los intentos de conexión. Dado que normalmente una planta no absorbe un litro de agua en minutos, sino en días, no parece necesario estar conectado todo el tiempo. Además, esto agotaría bastante la batería. Así que decidí agregar un PluginTimer que volvería a conectar el sensor cada 20 minutos y obtendría datos de él. Si, por alguna razón, el sensor no responde al intento de conexión, el código iniciará otro temporizador que intentará reconectarse cada minuto a partir de ese momento hasta que logre obtener los datos. Luego, volvería a buscar datos en el intervalo de 20 minutos. Si el dispositivo no se conecta dos veces seguidas (es decir, después de 20 + 1 minutos), se marcará como fuera de línea en el sistema y se puede alertar al usuario al respecto.

nulo DevicePluginFlowercare:: onPluginTimer () {foreach (FlowerCare * flowerCare, m_list) {if (--m_refreshMinutes [flowerCare] <= 0) {qCDebug (dcFlowerCare ()) << Dirección "Refrescante" (); flowerCare-> refreshData (); } else {qCDebug (dcFlowerCare ()) << "No actualizando" address () << "Siguiente actualización en" << m_refreshMinutes [flowerCare] << "minutos"; } // Si tuvimos 2 o más intentos de conexión fallidos, márquelo como desconectado if (m_refreshMinutes [flowerCare] <-2) {qCDebug (dcFlowerCare ()) << "No se pudo actualizar para" << (m_refreshMinutes [flowerCare] * -1) <setStateValue (flowerCareConnectedStateTypeId, falso); }}}

Con esta estrategia, nymea ahora parecía entregar datos perfectamente confiables de este sensor.

Paso 4: usándolo en un contexto más amplio

Usándolo en un contexto más amplio
Usándolo en un contexto más amplio
Usándolo en un contexto más amplio
Usándolo en un contexto más amplio

Sin embargo, obtener valores del sensor no es tan útil, también podría haber usado la aplicación original para eso. Ahora hagamos algunas cosas inteligentes con él.

Nymea admite el envío de notificaciones push, ya sea a teléfonos con la aplicación nymea: instalada o mediante PushBullet. Entonces, lo más obvio es enviarme algunas notificaciones automáticas cada vez que la humedad del suelo caiga por debajo del 15%. Es bastante fácil configurar eso en la aplicación. Como requisito previo, necesita una cuenta en nymea: cloud o en PushBullet. Para las notificaciones push basadas en nymea: cloud, basta con habilitar nymea: cloud en nymea: core y en nymea: app. Tan pronto como ambos estén conectados, aparecerá automáticamente una notificación. Para que PushBullet agregue algo nuevo en el sistema, encontrará PushBullet en la lista allí. Le pedirá la clave API que obtiene al registrarse con PushBullet. Una vez que tenga una notificación push en nymea, puede crear una regla.

Por supuesto, puede hacer lo que quiera … También puede encender algo de luz para reflejar los valores del sensor, o usar el complemento HTTP commander para publicar los valores del sensor en un servidor en Internet, por ejemplo. No tengo una válvula de agua que se puede controlar digitalmente (todavía) pero, por supuesto, si tiene tal cosa y aún no es compatible con nymea, agregar un complemento para eso sería bastante similar a esto.

Paso 5: Palabras de cierre

Palabras de cierre
Palabras de cierre

El complemento flowercare ya se ha aceptado en sentido ascendente y, si tiene uno de esos, ya está listo para usarse con nymea. Sin embargo, espero que este artículo sea de interés si alguien quiere agregar soporte para otros dispositivos. Debería ser un tutorial sobre cómo crear su propio complemento para nymea.

Si solo desea construir esta configuración en su hogar, todo lo que necesita es el sensor FlowerCare, una Raspberry Pi, la imagen de la comunidad nymea (ahora incluye el complemento de cuidado de flores) y nymea: aplicación que está disponible en las tiendas de aplicaciones. Además, hasta ahora mi Monstera Deliciosa está feliz de nuevo y, como habrás visto en las capturas de pantalla, también me he conseguido un segundo de esos sensores para rastrear la salud de mi limonero. Para eso, me envío una notificación automática cada vez que hace frío afuera para poder pasar el invierno de manera segura.

Recomendado: