ESPHome Smart Oil Diffuser & Nightlight

as I said, you have to solder a cable from RST to VCC, nothing more. Otherwise I have this esphome config

substitutions:
  devicename: bedroom_aroma_diffuser
  name: bedroom-aroma-diffuser
  friendly_name: Bedroom Aroma Diffuser
  device_description: Asakuki - ESP12F

esphome:
  name: ${name}
  friendly_name: ${friendly_name}

esp8266:
  board: esp01_1m
  restore_from_flash: true

# Enable logging
logger:
  baud_rate: 0

api:
  reboot_timeout: 1h
  encryption:
    key: ""

ota:
  - platform: esphome
    password: ""

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

  ap:
    ssid: "Asakuki-Diffuser"
    password: ""

captive_portal:

time:
  - platform: sntp
    timezone: Europe/Berlin
    id: sntp_time
    servers:
      - 0.pool.ntp.org
      - 1.pool.ntp.org
      - 2.pool.ntp.org

uart:
  baud_rate: 9600
  tx_pin: GPIO1
  rx_pin: GPIO3

tuya:
  id: master_bedroom_aroma_diffuser

button:
  - platform: restart
    name: Restart
    id: ${devicename}_reset
    entity_category: diagnostic

  - platform: factory_reset
    name: Factory Reset
    id: ${devicename}_fatory_reset
    internal: true
    entity_category: diagnostic

  - platform: safe_mode
    name: Safe Mode Boot
    id: ${devicename}_safe_mode_boot
    entity_category: diagnostic

text_sensor:
  - platform: tuya
    name: Selected Color
    id: ${devicename}_selected_color
    internal: true
    sensor_datapoint: 108
    on_value:
      then:
        - lambda: |-
            if (x == "00000000000000") {
              id(${devicename}_color).publish_state("None");
            } else if (x == "ff00000000ffff") {
              id(${devicename}_color).publish_state("Bright Red");
            } else if (x == "8000000000ff80") {
              id(${devicename}_color).publish_state("Dark Red");
            } else if (x == "ffff00003cffff") {
              id(${devicename}_color).publish_state("Bright Yellow");
            } else if (x == "808000003cff80") {
              id(${devicename}_color).publish_state("Dark Yellow");
            } else if (x == "00ff000078ffff") {
              id(${devicename}_color).publish_state("Bright Green");
            } else if (x == "0080000078ff80") {
              id(${devicename}_color).publish_state("Dark Green");
            } else if (x == "00ffff00b4ffff") {
              id(${devicename}_color).publish_state("Bright Cyan");
            } else if (x == "00808000b4ff80") {
              id(${devicename}_color).publish_state("Dark Cyan");
            } else if (x == "0000ff00f0ffff") {
              id(${devicename}_color).publish_state("Bright Blue");
            } else if (x == "00008000f0ff80") {
              id(${devicename}_color).publish_state("Dark Blue");
            } else if (x == "ff00ff012cffff") {
              id(${devicename}_color).publish_state("Bright Magenta");
            } else if (x == "800080012cff80") {
              id(${devicename}_color).publish_state("Dark Magenta");
            }

fan:
  - platform: tuya
    name: "Diffuseur fan"
    id: ${devicename}_diffuser_fan
    switch_datapoint: 1
    speed_datapoint: 103
    speed_count: 2

binary_sensor:
# sense water alert. 1 = fine. 0 = Out of water
  - platform: tuya
    name: Out of water
    id: ${devicename}_out_of_water
    sensor_datapoint: 12
    device_class: safety
    filters:
      - invert:

  - platform: status
    name: Status

switch:
  - platform: tuya
    name: Diffuser
    id: ${devicename}_diffuser
    switch_datapoint: 1

light:
  - platform: tuya
    name: LED
    id: ${devicename}_led
    switch_datapoint: 11
    dimmer_datapoint: 111
    color_type: RGBHSV
    color_datapoint: 108

select:
  - platform: tuya
    name: Light Mode
    id: ${devicename}_light_mode
    enum_datapoint: 110
    options:
      0: RGB Cycle
      1: Static Color
      2: White

  - platform: tuya
    name: Mist Strength
    id: ${devicename}_mist_strength
    enum_datapoint: 103
    options:
      0: low
      1: high

  - platform: template
    name: Color
    id: ${devicename}_color
    optimistic: true
    options:
      - None
      - Bright Red
      - Dark Red
      - Bright Yellow
      - Dark Yellow
      - Bright Green
      - Dark Green
      - Bright Cyan
      - Dark Cyan
      - Bright Blue
      - Dark Blue
      - Bright Magenta
      - Dark Magenta
    initial_option: None
    on_value:
      then:
        - if:
            condition:
              lambda: |-
                return x != "None";
            then:
              - light.turn_on: ${devicename}_led
              - lambda: |-
                  if (x == "Bright Red") {
                    id(master_bedroom_aroma_diffuser).set_string_datapoint_value(108, "ff00000000ffff");
                  } else if (x == "Dark Red") {
                    id(master_bedroom_aroma_diffuser).set_string_datapoint_value(108, "8000000000ff80");
                  } else if (x == "Bright Yellow") {
                    id(master_bedroom_aroma_diffuser).set_string_datapoint_value(108, "ffff00003cffff");
                  } else if (x == "Dark Yellow") {
                    id(master_bedroom_aroma_diffuser).set_string_datapoint_value(108, "808000003cff80");
                  } else if (x == "Bright Green") {
                    id(master_bedroom_aroma_diffuser).set_string_datapoint_value(108, "00ff000078ffff");
                  } else if (x == "Dark Green") {
                    id(master_bedroom_aroma_diffuser).set_string_datapoint_value(108, "0080000078ff80");
                  } else if (x == "Bright Cyan") {
                    id(master_bedroom_aroma_diffuser).set_string_datapoint_value(108, "00ffff00b4ffff");
                  } else if (x == "Dark Cyan") {
                    id(master_bedroom_aroma_diffuser).set_string_datapoint_value(108, "00808000b4ff80");
                  } else if (x == "Bright Blue") {
                    id(master_bedroom_aroma_diffuser).set_string_datapoint_value(108, "0000ff00f0ffff");
                  } else if (x == "Dark Blue") {
                    id(master_bedroom_aroma_diffuser).set_string_datapoint_value(108, "00008000f0ff80");
                  } else if (x == "Bright Magenta") {
                    id(master_bedroom_aroma_diffuser).set_string_datapoint_value(108, "ff00ff012cffff");
                  } else if (x == "Dark Magenta") {
                    id(master_bedroom_aroma_diffuser).set_string_datapoint_value(108, "800080012cff80");
                  }
            else:
              - lambda: |-
                  id(master_bedroom_aroma_diffuser).set_string_datapoint_value(108, "00000000000000");
              - light.turn_off: ${devicename}_led

status_led:
  pin:
    number: GPIO4
    inverted: true

I’m trying to flash the esp12f but can’t get it into flash mode.
the wiring are:
TTL > ESP12F

TX > RX
RX > TX
VCC (3V) > VCC (3V) > RST
GRD > GRD > GPIO0

what am I doing wrong?

Hi All, I’m late on the bandwagon but it appears that some Tuya chips are unlockable (without soldering) thanks to all the great work done on Tuya Cloudcutter. I have no idea if any diffuser chips are supported but it might be worth exploring!

I tried to replicate what you got, however i am running into issues:

12:16:42	[I]	[esphome.ota:326]	
Update complete
12:16:42	[W]	[component:172]	
Component esphome.ota cleared Warning flag
12:16:42	[I]	[app:132]	
Rebooting safely...
12:18:02	[I]	[tuya:156]	
MCU restarted
12:18:02	[W]	[tuya:201]	
Supplied status_pin does not equals the reported pin 2. TuyaMcu will work in limited mode.
12:18:02	[W]	[fan:055]	
'Diffuseur fan' - This fan does not support oscillation!
12:18:02	[W]	[fan:065]	
'Diffuseur fan' - This fan does not support directions!
12:18:02	[W]	[tuya:626]	
Setting unknown datapoint 1
12:18:02	[E]	[tuya.fan:015]	
Speed has invalid value 2
12:18:02	[W]	[tuya.select:017]	
Invalid value 2
12:18:09	[W]	[api.connection:135]	
ESPHome Logs 2025.4.0 (10.0.0.219): Connection closed
12:18:45	[I]	[safe_mode:041]	
Boot seems successful; resetting boot loop counter

Here is my configuration:

substitutions:
  name: schlafzimmer_luftbefeuchter
  friendly_name: Schlafzimmer Luftbefeuchter

esphome:
  name: schlafzimmer-luftbefeuchter
  friendly_name: $friendly_name

esp8266:
  board: esp01_1m

logger:
    baud_rate: 0
    level: INFO

api:

ota:
  - platform: esphome

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

  ap:
    ssid: friendly_name

captive_portal:

time:
  - platform: sntp
    timezone: Europe/Berlin
    id: sntp_time
    servers:
      - 0.pool.ntp.org
      - 1.pool.ntp.org
      - 2.pool.ntp.org

web_server:
  port: 80

uart:
  baud_rate: 9600
  tx_pin: GPIO1
  rx_pin: GPIO3

tuya:
  id: schlafzimmer_luftbefeuchter

button:
  - platform: restart
    name: Restart
    id: ${name}_reset
    entity_category: diagnostic
    icon: mdi:restart

  - platform: factory_reset
    name: Factory Reset
    id: ${name}_fatory_reset
    entity_category: diagnostic
    

  - platform: safe_mode
    name: Safe Mode Boot
    id: ${name}_safe_mode_boot
    entity_category: diagnostic
    icon: mdi:seatbelt

text_sensor:
  - platform: tuya
    name: Selected Color
    id: ${name}_selected_color
    internal: true
    sensor_datapoint: 108
    on_value:
      then:
        - lambda: |-
            if (x == "00000000000000") {
              id(${name}_color).publish_state("None");
            } else if (x == "ff00000000ffff") {
              id(${name}_color).publish_state("Bright Red");
            } else if (x == "8000000000ff80") {
              id(${name}_color).publish_state("Dark Red");
            } else if (x == "ffff00003cffff") {
              id(${name}_color).publish_state("Bright Yellow");
            } else if (x == "808000003cff80") {
              id(${name}_color).publish_state("Dark Yellow");
            } else if (x == "00ff000078ffff") {
              id(${name}_color).publish_state("Bright Green");
            } else if (x == "0080000078ff80") {
              id(${name}_color).publish_state("Dark Green");
            } else if (x == "00ffff00b4ffff") {
              id(${name}_color).publish_state("Bright Cyan");
            } else if (x == "00808000b4ff80") {
              id(${name}_color).publish_state("Dark Cyan");
            } else if (x == "0000ff00f0ffff") {
              id(${name}_color).publish_state("Bright Blue");
            } else if (x == "00008000f0ff80") {
              id(${name}_color).publish_state("Dark Blue");
            } else if (x == "ff00ff012cffff") {
              id(${name}_color).publish_state("Bright Magenta");
            } else if (x == "800080012cff80") {
              id(${name}_color).publish_state("Dark Magenta");
            }
  - platform: wifi_info
    ssid:
      name: "SSID"
      icon: mdi:access-point-network
    ip_address: 
      name: "IP Address"
      icon: mdi:ip-network
    mac_address: 
      name: "MAC Address"
      icon: mdi:network

fan:
  - platform: tuya
    name: "Diffuseur fan"
    id: ${name}_diffuser_fan
    switch_datapoint: 1
    speed_datapoint: 103
    speed_count: 2

binary_sensor:
# sense water alert. 1 = fine. 0 = Out of water
  - platform: tuya
    name: Out of water
    id: ${name}_out_of_water
    sensor_datapoint: 12
    device_class: safety
    filters:
      - invert:

  - platform: status
    name: Status

switch:
  - platform: tuya
    name: Diffuser
    id: ${name}_diffuser
    switch_datapoint: 1

light:
  - platform: tuya
    name: LED
    id: ${name}_led
    switch_datapoint: 11
    dimmer_datapoint: 111
    color_type: RGBHSV
    color_datapoint: 108

select:
  - platform: tuya
    name: Light Mode
    id: ${name}_light_mode
    enum_datapoint: 110
    options:
      0: RGB Cycle
      1: Static Color
      2: White

  - platform: tuya
    name: Mist Strength
    id: ${name}_mist_strength
    enum_datapoint: 103
    options:
      0: low
      1: high

  - platform: template
    name: Color
    id: ${name}_color
    optimistic: true
    options:
      - None
      - Bright Red
      - Dark Red
      - Bright Yellow
      - Dark Yellow
      - Bright Green
      - Dark Green
      - Bright Cyan
      - Dark Cyan
      - Bright Blue
      - Dark Blue
      - Bright Magenta
      - Dark Magenta
    initial_option: None
    on_value:
      then:
        - if:
            condition:
              lambda: |-
                return x != "None";
            then:
              - light.turn_on: ${name}_led
              - lambda: |-
                  if (x == "Bright Red") {
                    id(schlafzimmer_luftbefeuchter).set_string_datapoint_value(108, "ff00000000ffff");
                  } else if (x == "Dark Red") {
                    id(schlafzimmer_luftbefeuchter).set_string_datapoint_value(108, "8000000000ff80");
                  } else if (x == "Bright Yellow") {
                    id(schlafzimmer_luftbefeuchter).set_string_datapoint_value(108, "ffff00003cffff");
                  } else if (x == "Dark Yellow") {
                    id(schlafzimmer_luftbefeuchter).set_string_datapoint_value(108, "808000003cff80");
                  } else if (x == "Bright Green") {
                    id(schlafzimmer_luftbefeuchter).set_string_datapoint_value(108, "00ff000078ffff");
                  } else if (x == "Dark Green") {
                    id(schlafzimmer_luftbefeuchter).set_string_datapoint_value(108, "0080000078ff80");
                  } else if (x == "Bright Cyan") {
                    id(schlafzimmer_luftbefeuchter).set_string_datapoint_value(108, "00ffff00b4ffff");
                  } else if (x == "Dark Cyan") {
                    id(schlafzimmer_luftbefeuchter).set_string_datapoint_value(108, "00808000b4ff80");
                  } else if (x == "Bright Blue") {
                    id(schlafzimmer_luftbefeuchter).set_string_datapoint_value(108, "0000ff00f0ffff");
                  } else if (x == "Dark Blue") {
                    id(schlafzimmer_luftbefeuchter).set_string_datapoint_value(108, "00008000f0ff80");
                  } else if (x == "Bright Magenta") {
                    id(schlafzimmer_luftbefeuchter).set_string_datapoint_value(108, "ff00ff012cffff");
                  } else if (x == "Dark Magenta") {
                    id(schlafzimmer_luftbefeuchter).set_string_datapoint_value(108, "800080012cff80");
                  }
            else:
              - lambda: |-
                  id(schlafzimmer_luftbefeuchter).set_string_datapoint_value(108, "00000000000000");
              - light.turn_off: ${name}_led

status_led:
  pin:
    number: GPIO4
    inverted: true

sensor:
  - platform: wifi_signal
    icon: mdi:signal-variant
    name: "WiFi Signal dB"
    id: wifi_signal_db
    update_interval: 60s
    entity_category: "diagnostic"

  - platform: uptime
    icon: mdi:clock
    name: "Uptime"
    unit_of_measurement: minutes
    filters:
      - lambda: return x / 60.0;
    entity_category: "diagnostic"