Inhaltsverzeichnis:

FlowerCare und Nymea zur Rettung meiner Pflanzen - Gunook
FlowerCare und Nymea zur Rettung meiner Pflanzen - Gunook

Video: FlowerCare und Nymea zur Rettung meiner Pflanzen - Gunook

Video: FlowerCare und Nymea zur Rettung meiner Pflanzen - Gunook
Video: Flamingoblume (Anthurie) blüht nicht: So rettet der "Pflanzenarzt" die Topfpflanze | MDR Garten 2024, November
Anonim
FlowerCare und Nymea zur Rettung meiner Pflanzen
FlowerCare und Nymea zur Rettung meiner Pflanzen

Hände schmutzig machen beim Anschließen von Pflanzenpflegesensoren an mein bestehendes Open-Source-Smart Home. Eine exemplarische Vorgehensweise zur Plugin-Entwicklung für nymea.

Die Geschichte

Wie viele andere Tüftler und Hacker leide auch ich unter dem Problem, dass das Hacken von Dingen so viel Zeit in Anspruch nimmt, dass ich gelegentlich vergesse, meine Pflanzen zu gießen. Nachdem meine Monstera Deliciosa wieder einmal unter trockener Erde litt, habe ich mich entschieden, zu sehen, ob ich etwas dagegen tun kann, um mich daran zu erinnern, wenn sie durstig ist.

Eine kurze Recherche im Web brachte mich auf die Xiaomi FlowerCare, auch bekannt als MiCare oder PlantCare. Es ist ein Bluetooth-Low-Energy-Gerät und einige Grundlagenforschungen haben ergeben, dass sein Protokoll recht einfach zu verstehen zu sein scheint. Während Xiaomi keine öffentlichen Spezifikationen zu liefern scheint, wurde für dieses Gerät im Internet noch einiges an Reverse Engineering betrieben. Also beschloss ich, eine davon zu bestellen.

Ein paar Tage später wurde es geliefert und ich habe natürlich sofort angefangen, damit herumzuspielen. Ich habe mir die mitgelieferte App kurz angesehen, aber wie Sie sich wahrscheinlich vorstellen können, war es nie mein Plan, sie in der Standardkonfiguration zu verwenden. Dies muss natürlich in mein bestehendes Smart Home Setup integriert werden. Wie auch hier beschrieben verwende ich nymea als meine Smart Home Lösung (Ja, die Monstera ist dort sogar auf einem der Bilder zu erkennen:)). Leider hat nymea diesen Sensor noch nicht unterstützt, also war es in Ordnung, etwas IDE zu starten.

Schritt 1: Laden eines Plugin-Stubs

Einen Plugin-Stub laden
Einen Plugin-Stub laden
Einen Plugin-Stub laden
Einen Plugin-Stub laden
Einen Plugin-Stub laden
Einen Plugin-Stub laden

Das erste, was ich tat, war, das vorhandene Texas Instruments Sensor Tag-Plugin zu kopieren, es schien dem ähnlich genug zu sein, von dem ich annahm, dass es auch für das FlowerCare-Gerät funktionieren sollte. Nach der grundlegenden Umbenennung der Dinge in der plugininfo.json und dem Wegkommentieren des größten Teils des Codes des Sensortag-Plugins war ich bereit, den neuen Plugin-Stub zu laden.

Wie erwartet würde die Entdeckung den Sensor bereits sofort anzeigen und es mir ermöglichen, ihn dem System hinzuzufügen. Natürlich würde es zu diesem Zeitpunkt keine aussagekräftigen Daten liefern.

Schritt 2: Suchen von Daten auf dem Sensor

Auffinden von Daten auf dem Sensor
Auffinden von Daten auf dem Sensor

