لقد رفعت دعوى قضائية ضد تكامل MiFlora Home Assistant للحصول على بيانات حول نباتات منزلية مختلفة لفترة من الوقت. ولكن على طول الطريق كان علي التغلب على العديد من العقبات بما في ذلك نطاق محدود من البلوتوث, مشاكل عمر البطارية, والحصول على قيم البطارية للإبلاغ عنها. أخيرًا يبدو أنني قمت بتكسير كل هذه الأشياء ولدي الآن نظام يعمل بشكل موثوق مع الكثير من النباتات حول المنزل. لقد لخصت ما استخدمته أدناه.
المعدات
The first thing to say is that I do have a bluetooth USB dongle attached to my home assistant system. This monitors the plants in range directly (بمعنى آخر. تلك الموجودة في نفس غرفة صندوق HA). To monitor more distance devices I have used an ESP32 board with built-in bluetooth module which I have inside a cheap little case and have powered with an old micro-USB شاحن الجوال
- USB دونجل: the one I got is no longer available — due to age — but there are plenty of amazon and elsewhere — just make sure it has support in linux
- لوحة ESP32: لدي JZK ESP32‑S which is currently £6.49 on amazon
- الحال بالنسبة لـ ESP32: I found the case for a NodeMCU Wroom-32D (short aerial) fitted my board — this was £4.20 from موقع ئي باي
تكامل مساعد المنزل
Whilst the basic MiFlora integration is built in to home assistant I found it uses a lot of battery when used natively. بدلاً من ذلك ، أستخدم ملف Bluetooth Low Energy Monitor 3rd party integration which you can install easily using بطئ
ثم قمت أيضًا بتثبيت ESPHome integration for home assistant to manage my ESP32 BLE repeater
أخيرا, to display the plants in a nice way I added a particular fork of the lovelace plant card addon via HACS
ترتيب
Once BLE Monitor was installed and configured with my bluetooth dongle it picked up the MiFlora sensors within range and listed them in its “devices” drop down as well as listing the devices and entities on it’s card in the HA configuration
The great thing about BLE monitor is that it listens for the sensors to transmit, rather than actively polling them, which would run down their batteries. ومع ذلك, the sensors don’t transmit battery information so to get this we have to actively poll for it. Polling just for this, and passively listening for the other data seems to be the best compromise if you want to have all the data available but also maximise the sensor’s battery life. I have separated my configuration.yaml into multiple separate files to keep things a bit easier to manage so I just have the following line in my configuration.yaml —
المستشعر: !include sensors.yaml
Then in sensors.yaml I have each plant listed as follows
- منصة: miflora mac: 'ماك:عنوان:of:ازدهر:المستشعر:here' name: basil force_update: true scan_interval: 08:00 الوسيط: 3 go_unavailable_timeout: 43200 المراقبة_الظروف: - البطارية
Next — to make the plants appear nicely I have a plants config. كما كان من قبل سطر واحد في التكوين. yaml لتبدأ به:
مصنع: !تشمل النباتات
ثم في النباتات. yaml لدي ما يلي
رَيحان: مجسات: رُطُوبَة: sensor.ble_moisture_basil battery: sensor.basil_battery temperature: sensor.ble_temperature_basil conductivity: sensor.ble_conductivity_basil brightness: sensor.ble_illuminance_basil min_battery: 15 السطوع الأدنى: 2500 السطوع الأقصى: 60000 min_temperature: 8 max_temperature: 32 الحد الأدنى للرطوبة: 15 الرطوبة القصوى: 60 min_conductivity: 350 الموصلية القصوى: 2000
Note the subtle difference between the entity name for the battery compared with the other sensors. The battery entity is coming from the miflora platform in sensors.yaml whilst the other 4 sensors are coming from the BLE integration. There IS a battery entity listed by the BLE integration but this just shows as “unknown” for this plant. This configuration is needed for the plant card to show the plant in a nicely presented way
ثم انتقل ببساطة إلى المكان الذي تريد إضافة نباتك إليه وأضف بطاقة نبات الحب. You will have to “configure” the card manually, but it only takes 3 lines…
نوع: مخصص:flower-card entity: plant.basil species: البازيليك
Note that the species is listed for 2 REAS فيرفكس. Firstly it will display the name on the card, ولكن أكثر استيراد وantly, it will also display a picture of the plant if you have downloaded the plant images and added them into \config\www\images\plants using the latin names — the information on the database is available on the lovelace plant card documentation
توسيع النطاق
أخيرا, نحن بحاجة إلى توسيع النطاق الذي يمكننا الوصول إليه. لهذا نحتاج إلى جهاز ESP32. The first thing to do is to get it hooked up to your computer via USB وفلاشها بصورة أساسية ESPHome
لقد استخدمت ESPHome Flasher و cp210x universal windows driver from SiLabs and followed the guide provided by the ESPHome HomeAssistant integration
The config I used for my ESP32 device is below
إسفومي: اسم: jzk-esp-32s platform: ESP32 board: esp32doit-devkit-v1 # Enable logging logger: # Enable Home Assistant API api: واي فاي: ssid: !secret wifi_ssid password: !secret wifi_password # Enable fallback hotspot (captive portal) in case wifi connection fails ap: ssid: "Esp32 Fallback Hotspot" كلمة السر: "random-password-here" external_components: - مصدر: github://myhomeiot/esphome-components esp32_ble_tracker: ble_gateway: الأجهزة: - mac_address: mac:عنوان:of:ازدهر:المستشعر:إلى:monitor:goes:here on_ble_advertise: ثم: homeassistant.event: event: esphome.on_ble_advertise data: packet: !lambda return packet; myhomeiot_ble_host: myhomeiot_ble_client: - mac_address: mac:عنوان:of:ازدهر:المستشعر:إلى:monitor:goes:here service_uuid: '1204' characteristic_uuid: '1A02' update_interval: 4h on_value: ثم: homeassistant.event: event: esphome.on_ble_advertise data: packet: !lambda |- إذا (x.size() 2) { ESP_LOGE("myhomeiot_ble_client", "payload has wrong size (%د)", x.size()); عودة ""; }; ESP_LOGI("myhomeiot_ble_client", "بطارية (%d%%), البرامج الثابتة (%ق)", س[0], std::string(x.begin(), x.end()).SUBSTR(2).c_str()); char buffer[70 + 1]; const uint8_t *remote_bda = xthis.remote_bda(); snprintf(buffer, sizeof(buffer), "043E2002010000%02X%02X%02X%02X%02X%02X14020106030295FE0C1695FE41209800000A1001%02X00", remote_bda[5], remote_bda[4], remote_bda[3], remote_bda[2], remote_bda[1], remote_bda[0], س[0]); return std::string(buffer).c_str();
Then save and update to your esp32 device via wifi. The ESP32 device will pick up the data from the miflora sensor and will ‘push’ it via wifi to the BLE integration which will create a device and entities automatically. Devices pushed in this way do appear to show their batteyr level (thanks to the code at the bottom of the myhomeiot_ble_client section I believe). You then just need to give the device a nice name (and let the entities be renamed too) and then create an entry in plants.yaml with the right entities
مرحبا,
es gibt doch auch die Version die flora Sensoren via ESP script auszulesen und an den MQTT Broker zu schicken. Finde da leider noch nicht die richtige Beschreibung wie ich dann die in MQTT enthaltenen Daten als Sensor in HomeAssistant publishen kann.
Hier der Link dazu: https://www.barrymercer.co.uk/wordpress/2020/04/27/mi-flora-home-assistant-and-mqtt-gateway/
مرحبا
نعم فعلا, I actually use ESP32 repeaters myself now as they are able to use “passive” mode AND collect battery data.
If you have a USB bluetooth device then you can pair the MiFlora devices directly to that first and then when you set up the ESP32 it will send the information into HA and it will show up for the correct entities automatically
You need to use the code as I describe in the “Extending range” section.
You also need to have the “Bluetooth Low Energy Monitor” integration installed (via HACS)
If you don’t have a USB Bluetooth then there is a way to get the devices to show up in Bluetooth Low Energy Monitor. I can’t remember the link where I read it but I think it’s part of the Bluetooth Low Energy Monitor Wiki or FAQs
If you do it that way then you don’t need to use the manual YAML that Barry uses. His post is from 2020 — I think before Bluetooth Low Energy Monitor could do it or maybe before it even existed.
مرحبًا, thank you for posting this great solution.
Can the esp32 Bluetooth gateway transmit data more than one bluetooth device or or do you have to provide one ESP 32 for each Bluetooth device we want to extend the range for?
Hi Tony
The ESP will transmit data for any BT devices within range I believe although as mine is currently only used for 1 BT device I can’t confirm 100% — but that is certainly my understanding