I finally took the time to convert the Treatlife Single Pole Smart Dimmer Switch (DS02S) to ESPhome after a bunch of searching and trial and error I finally have a good configuration that gives me all of the same control and options just without the connection to Tuya/Treatlife.
I purchased the DS02S in July 2022, the version that I received has a board version 2.1 with a date code of 2020/06/23. It does have the WB3S module and the Nuvoton (TuyaMCU) controller. I was able to use tuya-cloudcutter to load ESPhome to the board. Below is the YAML file I have loaded and operating on this switch. Some of the text sensors might be too much information so you can always comment it out.
substitutions: device_name: basement_lights device_friendly_name: Basement Lights device_description: "Treatlife Single Pole Smart Dimmer Switch DS02S" icon: "mdi:light-switch" update_interval_wifi: "60s" # Esphome core information esphome: name: ${device_name} friendly_name: ${device_friendly_name} comment: ${device_description} on_boot: priority: 600 then: lambda: |- int value = 0; auto call = id(led_indicator).make_call(); call.set_value(value); call.perform(); id(light1).remote_values.set_brightness(100); # The board type for this device bk72xx: board: generic-bk7231t-qfn32-tuya framework: version: dev # Automatically logs all log messages, By default, all logs with a severity DEBUG or higher will be shown # Increasing the log level severity (to e.g INFO or WARNING) can help with the performance of the application and memory size. logger: level: INFO baud_rate: 0 # Creata a simple web server on the node that can be accessed through any browser and a simple REST API web_server: # Make the node announce itself on the local network using the multicast DNS (MDNS) mdns: # ESPHome native API is used to communicate with clients directly, required for openHAB functionality api: encryption: key: !secret api_password # Permit OTA (Over The Air) updates ota: - platform: esphome password: !secret esphome_password # Setup the wifi connection, and configure a possible local access point wifi: ssid: !secret wifi_ssid password: !secret wifi_password domain: !secret wifi_domain power_save_mode: NONE # Enable fallback hotspot (captive portal) in case wifi connection fails ap: ssid: ${device_name} password: !secret ap_password # After 1 minute of unsuccessful WiFi connection attempts, the ESP will start a WiFi hotspot (with the credentials from ap configuration above) captive_portal: # Provide buttons to restart device in normal and Safe modes. button: - platform: restart name: "Restart" id: restart_normal - platform: safe_mode name: "Restart (Safe Mode)" id: restart_safe debug: update_interval: 30s # Report various information about the device and the WiFi connection text_sensor: - platform: debug reset_reason: name: Reset Reason - platform: version name: Version - platform: libretiny version: name: LibreTiny Version - platform: wifi_info ip_address: name: ${device_friendly_name} IP Address icon: "mdi:ip-outline" update_interval: ${update_interval_wifi} ssid: name: Connected SSID icon: "mdi:wifi-settings" update_interval: ${update_interval_wifi} bssid: name: Connected BSSID icon: "mdi:wifi-settings" update_interval: ${update_interval_wifi} mac_address: name: ${device_friendly_name} WiFi MAC Address icon: "mdi:network-outline" # Set the time: - platform: sntp servers: xx.xx.xx.x id: sntp_time # Loads TUYA library to communicate with MCU and sends the time to the MCU tuya: time_id: sntp_time # Sets the communication details to MCU uart: rx_pin: GPIO10 tx_pin: GPIO11 baud_rate: 115200 # This defines the white led number: - platform: tuya id: "led_indicator" number_datapoint: 104 min_value: 0 max_value: 1 step: 1 # Report the WiFi Signal Strength and Uptime sensor: - platform: wifi_signal name: ${device_friendly_name} WiFi Signal update_interval: 60s filters: - delta: 0.01 - throttle: 300s - platform: uptime name: ${device_friendly_name} Uptime unit_of_measurement: minutes filters: - lambda: return x / 60.0; light: - platform: "tuya" name: ${device_friendly_name} id: light1 icon: ${icon} dimmer_datapoint: 2 switch_datapoint: 1 min_value: 10 max_value: 1000 restore_mode: RESTORE_AND_ON # This allows you to control the Dimming Mode and how the led operates when the load is on or off. select: - platform: "tuya" id: "dimmer_mode" name: "Dimming Mode" enum_datapoint: 4 options: 0: LED # Index 0 1: Incandescent # Index 1 2: Halogen # Index 2 - platform: template name: "LED indicator vs load" optimistic: true options: - Follow - Opposite set_action: then: lambda: |- int value = 0; if( x == "Opposite" ) { value = 0; } else if( x == "Follow") { value = 1; } auto call = id(led_indicator).make_call(); call.set_value(value); call.perform(); #1 - switch #2 - dimmer = 763 #3 - brightness min = 100 Diming Range 10%= 100, 100%=1000 #4 - dimming mode = LED, incandescent, halogen #101 - led_bright low/ wake_up value=AAAA #102 - count_down value=0 #103 - bright_value_3 = 10 #104 - led indicator #105 - random time
Can you give more information on how you flash these with esphome? Thank you
I used Tuya-CloudCutter (https://github.com/tuya-cloudcutter/tuya-cloudcutter) to get it over to ESPHome.
Many thanks for sharing this. Over the weekend I was able to update 8 of my DS02S switches. I also have DS02, SS02S and SS02 switches that I’d like to update or replace with switches that I can flash. I assume since you shared your code for one treatlife device, you might have others. Or you may be able to give a recommendation for alternates I should consider. Many thanks.
I will get the code I am using for the SS02 (3-way smart switch) and for the SS02S (Single Pole On/Off switch) posted soon. I have the DS03 (Smart Ceiling Fan Control) that I’m still working on as the chip on this unit requires a different method of loading the firmware than the other devices. I’ll try to get those posted in a couple of days.
Hi Aaron. Many thanks for offering to help. I have some DS02F fan switches that I couldn’t directly update to ESPHome. I had to first flash with OpenBeken and then upload a ESPHome OTA update after that. It seems to have worked, but I’m still struggling with the YAML settings for that one. Looking forward to seeing what you have for the other devices. All the best.