Wie bei jedem Bluetooth LE-Gerät möchten Sie sich zunächst über die angebotenen Dienste und deren Eigenschaften informieren. Irgendwo dort sind die eigentlichen Daten versteckt. Mit einem schnellen Debug-Druck, der alle entdeckten Dienste durchläuft und ihre Eigenschaften ausdruckt, war ich an dem Punkt, an dem ich die Informationen, die ich im Internet gefunden habe, mit dem vergleichen konnte, was das Gerät tatsächlich meldet.

void FlowerCare::onServiceDiscoveryFinished() { BluetoothLowEnergyDevice *btDev = static_cast(sender()); qCDebug(dcFlowerCare()) << "Dienst-UUIDs haben" 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() < " << Merkmal.uuid().toString() << " (" << Merkmal.handle() << " Name: " << Merkmal.name() << "): " << Merkmal. Wert() << ", " << Merkmal. Wert().toHex(); foreach (const QLowEnergyDescriptor &descriptor, Merkmal.descriptors()) { qCDebug(dcFlowerCare()).nospace() < " << descriptor.uuid().toString() << " (" << descriptor.handle() << " Name: " << descriptor.name() << "): " << descriptor.value() << ", " << descriptor.value().toHex(); } } }

Die Firmware-Version und der Akkustand waren einfach. Die entsprechenden Werte konnte ich bereits bei diesem allerersten Versuch der Datenauflistung sehen. Die eigentlichen Sensorwerte sind dort etwas tiefer versteckt, aber die Kombination mit den Daten aus dem Internet zeigte sofort, wo man sie findet und vor allem wie man sie ausliest.

void FlowerCare::onSensorServiceCharacteristicRead(const QLowEnergyCharacteristic &characteristic, const QByteArray &value){ qCDebug(dcFlowerCare()) << "Characteristic read" << QString::number(characteristic.handle(), 16) temp; qint8 überspringen; streamen >> überspringen; Quint32 Lux; Strom >> Lux; qint8 Feuchtigkeit; Strom >> Feuchtigkeit; qint16 Fruchtbarkeit; Strom >> Fruchtbarkeit; emittieren fertig (m_batteryLevel, 1.0 * temp / 10, Lux, Feuchtigkeit, Fruchtbarkeit); }

Zusammengenommen hat das Plugin bereits damit begonnen, aussagekräftige Daten zu produzieren.

Schritt 3: Feinschliff

Feinschliff
Feinschliff

Im Grunde hat es jetzt funktioniert, aber ein Problem war noch da. Der FlowerCare-Sensor würde im Gegensatz zum Texas Instruments SensorTag die Bluetooth-Verbindung nach wenigen Sekunden abbrechen. In Anbetracht des Anwendungsfalls scheint dies jedoch kein Problem zu sein, da es sehr zuverlässig auf Verbindungsversuche reagiert. Da eine Pflanze normalerweise nicht innerhalb von Minuten, sondern Tagen einen Liter Wasser aufsaugt, scheint es nicht notwendig zu sein, ständig in Verbindung zu bleiben. Außerdem würde dies die Batterie ziemlich entladen. Also beschloss ich, einen PluginTimer hinzuzufügen, der den Sensor alle 20 Minuten neu verbindet und Daten von ihm abruft. Wenn der Sensor aus irgendeinem Grund nicht auf den Verbindungsversuch reagiert, startet der Code einen weiteren Timer, der ab diesem Zeitpunkt jede Minute versucht, die Verbindung wieder herzustellen, bis er die Daten abrufen kann. Dann würde es zurückgehen, um Daten im 20-Minuten-Intervall wieder abzurufen. Sollte sich das Gerät zweimal hintereinander nicht verbinden (also nach 20 + 1 Minuten), wird es im System als offline markiert und der Benutzer kann darauf hingewiesen werden.

