this motion detecting night light tells Home Assistant when you pass by

The very popular, but hardly-known Xiaomi nightlight, which lights up a dark space when you pass, now has a ‘smart’ version. A night light is nice on a dark stairway and toe-saving on a bedroom floor, but this version is able to send these exciting events to a home automation hub. If it can do that maybe we can use it to trigger other smart devices? Today’s post explains how to read the light’s sensors with Home Assistant – as well as how to buy the right model.

what can I do with the Xiaomi Yeelight night light – MJYD02YL-A

When added to the Xiaomi Mi Home app you can set the light’s brightness; the light level at which it doesn’t turn on and how long the light should remain on. You can turn off the night light feature completely if you want to use it as a sensor and save power. Your phone must be within Bluetooth range to change a setting.

IN THEORY, the app can also set up triggers that notify you, fire an alarm, or turn on a light or a camera. You’d need a Xiaomi gateway, if such a thing exists, to be available to listen for triggers and effect actions. BUT HAPPILY we use Home Assistant so there’s hope for us.

You connect the Xiaomi night light to Home Assistant via a Bluetooth BLE gateway (which we’ll make below – and it has other good uses such as here). The night light provides three sensors that report on the battery level, the idle time, and the light brightness setting. Two more sensors have on/off states that detect motion and report whether the ambient light level is at a trigger level (I think). There appears to be no way for Home Assistant to trigger the night light or adjust anything.

A first use case is to put the night light in a kitchen. When motion is detected the main kitchen light fades up. If there’s no further activity for 15 minutes the main light turns off. When motion is detected during the night, the main kitchen light only fades up to 20%. If there’s no activity for 5 minutes the main light turns off. See below for the automation setup.

You could also place the night light near a door and use it to trigger all the security cameras to start recording. But I’m riffing: the device seems to work, and experience will lead to meaningful uses.

Alert to misleading shops: there are more than two versions of the Xiaomi night light. All versions have a motion sensor and are deemed smart. There are versions that also have Bluetooth to communicate with the Mi Home / Mijia app and communicate with ESPHome. You want that one and it costs £12. Look for Xiaomi Mijia night light 2021 Bluetooth-compatible for app with adjustable brightness. The model number might be MJYD02YL-A but look for “Bluetooth” or “BLE”.

what you need to make this work

  • the Xiaomi Mi Home app, signed in on a phone or tablet
  • an ESP32 development board eg ‘MV-HT ESP32 minikit’ OR ‘M5Stack ATOM Lite ESP32 IoT Development Kit
  • possibly CH34xVCP drivers to connect to the ESP32 USB
  • Home Assistant, the home automation hub running on eg a Raspberry Pi – see my introduction here
  • ESPHome, an add-on for Home Assistant, installed within Home Assistant – see how and why here

what to do to make this nightlight more useful

  • set up the nightlight in the Xiaomi Mi Home app and register a login account
  • go to ESPHome and set up a new device for our Bluetooth ‘sniffer’
  • edit the code below and get a security ‘bindkey’
  • compile the code and download a bin file to put on the ESP32 minikit
  • connect the ESP32 minikit to a USB power source
  • discover the Bluetooth ‘sniffer’ and add entities to a Home Assistant dashboard.
  • use an entity as a trigger in an automation routine

install the MiHome app and add the Xiaomi nightlight

  1. The MiHome app is used to monitor and control a huge range of Xiaomi brand devices. Whatever your initial impression, over the years the app has become very capable and it doesn’t miss a trick. After you install it, register an account with an email address and password. Unless you read otherwise, some devices work best when set up with ‘Chinese mainland’ as the account location.
  2. Turn on Bluetooth on your phone. When you’re signed into the app, look for a ‘+’ to add a device, choose the Xiaomi nightlight and follow the guide. You’ll be asked to remove the nightlight white cover and flick the Bluetooth switch from side to side to make the nightlight discoverable.
  3. Explore the settings for the nightlight and get it working as required. Now’s the best time to repeat the discovery process for other Xiaomi devices that you may have.

add the code to your ESPhome node

  • in your browser, go to the ESPhome section of your Home Assistant installation for example, 192.168.1.X:8123.
  • create a ‘new device’. You’ll now identify the ESP32 development board you use. Worry not if you can’t find it: the generic ESP32 will be fine.
  • click edit to use the ESPHome code editor and note the code that’s already been added. Add in (paste) the following and click SAVE. Now edit each section to switch my details (wifi; ip; mac address; names) for yours. Ensure that you have only one of each section heading eg you want only one esphome: in the left margin.
esphome:
name: btproxy-mini
friendly_name: btproxy-mini

esp32:
board: esp32dev
framework:
type: esp-idf

# Enable logging
logger:

# Enable Home Assistant API
api:
# encryption:
# key: "f2CntXFKA4UmpxC2tvYL7+jHmefmw4wLXXXXXXXX"
# the above may be optional

ota:
- platform: esphome
# password: ""

wifi:
networks:
- ssid: !secret wifi_ssid
password: !secret wifi_password
- ssid: !secret ee_ssid
password: !secret ee_password

# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "Btproxy-Mini Fallback Hotspot"
password: ""
captive_portal:
mdns:


esp32_ble_tracker:
scan_parameters:
active: true
interval: 1100ms
window: 1100ms


bluetooth_proxy:
active: true

# DONT USE FOR PRODUCTION
# web_server:
# port: 80

# binary_sensor:
# optional you can detect the presence of Bluetooth devices that don't have integrations.
# - platform: ble_presence
# mac_address: D0:B4:5D:33:XX:XX
# name: roger_huaweiwatch
THE FOLLOWING CODE WAS RELEVANT IN 2021 - IN 2023 XIAOMI DEVICES BECAME INTEGRATED

substitutions:
devicename: bluesniffer

esphome:
name: ${devicename}
platform: ESP32
board: mhetesp32minikit

# when you create a 'new node' in ESPhome it adds esphome: above. The name can be anything without punctuation. I use a substitution string which helps to reduce my typos later in the code. It's more useful in other projects where simply changing the devicename above changes the name throughout the code.

# variously useful features - you can add a password to stop your ESP being accessed by another Home Assistant device on your home wifi
logger:
api:
ota:
captive_portal:


# add your own wifi details

wifi:
ssid: "mywifidetails"
password: "password"
# details for the hotspot (captive portal) in case your wifi connection fails
ap:
ssid: "ble_hotspot"
password: "password"
# details for the ESP32 to have a self-assigned IP address
manual_ip:
# Set the IP of the ESP
static_ip: 192.168.1.24
# Set gateway to the IP address of the router which often ends with .1
gateway: 192.168.1.1
# The subnet of the network - the following works for most home networks
subnet: 255.255.255.0


# this code adds the Bluetooth sniffer feature to the ESP32

esp32_ble_tracker:


sensor:
# optional you can also use the xiaomi temperature sensor platform on this same ESP.
- platform: xiaomi_lywsdcgq
mac_address: '58:2D:34:34:XX:XX'
temperature:
name: "hall temperature"
humidity:
name: "hall humidity"
battery_level:
name: "hall battery"

# optional this is a bit of code to tell you if the wifi is ok
- platform: wifi_signal
name: ${devicename} wifi signal
update_interval: 600s

binary_sensor:
# optional you can detect the presence of a Bluetooth phone on the same ESP.
- platform: ble_presence
mac_address: D0:B4:5D:33:XX:XX
name: roger_huaweiwatch

# this code helps to recognise the Xiaomi nightlight
- platform: xiaomi_mjyd02yla
name: "MJ-nightlight"
# insert the mac address of the Xiaomi nightlight - see next section
mac_address: "EC:4D:3E:D9:BB:BB"
# insert the BLEkey of the Xiaomi nightlight - see next section
bindkey: "1605be6026ac8276e7f49cf7fa07xxxx"
idle_time:
name: "MJ-idletime"
light:
name: "MJ-lightstatus"
battery_level:
name: "MJ-battery"
illuminance:
name: "MJ-luminance"
a mini ESP32 development board is turned into a Bluetooth / BLE gateway

get the Bluetooth BLE key or ‘bindkey’ for the Xiaomi nightlight

By now you should have added the nightlight to the Xiaomi Mi Home app. These details are stored in Xiaomi’s cloud so that if you mislaid your phone, you could login to the app on an ipad and find your nightlight there. You now need these account login details. It might be important to you that outsiders can’t access your devices so each time a device is set up a new password or bind key is made for the connection. We need that bindkey to decode the ‘secure’ data sent by the nightlight.

  1. After some moments you’ll see an output as below. Copy the BLE KEY hex code. When Home Assistant discovers your Xiaomi device (or when you add the Xiaomi integration) you will be asked to paste in the bindkey.
  2. In the ESPhome code editor click Save and Install and choose Manual download. When the compiler finishes it may download the bin file to your computer.
  3. You can upload the bin file using the ESPHOME WEB PORTAL. Plug the ESP32 dev board into the computer.
  4. Alternatively the traditional upload requires that you use a desktop app: ESPhome Flasher. Choose a COM port and choose the bin file just saved. If the above goes wrong try again once more. Hit view logs. Or try again after removing / reinstalling the CH34xVCP drivers. You may need to choose a different port. You may need to hold the dev board button when you power it.
OUTPUT AFTER ENTERING YOUR XIAOMI LOGIN DETAILS in token_extractor.exe

