Finally figured out how to get these floods off of Tuya with full local control, including DDP listening from a WLED controller. Best part, this is all done over the air and no hardware to mod.
Pre-Reqs
Need a Ubuntu/Linux machine with Docker to do the install with Tuya Cloud Cutter. Git clone the repository locally.
For DDP to work you for effects you need need an ESP32 running WLED or xLights. This is running separately from the Novostella floods.
Flashing
Run sudo ./tuya-cloudcutter.sh from the terminal, no need for additional flags
Choose 2 - Flash 3rd Party Firmware
Select OpenBeken firmware that you downloaded
Select By firmware version and name
My version was 2.9.6 - BK7231T, double check in the smart life app under device info->updates
Choose Tuya Generic
Choose GU10 RGBCT Bulb
Power cycle the flood light 6 times with about 1 second between on/off. If the light is flashing quickly, power cycle 3 more times. Should be flashing slowly.
Pro tip use a smart outlet and press the button on it.
Thanks for posting this! I originally bought the four pack and then decided to return them and build my own waterproof box and use a ānormalā pixel flood light. But I have a location that Iād prefer not to do that.
I wouldnāt mind a higher power one thoughā¦ Iāve searched around (not just your links), and donāt see anyone messing with the 60 and 100 Watt options. Are you aware of any info if they have a BK7231T or not?
Also, from my understanding of your steps, you linked yours to a Tuya/Smart Life account first (to check version number?). Is that required, or any way around that?
I had a friend that was able to directly flash them without connecting to Tuya (smart life), he used LibreTiny (EspHome) instead of OpenBeken. I plan to switchover in the next few weeks.
Somewhere in discord I think they said the 60w uses the same chip, canāt find it so no guarantees.
Greatly appreciate the response.
Are you saying he linked it with an account on Tuya or Smart Life? I was hoping to avoid doing thatā¦ is there a way to?
Same with your conversionā¦ is there a way around activating via Tuya or Smart Life first? (other than opening the unit up)
I guess my only remaining point of confusion is that it seemed like you were saying to check the version number before upgrading, and that required connecting to Tuya/Smart Life.
Temporally adding the devie to the Generic Tuya app (I am not sure about the many other private label apps) is a bit of extra work, however, in my experience this Tuya app defaults to NOT upgrading the firmware of device you are installing, rather it requiring you to manually do the upgrade, so playing around in the generic Tuya app, unless you select a firmware upgrade, is harmless IHMO and may offer some useful info if you encounter issues in later steps (which for the goal of replacing the device firmware, do NOT upgrade the device firmware). So I add the device to this generic Tuya app and take iOS screen shots of the various UI screens. The most important screen to grab a screen shot of is the device and MCU current version number. This is mostly a CYA step in case your device has a firmware version that is not supported by the Cloud Cutter process, having this info might help you to understand if you might have made a mistake during the cloud cutter steps or if the device is not able to ācutā. This is found by clicking the āpencilā icon in the upper right of the iOS screen and then selecting the āDevice Updateā option at the bottom of the screen, select this even if it says āNo updates availableā. This will take you to a screen that shows the current Main Module and MCU Module firmware versions. Again, do NOT do any firmware updates! Take a screen shot of this screen with the version info. Navigate back one level and select the āRemove Deviceā selection at the bottom of the screen. Then select the āRemove and Erase Dataā option to set the device back to it current ānot installedā state. Then move forward with the ācloud cutterā steps to replace the devices firmware with a open local only firmware. Good hunting!
In my experience its not uncommon for brands to update chipsets and versions.
If my versions settings donāt work, connect to Smart Life and check version number and try again. While I prefer not to use Tuya cloud, I am not overly paranoid about it and they do have US servers. I recently ran into this issue with a few Feit bulbs that had different chipsets.
I do have a separate IoT network that does not have access to may main network and monitor for misbehaving devices.
I like how it handles DDP better. No need for MQTT, you can just choose DDP effect. Bonus after about 20-30 seconds without a DDP command the flood lights revert back to its last manually set state.
Yaml:
substitutions:
name: flood-light
friendly_name: Flood Light
esphome:
name: ${name}
friendly_name: ${friendly_name}
libretiny:
board: generic-bk7231t-qfn32-tuya
framework:
version: dev
external_components:
- source:
type: git
url: https://github.com/Cossid/common
ref: ddp-libretuya
components: [ ddp ]
refresh: always
# Enable logging
logger:
# Enable Home Assistant API
api:
encryption:
key: !secret key
ota:
password: !secret fallback_password
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
power_save_mode: none
# Enable fallback hotspot in case wifi connection fails
ap:
ssid: ${name}
password: !secret fallback_password
web_server:
captive_portal:
output:
- platform: ledc
id: red
pin: PWM4
- platform: ledc
id: green
pin: PWM0
- platform: ledc
id: blue
pin: PWM5
ddp:
light:
- platform: rgb
name: ${friendly_name}
red: red
green: green
blue: blue
restore_mode: ALWAYS_ON #Start with light on after reboot/power-loss event
effects:
- ddp
- random:
- strobe:
(Iām running on Debianā¦ your originating path my vary).
I still need to play with my WLED configā¦ I donāt think I have it configured/segmented properly.
Unrelated to installation, I do have a question about DDP: did you have any trouble getting it to work?
I added my two new Novostella 60W devices (which I can control via HA) to my WLED config thatās on another ESP32, but the Novstellas never seem to receive a command when I put them in DDP mode. I am running Sound Reactive WLED, so I wonder if itās behind in its DDP support.
I forgot to mention, for anyone curious - I was able to flash these without taking them out of the box!
The power cord is at the top of the box, so simply plug it into the wall (ideally a plug with an on-off switch) while leaving everything else in the box alone. If you canāt intercept and reprogram, just close the box and return it.
I was successfully able to flash the 80w version using the 1.3.21 - BK7231N version. I was not able to get the 100w working. Tuya is reporting it as version 2.9.29. I attempted to use 2.9.6, 2.9.3, and 2.9.27 without success.
It seems Novosetella has moved from ESP to BK chips.
Hereās my working code:
substitutions:
device_name: novostella-flood-light-1
device_description: 20W RGBWW flood light
friendly_name: Novostella Flood Light 1
esphome:
name: ${device_name}
comment: ${device_description}
friendly_name: ${friendly_name}
bk72xx:
board: generic-bk7231n-qfn32-tuya
logger:
web_server:
captive_portal:
mdns:
api:
ota:
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
ap:
button:
- platform: restart
name: Restart
debug:
update_interval: 30s
text_sensor:
- platform: debug
reset_reason:
name: Reset Reason
- platform: libretiny
version:
name: LibreTiny Version
binary_sensor:
# Reports if this device is Connected or not
- platform: status
name: ${friendly_name} Status
sensor:
# Reports the WiFi signal strength
- platform: wifi_signal
name: ${friendly_name} Signal
update_interval: 60s
# Reports how long the device has been powered (in minutes)
- platform: uptime
name: ${friendly_name} Uptime
filters:
- lambda: return x / 60.0;
unit_of_measurement: minutes
output:
- platform: libretiny_pwm
id: red
pin: P6
- platform: libretiny_pwm
id: green
pin: P7
- platform: libretiny_pwm
id: blue
pin: P8
- platform: libretiny_pwm
id: cold_white
pin: P26
- platform: libretiny_pwm
id: warm_white
pin: P24
light:
- platform: rgbww
name: ${friendly_name}
red: red
green: green
blue: blue
cold_white: cold_white
warm_white: warm_white
cold_white_color_temperature: 6500 K
warm_white_color_temperature: 2700 K
id: thelight
color_interlock: true #Prevent white leds being on at the same time as RGB leds
restore_mode: restore_default_off
effects:
- random:
- strobe:
- flicker:
alpha: 50% #The percentage that the last color value should affect the light. More or less the āforget-factorā of an exponential moving average. Defaults to 95%.
intensity: 50% #The intensity of the flickering, basically the maximum amplitude of the random offsets. Defaults to 1.5%.
- lambda:
name: Throb
update_interval: 1s
lambda: |-
static int state = 0;
auto call = id(thelight).turn_on();
// Transtion of 1000ms = 1s
call.set_transition_length(1000);
if (state == 0) {
call.set_brightness(1.0);
} else {
call.set_brightness(0.01);
}
call.perform();
state += 1;
if (state == 2)
state = 0;
I could us a handā¦ I got through the CloudCutterFlash just fine (well, a bit of trial and error) and got to the end when it gives me the Mac, ID, Key, etc. The device is now on my network and pingable.
But the top entries say to browse to the IP address ā no luck. nmap says no ports are open.
Am I missing a big part of this, should I be able to browse to it?
ESPHome OTA update doesnāt work either by the way(I tried modeling it after the one above from @Bryan_Fleming . Itās not that it doesnāt run, it doesnāt upload. It is like I have created a wifi device that will ping and nothing else.
**** Update **** : Never mind. I found I needed to then rerun the cloudcutter to flash the appropriate esphome kickstarter. once done, then everything seemed to work fine.
I had some trouble finding an option that worked, but finally was successful with āBy firmware version and nameā and using 2.0.0 - BK7231N / oem_bk7231n_strip_ty
Let it run the exploit; once finished, you should see an open network (I forget the name, but it should be easy to identify). Connect to it and add your network credentials. Then, you can use ESPHome in HA to adopt it and push updated firmware (such as my example above).