Оглавление:

FlowerCare и Nymea спасают мои растения: 5 шагов
FlowerCare и Nymea спасают мои растения: 5 шагов

Видео: FlowerCare и Nymea спасают мои растения: 5 шагов

Видео: FlowerCare и Nymea спасают мои растения: 5 шагов
Видео: Irrigazione domotica fai da te con Home Assistant e ESP 2024, Июль
Anonim
FlowerCare и Nymea спасают мои растения
FlowerCare и Nymea спасают мои растения

Запачкал руки при подключении датчиков ухода за растениями к моему существующему умному дому с открытым исходным кодом. Пошаговое руководство по разработке плагина для nymea.

История

Как и многие другие мастерицы и хакеры, я тоже страдаю от того, что хакерство отнимает у меня столько времени, что я иногда забываю поливать растения. После того, как моя Monstera Deliciosa снова пострадала от сухой почвы, я решил посмотреть, могу ли я что-нибудь с этим сделать, чтобы напомнить мне, когда она хочет пить.

Быстрое исследование в Интернете привлекло мое внимание к Xiaomi FlowerCare, также известному как MiCare или PlantCare. Это устройство Bluetooth с низким энергопотреблением, и некоторые фундаментальные исследования показали, что его протокол довольно прост для понимания. Хотя Xiaomi, похоже, не предоставляет каких-либо общедоступных спецификаций, в Интернете для этого устройства было проведено довольно много реверс-инжиниринга. Поэтому я решил заказать один из них.

Через несколько дней он был доставлен, и, конечно же, я сразу же начал с ним экспериментировать. Я вкратце проверил прилагаемое к нему приложение, но, как вы, наверное, догадались, использование его в настройках по умолчанию никогда не входило в мои планы. Конечно, это должно быть интегрировано с моей существующей настройкой умного дома. Как также описано здесь, я использую nymea в качестве своего решения для умного дома (да, вы даже можете увидеть Monstera на одной из картинок там:)). К сожалению, nymea еще не поддерживает этот датчик, поэтому нужно было запустить IDE.

Шаг 1. Загрузка заглушки плагина

Загрузка заглушки плагина
Загрузка заглушки плагина
Загрузка заглушки плагина
Загрузка заглушки плагина
Загрузка заглушки плагина
Загрузка заглушки плагина

Итак, первым делом я скопировал существующий плагин Texas Instruments Sensor Tag, он выглядел достаточно похожим на то, что, как я предполагал, должно работать и для устройства FlowerCare. После простого переименования вещей в plugininfo.json и комментирования большей части кода плагина sensortag я был готов загрузить новую заглушку плагина.

Как и ожидалось, обнаружение уже сразу покажет датчик и позволит мне добавить его в систему. Конечно, на данный момент это не даст никаких значимых данных.

Шаг 2: поиск данных на датчике

Поиск данных на датчике
Поиск данных на датчике

Как и в случае с любым другим устройством Bluetooth LE, первое, что вам нужно сделать, это узнать об услугах, которые оно предлагает, и их характеристиках. Где-то там спрятаны фактические данные. Благодаря быстрой отладочной печати, перебирающей все обнаруженные службы и распечатке их характеристик, я был в той точке, где я мог сравнить информацию, которую я нашел в Интернете, с тем, что фактически сообщает устройство.

void FlowerCare:: onServiceDiscoveryFinished () {BluetoothLowEnergyDevice * btDev = static_cast (sender ()); qCDebug (dcFlowerCare ()) << "иметь служебные uuid" controller () -> createServiceObject (sensorServiceUuid, это); 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 & характеристика, m_sensorService-> характеристики ()) {qCDebug (dcFlowerCare ()). nospace () <"<< характеристика.uuid (). toString () <<" ("<< характеристика.handle () << "Имя:" << характеристика.имя () << "):" << характеристика.значение () << "," << характеристика.значение (). ToHex (); foreach (const QLowEnergyDescriptor & дескриптор, характеристика.descriptors ()) {qCDebug (dcFlowerCare ()). nospace () <"<< descriptor.uuid (). toString () <<" ("<< descriptor.handle () <<" Имя: "<< дескриптор.name () << "):" << descriptor.value () << "," << descriptor.value (). toHex (); }}}

Версия прошивки и уровень заряда батареи были легкими. Я уже мог видеть соответствующие значения, напечатанные при этой самой первой попытке перечисления данных. Фактические значения датчиков скрыты там немного глубже, но объединение их с данными из Интернета сразу же указывает на то, где их найти и особенно как их читать.

void FlowerCare:: onSensorServiceCharacteristicRead (const QLowEnergyCharacteristic & характеристика, const QByteArray & value) {qCDebug (dcFlowerCare ()) << "Считывание характеристики" << QString:: number (характеристика.handle (), 16) temp; qint8 skip; поток >> пропустить; quint32 lux; поток >> люкс; qint8 влаги; поток >> влага; qint16 плодородие; поток >> плодородие; излучение завершено (m_batteryLevel, 1.0 * temp / 10, люкс, влажность, плодородие); }

