Índice:

FlowerCare e Nymea para resgatar minhas plantas: 5 etapas
FlowerCare e Nymea para resgatar minhas plantas: 5 etapas

Vídeo: FlowerCare e Nymea para resgatar minhas plantas: 5 etapas

Vídeo: FlowerCare e Nymea para resgatar minhas plantas: 5 etapas
Vídeo: How to Care & Cultivate Anthurium Regale (Indoor Rare Plants) 2024, Novembro
Anonim
FlowerCare e Nymea para resgatar minhas plantas
FlowerCare e Nymea para resgatar minhas plantas

Sujar as mãos ao conectar sensores de manutenção de plantas à minha casa inteligente de código aberto existente. Um passo a passo sobre o desenvolvimento de plug-ins para nymea.

A história

Como muitos outros consertadores e hackers, também estou sofrendo com o problema de hackear coisas que toma tanto do meu tempo que às vezes me esqueço de regar minhas plantas. Depois que minha Monstera Deliciosa mais uma vez ficou com terra seca, decidi ver se posso fazer algo a respeito para me lembrar quando está com sede.

Uma rápida pesquisa na web chamou minha atenção para o Xiaomi FlowerCare, também conhecido como MiCare ou PlantCare. É um dispositivo Bluetooth Low Energy e algumas pesquisas básicas revelaram que seu protocolo parece ser bastante fácil de entender. Embora a Xiaomi não pareça fornecer nenhuma especificação pública, ainda houve bastante engenharia reversa na Internet para este dispositivo. Então decidi pedir um desses.

Poucos dias depois, ele foi entregue e, claro, comecei a brincar com ele imediatamente. Eu verifiquei brevemente o aplicativo que vem com ele, mas como você provavelmente pode imaginar, usá-lo em sua configuração padrão nunca foi meu plano. É claro que isso precisa ser integrado à minha configuração de casa inteligente existente. Como também descrito aqui, estou usando o nymea como minha solução de casa inteligente (sim, você pode até localizar a Monstera em uma das fotos lá:)). Infelizmente, a nymea ainda não era compatível com esse sensor, portanto, era necessário acionar um pouco de IDE.

Etapa 1: Carregar um Stub de Plug-in

Carregar um Stub de Plugin
Carregar um Stub de Plugin
Carregar um Stub de Plugin
Carregar um Stub de Plugin
Carregar um Stub de Plugin
Carregar um Stub de Plugin

Portanto, a primeira coisa que fiz foi copiar o plugin existente da Texas Instruments Sensor Tag, parecia bastante semelhante ao que eu presumi que deveria funcionar para o dispositivo FlowerCare também. Após a renomeação básica das coisas no plugininfo.json e comentar a maior parte do código do plugin sensortag, eu estava pronto para carregar o novo esboço do plugin.

Como esperado, a descoberta já mostraria o sensor imediatamente e me permitiria adicioná-lo ao sistema. Claro que não produziria nenhum dado significativo neste ponto.

Etapa 2: Encontrar dados no sensor

Encontrando Dados no Sensor
Encontrando Dados no Sensor

Como acontece com qualquer dispositivo Bluetooth LE, a primeira coisa que você deseja fazer é descobrir os serviços que ele oferece e suas características. Em algum lugar lá, os dados reais estão ocultos. Com uma rápida depuração, imprimindo um loop de todos os serviços descobertos e imprimindo suas características, eu estava no ponto em que pude comparar as informações que encontrei na internet com o que o dispositivo realmente reporta.

void FlowerCare:: onServiceDiscoveryFinished () {BluetoothLowEnergyDevice * btDev = static_cast (sender ()); qCDebug (dcFlowerCare ()) << "ter uuids de serviço" controlador () -> createServiceObject (sensorServiceUuid, este); conectar (m_sensorService, & QLowEnergyService:: stateChanged, this, & FlowerCare:: onSensorServiceStateChanged); conectar (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 & Character, m_sensorService-> features ()) {qCDebug (dcFlowerCare ()). nospace () <"<< Character.uuid (). toString () <<" ("<< Character.handle () << "Nome:" << caracteristica.nome () << "):" << caracteristica.valor () << "," << caracteristica.valor (). ToHex (); foreach (const QLowEnergyDescriptor & descritor, caracteristica.descriptors ()) {qCDebug (dcFlowerCare ()). nospace () <"<< descriptor.uuid (). toString () <<" ("<< descriptor.handle () <<" Nome: "<< descritor.name () << "):" << descriptor.value () << "," << descriptor.value (). toHex (); }}}

A versão do firmware e o nível da bateria eram fáceis. Eu já pude ver os valores correspondentes impressos nesta primeira tentativa de listar os dados. Os valores reais do sensor estão escondidos um pouco mais profundamente lá, mas combinando-os com os dados da internet imediatamente indica onde encontrá-los e especialmente como lê-los.

void FlowerCare:: onSensorServiceCharacteristicRead (const QLowEnergyCharacteristic & feature, const QByteArray & value) {qCDebug (dcFlowerCare ()) << "Leitura característica" << QString:: number (Character.handle (), 16) temp; qint8 skip; stream >> pular; quint32 lux; stream >> lux; umidade qint8; fluxo >> umidade; qint16 fertilidade; riacho >> fertilidade; emitir acabado (m_batteryLevel, 1.0 * temp / 10, lux, umidade, fertilidade); }

Somando tudo isso, o plugin já começou a produzir dados significativos.

Etapa 3: toques finais

Toques finais
Toques finais

Então, basicamente funcionou agora, no entanto, um problema ainda estava lá. O sensor FlowerCare, ao contrário do SensorTag da Texas Instruments, interromperia a conexão Bluetooth após alguns segundos. Porém, considerando o caso de uso, isso não parece ser um problema, pois é bastante confiável para responder às tentativas de conexão. Dado que normalmente uma planta não suga um litro de água em minutos, mas sim em dias, não parece necessário ficar conectada o tempo todo. Além disso, isso consumiria bastante a bateria. Então, decidi adicionar um PluginTimer que reconectaria o sensor a cada 20 minutos e buscaria dados dele. Se, por algum motivo, o sensor não responder à tentativa de conexão, o código iniciará outro cronômetro que tenta reconectar a cada minuto a partir desse ponto até conseguir obter os dados. Em seguida, ele voltaria para buscar dados no intervalo de 20 minutos novamente. Se o dispositivo não conseguir se conectar duas vezes seguidas (ou seja, após 20 + 1 minutos), ele será marcado como off-line no sistema e o usuário poderá ser alertado sobre isso.

void DevicePluginFlowercare:: onPluginTimer () {foreach (FlowerCare * flowerCare, m_list) {if (--m_refreshMinutes [flowerCare] <= 0) {qCDebug (dcFlowerCare ()) << endereço "Atualizando" (); flowerCare-> refreshData (); } else {qCDebug (dcFlowerCare ()) << "Não atualizando" address () << "Próxima atualização em" << m_refreshMinutes [flowerCare] << "minutos"; } // Se tivemos 2 ou mais tentativas de conexão com falha, marque-o como desconectado if (m_refreshMinutes [flowerCare] <-2) {qCDebug (dcFlowerCare ()) << "Falha ao atualizar para" << (m_refreshMinutes [flowerCare] * -1) <setStateValue (flowerCareConnectedStateTypeId, false); }}}

Com essa estratégia, a nymea agora parecia fornecer dados perfeitamente confiáveis desse sensor.

Etapa 4: usando no contexto maior

Usando no contexto maior
Usando no contexto maior
Usando no contexto maior
Usando no contexto maior

Porém, apenas obter valores do sensor não é muito útil, eu também poderia ter usado o aplicativo original para isso. Agora vamos fazer algumas coisas inteligentes com ele.

O Nymea oferece suporte ao envio de notificações push para telefones com o nymea: app instalado ou via PushBullet. Portanto, a coisa óbvia a fazer é enviar a mim mesmo algumas notificações push sempre que a umidade do solo cair abaixo de 15%. É bastante fácil configurar isso no aplicativo. Como pré-requisito, você precisa de uma conta no nymea: cloud ou no PushBullet. Para notificações push baseadas em nymea: nuvem, é suficiente habilitar nymea: cloud no nymea: core e no nymea: app. Assim que ambos estiverem conectados, uma notificação aparecerá automaticamente. Para que o PushBullet adicione uma coisa nova ao sistema, você encontrará o PushBullet na lista. Ele solicitará a chave API que você obtém ao se inscrever no PushBullet. Depois de ter uma notificação push no nymea, você pode criar uma regra.

Claro que você pode fazer tudo o que quiser … Também pode acender alguma luz para refletir os valores do sensor ou usar o plug-in do comandante HTTP para postar os valores do sensor em um servidor na Internet, por exemplo. Não tenho uma válvula de água que pode ser controlado digitalmente (ainda), mas é claro, se você tiver tal coisa e não for suportado pelo nymea ainda, adicionar um plugin para isso seria bastante semelhante a este.

Etapa 5: Palavras finais

Palavras de Encerramento
Palavras de Encerramento

O plugin flowercare já foi aceito pelo upstream e, se você tiver um deles, ele está pronto para ser usado com o nymea agora. No entanto, espero que este artigo possa ser de interesse se alguém quiser adicionar suporte para outros dispositivos. Deve ser um passo a passo sobre como construir seu próprio plugin para o nymea.

Se você deseja apenas construir essa configuração em sua casa, tudo o que você precisa é o sensor FlowerCare, um Raspberry Pi, a imagem da comunidade nymea (agora inclui o plugin para cuidados com as flores) e nymea: app que está disponível nas lojas de aplicativos. Além disso, até agora minha Monstera Deliciosa está feliz novamente e como você deve ter visto nas imagens, eu comprei um segundo desses sensores para rastrear a saúde do meu limoeiro também. Para esse, estou enviando uma notificação push para mim mesmo sempre que estiver congelando lá fora, para que eu possa levá-lo durante o inverno com segurança.

Recomendado: