Novostella Blaze 25W RGB Flood Lights Local Control w/DDP

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.
  • Download OpenBK7231T_UG_X.XX.XX.bin and place it in /custom-firmware folder
  • 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.
  • Let Tuya Cloud Cutter do its magic

Setup Wifi

  • Connect to the OpenBK7231T hotspot
  • Navigate to http://192.168.4.1
  • Configure Wifi to have the device join your network
  • Let the device reboot and find the IP from your router

Configure OpenBeken

  • Navigate to your flood light (http://192.168.xx.xxx)
  • Go to Config->Configure Module
  • Set these pins
    • P6 (PWM0) - PWM - 1
    • P24 (PWM4) - PWM - 0
    • P26 (PWM5) - PWM - 2
  • Choose Return to Menu then *Launch Web Application"
  • Choose Tools from top menu
  • Under LED tools click ā€œ100% Red, Blue, Greenā€ to test out colors

Misc Settings

  • Go to Config->Configure General/Flags
  • Flags I turn on:
    • Flag 0,1,2,10 for MQTT Broadcasts
    • Flag 24, for a decent white mode
  • Config->Configure Name - Name of the device

Configure Home Assistant

  • From the main menu choose Config->Configure MQTT
    • Enter in your host info
    • For Client Topic I use ā€œflood_light_Xā€
    • Group Topic I use ā€œnovestellaā€
  • Check from Main Menu that MQTT is connected
  • Navigate to Config->Home Assistant Configuration
  • Click Start Home Assistant Discovery
  • Message should queue and show up in Home Assistant MQTT
  • Control you lights from Home Assistant

DDP for WLED listening
In WLED under LED preferences you can add DDP(Network) under led outputs and add the IP address for the flood light.

You can turn on/off WLED DDP listening through MQTT. This is the scripts I use:

connect_flood_lights_wled:
  alias: Connect Flood Lights to WLED
  sequence: 
    - service: light.turn_on
      entity_id:
        - light.flood_light_1
    - service: mqtt.publish
      data:
        topic: cmnd/flood_light_1/startDriver
        payload: DDP

disconnect_flood_lights_wled:
  alias: Disconnect Flood Lights to WLED
  sequence: 
    - service: mqtt.publish
      data:
        topic: cmnd/flood_light_1/stopDriver
        payload: DDP
    - service: light.turn_off
      entity_id:
        - light.flood_light_1

I have flashed 6 Novostellas. Four from August 2021, and a couple I got under warranty replacement last year (Sept 2022)

Product Link: https://www.amazon.com/gp/product/B08WX4QN63
OpenBeken Teardown: https://www.elektroda.com/rtvforum/viewtopic.php?p=20552462

10 Likes

Quick Video of the lights with DDP running a chase effect:

1 Like

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?

Thanks!

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)

Thanks again!

Doh, typo. He did NOT connect it to Tuya or Smart Life.

No need to open it up. I only opened up one to figure out the chip and I had one unit that the Blue LEDs stopped working.

Ah!

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.

Moved to LibreTiny (ESPHome Fork).

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:
1 Like

Iā€™m very new to the Tuya stuff, do you have to use CloudCutter again, or can you upload a compiled LibreTiny firmware directly to the light?

If you flashed it with OpenBeken you can rename LibreTiny file and flash it OTA from OpenBekenā€™s web app.

1 Like

Many thanks to you on this!

For anyone that isnā€™t aware, if you donā€™t want to go to the trouble of doing the build manually, you can install a LibraTiny ESPhome Add-on: GitHub - libretiny-eu/esphome-hass-addon: LibreTuya ESPHome Home Assistant Add-on

I then grabbed the binary from

/usr/share/hassio/addons/data/[random]_libretiny-esphome/<device_name>/.pioenvs/<device_name>

(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.

> [17:13:08][D][light:035]: ā€˜Novo Flood 1ā€™ Setting:
> [17:13:08][D][light:108]: Effect: ā€˜DDPā€™
> [17:13:08][D][ddp:048]: Starting UDP listening for DDP

Glad its working! I am running the LibreTiny docker to manage all my DDP devices. I have been replacing all my outdoor bulbs with flashable options.

Current setup:

  • 4 Novostella Floods RGB
  • 2 Onforu Floods RGBW (plastic, got them for $10 each)
  • 3 Feit BR30 RGBW
  • 6 Daybetter Bulbs RGBW
  • 3 WLED RGB Strips in upstairs Windows
  • 3 WLED controllers for bulbs/flood groups
  • 3 cheap projectors projecting onto windows (only for the big holidays)

I mapped everything in xLights and using Falcon Player to run lighting sequences. Over the summer I am going to create sequences for all the holidays.

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.

For the 80w you have to flip P26 / P24

  • P6 (PWM0) - PWM - 1
  • P24 (PWM4) - PWM - 2
  • P26 (PWM5) - PWM - 0
1 Like

Update! Libretiny was merged into ESPHome. This is the ESPHome Config.

substitutions:
  name: flood-light-1
  friendly_name: Flood Light 1

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

bk72xx:
  board: generic-bk7231t-qfn32-tuya

external_components:
  - source:
      type: git
      url: https://github.com/KaufHA/common
    components: [ ddp ]
    refresh: always

# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: !secret key

ota:
  password: !secret ota_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: libretiny_pwm
    id: red
    pin: PWM4
  - platform: libretiny_pwm
    id: green
    pin: PWM0
  - platform: libretiny_pwm
    id: blue
    pin: PWM5

ddp:

light:
  - platform: rgb
    name: ${friendly_name}
    red: red
    green: green
    blue: blue
    restore_mode: RESTORE_DEFAULT_OFF
    effects:
      - ddp
      - random:
      - strobe:
1 Like

I picked up two packs of these and have successfully flashed them using Tuya Cloud Cutter!

NOVOSTELLA Smart Led Flood Lights,RGBCW 200w Equivalent 2000lm,Color Changing Stage Landscape Lights&16 Million Colors&Timing&Music Sync&IP66&APP Alexa Wall Wash Uplights Indoor Outdoor 4 Pack

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.

1 Like

Thatā€™s exactly right; sorry I didnā€™t post more details. Iā€™ve been traveling for the past weekā€¦ Hereā€™s a great guide that covers things: How To Guide - Tuya CloudCutter with ESPHome LibreTiny - No soldering

You can install the ESPHome Kickstarter the first time you run Tuya-CloudCutter. I used these steps once Tuya CloudCutter was installed on the Pi.

Run: sudo ./tuya-cloudcutter.sh -f ESPHome-Kickstart-v23.08.29_bk7231t_app.ota.ug.bin

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).