rbaron / b-parasite

🌱💧 An open source DIY soil moisture sensor
1.95k stars 151 forks source link

BLE 5 Long Range / Coded PHY #58

Open rbaron opened 2 years ago

rbaron commented 2 years ago

BLE 5 introduced a new PHY - the Coded PHY - which extends the range of BLE at the expense of data rate and current consumption. For b-parasite, data rate is not very relevant, as we only need a few bytes every few minutes.

This article for Nordic finds that the outdoor range is roughly doubled when using Coded PHY under test conditions.

Test Setup

I implemented experimental support for Coded PHY for b-parasite in a7732f106b75e24ddcb921d37180e2151297d8ee. I flashed two b-parasites, one running Coded PHY and one running the usual Uncoded PHY. Both advertise for 1 s with a 30 ms interval and sleep for 2 s.

I then hacked support for Coded PHY in ESPHome's esp32_ble_tracker component in rbaron/esphome/ble_ext_tracker_component. I'm using it like this in an ESP32-C3-DevKitC-02 dev board with a PCB antenna:

esphome:
  name: prst-ext-tracker
  platformio_options:
    board_build.flash_mode: dio

esp32:
  board: esp32-c3-devkitm-1
  framework:
    type: esp-idf
    sdkconfig_options:
      CONFIG_BT_BLE_50_FEATURES_SUPPORTED: y

 external_components:
   - source: github://rbaron/esphome@ble_ext_tracker_component
     components: [ esp32_ble_tracker ]

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

api:
  password: !secret home_assistant_api

esp32_ble_tracker:

sensor:
  # Uses Coded PHY.
  - platform: b_parasite
    mac_address: "f0:ca:f0:ca:02:01"
    humidity:
      name: "Coded PHY Humidity"
    temperature:
      name: "Coded PHY Temperature"
    moisture:
      name: "Coded PHY Soil Moisture"
      force_update: true
    battery_voltage:
      name: "Coded PHY Battery Voltage"
  - platform: ble_rssi
    mac_address: "f0:ca:f0:ca:02:01"
    name: "Coded PHY RSSI"
  # Does not use Coded PHY.
  - platform: b_parasite
    mac_address: "f0:ca:f0:ca:02:02"
    humidity:
      name: "Uncoded PHY Humidity"
    temperature:
      name: "Uncoded PHY Temperature"
    moisture:
      name: "Uncoded PHY Soil Moisture"
      force_update: true
    battery_voltage:
      name: "Uncoded PHY Battery Voltage"
  - platform: ble_rssi
    mac_address: "f0:ca:f0:ca:02:02"
    name: "Uncoded PHY RSSI"

logger:

Power Consumption

Default, Uncoded PHY - Average 1.49 mA while transmitting: uncoded

Coded PHY - Average 7.2 mA while transmitting: coded

Indoor Range

In this test, I left the ESP32-C3 in my office and walked down the stairs in my building.

Screen Shot 2022-09-11 at 16 09 04

Initial Results

With this first quick and simple test, I unfortunately haven't observed any meaningful differences in indoor range. There are still many parameters to experiment with, of course, but we have to start somewhere. I also want to try a nRF52-based scanner and a better, non-PCB antenna.

pvvx commented 2 years ago

LongRange (Coded PHY) works in HA from USB-BT RTL8761B. But not all options. The BLE standard provides for the reception of generic advertisements in the Coded PHY. But this option does not work - there is no support in many OS. It also doesn't work when extended advertising send the header to the Coded PHY on the main channels. This is also a defect of software manufacturers.

https://www.home-assistant.io/integrations/bluetooth/#known-working-adapters This description is incorrect. Long Range is not the presence of an external antenna :)