void DevicePluginFlowercare::onPluginTimer(){ foreach (FlowerCare *flowerCare, m_list) { if (--m_refreshMinutes[flowerCare] <= 0) { qCDebug(dcFlowerCare()) << "Refreshing" address(); flowerCare->refreshData(); } else { qCDebug(dcFlowerCare()) << "Nicht aktualisieren" address() << "Nächste Aktualisierung in" << m_refreshMinutes[flowerCare] << "Minuten"; } // Wenn wir 2 oder mehr fehlgeschlagene Verbindungsversuche hatten, markieren Sie sie als getrennt if (m_refreshMinutes[flowerCare] < -2) { qCDebug(dcFlowerCare()) << "Fehler beim Aktualisieren für"<< (m_refreshMinutes[flowerCare] * -1) <setStateValue(flowerCareConnectedStateTypeId, false); } } }

Mit dieser Strategie schien nymea nun absolut zuverlässige Daten von diesem Sensor zu liefern.

Schritt 4: Verwenden Sie es im größeren Kontext

Verwendung im größeren Kontext
Verwendung im größeren Kontext
Verwendung im größeren Kontext
Verwendung im größeren Kontext

Nur Werte vom Sensor abzurufen ist jedoch nicht so nützlich, dafür hätte ich auch die Original-App verwenden können. Lassen Sie uns jetzt einige kluge Dinge damit machen.

Nymea unterstützt das Senden von Push-Benachrichtigungen, entweder an Telefone mit installierter nymea:app oder über PushBullet. Es liegt also nahe, mir selbst Push-Benachrichtigungen zu senden, wenn die Bodenfeuchtigkeit unter 15% fällt. Das lässt sich ganz einfach in der App einrichten. Als Voraussetzung benötigen Sie entweder einen Account in nymea:cloud oder auf PushBullet. Für nymea:cloud-basierte Push-Benachrichtigungen reicht es, nymea:cloud auf nymea:core und in nymea:app zu aktivieren. Sobald beide verbunden sind, erscheint automatisch eine Benachrichtigung. Für PushBullet fügen Sie ein neues Ding im System hinzu, Sie finden PushBullet dort in der Liste. Sie werden nach dem API-Schlüssel gefragt, den Sie bei der Anmeldung bei PushBullet erhalten. Sobald Sie eine Push-Benachrichtigung in nymea haben, können Sie eine Regel erstellen.

Natürlich können Sie tun, was Sie sonst noch wollen… Kann auch etwas Licht einschalten, um Sensorwerte zu reflektieren, oder das HTTP-Commander-Plugin verwenden, um beispielsweise Sensorwerte an einen Server im Internet zu senden. Ich habe kein Wasserventil die (noch) digital gesteuert werden kann, aber natürlich, wenn Sie so etwas haben und es noch nicht von nymea unterstützt wird, wäre das Hinzufügen eines Plugins dafür eher ähnlich.

Schritt 5: Schlussworte

Schlussworte
Schlussworte

Das Flowercare-Plugin wurde inzwischen als Upstream akzeptiert und wenn Sie eines davon haben, kann es jetzt mit nymea verwendet werden. Ich hoffe jedoch, dass dieser Artikel von Interesse sein könnte, wenn jemand Unterstützung für andere Geräte hinzufügen möchte. Es sollte eine exemplarische Vorgehensweise sein, wie Sie Ihr eigenes Plugin für Nymea erstellen können.

Wenn Sie dieses Setup einfach bei sich zu Hause aufbauen möchten, benötigen Sie lediglich den FlowerCare-Sensor, einen Raspberry Pi, das nymea-Community-Image (es enthält inzwischen das Flower-Care-Plugin) und nymea:app, das in App-Stores erhältlich ist. Außerdem ist meine Monstera Deliciosa bisher wieder glücklich und wie Sie vielleicht in den Screenshots gesehen haben, habe ich mir einen zweiten dieser Sensoren besorgt, um auch die Gesundheit meines Zitronenbaums zu verfolgen. Dafür schicke ich mir immer eine Push-Benachrichtigung, wenn es draußen friert, damit ich es sicher durch den Winter bringen kann.

Empfohlen: