Table des matières:

FlowerCare et Nymea pour sauver mes plantes : 5 étapes
FlowerCare et Nymea pour sauver mes plantes : 5 étapes

Vidéo: FlowerCare et Nymea pour sauver mes plantes : 5 étapes

Vidéo: FlowerCare et Nymea pour sauver mes plantes : 5 étapes
Vidéo: Blabla Plante : avoir des plantes, ce n'est pas facile tous les jours ! 2024, Juillet
Anonim
FlowerCare et Nymea pour sauver mes plantes
FlowerCare et Nymea pour sauver mes plantes

Se salir les mains en connectant des capteurs d'entretien des plantes à ma maison intelligente open source existante. Une procédure pas à pas sur le développement de plugins pour nymea.

L'histoire

Comme beaucoup d'autres bricoleurs et hackers, je souffre aussi du fait que le piratage informatique me prend tellement de temps que j'oublie parfois d'arroser mes plantes. Après que mon Monstera Deliciosa ait à nouveau souffert d'un sol sec, j'ai décidé de voir si je pouvais faire quelque chose pour me rappeler quand j'avais soif.

Une recherche rapide sur le Web a attiré mon attention sur le Xiaomi FlowerCare, également connu sous le nom de MiCare ou PlantCare. Il s'agit d'un appareil Bluetooth Low Energy et certaines recherches fondamentales ont révélé que son protocole semble assez facile à comprendre. Bien que Xiaomi ne semble pas fournir de spécifications publiques, il y a encore eu pas mal d'ingénierie inverse sur Internet pour cet appareil. J'ai donc décidé d'en commander un.

Quelques jours plus tard, il a été livré et, bien sûr, j'ai tout de suite commencé à jouer avec. J'ai brièvement vérifié l'application qui l'accompagne, mais comme vous pouvez probablement le deviner, son utilisation dans sa configuration par défaut n'a jamais été mon plan. Bien sûr, cela doit être intégré à ma configuration de maison intelligente existante. Comme également décrit ici, j'utilise nymea comme solution de maison intelligente (oui, vous pouvez même repérer le Monstera sur l'une des images:)). Malheureusement, nymea ne prenait pas encore en charge ce capteur, il était donc nécessaire de lancer un IDE.

Étape 1: chargement d'un stub de plugin

Obtenir un plugin Stub chargé
Obtenir un plugin Stub chargé
Obtenir un Plugin Stub chargé
Obtenir un Plugin Stub chargé
Obtenir un plugin Stub chargé
Obtenir un plugin Stub chargé

Donc, la première chose que j'ai faite a été de copier le plugin Texas Instruments Sensor Tag existant, il semblait assez similaire à ce que je supposais devrait également fonctionner pour l'appareil FlowerCare. Après le renommage de base des éléments dans plugininfo.json et la suppression de la plupart du code du plug-in sensortag, j'étais prêt à charger le nouveau stub du plug-in.

Comme prévu, la découverte montrerait déjà le capteur tout de suite et me permettrait de l'ajouter au système. Bien sûr, cela ne produirait aucune donnée significative à ce stade.

Étape 2: Recherche de données sur le capteur

Recherche de données sur le capteur
Recherche de données sur le capteur

Comme pour tout appareil Bluetooth LE, la première chose à faire est de vous renseigner sur les services qu'il propose et leurs caractéristiques. Quelque part là-dedans, les données réelles sont cachées. Avec une impression de débogage rapide en boucle sur tous les services découverts et en imprimant leurs caractéristiques, j'étais au point où je pouvais comparer les informations que j'ai trouvées sur Internet avec ce que l'appareil rapporte réellement.

void FlowerCare::onServiceDiscoveryFinished(){ BluetoothLowEnergyDevice *btDev = static_cast(sender()); qCDebug(dcFlowerCare()) << "avoir des uuids de service" 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() < " << caractéristique.uuid().toString() << " (" << caractéristique.handle() << " Nom: " << caractéristique.nom() << "): " << caractéristique.valeur() << ", " << caractéristique.valeur().toHex(); foreach (const QLowEnergyDescriptor &descriptor, caractéristique.descriptors()) { qCDebug(dcFlowerCare()).nospace() < " << descriptor.uuid().toString() << " (" << descriptor.handle() << " Nom: " << descripteur.name() << "): " << descriptor.value() << ", " << descriptor.value().toHex(); } } }

La version du firmware et le niveau de la batterie étaient faciles. Je pouvais déjà voir les valeurs correspondantes imprimées dans cette toute première tentative de liste des données. Les valeurs réelles des capteurs y sont cachées un peu plus profondément, mais leur combinaison avec les données d'Internet a immédiatement indiqué où les trouver et surtout comment les lire.

void FlowerCare::onSensorServiceCharacteristicRead(const QLowEnergyCharacteristic &characteristic, const QByteArray &value){ qCDebug(dcFlowerCare()) << "Characteristic read" << QString::number(characteristic.handle(), 16) temp; qint8 sauter; flux >> sauter; quint32 lux; flux >> lux; qint8 humidité; ruisseau >> humidité; qint16 fertilité; ruisseau >> fertilité; émettre fini (m_batteryLevel, 1.0 * temp / 10, lux, humidité, fertilité); }

En mettant tout cela ensemble, le plugin a déjà commencé à produire des données significatives.

Étape 3: Touches finales

La touche finale
La touche finale

Donc, cela fonctionnait essentiellement maintenant, cependant, un problème restait là. Le capteur FlowerCare, contrairement au Texas Instruments SensorTag, interromprait la connexion Bluetooth au bout de quelques secondes. Compte tenu du cas d'utilisation, cela ne semble pas être un problème car il est assez fiable pour répondre aux tentatives de connexion. Etant donné que normalement une plante n'aspire pas un litre d'eau en quelques minutes, mais en quelques jours, il ne semble pas nécessaire de rester connecté tout le temps. De plus, cela déchargerait beaucoup la batterie. J'ai donc décidé d'ajouter un PluginTimer qui reconnecterait le capteur toutes les 20 minutes et en récupérerait les données. Si, pour une raison quelconque, le capteur ne répondait pas à la tentative de connexion, le code lancera une autre minuterie qui essaiera de se reconnecter toutes les minutes à partir de ce moment jusqu'à ce qu'il parvienne à obtenir les données. Ensuite, il récupèrerait à nouveau les données sur l'intervalle de 20 minutes. Si l'appareil ne parvient pas à se connecter deux fois de suite (c'est-à-dire après 20 + 1 minutes), il sera marqué hors ligne dans le système et l'utilisateur pourra en être alerté.

void DevicePluginFlowercare::onPluginTimer(){ foreach (FlowerCare *flowerCare, m_list) { if (--m_refreshMinutes[flowerCare] <= 0) { qCDebug(dcFlowerCare()) << "Refreshing" address(); flowerCare->refreshData(); } else { qCDebug(dcFlowerCare()) << "Pas d'actualisation" adresse() << " Prochaine actualisation dans" << m_refreshMinutes[flowerCare] << "minutes"; } // Si nous avons eu 2 tentatives de connexion infructueuses ou plus, marquez-le comme déconnecté if (m_refreshMinutes[flowerCare] < -2) { qCDebug(dcFlowerCare()) << "Échec de l'actualisation pour"<< (m_refreshMinutes[flowerCare] * -1) <setStateValue(flowerCareConnectedStateTypeId, false); } } }

Avec cette stratégie, Nymea semblait désormais fournir des données parfaitement fiables à partir de ce capteur.

Étape 4: l'utiliser dans un contexte plus large

L'utiliser dans un contexte plus large
L'utiliser dans un contexte plus large
L'utiliser dans un contexte plus large
L'utiliser dans un contexte plus large

Obtenir les valeurs du capteur n'est pas très utile cependant, j'aurais également pu utiliser l'application d'origine pour cela. Faisons maintenant des choses intelligentes avec.

Nymea prend en charge l'envoi de notifications push, soit vers des téléphones sur lesquels nymea:app est installée, soit via PushBullet. Donc, la chose évidente à faire est de m'envoyer des notifications push chaque fois que l'humidité du sol tombe en dessous de 15%. C'est assez facile à configurer dans l'application. Comme condition préalable, vous avez besoin d'un compte dans nymea:cloud ou sur PushBullet. Pour les notifications push basées sur nymea:cloud, il suffit d'activer nymea:cloud sur nymea:core et dans nymea:app. Dès que les deux sont connectés, une notification apparaîtra automatiquement. Pour PushBullet, ajoutez une nouvelle chose dans le système, vous y trouverez PushBullet dans la liste. Il vous demandera la clé API que vous obtenez lors de votre inscription avec PushBullet. Une fois que vous avez une notification push dans Nymea, vous pouvez créer une règle.

Bien sûr, vous pouvez faire ce que vous voulez d'autre… Vous pouvez également allumer de la lumière afin de refléter les valeurs des capteurs, ou utiliser le plugin HTTP Commander pour publier les valeurs des capteurs sur un serveur sur Internet par exemple. Je n'ai pas de vanne d'eau qui peut être contrôlé numériquement (encore) mais bien sûr, si vous avez une telle chose et qu'elle n'est pas encore prise en charge par nymea, l'ajout d'un plugin pour cela serait plutôt similaire à celui-ci.

Étape 5: Mots de clôture

Mots de clôture
Mots de clôture

Le plugin flowercare a déjà été accepté en amont et si vous en avez un, il est prêt à être utilisé avec nymea maintenant. Cependant, j'espère que cet article pourrait être intéressant si quelqu'un souhaite ajouter la prise en charge d'autres appareils. Cela devrait être une procédure pas à pas sur la façon de créer votre propre plugin pour nymea.

Si vous souhaitez simplement créer cette configuration chez vous, tout ce dont vous avez besoin est le capteur FlowerCare, un Raspberry Pi, l'image de la communauté nymea (elle inclut désormais le plug-in Flower Care) et nymea:app qui est disponible dans les magasins d'applications. De plus, jusqu'à présent, mon Monstera Deliciosa est à nouveau heureux et, comme vous l'avez peut-être vu dans les captures d'écran, je me suis procuré un deuxième de ces capteurs pour suivre la santé de mon citronnier également. Pour celui-là, je m'envoie une notification push chaque fois qu'il gèle dehors afin que je puisse le faire passer l'hiver en toute sécurité.

Conseillé: