Levoit's Core 300s
General Notes
A smart air purifier with 3-stage filtration. The ESP32 talks to the Tuya MCU using standard 8N1 115200-baud UART. Code and configuration were obtained from acvigue's 'esphome-levoit-air-purifier' repo. It seems to be supporting the rest of the line-up, but the 300s is the only one tested by the author.
Manufacturer: Levoit

GPIO Pinout
| Pin | Function | 
|---|---|
| GPIO16 | TX Pin | 
| GPIO17 | RX Pin | 
Flashing
Based on the procedure shared by acvigue and Aiden Vigue
Disassembly
- Place upside down and remove base cover and filter to expose 8 screws (4 have washers)
- Remove all 8 screws. Be careful, as these are made out of a soft metal
- Using a pry tool slide in between tabs
- Separate base and top sleeve
- Unplug logic board
Flash
- Solder a header or wires to the module’s pins (3.3 V, GND, TX, RX, and GPIO0)
 
- Connect TX→RX, RX→TX, GND→GND, and 3.3 V→3.3 V (do not use 5 V)
- Hold GPIO0 to GND while applying power to enter the ESP32 bootloader
- Use your preferred flasher (e.g., esptool.py) to write the ESPHome firmware
ESPHome Configuration
esphome:
  name: levoit-air-purifier-core-300s
  friendly_name: Levoit Air Purifier Core 300s
esp32:
  board: esp32dev
  framework:
    type: esp-idf
    sdkconfig_options:
      CONFIG_FREERTOS_UNICORE: y
external_components:
  - source: github://acvigue/esphome-levoit-purifier
    components: [levoit]
logger:
  baud_rate: 115200
# Enable Home Assistant API
api:
ota:
  - platform: esphome
wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  ap:
    ssid: "$friendly_name Hotspot"
captive_portal:
uart:
  tx_pin: GPIO17
  rx_pin: GPIO16
  baud_rate: 115200
levoit:
  id: levoit1
fan:
  - platform: levoit
    name: Levoit Purifier
sensor:
  # Uptime sensor.
  - platform: uptime
    name: Uptime
  # WiFi Signal sensor.
  - platform: wifi_signal
    name: WiFi Signal
    update_interval: 60s
  # PM2.5 sensor
  - platform: levoit
    pm_2_5:
      name: PM2.5
    air_quality:
      name: Air Quality Index
switch:
  - platform: levoit
    display_lock:
      name: "Display Lock"
    display_on:
      name: "Display On"
    power:
      name: "Master Power"
select:
  - platform: levoit
    fan_mode:
      name: "Fan Mode"
    auto_mode:
      name: "Auto Mode"