/ESP32-mqtt-room

An ESP32 based presence detection node for use with the Home Assistant mqtt_room component for localized device presence detection.

Primary LanguageC++GNU Affero General Public License v3.0AGPL-3.0

ESP32-mqtt-room

An ESP32 based presence detection node for use with the Home Assistant mqtt_room component for localized device presence detection.

This depends heavily on the hard work done by pcbreflux and nkolban both on GitHub and on their YouTube Channels. Specifically, it is a modified version of pcbreflux's ESP32_BLE_beaconscan.

Getting Started

You can get started by cloning this repository to your local machine using git. Alternatively, you can download the zip. To get the code onto your device, you can load it via the Arduino IDE or, thanks to some great work by kylegordon, you can now build and upload using PlatformIO.

Create a copy of the Settings.h file, and rename it to Settings_local.h. This will allow you to set your own configuration without the risk of any commits to the repository of sensitive information.

Open the folder in Atom, using the open project option in the PlatformIO Home screen. Modify the settings in the Settings_local.h file to match your environment. Set the correct port in the platformio.ini file (or remove the line to use auto-detection), and upload to the board. Open the serial monitor after successful upload to check for success.

OTA Support

It is possible to update the device using "Over the Air" (OTA) updates from the command line interface of PlatformIO. You will need to know the IP address of the device itself (check your router). From the command line, enter the command platformio run -t upload --upload-port {{Device IP Address}}

Home Assistant Configuration

Once the device is running, it is important to configure Home Assistant to use the information from the MQTT topic to determine what devices to track. You can read the full documentation on the Home Assistant website. It is critical that you configure your device IDs to include the Major version, but ignore Minor version (i.e. set it to 0). This is to match the configuration used on the ESP32.

Sample Configuration.yaml Entry

Here is an example of how an entry into your configuration.yaml file should look:

sensor:

# One entry for each BLE beacon you want to track
  - platform: mqtt_room
    device_id: "fda50693a4e24fb1afcfc6eb07647825-5-0" # Note that major version must match, but any minor version will be ignored
    name: 'iBeacon Room Presence'
    state_topic: 'room_presence'
    timeout: 60
    away_timeout: 120

binary_sensor:

# One entry per sensor node to understand when the device is online/offline
  - platform: mqtt
    name: ESP32 Room Presence
    state_topic: "presence_nodes/esp32"
    payload_on: "CONNECTED"
    payload_off: "DISCONNECTED"
    device_class: connectivity

Trackable Devices

iBeacon Hardware

Generic beacon hardware should be compatible, provided it meets a beacon standard (such as iBeacon or Eddystone). There are plenty of models based on the Nordic Semiconductor NRF51822 chip available from sellers such as eBay or Ali Express. Some other devices that advertise as BLE (such as the Mi Flora plant sensors or the Mi Band fitness tracker) can also be tracked, as long as you can scan the device and see its hardware ID.

Tracking Android Phone

In order to track your Android phone as a BLE Beacon, you will need to emulate Beacon adertisement packets from your phone. This is the opposite to what most beacon apps do (i.e. scanning for beacons instead of emulating one). I have had success using the Beacon Scope app. Configure a transmitter, and specify the device ID in your Home Assistant configuration files.

Tracking iPhone

Unfortunately, Apple does not allow devices to advertise iBeacon data in the background.

Future Development Tasks

  • Implement basic BLE packet discovery
  • Implement iBeacon data packet parsing
  • Setup instructions in README.md
  • Address watchdog issue
  • Match configuration options to Room Assistant
  • Implement Mi Flora data parsing and reporting
  • Whitelist functionality
  • Blacklist functionality
  • Maximum distance limit
  • Scan interval Settings
  • Configuration via Web UI
  • Wifi Manager for managing access point credentials
  • Implement Over-The-Air (OTA) updates
  • Build and upload via PlatformIO