Собирая все вместе, плагин уже начал производить значимые данные.

Шаг 3: завершающие штрихи

Последние штрихи
Последние штрихи

Так что сейчас это в основном сработало, однако одна проблема все еще оставалась там. Датчик FlowerCare, в отличие от Texas Instruments SensorTag, разорвет соединение Bluetooth через несколько секунд. Однако, учитывая вариант использования, это не кажется проблемой, так как он довольно надежно реагирует на попытки подключения. Учитывая, что обычно растение впитывает литр воды не за минуты, а за дни, нет необходимости постоянно оставаться на связи. Также это сильно разряжает батарею. Поэтому я решил добавить PluginTimer, который будет повторно подключать датчик каждые 20 минут и извлекать из него данные. Если по какой-то причине датчик не реагирует на попытку подключения, код запускает другой таймер, который пытается повторно подключиться каждую минуту с этого момента, пока ему не удастся получить данные. Затем он вернется, чтобы снова получить данные за 20-минутный интервал. Если устройству не удается подключиться дважды подряд (то есть через 20 + 1 минут), оно будет помечено в системе как отключенное, и пользователь может быть предупрежден об этом.

void DevicePluginFlowercare:: onPluginTimer () {foreach (FlowerCare * flowerCare, m_list) {if (--m_refreshMinutes [flowerCare] <= 0) {qCDebug (dcFlowerCare ()) << "Обновляющий" адрес (); flowerCare-> refreshData (); } else {qCDebug (dcFlowerCare ()) << "Не обновляется" адрес () << "Следующее обновление через" << m_refreshMinutes [flowerCare] << "минут"; } // Если у нас было 2 или более неудачных попытки подключения, пометьте это как отключенное if (m_refreshMinutes [flowerCare] <-2) {qCDebug (dcFlowerCare ()) << "Не удалось обновить для" << (m_refreshMinutes [flowerCare] * -1) <setStateValue (flowerCareConnectedStateTypeId, ложь); }}}

С этой стратегией теперь казалось, что nymea предоставляет совершенно надежные данные с этого датчика.

Шаг 4: Использование в более широком контексте

Использование его в более широком контексте
Использование его в более широком контексте
Использование его в более широком контексте
Использование его в более широком контексте

Хотя просто получение значений с датчика не так уж и полезно, я также мог бы использовать для этого оригинальное приложение. Теперь давайте поработаем с ним по-умному.

Nymea поддерживает отправку push-уведомлений на телефоны с установленным приложением nymea: или через PushBullet. Таким образом, очевидная вещь, которую нужно сделать, - это отправить мне несколько push-уведомлений, когда влажность почвы упадет ниже 15%. Это довольно просто настроить в приложении. В качестве предварительного условия вам понадобится учетная запись в nymea: cloud или в PushBullet. Для push-уведомлений на основе nymea: cloud достаточно включить nymea: cloud в ядре nymea: и в приложении nymea: app. Как только оба подключатся, автоматически появится уведомление. Для PushBullet добавьте новую вещь в систему, вы найдете PushBullet в списке там. Он запросит у вас ключ API, который вы получите при регистрации в PushBullet. Если у вас есть push-уведомление в nymea, вы можете создать правило.

Конечно, вы можете делать все, что захотите … Можно также включить свет, чтобы отразить значения датчиков, или использовать плагин HTTP commander для отправки значений датчиков, например, на сервер в Интернете. У меня нет водяного клапана. которым можно управлять в цифровом виде (пока), но, конечно, если у вас есть такая вещь, и она еще не поддерживается nymea, добавление плагина для этого было бы скорее похожим, чем это.

Шаг 5: заключительные слова

Заключительные слова
Заключительные слова

Плагин flowercare уже принят в апстриме, и если у вас есть один из них, он готов к использованию с nymea. Однако я надеюсь, что эта статья может быть интересна, если кто-то захочет добавить поддержку других устройств. Это должно быть пошаговое руководство по созданию собственного плагина для nymea.

Если вы хотите просто построить эту установку у себя дома, все, что вам нужно, это датчик FlowerCare, Raspberry Pi, образ сообщества nymea (на данный момент он включает плагин для ухода за цветами) и приложение nymea:, которое доступно в магазинах приложений. Кроме того, пока моя Monstera Deliciosa снова счастлива, и, как вы могли видеть на скриншотах, я купил себе второй из этих датчиков, чтобы отслеживать состояние моего лимонного дерева. Для этого я отправляю себе push-уведомление, когда на улице холодно, чтобы я мог безопасно перенести его на зиму.

Рекомендуемые: