Neewer RGB660 WIFI Controller (small electronics project using Home Assistant and ESPHome)

Neewer shipped it’s RGB660 lights, a popular budget video- and photography light, with Bluetooth support. But in my experience both the phone app as well as the bluetooth stack on the lights are horrendous. Thus I built a little gizmo that mounts directly to the back of the light and allows you to reliably control your Neewer RGB660 lights over WIFI using Home Assistant and ESPHome! For convenience and simplicity, it hooks directly into the lights power source and doesn’t require any additional cable runs. Once installed, it just permanently lives with the light and provides a reliable WIFI connection.

I’ve shared the full instructions on how to build one yourself on my blog. Please check them out there!

If you would like to upgrade your Neewer RGB660 but don’t feel comfortable building one yourself, you can now buy the Neewer RGB660 Wi-Fi modules prebuilt from my Tindie store.

I’ve also created a custom ESPHome firmware in the process that allows you to easily pair your ESPHome powered MCU with a light without having to recompile the firmware with the Bluetooth MAC hardware address. Instead, the firmware automatically finds the light and gives you the option to simply pair to it via a simple button press. The WIFI Controller ESPHome firmware can be found on my Github.

Please share you thoughts!

1 Like

this is awesome! do you know if it works on other models of light from neewer?

I’m not sure. I only was able to test it with Neewer RGB660. I find it likely to be working with other lights in the same series (Neewer RGB), but haven’t had an opportunity to try yet.

What specific lights do you have? If you have a ESP32 tossing around you could simply flash the firmware to it and see if it can connect and control the light. I’d be willing to help to see if we can get it to work with lights other than RGB660.

I’ve also started selling pre-built versions of this on my Tindie store if you’re interested in something a little less DIY https://www.tindie.com/products/rarelyunplugged/neewer-rgb660-wifi-module/

1 Like

Just wanted to share that the Neewer RGB WIFI Controller is back in stock in my Tinder store:

Perfect for those interested in upgrading their Neewer RGB lights with WiFi and Home Assistant control!

Hi @dev0, any chance you have tested the module and firmware with the new 660 Pro RGB Mk II lights?

Thanks,
Alex

I have not, I‘m sorry. My best guess is that they will work. But I can’t be sure until we had a chance to test it.

If you would like to test the Neewer 660 RGB Pro II lights I’ll be happy to give you a full refund should we not be able to get them to work. So you won’t have any risk if you want to give it a shot.

Sounds great and amazing work btw! I‘ve just ordered two 660 RGB Mk.2 today. I‘d love to solder the controllers myself but buying all parts will most likely end up costing the same as supporting you and buying them through your store, so that‘s my preferred route. Any chance you will be traveling back home to Germany anytime soon and wanna bring over 2 modules? :smiley:

Ha, I just returned from Germany. I went back home for Christmas and New Years.

I do offer shipping to Germany / Europe from my Tindie store. But it’s expensive. It’s at least $24 for packaging and shipping. That would make a set a total price, including shipping of ~$76. And Germany charges another 19% of the item value in VAT (“Mehrwertsteuer”), putting the total at closer to $86. Not to mention that returning them in case of them not working would likely be just as expensive.

I can offer the following:
Once you get your new lights you order a simple ESP32 from Amazon.de. I will help you flash the Neewer Controller firmware to the ESP32, which will allow us to test compatibility with the firmware.

If the firmware is compatible and you are still interested in getting my “off the shelve” version, you can order them through the store and I’ll knock the 7 EUR you paid for the ESP32 off of the purchase price.

Alright, let’s do that! I‘ll give you a ping once I have the lights and an ESP32 here for testing. Looking forward - thanks!

Just ordered two for my new RGB660 lights! Here’s hoping it works well!

1 Like

@dev0, here’s my feedback after testing.

Tl;dr:
Neewer 660 Pro Mk2 RGB lights are working - mostly.

More detail below…

Setup:
I am using the lights in my professional home office setup. Currently, I have two Neewer 660 Pro Mk2 RGB lights installed. I plan to add at least one more identical light, possibly two. All the lights will remain stationary in the same room.

Requirements:
Being able to control the lights in Home Assistant to include them in different scenes (e.g., one for calls, work, all lights off, etc.).

Equipment used:

Software components used:

Flashing:

  • Flashing your ESP32 firmware onto my ESP32s eventuell worked well.
  • However, I first just added your package to my out-of-box ESP32 configuration as described in your readme and didn’t look into your “neewer-controller.yaml”. This resultet in duplicate definitions for esphome and esp32 (among others) and my ESP32 only booted up properly once after flashing. After checking your yaml and resolving the duplicate entries, flashing and booting repeatedly works well without issues.
  • Important to note also that I had to delete the original definition of my esp32 board as “esp32_dev” (or so) and keep that one from your yaml as “wemos_d1_mini32” also for those non-wemos ESP32s I ordered on Amazon.
  • As a learning, we could adapt your readme on GitHub and maybe include a sample ESP32 config.yaml as reference. Happy to support.

Pairing and basic usage:

  • The Mk2 lights identify as “NEEWER-RGB660 PRO” instead of “NEEWER-RGB660”, which is why I am getting the following log message:
12:25:04 [W] [neewer:126] Neewer device "NEEWER-RGB660 PRO" does not identify as NEEWER-RGB660, is not officially supported and may not work as expected
  • The integration connects successfully to my Neewer 660 Mk2 lights:
12:25:57 [I] [neewer:180] Connecting to BLE client
12:25:58 [I] [esp32_ble_client:067] [0] [E8:49:31:33:EF:B3] 0x01 Attempting BLE connection
12:25:58 [W] [neewer_ble_output:021] [69400002-B5A3-F393-E0A9-E50E24DCCA99] Connected successfully!
12:25:59 [I] [esp32_ble_client:227] [0] [E8:49:31:33:EF:B3] Connected
  • The lights switch on or off fine using either your web interface or Home Assistant. While doing so, I am getting the following log message. Is this expected behavior?
12:26:03 [I] [light:392] 'Neewer 660 RGB Light' - Keeping current color mode Color temperature for call without color mode.
12:26:03 [I] [neewer_ble_output:067] Attempting to write colour command 5 bytes, state value: 1.000000

Bugs and issues:

  • As soon as I send the same command twice, this could be as easy as a light.turn_on command wihtout any additional data, the Neewer light turns off with the second command and doesn’t seem to react anymore. From that point on, the light status in your web interface or Home Assistant does not reflect the physical status of the light anymore (for instance, after switching on again, Home Assistant shows light is on but it isn’t). This is the log (3x light.turn_on with light being on after the first command, and staying off after second command):
12:34:09 [I] [neewer_ble_output:067] Attempting to write colour command 5 bytes, state value: 1.000000
12:34:13 [I] [neewer_ble_output:067] Attempting to write colour command 8 bytes, state value: 1.000000
12:35:42 [I] [neewer_ble_output:067] Attempting to write colour command 8 bytes, state value: 1.000000
  • I found that the way to get the Neewer light to work again is sending a light.turn_on command that is different from the last one that made the light/integration crash. For instance, include a different color temperature or brightness. The log when sending this command and making the Neewer light turn on again looks as follows:
12:38:57 [I] [neewer_ble_output:067] Attempting to write colour command 6 bytes, state value: 1.000000
  • As long as I only send every command only once, everything works again.
  • Unfortunately though, it happens quite often that you send the same command multiple times to the Neewer light. As stated above, I am using light scenes that include the Neewer lights. If I use a wall switch or button to toggle through scenes, it happens quickly that the lights get the same light.turn_on command twice because two scenes both keep the lights on at the same brightness/color temp. So for my envisioned setup, it’s almost impossible to avoid this issue. (Admittedly, a quick fix would be to edit my scenes and don’t include the Neewer lights in all subsequent scenes after the first scene that switched them on, however, typically I have multiple switches triggering these scenes in different orders, which means I’d have to duplicate scenes… it’s a rabbit hole.)
  • As a first root cause analysis, I have flashed my spare ESP32 directly with Litui’s neewerlight implementation without using your component. The issue is the same, so it is related to Litui’s neewerlight implementation (that you use in yours).

Questions, additional thoughts and considerations:

  • Can you reproduce the issue described above with your Neewer 660 RGB Mk1 lights (or else, is it related to the Mk2 lights)? Has anyone looked deeper into bugfixing this?
  • I really like the additional entities your integration creates, making it transparent for instance which device is currently paired, change the paired device, or reboot the ESP32. The only thing I prefer using Litui’s neewerlight implementation directly is the ability to pair multiple Neewer lights to one ESP32. Is that something you considered adding? For my configuration using multiple Neewer lights close to each other in one room, BLE connectivity seems to be good enough (maybe only for Mk2?) to use one only ESP32 centrally.

Hope this feedback helps. :slight_smile:

EDIT:
Adding the log from the neewerlight implementation for when sending two subsequent light.turn_on commands and the lights stop working.

First light.turn_on command => Neewer light turns on:

[17:27:57][D][light:036]: 'Neewer 660 Pro II RGB' Setting:
[17:27:57][D][light:047]:   State: ON
[17:27:57][D][neewer_rgbct_light_output:272]: CTWB value changed while RGB == 0
[17:27:57][D][neewer_rgbct_light_output:274]: Only WB changed.
[17:27:57][D][neewer_ble_output:089]: Message length at end of build_msg_with_checksum: 5
[17:27:57][D][neewer_ble_output:063]: Message length before write to light: 5
[17:27:57][I][neewer_ble_output:067]: Attempting to write colour command 5 bytes, state value: 1.000000
[17:27:57][D][esp32_ble_client:110]: [1] [E8:49:31:33:EF:B3] ESP_GATTC_WRITE_CHAR_EVT

Second light.turn_on command => Neewer light turns off and becomes unresponsive:

[17:28:00][D][light:036]: 'Neewer 660 Pro II RGB' Setting:
[17:28:00][D][neewer_rgbct_light_output:281]: Executing RGB fallback.
[17:28:00][D][neewer_rgbct_light_output:207]: Attempting RGB colour conversion from 0.000000, 0.000000, 0.000000...
[17:28:00][D][neewer_rgbct_light_output:249]: Converted RGB to HSB values 0, 0, 0
[17:28:00][D][neewer_ble_output:089]: Message length at end of build_msg_with_checksum: 8
[17:28:00][D][neewer_ble_output:063]: Message length before write to light: 8
[17:28:00][I][neewer_ble_output:067]: Attempting to write colour command 8 bytes, state value: 1.000000
[17:28:00][D][esp32_ble_client:110]: [1] [E8:49:31:33:EF:B3] ESP_GATTC_WRITE_CHAR_EVT
1 Like

Got mine. Delivered and well packaged.

Quick note: as someone who is not very skilled at Home Assistant I ran into a problem trying to add the lights in home assistant. I got the following error:

Failed config

at least one platform must be specified for ‘ota’ ; add ‘platform:esphome’ for original OTA functionality

I had to do a little searching online to discover I had to edit the yaml file and add the following:

ota:

  • platform: esphome

Once added, the lights/controller did an update and were visible in home assistant.

Thanks!

1 Like

My lights just stopped working even though the controller is still connected and paired.

I’m getting:

12:47:47 [W] [component:157] Component api set Warning flag: unspecified
12:47:48 [W] [component:170] Component api cleared Warning flag
12:47:48 [W] [component:237] Component api took a long time for an operation (52 ms).
12:47:48 [W] [component:238] Components should block for at most 30 ms.
12:48:21 [I] [neewer_ble_output:067] Attempting to write colour command 5 bytes, state value: 1.000000
12:48:28 [I] [neewer_ble_output:067] Attempting to write colour command 5 bytes, state value: 1.000000
12:48:52 [I] [light:392] ‘Neewer 660 RGB Light’ - Keeping current color mode Color temperature for call without color mode.
12:48:52 [I] [neewer_ble_output:067] Attempting to write colour command 5 bytes, state value: 1.000000
12:49:02 [I] [neewer_ble_output:067] Attempting to write colour command 5 bytes, state value: 1.000000
12:50:25 [I] [light:392] ‘Neewer 660 RGB Light’ - Keeping current color mode Color temperature for call without color mode.
12:50:25 [I] [neewer_ble_output:067] Attempting to write colour command 5 bytes, state value: 1.000000
12:50:27 [I] [neewer_ble_output:067] Attempting to write colour command 5 bytes, state value: 1.000000
12:50:28 [I] [light:392] ‘Neewer 660 RGB Light’ - Keeping current color mode Color temperature for call without color mode.
12:50:28 [I] [neewer_ble_output:067] Attempting to write colour command 5 bytes, state value: 1.000000
12:50:30 [I] [neewer_ble_output:067] Attempting to write colour command 5 bytes, state value: 1.000000

I am not using any automation. I cannot toggle the light on when using Home Assistant or the web interface.

Any help would be appreciated.

1 Like

See my comment above under “Bugs and issues” about lights that stop responding and how to get them working again.

2 Likes

Yes. Just implemented your fix. Lights are working again. Thanks!

Thanks for the detailed reports and feedback @alexp1 and @ESmall.

@ESmall There’s been similar reports on litius component I believe, but I don’t think anyone was so far able to nail the bug down exactly. It seemed to happen rarely, not consistently and changing the color temperature or brightness on the light (even slightly) would fix it.

I’ll try to reproduce it using your description on my end. If I can reproduce it reliably then I should be able to at least provide some form of reasonably reliable workaround (if not even just fix it entirely)

@alexp1 Thanks for the feedback. The pre installed firmware and associated YAML are based on quite an old version of ESPHome. I will update them to ensure it builds correctly on the latest version.
As @alexp1 outlined, changing color temperature or brightness should fix the light. If that doesn’t suffice for you I’m happy to accept a return of the controllers.

Hey Daniel, as outlined above, I was able to reproduce the issue pretty much:

  • Every command sent twice causes the HA integration of the lights to crash, i.e. not turn on anymore when using the last on state to turn them back on.
  • Sending a different on state to turn the lights on works after a crash state.

Example: Send lights.turn_on with or without any data (color temp, brightness, etc.) twice (or more often) and they crash. Sending a different color temp once will bring them back.

My workaround for now: Instead of using scenes to control the lights, I am using scripts that (1) turn them on with a slightly different color temp (can be as simple as +1K) as intended, then (2) turn them back to desired color temp. This way, every time the script runs it first sends a color temp that is different from last on state which always brings the lights back to life. This is not ideal, but works reliably.

1 Like

Hi @dev0 I’m thinking your response to @alexp1 was meant for me and visa versa. Anyway, I can live with the fix. Seems to be working well without making any changes to temp or brightness, but that could be only temporary. Will report back if things get more problematic.

@dev0 I think I downloaded an update. This update appears to have fixed the problem for one of my lights, but oddly not the other.

Am I right that you sent a fix? Both lights are now at version 0.2.2 .

I hadn’t had a chance to put out a fix, yet. So whatever changed for you didn’t come from my end.