Devices found for server "cn":
   ---------
   NAME:     door nightlight
   ID:       blt.4.18rbaug400000
   BLE KEY:  3906f4b284b4131e533869c6cd111111
   MAC:      EC:4D:3E:D9:CC:CC
   TOKEN:    819fdceb1808117775222211
   MODEL:    yeelink.light.nl1
   ---------
   NAME:     kitchen nightlight
   ID:       blt.4.19adadmd00000
   BLE KEY:  1605be6026ac8276e7f49cf7fa07xxxx
   MAC:      EC:4D:3E:D9:BB:BB
   IP:       10.174.205.33
   TOKEN:    278f150de3c3b5a37d22223f
   MODEL:    yeelink.light.nl1
   ---------
   NAME:     workshop camera
   ID:       50639001
   MAC:      34:CE:00:E6:AA:AA
   IP:       192.168.10.145
   TOKEN:    33566e50504e73774931595174522222
   MODEL:    isa.camera.df3
   ---------

Press ENTER to finish

more ways to get the Bluetooth BLE key or ‘bindkey’ for the Xiaomi nightlight

Use the command line in Linux

  • An alternative method for Linux is described at https://github.com/PiotrMachowski/Xiaomi-cloud-tokens-extractor. It downloads the same token extractor written in python. Here’s what you do:
  • open a Linux terminal on a PC or Raspberry Pi with python
  • enter sudo wget https://github.com/PiotrMachowski/Xiaomi-cloud-tokens-extractor/releases/latest/download/token_extractor.zip extractor/raw/master/run.sh)
  • enter sudo unzip token_extractor.zip
  • If that fails enter sudo apt-get install unzip then try it again
  • enter cd token_extractor
  • enter sudo pip3 install -r requirements.txt
  • enter sudo python3 token_extractor.py

add the ESPhome ESP32 node to Home Assistant

Home Assistant on the Raspberry Pi will discover the ESP32 that we’ve just programmed. The ESPhome ‘logs’ window lets you see the what the ESP32 sees and we hope that’s encouraging.

Go to the Home Assistant Overview tab and choose edit dashboard in the top corner. Add an entities card and add the entities shown below. Their names may be different to mine

make a routine (aka automation) where something triggers the light

Disclaimer: at present my night light isn’t triggering fast enough to be useful. However the following shows what the automation looks like first as ‘yaml code’ and secondly as set up in the automation editor.

alias: KITCHEN - motion day lightson
description: ''
mode: restart
trigger:
  - platform: state
    entity_id: binary_sensor.mj_nightlight
    from: 'off'
    to: 'on'
    for:
      hours: 0
      minutes: 0
      seconds: 1
condition:
  - after: '06:30'
    before: '23:00'
    condition: time
action:
  - service: light.turn_on
    data:
      brightness_pct: 100
    target:
      entity_id: light.ceiling_all
  - delay:
      hours: 0
      minutes: 15
      seconds: 0
      milliseconds: 0
  - service: light.turn_off
    data: {}
    entity_id: light.ceiling_all

2 Responses

  1. Matthias says:

    Hello,
    what is actually the reason for the ESP32 based esphome device? Would it be possible to receive BLE broadcasts of the lamp directly in the home assistant instance via the BT device in the Raspberry Pi?
    And one question more: did you try to set something in the MI lamp like on/off or the dim level via bluetooth?
    As far as I got it, the Xiaomi app also uses bluetooth to set the values in the lamp. That’s why I hope this would be also possible via Bluetooth from Home Assistant.
    Looking forward to your insights as this lamp is the only affordable battery driven dimmable Led lamp with bluetooth I found so far which would fit my use case very well

    • roger says:

      Hi Matthias and thank you for your questions.

      what is actually the reason for the ESP32 based esphome device? To put a Bluetooth ‘sniffer’ (a ‘proxy’) nearer to your Bluetooth devices. In my house I need two ESPhome Bluetooth Proxies to be able to listen to the Xiaomi nightlights; temperature sensors in different rooms and also detect when a phone is nearby for ‘presence detection’. I think you’ll soon find that a Bluetooth proxy is very useful.

      Would it be possible to receive BLE broadcasts of the lamp directly in the home assistant instance via the BT device in the Raspberry Pi? I believe you can. It’s a popular question. Some people point to problems – see here. https://www.home-assistant.io/integrations/bluetooth

      Did you try to set something in the MI lamp like on/off or the dim level via bluetooth? As you say the Xiaomi Mihome app can do this – I set mine and never touch it. Home Assistant is presently limited to simply listening for changes in sensors. You’d have to search further and hope someone shares your need.

      My Xiaomi devices the most useful things of all. You chose well I think.

Leave a Reply

Your email address will not be published. Required fields are marked *