Repository: home-assistant/core
Pull request: Update wled to 0.19.2
<!--
  You are amazing! Thanks for contributing to our project!
  Please, DO NOT DELETE ANY TEXT from this template! (unless instructed).
-->
## Breaking change
<!--
  If your PR contains a breaking change for existing users, it is important
  to tell them what breaks, how to make it work again and why we did this.
  This piece of text is published with the release notes, so it helps if you
  write it towards our users, not us.
  Note: Remove this section if this PR is NOT a breaking change.
-->

The WLED integration now requires a WLED device running at least [WLED 0.14.0](https://github.com/Aircoookie/WLED/releases/tag/v0.14.0)


## Proposed change
<!--
  Describe the big picture of your changes here to communicate to the
  maintainers why we should accept this pull request. If it fixes a bug
  or resolves a feature request, be sure to link to that issue in the
  additional information section.
-->

Updates `wled` to 0.19.1

Release notes:
- https://github.com/frenck/python-wled/releases/tag/v0.19.0
- https://github.com/frenck/python-wled/releases/tag/v0.19.1
- https://github.com/frenck/python-wled/releases/tag/v0.19.2

Diff: https://github.com/frenck/python-wled/compare/v0.18.0...v0.19.2

This change is rather large, as the upstream library:
- Has now been put on top of Mashumaro
- Now requires WLED 0.14.0 or newer
- Now relies on the light capabilities provided by WLED (which are translated to our color modes in this PR)
- Separates WLED releases/version check handling from the device logic

These upstream changes have been implemented as minimally as possible in this PR.
Some things could be replaced/made prettier now, but opted to do that later.

In a similar fashion, the upstream library can now make its models more strict (eventually resulting in less `if None` logic on our end).

## Type of change
<!--
  What type of change does your PR introduce to Home Assistant?
  NOTE: Please, check only 1! box!
  If your PR requires multiple boxes to be checked, you'll most likely need to
  split it into multiple PRs. This makes things easier and faster to code review.
-->

- [ ] Dependency upgrade
- [ ] Bugfix (non-breaking change which fixes an issue)
- [ ] New integration (thank you!)
- [ ] New feature (which adds functionality to an existing integration)
- [ ] Deprecation (breaking change to happen in the future)
- [x] Breaking change (fix/feature causing existing functionality to break)
- [ ] Code quality improvements to existing code or addition of tests

## Additional information
<!--
  Details are important, and help maintainers processing your PR.
  Please be sure to fill out additional details, if applicable.
-->

- This PR fixes or closes issue:
  - closes #101029
  - fixes #110478
- This PR is related to issue: 
- Link to documentation pull request: 

## Checklist
<!--
  Put an `x` in the boxes that apply. You can also fill these out after
  creating the PR. If you're unsure about any of them, don't hesitate to ask.
  We're here to help! This is simply a reminder of what we are going to look
  for before merging your code.
-->

- [x] The code change is tested and works locally.
- [x] Local tests pass. **Your PR cannot be merged unless tests pass**
- [x] There is no commented out code in this PR.
- [x] I have followed the [development checklist][dev-checklist]
- [x] I have followed the [perfect PR recommendations][perfect-pr]
- [x] The code has been formatted using Ruff (`ruff format homeassistant tests`)
- [x] Tests have been added to verify that the new code works.

If user exposed functionality or configuration variables are added/changed:

- [ ] Documentation added/updated for [www.home-assistant.io][docs-repository]

If the code communicates with devices, web services, or third-party tools:

- [x] The [manifest file][manifest-docs] has all fields filled out correctly.  
      Updated and included derived files by running: `python3 -m script.hassfest`.
- [x] New or updated dependencies have been added to `requirements_all.txt`.  
      Updated by running `python3 -m script.gen_requirements_all`.
- [x] For the updated dependencies - a link to the changelog, or at minimum a diff between library versions is added to the PR description.

<!--
  This project is very active and we have a high turnover of pull requests.

  Unfortunately, the number of incoming pull requests is higher than what our
  reviewers can review and merge so there is a long backlog of pull requests
  waiting for review. You can help here!
  
  By reviewing another pull request, you will help raise the code quality of
  that pull request and the final review will be faster. This way the general
  pace of pull request reviews will go up and your wait time will go down.
  
  When picking a pull request to review, try to choose one that hasn't yet
  been reviewed.

  Thanks for helping out!
-->

To help with the load of incoming pull requests:

- [x] I have reviewed two other [open pull requests][prs] in this repository.

[prs]: https://github.com/home-assistant/core/pulls?q=is%3Aopen+is%3Apr+-author%3A%40me+-draft%3Atrue+-label%3Awaiting-for-upstream+sort%3Acreated-desc+review%3Anone+-status%3Afailure

<!--
  Thank you for contributing <3

  Below, some useful links you could explore:
-->
[dev-checklist]: https://developers.home-assistant.io/docs/development_checklist/
[manifest-docs]: https://developers.home-assistant.io/docs/creating_integration_manifest/
[quality-scale]: https://developers.home-assistant.io/docs/integration_quality_scale_index/
[docs-repository]: https://github.com/home-assistant/home-assistant.io
[perfect-pr]: https://developers.home-assistant.io/docs/review-process/#creating-the-perfect-pr


Problem statement:
Cannot add WLED because it supposedly uses CCT
### The problem

When trying to add a new WLED integration I get an error message telling me "This WLED device uses CCT channels, which is not supported by this integration".

This is definitely not the case. I verified through the direct interface that the LED choice is WS281x with GRB color order.

Any assistance on getting over this hurdle will be appreciated.

### What version of Home Assistant Core has the issue?

core-2023.9.3

### What was the last working version of Home Assistant Core?

started trying with 2023.9.2 - never worked

### What type of installation are you running?

Home Assistant OS

### Integration causing the issue

WLED

### Link to integration documentation on our website

_No response_

### Diagnostics information

_No response_

### Example YAML snippet

_No response_

### Anything in the logs that might be useful for us?

```txt
Started trying with Core 2023.9.2, then again with the current 2023.9.3.
Same situation, never worked.
```


### Additional information

_No response_

WLED - Traceback with keyerror
### The problem

Logger: homeassistant.components.wled
Source: helpers/update_coordinator.py:313
Integration: WLED (documentation, issues)
First occurred: 9:20:51 AM (8 occurrences)
Last logged: 9:28:07 AM

Unexpected error fetching wled data: 'palettes'
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/update_coordinator.py", line 313, in _async_refresh
    self.data = await self._async_update_data()
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/wled/coordinator.py", line 103, in _async_update_data
    device = await self.wled.update(full_update=not self.last_update_success)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/backoff/_async.py", line 151, in retry
    ret = await target(*args, **kwargs)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/wled/wled.py", line 275, in update
    self._device = Device(data)
                   ^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/wled/models.py", line 694, in __init__
    if any(
       ^^^^
  File "/usr/local/lib/python3.12/site-packages/wled/models.py", line 695, in <genexpr>
    k not in data and data[k] is not None
                      ~~~~^^^
KeyError: 'palettes'


### What version of Home Assistant Core has the issue?

core-2024.2.1

### What was the last working version of Home Assistant Core?

_No response_

### What type of installation are you running?

Home Assistant OS

### Integration causing the issue

wled

### Link to integration documentation on our website

_No response_

### Diagnostics information

_No response_

### Example YAML snippet

_No response_

### Anything in the logs that might be useful for us?

_No response_

### Additional information

There is no indication of which device is causing the error. It looks like this has been "fixed" a few times already but keeps returning.

Hints from issue discussion:
Hey there @frenck, mind taking a look at this issue as it has been labeled with an integration (`wled`) you are listed as a [code owner](https://github.com/home-assistant/core/blob/dev/CODEOWNERS#L1445) for? Thanks!

<details>
<summary>Code owner commands</summary>


Code owners of `wled` can trigger bot actions by commenting:

- `@home-assistant close` Closes the issue.
- `@home-assistant rename Awesome new title` Renames the issue.
- `@home-assistant reopen` Reopen the issue.
- `@home-assistant unassign wled` Removes the current integration label and assignees on the issue, add the integration domain after the command.

</details>


<sub><sup>(message by CodeOwnersMention)</sup></sub>

---

[wled documentation](https://www.home-assistant.io/integrations/wled)
[wled source](https://github.com/home-assistant/core/tree/dev/homeassistant/components/wled)
<sub><sup>(message by IssueLinks)</sup></sub>
⚠ "Compatibility notice"

    WLED devices are not supported by Home Assistant 2022.2 or later if a CCT bus is configured or `White Balance Correction` is enabled.  
    
    We hope to resolve this issue as soon as possible. As a temporary workaround you can enable the option `Calculate CCT from RGB` in LED settings.

https://kno.wled.ge/advanced/home-automation/

Sadly im really sad cuz of this. I had idea for really nice living room controller that will have SK6812RGBNW + SK6812WWA + one classic analog CCT led strip. Final goal is to have 3 light entities in HA. One normal for SK6812RGBNW, one for analog cct just like cwww component from esphome and one same like cwww from esphome but for digital adressable SK6812WWA with animation support. Would love to get that implemented together with UI support for SK6812WWA
Thank you for that feedback - and, of course all your efforts to make this work!
Hadn’t seen this limitation before.

However, as I had tried to explain, I don’t see where I would have set up a CCT bus (or WBC) - I have set the strip for an RGB (actually GRB)-type WS2812.
I do have the recommended “gamma-correction for color” ticked, though.

I’d appreciate if you could point me to where to look for those settings I could try fixing that.

Thanks,

	Benno

PS: On a loosely related topic: I recently got one of those WWA strips, too - those are not yet connected but would like to soon … how do you set them up in WLED?

> On 29. Sep 2023, at 09:54, Djordje ***@***.***> wrote:
> 
> 
> ⚠ "Compatibility notice"
> 
> WLED devices are not supported by Home Assistant 2022.2 or later if a CCT bus is configured or `White Balance Correction` is enabled.  
> 
> We hope to resolve this issue as soon as possible. As a temporary workaround you can enable the option `Calculate CCT from RGB` in LED settings.
> https://kno.wled.ge/advanced/home-automation/ <https://kno.wled.ge/advanced/home-automation/>
> Sadly im really sad cuz of this. I had idea for really nice living room controller that will have SK6812RGBNW + SK6812WWA + one classic analog CCT led strip. Final goal is to have 3 light entities in HA. One normal for SK6812RGBNW, one for analog cct just like cwww component from esphome and one same like cwww from esphome but for digital adressable SK6812WWA with animation support.
> 
> —
> Reply to this email directly, view it on GitHub <https://github.com/home-assistant/core/issues/101029#issuecomment-1740466527>, or unsubscribe <https://github.com/notifications/unsubscribe-auth/ABNFDNNOL3TCEPKISAPO5MLX4Z5CZANCNFSM6AAAAAA5KCYWNA>.
> You are receiving this because you authored the thread.
> 


Try enabling calculating cct from rgb. It might help. I don't know how it is implemented and why it's throwing that error. It's best to wait for response from devs.

About WWA adressable strip, it works fine but you can only use it as adressable rgb strip. Colors are mapped in same 24bit format with 8 bit per color but i dont know in which order. Bad thing is that UI does not support WWA adressable strip (for example you dont have UI option to control color temperature for WWA adressable strip). It's explained in documentation at https://kno.wled.ge/features/cct/

```
Since as of the release of version 0.13.0 no adjustable CCT addressable LEDs are supported*, this only applies to PWM analog LED outputs.

*SK6812 WWA (with 3 channels, warm white, cold white and amber) are supported, but treated as if RGB using the WS281x bus type. White spectrum support for this LED type will be added at a later point.
```

It's planned but probably not a priority. I guess we will have to wait for HA to implement CCT WLED device. Until then there would probably be no progress for WWA UI support.
https://github.com/Aircoookie/WLED/issues/552
“Solved” - at least I can now register the device :)

I looked for all settings that could relate to CCT/White balance and unticked the setting 

	White management > White Balance correction

After that modification everything worked as expected.

Thank you pointing me in the right direction!

	Benno

> On 29. Sep 2023, at 15:29, Djordje ***@***.***> wrote:
> 
> 
> Try enabling calculating cct from rgb. It might help. I don't know how it is implemented and why it's throwing that error. It's best to wait for response from devs.
> 
> About WWA adressable strip, it works fine but you can only use it as adressable rgb strip. Colors are mapped in same 24bit format with 8 bit per color but i dont know in which order. Bad thing is that UI does not support WWA adressable strip (for example you dont have UI option to control color temperature for WWA adressable strip). It's explained in documentation at https://kno.wled.ge/features/cct/ <https://kno.wled.ge/features/cct/>
> Since as of the release of version 0.13.0 no adjustable CCT addressable LEDs are supported*, this only applies to PWM analog LED outputs.
> 
> *SK6812 WWA (with 3 channels, warm white, cold white and amber) are supported, but treated as if RGB using the WS281x bus type. White spectrum support for this LED type will be added at a later point.
> It's planned but probably not a priority. I guess we will have to wait for HA to implement CCT WLED device. Until then there would probably be no progress for WWA UI support.
> Aircoookie/WLED#552 <https://github.com/Aircoookie/WLED/issues/552>
> —
> Reply to this email directly, view it on GitHub <https://github.com/home-assistant/core/issues/101029#issuecomment-1740899426>, or unsubscribe <https://github.com/notifications/unsubscribe-auth/ABNFDNLR3XSDOSBGDQTXA5TX43EJ3ANCNFSM6AAAAAA5KCYWNA>.
> You are receiving this because you authored the thread.
> 


> “Solved” - at least I can now register the device :) I looked for all settings that could relate to CCT/White balance and unticked the setting White management > White Balance correction After that modification everything worked as expected. Thank you pointing me in the right direction! Benno
> [](#)


This also fixed my issue. I unchecked "White Balance correction" under LED and Hardware configuration page. 
There hasn't been any activity on this issue recently. Due to the high number of incoming GitHub notifications, we have to clean some of the old issues, as many of them have already been resolved with the latest updates.
Please make sure to update to the latest Home Assistant version and check if that solves the issue. Let us know if that works for you by adding a comment 👍
This issue has now been marked as stale and will be closed if no further activity occurs. Thank you for your contributions.
I cannot seem to get the work around to work, I have an sk6812rgbw strip connected to a dig2go controller with 0.14.0-b1. I unchecked the white balance correction and still cannot add the strip. What should I have "auto-calculate white channel from RGB:"? I have Calculate CCT from RGB turned on. Any help would be appreciated. 

EDIT: I figured it out, I just had to reboot my wled instance for some reason...
I wonder if CCT support is gonna be implemented soon. [This](https://github.com/frozen2077/wled-joy-HA/tree/main) has some work done but still that's not it. 
> I wonder if CCT support is gonna be implemented soon. [This](https://github.com/frozen2077/wled-joy-HA/tree/main) has some work done but still that's not it.

That only does a convertion of color_temp to rgb color. is not really a color_temp mode. 

Hey there @frenck, mind taking a look at this issue as it has been labeled with an integration (`wled`) you are listed as a [code owner](https://github.com/home-assistant/core/blob/dev/CODEOWNERS#L1532) for? Thanks!

<details>
<summary>Code owner commands</summary>


Code owners of `wled` can trigger bot actions by commenting:

- `@home-assistant close` Closes the issue.
- `@home-assistant rename Awesome new title` Renames the issue.
- `@home-assistant reopen` Reopen the issue.
- `@home-assistant unassign wled` Removes the current integration label and assignees on the issue, add the integration domain after the command.
- `@home-assistant add-label needs-more-information` Add a label (needs-more-information, problem in dependency, problem in custom component) to the issue.
- `@home-assistant remove-label needs-more-information` Remove a label (needs-more-information, problem in dependency, problem in custom component) on the issue.

</details>


<sub><sup>(message by CodeOwnersMention)</sup></sub>

---

[wled documentation](https://www.home-assistant.io/integrations/wled)
[wled source](https://github.com/home-assistant/core/tree/dev/homeassistant/components/wled)
<sub><sup>(message by IssueLinks)</sup></sub>
There hasn't been any activity on this issue recently. Due to the high number of incoming GitHub notifications, we have to clean some of the old issues, as many of them have already been resolved with the latest updates.
Please make sure to update to the latest Home Assistant version and check if that solves the issue. Let us know if that works for you by adding a comment 👍
This issue has now been marked as stale and will be closed if no further activity occurs. Thank you for your contributions.
Bugs don't fix themselves

Commit message: Update wled to 0.19.2

Patch to review:
diff --git a/homeassistant/components/wled/__init__.py b/homeassistant/components/wled/__init__.py
index ba87fb5812225..b483434769440 100644
--- a/homeassistant/components/wled/__init__.py
+++ b/homeassistant/components/wled/__init__.py
@@ -5,9 +5,12 @@
 from homeassistant.config_entries import ConfigEntry
 from homeassistant.const import Platform
 from homeassistant.core import HomeAssistant
+from homeassistant.helpers import config_validation as cv
+from homeassistant.helpers.typing import ConfigType
+from homeassistant.util.hass_dict import HassKey
 
-from .const import LOGGER
-from .coordinator import WLEDDataUpdateCoordinator
+from .const import DOMAIN
+from .coordinator import WLEDDataUpdateCoordinator, WLEDReleasesDataUpdateCoordinator
 
 PLATFORMS = (
     Platform.BUTTON,
@@ -21,23 +24,26 @@
 
 type WLEDConfigEntry = ConfigEntry[WLEDDataUpdateCoordinator]
 
+WLED_KEY: HassKey[WLEDReleasesDataUpdateCoordinator] = HassKey(DOMAIN)
+CONFIG_SCHEMA = cv.config_entry_only_config_schema(DOMAIN)
+
+
+async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
+    """Set up the WLED integration.
+
+    We set up a single coordinator for fetching WLED releases, which
+    is used across all WLED devices (and config entries) to avoid
+    fetching the same data multiple times for each.
+    """
+    hass.data[WLED_KEY] = WLEDReleasesDataUpdateCoordinator(hass)
+    await hass.data[WLED_KEY].async_request_refresh()
+    return True
+
 
 async def async_setup_entry(hass: HomeAssistant, entry: WLEDConfigEntry) -> bool:
     """Set up WLED from a config entry."""
-    coordinator = WLEDDataUpdateCoordinator(hass, entry=entry)
-    await coordinator.async_config_entry_first_refresh()
-
-    if coordinator.data.info.leds.cct:
-        LOGGER.error(
-            (
-                "WLED device '%s' has a CCT channel, which is not supported by "
-                "this integration"
-            ),
-            entry.title,
-        )
-        return False
-
-    entry.runtime_data = coordinator
+    entry.runtime_data = WLEDDataUpdateCoordinator(hass, entry=entry)
+    await entry.runtime_data.async_config_entry_first_refresh()
 
     # Set up all platforms for this device/entry.
     await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
diff --git a/homeassistant/components/wled/config_flow.py b/homeassistant/components/wled/config_flow.py
index c40753b686a6d..7853ad2101e33 100644
--- a/homeassistant/components/wled/config_flow.py
+++ b/homeassistant/components/wled/config_flow.py
@@ -46,8 +46,6 @@ async def async_step_user(
             except WLEDConnectionError:
                 errors["base"] = "cannot_connect"
             else:
-                if device.info.leds.cct:
-                    return self.async_abort(reason="cct_unsupported")
                 await self.async_set_unique_id(device.info.mac_address)
                 self._abort_if_unique_id_configured(
                     updates={CONF_HOST: user_input[CONF_HOST]}
@@ -84,9 +82,6 @@ async def async_step_zeroconf(
         except WLEDConnectionError:
             return self.async_abort(reason="cannot_connect")
 
-        if self.discovered_device.info.leds.cct:
-            return self.async_abort(reason="cct_unsupported")
-
         await self.async_set_unique_id(self.discovered_device.info.mac_address)
         self._abort_if_unique_id_configured(updates={CONF_HOST: discovery_info.host})
 
diff --git a/homeassistant/components/wled/const.py b/homeassistant/components/wled/const.py
index f698347537c28..635b78dcf13be 100644
--- a/homeassistant/components/wled/const.py
+++ b/homeassistant/components/wled/const.py
@@ -3,11 +3,16 @@
 from datetime import timedelta
 import logging
 
+from wled import LightCapability
+
+from homeassistant.components.light import ColorMode
+
 # Integration domain
 DOMAIN = "wled"
 
 LOGGER = logging.getLogger(__package__)
 SCAN_INTERVAL = timedelta(seconds=10)
+RELEASES_SCAN_INTERVAL = timedelta(hours=3)
 
 # Options
 CONF_KEEP_MAIN_LIGHT = "keep_master_light"
@@ -24,3 +29,72 @@
 ATTR_SPEED = "speed"
 ATTR_TARGET_BRIGHTNESS = "target_brightness"
 ATTR_UDP_PORT = "udp_port"
+
+
+LIGHT_CAPABILITIES_COLOR_MODE_MAPPING: dict[LightCapability, list[ColorMode]] = {
+    LightCapability.NONE: [
+        ColorMode.ONOFF,
+    ],
+    LightCapability.RGB_COLOR: [
+        ColorMode.RGB,
+    ],
+    LightCapability.WHITE_CHANNEL: [
+        ColorMode.BRIGHTNESS,
+    ],
+    LightCapability.RGB_COLOR | LightCapability.WHITE_CHANNEL: [
+        ColorMode.RGBW,
+    ],
+    LightCapability.COLOR_TEMPERATURE: [
+        ColorMode.COLOR_TEMP,
+    ],
+    LightCapability.RGB_COLOR | LightCapability.COLOR_TEMPERATURE: [
+        ColorMode.RGBWW,
+    ],
+    LightCapability.WHITE_CHANNEL | LightCapability.COLOR_TEMPERATURE: [
+        ColorMode.COLOR_TEMP,
+    ],
+    LightCapability.RGB_COLOR
+    | LightCapability.WHITE_CHANNEL
+    | LightCapability.COLOR_TEMPERATURE: [
+        ColorMode.RGB,
+        ColorMode.COLOR_TEMP,
+    ],
+    LightCapability.MANUAL_WHITE: [
+        ColorMode.BRIGHTNESS,
+    ],
+    LightCapability.RGB_COLOR | LightCapability.MANUAL_WHITE: [
+        ColorMode.RGBW,
+    ],
+    LightCapability.WHITE_CHANNEL | LightCapability.MANUAL_WHITE: [
+        ColorMode.BRIGHTNESS,
+    ],
+    LightCapability.RGB_COLOR
+    | LightCapability.WHITE_CHANNEL
+    | LightCapability.MANUAL_WHITE: [
+        ColorMode.RGBW,
+        ColorMode.WHITE,
+    ],
+    LightCapability.COLOR_TEMPERATURE | LightCapability.MANUAL_WHITE: [
+        ColorMode.COLOR_TEMP,
+        ColorMode.WHITE,
+    ],
+    LightCapability.RGB_COLOR
+    | LightCapability.COLOR_TEMPERATURE
+    | LightCapability.MANUAL_WHITE: [
+        ColorMode.RGBW,
+        ColorMode.COLOR_TEMP,
+    ],
+    LightCapability.WHITE_CHANNEL
+    | LightCapability.COLOR_TEMPERATURE
+    | LightCapability.MANUAL_WHITE: [
+        ColorMode.COLOR_TEMP,
+        ColorMode.WHITE,
+    ],
+    LightCapability.RGB_COLOR
+    | LightCapability.WHITE_CHANNEL
+    | LightCapability.COLOR_TEMPERATURE
+    | LightCapability.MANUAL_WHITE: [
+        ColorMode.RGBW,
+        ColorMode.COLOR_TEMP,
+    ],
+}
diff --git a/homeassistant/components/wled/coordinator.py b/homeassistant/components/wled/coordinator.py
index f6219c63cb8ad..a811274d95d04 100644
--- a/homeassistant/components/wled/coordinator.py
+++ b/homeassistant/components/wled/coordinator.py
@@ -2,7 +2,14 @@
 
 from __future__ import annotations
 
-from wled import WLED, Device as WLEDDevice, WLEDConnectionClosedError, WLEDError
+from wled import (
+    WLED,
+    Device as WLEDDevice,
+    Releases,
+    WLEDConnectionClosedError,
+    WLEDError,
+    WLEDReleases,
+)
 
 from homeassistant.config_entries import ConfigEntry
 from homeassistant.const import CONF_HOST, EVENT_HOMEASSISTANT_STOP
@@ -15,6 +22,7 @@
     DEFAULT_KEEP_MAIN_LIGHT,
     DOMAIN,
     LOGGER,
+    RELEASES_SCAN_INTERVAL,
     SCAN_INTERVAL,
 )
 
@@ -101,17 +109,40 @@ async def close_websocket(_: Event) -> None:
     async def _async_update_data(self) -> WLEDDevice:
         """Fetch data from WLED."""
         try:
-            device = await self.wled.update(full_update=not self.last_update_success)
+            device = await self.wled.update()
         except WLEDError as error:
             raise UpdateFailed(f"Invalid response from API: {error}") from error
 
         # If the device supports a WebSocket, try activating it.
         if (
             device.info.websocket is not None
-            and device.info.leds.cct is not True
             and not self.wled.connected
             and not self.unsub
         ):
             self._use_websocket()
 
         return device
+
+
+class WLEDReleasesDataUpdateCoordinator(DataUpdateCoordinator[Releases]):
+    """Class to manage fetching WLED releases."""
+
+    def __init__(
+        self,
+        hass: HomeAssistant,
+    ) -> None:
+        """Initialize global WLED releases updater."""
+        self.wled = WLEDReleases(session=async_get_clientsession(hass))
+        super().__init__(
+            hass,
+            LOGGER,
+            name=DOMAIN,
+            update_interval=RELEASES_SCAN_INTERVAL,
+        )
+
+    async def _async_update_data(self) -> Releases:
+        """Fetch release data from WLED."""
+        try:
+            return await self.wled.releases()
+        except WLEDError as error:
+            raise UpdateFailed(f"Invalid response from GitHub API: {error}") from error
diff --git a/homeassistant/components/wled/diagnostics.py b/homeassistant/components/wled/diagnostics.py
index e81760e0f7266..732cd3602a085 100644
--- a/homeassistant/components/wled/diagnostics.py
+++ b/homeassistant/components/wled/diagnostics.py
@@ -17,31 +17,23 @@ async def async_get_config_entry_diagnostics(
     coordinator = entry.runtime_data
 
     data: dict[str, Any] = {
-        "info": async_redact_data(coordinator.data.info.__dict__, "wifi"),
-        "state": coordinator.data.state.__dict__,
+        "info": async_redact_data(coordinator.data.info.to_dict(), "wifi"),
+        "state": coordinator.data.state.to_dict(),
         "effects": {
-            effect.effect_id: effect.name for effect in coordinator.data.effects
+            effect.effect_id: effect.name
+            for effect in coordinator.data.effects.values()
         },
         "palettes": {
-            palette.palette_id: palette.name for palette in coordinator.data.palettes
+            palette.palette_id: palette.name
+            for palette in coordinator.data.palettes.values()
         },
         "playlists": {
-            playlist.playlist_id: {
-                "name": playlist.name,
-                "repeat": playlist.repeat,
-                "shuffle": playlist.shuffle,
-                "end": playlist.end.preset_id if playlist.end else None,
-            }
-            for playlist in coordinator.data.playlists
+            playlist.playlist_id: playlist.name
+            for playlist in coordinator.data.playlists.values()
         },
         "presets": {
-            preset.preset_id: {
-                "name": preset.name,
-                "quick_label": preset.quick_label,
-                "on": preset.on,
-                "transition": preset.transition,
-            }
-            for preset in coordinator.data.presets
+            preset.preset_id: preset.name
+            for preset in coordinator.data.presets.values()
         },
     }
     return data
diff --git a/homeassistant/components/wled/light.py b/homeassistant/components/wled/light.py
index 36ebd024de32f..5423df8468667 100644
--- a/homeassistant/components/wled/light.py
+++ b/homeassistant/components/wled/light.py
@@ -19,7 +19,12 @@
 from homeassistant.helpers.entity_platform import AddEntitiesCallback
 
 from . import WLEDConfigEntry
-from .const import ATTR_COLOR_PRIMARY, ATTR_ON, ATTR_SEGMENT_ID
+from .const import (
+    ATTR_COLOR_PRIMARY,
+    ATTR_ON,
+    ATTR_SEGMENT_ID,
+    LIGHT_CAPABILITIES_COLOR_MODE_MAPPING,
+)
 from .coordinator import WLEDDataUpdateCoordinator
 from .entity import WLEDEntity
 from .helpers import wled_exception_handler
@@ -112,8 +117,6 @@ def __init__(
     ) -> None:
         """Initialize WLED segment light."""
         super().__init__(coordinator=coordinator)
-        self._rgbw = coordinator.data.info.leds.rgbw
-        self._wv = coordinator.data.info.leds.wv
         self._segment = segment
 
         # Segment 0 uses a simpler name, which is more natural for when using
@@ -127,18 +130,24 @@ def __init__(
             f"{self.coordinator.data.info.mac_address}_{self._segment}"
         )
 
-        self._attr_color_mode = ColorMode.RGB
-        self._attr_supported_color_modes = {ColorMode.RGB}
-        if self._rgbw and self._wv:
-            self._attr_color_mode = ColorMode.RGBW
-            self._attr_supported_color_modes = {ColorMode.RGBW}
+        if (
+            coordinator.data.info.leds.segment_light_capabilities is not None
+            and (
+                color_modes := LIGHT_CAPABILITIES_COLOR_MODE_MAPPING.get(
+                    coordinator.data.info.leds.segment_light_capabilities[segment]
+                )
+            )
+            is not None
+        ):
+            self._attr_color_mode = color_modes[0]
+            self._attr_supported_color_modes = set(color_modes)
 
     @property
     def available(self) -> bool:
         """Return True if entity is available."""
         try:
             self.coordinator.data.state.segments[self._segment]
-        except IndexError:
+        except KeyError:
             return False
 
         return super().available
@@ -146,20 +155,23 @@ def available(self) -> bool:
     @property
     def rgb_color(self) -> tuple[int, int, int] | None:
         """Return the color value."""
-        return self.coordinator.data.state.segments[self._segment].color_primary[:3]
+        if not (color := self.coordinator.data.state.segments[self._segment].color):
+            return None
+        return color.primary[:3]
 
     @property
     def rgbw_color(self) -> tuple[int, int, int, int] | None:
         """Return the color value."""
-        return cast(
-            tuple[int, int, int, int],
-            self.coordinator.data.state.segments[self._segment].color_primary,
-        )
+        if not (color := self.coordinator.data.state.segments[self._segment].color):
+            return None
+        return cast(tuple[int, int, int, int], color.primary)
 
     @property
     def effect(self) -> str | None:
         """Return the current effect of the light."""
-        return self.coordinator.data.state.segments[self._segment].effect.name
+        return self.coordinator.data.effects[
+            int(self.coordinator.data.state.segments[self._segment].effect_id)
+        ].name
 
     @property
     def brightness(self) -> int | None:
@@ -178,7 +190,7 @@ def brightness(self) -> int | None:
     @property
     def effect_list(self) -> list[str]:
         """Return the list of supported effects."""
-        return [effect.name for effect in self.coordinator.data.effects]
+        return [effect.name for effect in self.coordinator.data.effects.values()]
 
     @property
     def is_on(self) -> bool:
@@ -258,7 +270,11 @@ def async_update_segments(
     async_add_entities: AddEntitiesCallback,
 ) -> None:
     """Update segments."""
-    segment_ids = {light.segment_id for light in coordinator.data.state.segments}
+    segment_ids = {
+        light.segment_id
+        for light in coordinator.data.state.segments.values()
+        if light.segment_id is not None
+    }
     new_entities: list[WLEDMainLight | WLEDSegmentLight] = []
 
     # More than 1 segment now? No main? Add main controls
diff --git a/homeassistant/components/wled/manifest.json b/homeassistant/components/wled/manifest.json
index a01bbcabdd6fd..85d8e957120f1 100644
--- a/homeassistant/components/wled/manifest.json
+++ b/homeassistant/components/wled/manifest.json
@@ -7,6 +7,6 @@
   "integration_type": "device",
   "iot_class": "local_push",
   "quality_scale": "platinum",
-  "requirements": ["wled==0.18.0"],
+  "requirements": ["wled==0.19.2"],
   "zeroconf": ["_wled._tcp.local."]
 }
diff --git a/homeassistant/components/wled/number.py b/homeassistant/components/wled/number.py
index 5af466360bbc4..225d783bfdb8c 100644
--- a/homeassistant/components/wled/number.py
+++ b/homeassistant/components/wled/number.py
@@ -44,7 +44,7 @@ async def async_setup_entry(
 class WLEDNumberEntityDescription(NumberEntityDescription):
     """Class describing WLED number entities."""
 
-    value_fn: Callable[[Segment], float | None]
+    value_fn: Callable[[Segment], int | None]
 
 
 NUMBERS = [
@@ -64,7 +64,7 @@ class WLEDNumberEntityDescription(NumberEntityDescription):
         native_step=1,
         native_min_value=0,
         native_max_value=255,
-        value_fn=lambda segment: segment.intensity,
+        value_fn=lambda segment: int(segment.intensity),
     ),
 ]
 
@@ -100,7 +100,7 @@ def available(self) -> bool:
         """Return True if entity is available."""
         try:
             self.coordinator.data.state.segments[self._segment]
-        except IndexError:
+        except KeyError:
             return False
 
         return super().available
@@ -133,7 +133,11 @@ def async_update_segments(
     async_add_entities: AddEntitiesCallback,
 ) -> None:
     """Update segments."""
-    segment_ids = {segment.segment_id for segment in coordinator.data.state.segments}
+    segment_ids = {
+        segment.segment_id
+        for segment in coordinator.data.state.segments.values()
+        if segment.segment_id is not None
+    }
 
     new_entities: list[WLEDNumber] = []
 
diff --git a/homeassistant/components/wled/select.py b/homeassistant/components/wled/select.py
index 20b14531ac716..a645b04573ca1 100644
--- a/homeassistant/components/wled/select.py
+++ b/homeassistant/components/wled/select.py
@@ -4,7 +4,7 @@
 
 from functools import partial
 
-from wled import Live, Playlist, Preset
+from wled import LiveDataOverride
 
 from homeassistant.components.select import SelectEntity
 from homeassistant.const import EntityCategory
@@ -56,17 +56,17 @@ def __init__(self, coordinator: WLEDDataUpdateCoordinator) -> None:
         super().__init__(coordinator=coordinator)
 
         self._attr_unique_id = f"{coordinator.data.info.mac_address}_live_override"
-        self._attr_options = [str(live.value) for live in Live]
+        self._attr_options = [str(live.value) for live in LiveDataOverride]
 
     @property
     def current_option(self) -> str:
         """Return the current selected live override."""
-        return str(self.coordinator.data.state.lor.value)
+        return str(self.coordinator.data.state.live_data_override.value)
 
     @wled_exception_handler
     async def async_select_option(self, option: str) -> None:
         """Set WLED state to the selected live override state."""
-        await self.coordinator.wled.live(live=Live(int(option)))
+        await self.coordinator.wled.live(live=LiveDataOverride(int(option)))
 
 
 class WLEDPresetSelect(WLEDEntity, SelectEntity):
@@ -79,7 +79,9 @@ def __init__(self, coordinator: WLEDDataUpdateCoordinator) -> None:
         super().__init__(coordinator=coordinator)
 
         self._attr_unique_id = f"{coordinator.data.info.mac_address}_preset"
-        self._attr_options = [preset.name for preset in self.coordinator.data.presets]
+        self._attr_options = [
+            preset.name for preset in self.coordinator.data.presets.values()
+        ]
 
     @property
     def available(self) -> bool:
@@ -89,9 +91,13 @@ def available(self) -> bool:
     @property
     def current_option(self) -> str | None:
         """Return the current selected preset."""
-        if not isinstance(self.coordinator.data.state.preset, Preset):
+        if not self.coordinator.data.state.preset_id:
             return None
-        return self.coordinator.data.state.preset.name
+        if preset := self.coordinator.data.presets.get(
+            self.coordinator.data.state.preset_id
+        ):
+            return preset.name
+        return None
 
     @wled_exception_handler
     async def async_select_option(self, option: str) -> None:
@@ -110,7 +116,7 @@ def __init__(self, coordinator: WLEDDataUpdateCoordinator) -> None:
 
         self._attr_unique_id = f"{coordinator.data.info.mac_address}_playlist"
         self._attr_options = [
-            playlist.name for playlist in self.coordinator.data.playlists
+            playlist.name for playlist in self.coordinator.data.playlists.values()
         ]
 
     @property
@@ -121,9 +127,13 @@ def available(self) -> bool:
     @property
     def current_option(self) -> str | None:
         """Return the currently selected playlist."""
-        if not isinstance(self.coordinator.data.state.playlist, Playlist):
+        if not self.coordinator.data.state.playlist_id:
             return None
-        return self.coordinator.data.state.playlist.name
+        if playlist := self.coordinator.data.playlists.get(
+            self.coordinator.data.state.playlist_id
+        ):
+            return playlist.name
+        return None
 
     @wled_exception_handler
     async def async_select_option(self, option: str) -> None:
@@ -150,7 +160,7 @@ def __init__(self, coordinator: WLEDDataUpdateCoordinator, segment: int) -> None
 
         self._attr_unique_id = f"{coordinator.data.info.mac_address}_palette_{segment}"
         self._attr_options = [
-            palette.name for palette in self.coordinator.data.palettes
+            palette.name for palette in self.coordinator.data.palettes.values()
         ]
         self._segment = segment
 
@@ -159,7 +169,7 @@ def available(self) -> bool:
         """Return True if entity is available."""
         try:
             self.coordinator.data.state.segments[self._segment]
-        except IndexError:
+        except KeyError:
             return False
 
         return super().available
@@ -167,7 +177,9 @@ def available(self) -> bool:
     @property
     def current_option(self) -> str | None:
         """Return the current selected color palette."""
-        return self.coordinator.data.state.segments[self._segment].palette.name
+        return self.coordinator.data.palettes[
+            int(self.coordinator.data.state.segments[self._segment].palette_id)
+        ].name
 
     @wled_exception_handler
     async def async_select_option(self, option: str) -> None:
@@ -182,7 +194,11 @@ def async_update_segments(
     async_add_entities: AddEntitiesCallback,
 ) -> None:
     """Update segments."""
-    segment_ids = {segment.segment_id for segment in coordinator.data.state.segments}
+    segment_ids = {
+        segment.segment_id
+        for segment in coordinator.data.state.segments.values()
+        if segment.segment_id is not None
+    }
 
     new_entities: list[WLEDPaletteSelect] = []
 
diff --git a/homeassistant/components/wled/sensor.py b/homeassistant/components/wled/sensor.py
index 7d18665a085ef..4f97c367612c0 100644
--- a/homeassistant/components/wled/sensor.py
+++ b/homeassistant/components/wled/sensor.py
@@ -4,7 +4,7 @@
 
 from collections.abc import Callable
 from dataclasses import dataclass
-from datetime import datetime, timedelta
+from datetime import datetime
 
 from wled import Device as WLEDDevice
 
@@ -71,7 +71,7 @@ class WLEDSensorEntityDescription(SensorEntityDescription):
         device_class=SensorDeviceClass.TIMESTAMP,
         entity_category=EntityCategory.DIAGNOSTIC,
         entity_registry_enabled_default=False,
-        value_fn=lambda device: (utcnow() - timedelta(seconds=device.info.uptime)),
+        value_fn=lambda device: (utcnow() - device.info.uptime),
     ),
     WLEDSensorEntityDescription(
         key="free_heap",
diff --git a/homeassistant/components/wled/strings.json b/homeassistant/components/wled/strings.json
index 9581641f5454a..50dc0129369ca 100644
--- a/homeassistant/components/wled/strings.json
+++ b/homeassistant/components/wled/strings.json
@@ -21,8 +21,7 @@
     },
     "abort": {
       "already_configured": "[%key:common::config_flow::abort::already_configured_device%]",
-      "cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
-      "cct_unsupported": "This WLED device uses CCT channels, which is not supported by this integration"
+      "cannot_connect": "[%key:common::config_flow::error::cannot_connect%]"
     }
   },
   "options": {
diff --git a/homeassistant/components/wled/switch.py b/homeassistant/components/wled/switch.py
index 7ec75b956c005..643834dcdec12 100644
--- a/homeassistant/components/wled/switch.py
+++ b/homeassistant/components/wled/switch.py
@@ -11,7 +11,7 @@
 from homeassistant.helpers.entity_platform import AddEntitiesCallback
 
 from . import WLEDConfigEntry
-from .const import ATTR_DURATION, ATTR_FADE, ATTR_TARGET_BRIGHTNESS, ATTR_UDP_PORT
+from .const import ATTR_DURATION, ATTR_TARGET_BRIGHTNESS, ATTR_UDP_PORT
 from .coordinator import WLEDDataUpdateCoordinator
 from .entity import WLEDEntity
 from .helpers import wled_exception_handler
@@ -62,7 +62,6 @@ def extra_state_attributes(self) -> dict[str, Any] | None:
         state = self.coordinator.data.state
         return {
             ATTR_DURATION: state.nightlight.duration,
-            ATTR_FADE: state.nightlight.fade,
             ATTR_TARGET_BRIGHTNESS: state.nightlight.target_brightness,
         }
 
@@ -171,7 +170,7 @@ def available(self) -> bool:
         """Return True if entity is available."""
         try:
             self.coordinator.data.state.segments[self._segment]
-        except IndexError:
+        except KeyError:
             return False
 
         return super().available
@@ -199,7 +198,11 @@ def async_update_segments(
     async_add_entities: AddEntitiesCallback,
 ) -> None:
     """Update segments."""
-    segment_ids = {segment.segment_id for segment in coordinator.data.state.segments}
+    segment_ids = {
+        segment.segment_id
+        for segment in coordinator.data.state.segments.values()
+        if segment.segment_id is not None
+    }
 
     new_entities: list[WLEDReverseSwitch] = []
 
diff --git a/homeassistant/components/wled/update.py b/homeassistant/components/wled/update.py
index 05df5fcf54fde..52e8540941454 100644
--- a/homeassistant/components/wled/update.py
+++ b/homeassistant/components/wled/update.py
@@ -12,8 +12,8 @@
 from homeassistant.core import HomeAssistant
 from homeassistant.helpers.entity_platform import AddEntitiesCallback
 
-from . import WLEDConfigEntry
-from .coordinator import WLEDDataUpdateCoordinator
+from . import WLED_KEY, WLEDConfigEntry
+from .coordinator import WLEDDataUpdateCoordinator, WLEDReleasesDataUpdateCoordinator
 from .entity import WLEDEntity
 from .helpers import wled_exception_handler
 
@@ -24,7 +24,7 @@ async def async_setup_entry(
     async_add_entities: AddEntitiesCallback,
 ) -> None:
     """Set up WLED update based on a config entry."""
-    async_add_entities([WLEDUpdateEntity(entry.runtime_data)])
+    async_add_entities([WLEDUpdateEntity(entry.runtime_data, hass.data[WLED_KEY])])
 
 
 class WLEDUpdateEntity(WLEDEntity, UpdateEntity):
@@ -36,11 +36,33 @@ class WLEDUpdateEntity(WLEDEntity, UpdateEntity):
     )
     _attr_title = "WLED"
 
-    def __init__(self, coordinator: WLEDDataUpdateCoordinator) -> None:
+    def __init__(
+        self,
+        coordinator: WLEDDataUpdateCoordinator,
+        releases_coordinator: WLEDReleasesDataUpdateCoordinator,
+    ) -> None:
         """Initialize the update entity."""
         super().__init__(coordinator=coordinator)
+        self.releases_coordinator = releases_coordinator
         self._attr_unique_id = coordinator.data.info.mac_address
 
+    async def async_added_to_hass(self) -> None:
+        """When entity is added to hass.
+
+        Register extra update listener for the releases coordinator.
+        """
+        await super().async_added_to_hass()
+        self.async_on_remove(
+            self.releases_coordinator.async_add_listener(
+                self._handle_coordinator_update
+            )
+        )
+
+    @property
+    def available(self) -> bool:
+        """Return if entity is available."""
+        return bool(super().available and self.releases_coordinator.last_update_success)
+
     @property
     def installed_version(self) -> str | None:
         """Version currently installed and in use."""
@@ -54,17 +76,17 @@ def latest_version(self) -> str | None:
         # If we already run a pre-release, we consider being on the beta channel.
         # Offer beta version upgrade, unless stable is newer
         if (
-            (beta := self.coordinator.data.info.version_latest_beta) is not None
+            (beta := self.releases_coordinator.data.beta) is not None
             and (current := self.coordinator.data.info.version) is not None
             and (current.alpha or current.beta or current.release_candidate)
             and (
-                (stable := self.coordinator.data.info.version_latest_stable) is None
-                or (stable is not None and stable < beta)
+                (stable := self.releases_coordinator.data.stable) is None
+                or (stable is not None and stable < beta and current > stable)
             )
         ):
             return str(beta)
 
-        if (stable := self.coordinator.data.info.version_latest_stable) is not None:
+        if (stable := self.releases_coordinator.data.stable) is not None:
             return str(stable)
 
         return None
diff --git a/requirements_all.txt b/requirements_all.txt
index 38a393caea1ba..3cc584cfb8367 100644
--- a/requirements_all.txt
+++ b/requirements_all.txt
@@ -2896,7 +2896,7 @@ wiffi==1.1.2
 wirelesstagpy==0.8.1
 
 # homeassistant.components.wled
-wled==0.18.0
+wled==0.19.2
 
 # homeassistant.components.wolflink
 wolf-comm==0.0.9
diff --git a/requirements_test_all.txt b/requirements_test_all.txt
index 4806c357d8995..0e9974e8ddf18 100644
--- a/requirements_test_all.txt
+++ b/requirements_test_all.txt
@@ -2270,7 +2270,7 @@ whois==0.9.27
 wiffi==1.1.2
 
 # homeassistant.components.wled
-wled==0.18.0
+wled==0.19.2
 
 # homeassistant.components.wolflink
 wolf-comm==0.0.9
diff --git a/tests/components/wled/conftest.py b/tests/components/wled/conftest.py
index 2cf909ca66499..301729843a224 100644
--- a/tests/components/wled/conftest.py
+++ b/tests/components/wled/conftest.py
@@ -5,7 +5,7 @@
 
 from freezegun.api import FrozenDateTimeFactory
 import pytest
-from wled import Device as WLEDDevice
+from wled import Device as WLEDDevice, Releases
 
 from homeassistant.components.wled.const import DOMAIN
 from homeassistant.const import CONF_HOST
@@ -51,7 +51,24 @@ def device_fixture() -> str:
 
 
 @pytest.fixture
-def mock_wled(device_fixture: str) -> Generator[MagicMock]:
+def mock_wled_releases() -> Generator[MagicMock]:
+    """Return a mocked WLEDReleases client."""
+    with patch(
+        "homeassistant.components.wled.coordinator.WLEDReleases", autospec=True
+    ) as wled_releases_mock:
+        wled_releases = wled_releases_mock.return_value
+        wled_releases.releases.return_value = Releases(
+            beta="1.0.0b5",
+            stable="0.99.0",
+        )
+
+        yield wled_releases
+
+
+@pytest.fixture
+def mock_wled(
+    device_fixture: str, mock_wled_releases: MagicMock
+) -> Generator[MagicMock]:
     """Return a mocked WLED client."""
     with (
         patch(
@@ -60,11 +77,12 @@ def mock_wled(device_fixture: str) -> Generator[MagicMock]:
         patch("homeassistant.components.wled.config_flow.WLED", new=wled_mock),
     ):
         wled = wled_mock.return_value
-        wled.update.return_value = WLEDDevice(
+        wled.update.return_value = WLEDDevice.from_dict(
             load_json_object_fixture(f"{device_fixture}.json", DOMAIN)
         )
         wled.connected = False
         wled.host = "127.0.0.1"
+
         yield wled
 
 
diff --git a/tests/components/wled/fixtures/rgb.json b/tests/components/wled/fixtures/rgb.json
index 21f9b005b7229..50a82eb792e5d 100644
--- a/tests/components/wled/fixtures/rgb.json
+++ b/tests/components/wled/fixtures/rgb.json
@@ -1,28 +1,41 @@
 {
   "state": {
     "on": true,
-    "bri": 127,
+    "bri": 128,
     "transition": 7,
     "ps": -1,
     "pl": -1,
     "nl": {
       "on": false,
       "dur": 60,
-      "fade": true,
-      "tbri": 0
+      "mode": 1,
+      "tbri": 0,
+      "rem": -1
     },
     "udpn": {
       "send": false,
-      "recv": true
+      "recv": true,
+      "sgrp": 1,
+      "rgrp": 1
     },
+    "lor": 0,
+    "mainseg": 1,
     "seg": [
       {
         "id": 0,
         "start": 0,
-        "stop": 19,
-        "len": 20,
+        "stop": 15,
+        "len": 15,
+        "grp": 1,
+        "spc": 0,
+        "of": 0,
+        "on": true,
+        "frz": false,
+        "bri": 255,
+        "cct": 127,
+        "set": 0,
         "col": [
-          [255, 159, 0],
+          [127, 172, 255],
           [0, 0, 0],
           [0, 0, 0]
         ],
@@ -30,62 +43,106 @@
         "sx": 32,
         "ix": 128,
         "pal": 0,
-        "sel": true,
+        "c1": 128,
+        "c2": 128,
+        "c3": 16,
+        "sel": false,
         "rev": false,
-        "cln": -1
+        "mi": false,
+        "o1": false,
+        "o2": false,
+        "o3": false,
+        "si": 0,
+        "m12": 0
       },
       {
         "id": 1,
-        "start": 20,
+        "start": 15,
         "stop": 30,
-        "len": 10,
+        "len": 15,
+        "grp": 1,
+        "spc": 0,
+        "of": 0,
+        "on": true,
+        "frz": false,
+        "bri": 255,
+        "cct": 127,
+        "set": 0,
         "col": [
-          [0, 255, 123],
+          [255, 170, 0],
           [0, 0, 0],
           [0, 0, 0]
         ],
-        "fx": 1,
+        "fx": 3,
         "sx": 16,
         "ix": 64,
         "pal": 1,
+        "c1": 128,
+        "c2": 128,
+        "c3": 16,
         "sel": true,
         "rev": true,
-        "cln": -1
+        "mi": false,
+        "o1": false,
+        "o2": false,
+        "o3": false,
+        "si": 0,
+        "m12": 0
       }
     ]
   },
   "info": {
-    "ver": "0.8.5",
-    "version_latest_stable": "0.12.0",
-    "version_latest_beta": "0.13.0b1",
-    "vid": 1909122,
+    "ver": "0.14.4",
+    "vid": 2405180,
     "leds": {
       "count": 30,
-      "rgbw": false,
-      "pin": [2],
-      "pwr": 470,
+      "pwr": 515,
+      "fps": 5,
       "maxpwr": 850,
-      "maxseg": 10
+      "maxseg": 32,
+      "seglc": [1, 1],
+      "lc": 1,
+      "rgbw": false,
+      "wv": 0,
+      "cct": 0
     },
+    "str": false,
     "name": "WLED RGB Light",
     "udpport": 21324,
     "live": false,
-    "fxcount": 81,
-    "palcount": 50,
+    "liveseg": -1,
+    "lm": "",
+    "lip": "",
+    "ws": -1,
+    "fxcount": 187,
+    "palcount": 71,
+    "cpalcount": 0,
+    "maps": [
+      {
+        "id": 0
+      }
+    ],
     "wifi": {
       "bssid": "AA:AA:AA:AA:AA:BB",
-      "rssi": -62,
-      "signal": 76,
+      "rssi": -43,
+      "signal": 100,
       "channel": 11
     },
-    "arch": "esp8266",
-    "core": "2_4_2",
-    "freeheap": 14600,
-    "uptime": 32,
-    "opt": 119,
+    "fs": {
+      "u": 12,
+      "t": 983,
+      "pmt": 1718827787
+    },
+    "ndc": 1,
+    "arch": "esp32",
+    "core": "v3.3.6-16-gcc5440f6a2",
+    "lwip": 0,
+    "freeheap": 198384,
+    "uptime": 966,
+    "time": "2024-6-19, 20:10:38",
+    "opt": 79,
     "brand": "WLED",
-    "product": "DIY light",
-    "btype": "bin",
+    "product": "FOSS",
     "mac": "aabbccddeeff",
     "ip": "127.0.0.1"
   },
@@ -101,21 +158,21 @@
     "Colorloop",
     "Rainbow",
     "Scan",
-    "Dual Scan",
+    "Scan Dual",
     "Fade",
-    "Chase",
-    "Chase Rainbow",
+    "Theater",
+    "Theater Rainbow",
     "Running",
     "Saw",
     "Twinkle",
     "Dissolve",
     "Dissolve Rnd",
     "Sparkle",
-    "Dark Sparkle",
+    "Sparkle Dark",
     "Sparkle+",
     "Strobe",
     "Strobe Rainbow",
-    "Mega Strobe",
+    "Strobe Mega",
     "Blink Rainbow",
     "Android",
     "Chase",
@@ -127,30 +184,30 @@
     "Colorful",
     "Traffic Light",
     "Sweep Random",
-    "Running 2",
-    "Red & Blue",
+    "Chase 2",
+    "Aurora",
     "Stream",
     "Scanner",
     "Lighthouse",
     "Fireworks",
     "Rain",
-    "Merry Christmas",
+    "Tetrix",
     "Fire Flicker",
     "Gradient",
     "Loading",
-    "In Out",
-    "In In",
-    "Out Out",
-    "Out In",
-    "Circus",
-    "Halloween",
-    "Tri Chase",
+    "Rolling Balls",
+    "Fairy",
+    "Two Dots",
+    "Fairytwinkle",
+    "Running Dual",
+    "RSVD",
+    "Chase 3",
     "Tri Wipe",
     "Tri Fade",
     "Lightning",
     "ICU",
     "Multi Comet",
-    "Dual Scanner",
+    "Scanner Dual",
     "Stream 2",
     "Oscillate",
     "Pride 2015",
@@ -158,27 +215,133 @@
     "Palette",
     "Fire 2012",
     "Colorwaves",
-    "BPM",
+    "Bpm",
     "Fill Noise",
     "Noise 1",
     "Noise 2",
     "Noise 3",
     "Noise 4",
-    "Colortwinkle",
+    "Colortwinkles",
     "Lake",
     "Meteor",
-    "Smooth Meteor",
+    "Meteor Smooth",
     "Railway",
     "Ripple",
-    "Twinklefox"
+    "Twinklefox",
+    "Twinklecat",
+    "Halloween Eyes",
+    "Solid Pattern",
+    "Solid Pattern Tri",
+    "Spots",
+    "Spots Fade",
+    "Glitter",
+    "Candle",
+    "Fireworks Starburst",
+    "Fireworks 1D",
+    "Bouncing Balls",
+    "Sinelon",
+    "Sinelon Dual",
+    "Sinelon Rainbow",
+    "Popcorn",
+    "Drip",
+    "Plasma",
+    "Percent",
+    "Ripple Rainbow",
+    "Heartbeat",
+    "Pacifica",
+    "Candle Multi",
+    "Solid Glitter",
+    "Sunrise",
+    "Phased",
+    "Twinkleup",
+    "Noise Pal",
+    "Sine",
+    "Phased Noise",
+    "Flow",
+    "Chunchun",
+    "Dancing Shadows",
+    "Washing Machine",
+    "RSVD",
+    "Blends",
+    "TV Simulator",
+    "Dynamic Smooth",
+    "Spaceships",
+    "Crazy Bees",
+    "Ghost Rider",
+    "Blobs",
+    "Scrolling Text",
+    "Drift Rose",
+    "Distortion Waves",
+    "Soap",
+    "Octopus",
+    "Waving Cell",
+    "Pixels",
+    "Pixelwave",
+    "Juggles",
+    "Matripix",
+    "Gravimeter",
+    "Plasmoid",
+    "Puddles",
+    "Midnoise",
+    "Noisemeter",
+    "Freqwave",
+    "Freqmatrix",
+    "GEQ",
+    "Waterfall",
+    "Freqpixels",
+    "RSVD",
+    "Noisefire",
+    "Puddlepeak",
+    "Noisemove",
+    "Noise2D",
+    "Perlin Move",
+    "Ripple Peak",
+    "Firenoise",
+    "Squared Swirl",
+    "RSVD",
+    "DNA",
+    "Matrix",
+    "Metaballs",
+    "Freqmap",
+    "Gravcenter",
+    "Gravcentric",
+    "Gravfreq",
+    "DJ Light",
+    "Funky Plank",
+    "RSVD",
+    "Pulser",
+    "Blurz",
+    "Drift",
+    "Waverly",
+    "Sun Radiation",
+    "Colored Bursts",
+    "Julia",
+    "RSVD",
+    "RSVD",
+    "RSVD",
+    "Game Of Life",
+    "Tartan",
+    "Polar Lights",
+    "Swirl",
+    "Lissajous",
+    "Frizzles",
+    "Plasma Ball",
+    "Flow Stripe",
+    "Hiphotic",
+    "Sindots",
+    "DNA Spiral",
+    "Black Hole",
+    "Wavesins",
+    "Rocktaves",
+    "Akemi"
   ],
   "palettes": [
     "Default",
-    "Random Cycle",
-    "Primary Color",
-    "Based on Primary",
-    "Set Colors",
-    "Based on Set",
+    "* Random Cycle",
+    "* Color 1",
+    "* Colors 1&2",
+    "* Color Gradient",
+    "* Colors Only",
     "Party",
     "Cloud",
     "Lava",
@@ -195,11 +358,11 @@
     "Splash",
     "Pastel",
     "Sunset 2",
-    "Beech",
+    "Beach",
     "Vintage",
     "Departure",
     "Landscape",
-    "Beach",
+    "Beech",
     "Sherbet",
     "Hult",
     "Hult 64",
@@ -222,6 +385,27 @@
     "April Night",
     "Orangery",
     "C9",
-    "Sakura"
+    "Sakura",
+    "Aurora",
+    "Atlantica",
+    "C9 2",
+    "C9 New",
+    "Temperature",
+    "Aurora 2",
+    "Retro Clown",
+    "Candy",
+    "Toxy Reaf",
+    "Fairy Reaf",
+    "Semi Blue",
+    "Pink Candy",
+    "Red Reaf",
+    "Aqua Flash",
+    "Yelblu Hot",
+    "Lite Light",
+    "Red Flash",
+    "Blink Red",
+    "Red Shift",
+    "Red Tide",
+    "Candy2"
   ]
 }
diff --git a/tests/components/wled/fixtures/rgb_no_update.json b/tests/components/wled/fixtures/rgb_no_update.json
deleted file mode 100644
index c8aa902cc952f..0000000000000
--- a/tests/components/wled/fixtures/rgb_no_update.json
+++ /dev/null
@@ -1,227 +0,0 @@
-{
-  "state": {
-    "on": true,
-    "bri": 127,
-    "transition": 7,
-    "ps": -1,
-    "pl": -1,
-    "nl": {
-      "on": false,
-      "dur": 60,
-      "fade": true,
-      "tbri": 0
-    },
-    "udpn": {
-      "send": false,
-      "recv": true
-    },
-    "seg": [
-      {
-        "id": 0,
-        "start": 0,
-        "stop": 19,
-        "len": 20,
-        "col": [
-          [255, 159, 0],
-          [0, 0, 0],
-          [0, 0, 0]
-        ],
-        "fx": 0,
-        "sx": 32,
-        "ix": 128,
-        "pal": 0,
-        "sel": true,
-        "rev": false,
-        "cln": -1
-      },
-      {
-        "id": 1,
-        "start": 20,
-        "stop": 30,
-        "len": 10,
-        "col": [
-          [0, 255, 123],
-          [0, 0, 0],
-          [0, 0, 0]
-        ],
-        "fx": 1,
-        "sx": 16,
-        "ix": 64,
-        "pal": 1,
-        "sel": true,
-        "rev": true,
-        "cln": -1
-      }
-    ]
-  },
-  "info": {
-    "ver": null,
-    "version_latest_stable": null,
-    "version_latest_beta": null,
-    "vid": 1909122,
-    "leds": {
-      "count": 30,
-      "rgbw": false,
-      "pin": [2],
-      "pwr": 470,
-      "maxpwr": 850,
-      "maxseg": 10
-    },
-    "name": "WLED RGB Light",
-    "udpport": 21324,
-    "live": false,
-    "fxcount": 81,
-    "palcount": 50,
-    "wifi": {
-      "bssid": "AA:AA:AA:AA:AA:BB",
-      "rssi": -62,
-      "signal": 76,
-      "channel": 11
-    },
-    "arch": "esp8266",
-    "core": "2_4_2",
-    "freeheap": 14600,
-    "uptime": 32,
-    "opt": 119,
-    "brand": "WLED",
-    "product": "DIY light",
-    "btype": "bin",
-    "mac": "aabbccddeeff",
-    "ip": "127.0.0.1"
-  },
-  "effects": [
-    "Solid",
-    "Blink",
-    "Breathe",
-    "Wipe",
-    "Wipe Random",
-    "Random Colors",
-    "Sweep",
-    "Dynamic",
-    "Colorloop",
-    "Rainbow",
-    "Scan",
-    "Dual Scan",
-    "Fade",
-    "Chase",
-    "Chase Rainbow",
-    "Running",
-    "Saw",
-    "Twinkle",
-    "Dissolve",
-    "Dissolve Rnd",
-    "Sparkle",
-    "Dark Sparkle",
-    "Sparkle+",
-    "Strobe",
-    "Strobe Rainbow",
-    "Mega Strobe",
-    "Blink Rainbow",
-    "Android",
-    "Chase",
-    "Chase Random",
-    "Chase Rainbow",
-    "Chase Flash",
-    "Chase Flash Rnd",
-    "Rainbow Runner",
-    "Colorful",
-    "Traffic Light",
-    "Sweep Random",
-    "Running 2",
-    "Red & Blue",
-    "Stream",
-    "Scanner",
-    "Lighthouse",
-    "Fireworks",
-    "Rain",
-    "Merry Christmas",
-    "Fire Flicker",
-    "Gradient",
-    "Loading",
-    "In Out",
-    "In In",
-    "Out Out",
-    "Out In",
-    "Circus",
-    "Halloween",
-    "Tri Chase",
-    "Tri Wipe",
-    "Tri Fade",
-    "Lightning",
-    "ICU",
-    "Multi Comet",
-    "Dual Scanner",
-    "Stream 2",
-    "Oscillate",
-    "Pride 2015",
-    "Juggle",
-    "Palette",
-    "Fire 2012",
-    "Colorwaves",
-    "BPM",
-    "Fill Noise",
-    "Noise 1",
-    "Noise 2",
-    "Noise 3",
-    "Noise 4",
-    "Colortwinkle",
-    "Lake",
-    "Meteor",
-    "Smooth Meteor",
-    "Railway",
-    "Ripple",
-    "Twinklefox"
-  ],
-  "palettes": [
-    "Default",
-    "Random Cycle",
-    "Primary Color",
-    "Based on Primary",
-    "Set Colors",
-    "Based on Set",
-    "Party",
-    "Cloud",
-    "Lava",
-    "Ocean",
-    "Forest",
-    "Rainbow",
-    "Rainbow Bands",
-    "Sunset",
-    "Rivendell",
-    "Breeze",
-    "Red & Blue",
-    "Yellowout",
-    "Analogous",
-    "Splash",
-    "Pastel",
-    "Sunset 2",
-    "Beech",
-    "Vintage",
-    "Departure",
-    "Landscape",
-    "Beach",
-    "Sherbet",
-    "Hult",
-    "Hult 64",
-    "Drywet",
-    "Jul",
-    "Grintage",
-    "Rewhi",
-    "Tertiary",
-    "Fire",
-    "Icefire",
-    "Cyane",
-    "Light Pink",
-    "Autumn",
-    "Magenta",
-    "Magred",
-    "Yelmag",
-    "Yelblu",
-    "Orange & Teal",
-    "Tiamat",
-    "April Night",
-    "Orangery",
-    "C9",
-    "Sakura"
-  ]
-}
diff --git a/tests/components/wled/fixtures/rgb_single_segment.json b/tests/components/wled/fixtures/rgb_single_segment.json
index aa0b79e98f58e..512ac2a00dfcd 100644
--- a/tests/components/wled/fixtures/rgb_single_segment.json
+++ b/tests/components/wled/fixtures/rgb_single_segment.json
@@ -1,28 +1,41 @@
 {
   "state": {
     "on": true,
-    "bri": 127,
+    "bri": 128,
     "transition": 7,
     "ps": -1,
     "pl": -1,
     "nl": {
       "on": false,
       "dur": 60,
-      "fade": true,
-      "tbri": 0
+      "mode": 1,
+      "tbri": 0,
+      "rem": -1
     },
     "udpn": {
       "send": false,
-      "recv": true
+      "recv": true,
+      "sgrp": 1,
+      "rgrp": 1
     },
+    "lor": 0,
+    "mainseg": 0,
     "seg": [
       {
         "id": 0,
         "start": 0,
         "stop": 30,
-        "len": 20,
+        "len": 30,
+        "grp": 1,
+        "spc": 0,
+        "of": 0,
+        "on": true,
+        "frz": false,
+        "bri": 255,
+        "cct": 127,
+        "set": 0,
         "col": [
-          [255, 159, 0],
+          [127, 172, 255],
           [0, 0, 0],
           [0, 0, 0]
         ],
@@ -30,44 +43,72 @@
         "sx": 32,
         "ix": 128,
         "pal": 0,
+        "c1": 128,
+        "c2": 128,
+        "c3": 16,
         "sel": true,
         "rev": false,
-        "cln": -1
+        "mi": false,
+        "o1": false,
+        "o2": false,
+        "o3": false,
+        "si": 0,
+        "m12": 0
       }
     ]
   },
   "info": {
-    "ver": "0.8.6b1",
-    "version_latest_stable": "0.8.5",
-    "version_latest_beta": "0.8.6b2",
-    "vid": 1909122,
+    "ver": "1.0.0b4",
+    "vid": 2405180,
     "leds": {
       "count": 30,
-      "rgbw": false,
-      "pin": [2],
-      "pwr": 470,
+      "pwr": 536,
+      "fps": 5,
       "maxpwr": 850,
-      "maxseg": 10
+      "maxseg": 32,
+      "seglc": [1],
+      "lc": 1,
+      "rgbw": false,
+      "wv": 0,
+      "cct": 0
     },
+    "str": false,
     "name": "WLED RGB Light",
     "udpport": 21324,
     "live": false,
-    "fxcount": 81,
-    "palcount": 50,
+    "liveseg": -1,
+    "lm": "",
+    "lip": "",
+    "ws": -1,
+    "fxcount": 187,
+    "palcount": 71,
+    "cpalcount": 0,
+    "maps": [
+      {
+        "id": 0
+      }
+    ],
     "wifi": {
       "bssid": "AA:AA:AA:AA:AA:BB",
-      "rssi": -62,
-      "signal": 76,
+      "rssi": -44,
+      "signal": 100,
       "channel": 11
     },
-    "arch": "esp8266",
-    "core": "2_4_2",
-    "freeheap": 14600,
-    "uptime": 32,
-    "opt": 119,
+    "fs": {
+      "u": 12,
+      "t": 983,
+      "pmt": 0
+    },
+    "ndc": 1,
+    "arch": "esp32",
+    "core": "v3.3.6-16-gcc5440f6a2",
+    "lwip": 0,
+    "freeheap": 196960,
+    "uptime": 461,
+    "time": "1970-1-1, 00:07:41",
+    "opt": 79,
     "brand": "WLED",
-    "product": "DIY light",
-    "btype": "bin",
+    "product": "FOSS",
     "mac": "aabbccddeeff",
     "ip": "127.0.0.1"
   },
@@ -83,21 +124,21 @@
     "Colorloop",
     "Rainbow",
     "Scan",
-    "Dual Scan",
+    "Scan Dual",
     "Fade",
-    "Chase",
-    "Chase Rainbow",
+    "Theater",
+    "Theater Rainbow",
     "Running",
     "Saw",
     "Twinkle",
     "Dissolve",
     "Dissolve Rnd",
     "Sparkle",
-    "Dark Sparkle",
+    "Sparkle Dark",
     "Sparkle+",
     "Strobe",
     "Strobe Rainbow",
-    "Mega Strobe",
+    "Strobe Mega",
     "Blink Rainbow",
     "Android",
     "Chase",
@@ -109,30 +150,30 @@
     "Colorful",
     "Traffic Light",
     "Sweep Random",
-    "Running 2",
-    "Red & Blue",
+    "Chase 2",
+    "Aurora",
     "Stream",
     "Scanner",
     "Lighthouse",
     "Fireworks",
     "Rain",
-    "Merry Christmas",
+    "Tetrix",
     "Fire Flicker",
     "Gradient",
     "Loading",
-    "In Out",
-    "In In",
-    "Out Out",
-    "Out In",
-    "Circus",
-    "Halloween",
-    "Tri Chase",
+    "Rolling Balls",
+    "Fairy",
+    "Two Dots",
+    "Fairytwinkle",
+    "Running Dual",
+    "RSVD",
+    "Chase 3",
     "Tri Wipe",
     "Tri Fade",
     "Lightning",
     "ICU",
     "Multi Comet",
-    "Dual Scanner",
+    "Scanner Dual",
     "Stream 2",
     "Oscillate",
     "Pride 2015",
@@ -140,27 +181,133 @@
     "Palette",
     "Fire 2012",
     "Colorwaves",
-    "BPM",
+    "Bpm",
     "Fill Noise",
     "Noise 1",
     "Noise 2",
     "Noise 3",
     "Noise 4",
-    "Colortwinkle",
+    "Colortwinkles",
     "Lake",
     "Meteor",
-    "Smooth Meteor",
+    "Meteor Smooth",
     "Railway",
     "Ripple",
-    "Twinklefox"
+    "Twinklefox",
+    "Twinklecat",
+    "Halloween Eyes",
+    "Solid Pattern",
+    "Solid Pattern Tri",
+    "Spots",
+    "Spots Fade",
+    "Glitter",
+    "Candle",
+    "Fireworks Starburst",
+    "Fireworks 1D",
+    "Bouncing Balls",
+    "Sinelon",
+    "Sinelon Dual",
+    "Sinelon Rainbow",
+    "Popcorn",
+    "Drip",
+    "Plasma",
+    "Percent",
+    "Ripple Rainbow",
+    "Heartbeat",
+    "Pacifica",
+    "Candle Multi",
+    "Solid Glitter",
+    "Sunrise",
+    "Phased",
+    "Twinkleup",
+    "Noise Pal",
+    "Sine",
+    "Phased Noise",
+    "Flow",
+    "Chunchun",
+    "Dancing Shadows",
+    "Washing Machine",
+    "RSVD",
+    "Blends",
+    "TV Simulator",
+    "Dynamic Smooth",
+    "Spaceships",
+    "Crazy Bees",
+    "Ghost Rider",
+    "Blobs",
+    "Scrolling Text",
+    "Drift Rose",
+    "Distortion Waves",
+    "Soap",
+    "Octopus",
+    "Waving Cell",
+    "Pixels",
+    "Pixelwave",
+    "Juggles",
+    "Matripix",
+    "Gravimeter",
+    "Plasmoid",
+    "Puddles",
+    "Midnoise",
+    "Noisemeter",
+    "Freqwave",
+    "Freqmatrix",
+    "GEQ",
+    "Waterfall",
+    "Freqpixels",
+    "RSVD",
+    "Noisefire",
+    "Puddlepeak",
+    "Noisemove",
+    "Noise2D",
+    "Perlin Move",
+    "Ripple Peak",
+    "Firenoise",
+    "Squared Swirl",
+    "RSVD",
+    "DNA",
+    "Matrix",
+    "Metaballs",
+    "Freqmap",
+    "Gravcenter",
+    "Gravcentric",
+    "Gravfreq",
+    "DJ Light",
+    "Funky Plank",
+    "RSVD",
+    "Pulser",
+    "Blurz",
+    "Drift",
+    "Waverly",
+    "Sun Radiation",
+    "Colored Bursts",
+    "Julia",
+    "RSVD",
+    "RSVD",
+    "RSVD",
+    "Game Of Life",
+    "Tartan",
+    "Polar Lights",
+    "Swirl",
+    "Lissajous",
+    "Frizzles",
+    "Plasma Ball",
+    "Flow Stripe",
+    "Hiphotic",
+    "Sindots",
+    "DNA Spiral",
+    "Black Hole",
+    "Wavesins",
+    "Rocktaves",
+    "Akemi"
   ],
   "palettes": [
     "Default",
-    "Random Cycle",
-    "Primary Color",
-    "Based on Primary",
-    "Set Colors",
-    "Based on Set",
+    "* Random Cycle",
+    "* Color 1",
+    "* Colors 1&2",
+    "* Color Gradient",
+    "* Colors Only",
     "Party",
     "Cloud",
     "Lava",
@@ -177,11 +324,11 @@
     "Splash",
     "Pastel",
     "Sunset 2",
-    "Beech",
+    "Beach",
     "Vintage",
     "Departure",
     "Landscape",
-    "Beach",
+    "Beech",
     "Sherbet",
     "Hult",
     "Hult 64",
@@ -204,6 +351,27 @@
     "April Night",
     "Orangery",
     "C9",
-    "Sakura"
+    "Sakura",
+    "Aurora",
+    "Atlantica",
+    "C9 2",
+    "C9 New",
+    "Temperature",
+    "Aurora 2",
+    "Retro Clown",
+    "Candy",
+    "Toxy Reaf",
+    "Fairy Reaf",
+    "Semi Blue",
+    "Pink Candy",
+    "Red Reaf",
+    "Aqua Flash",
+    "Yelblu Hot",
+    "Lite Light",
+    "Red Flash",
+    "Blink Red",
+    "Red Shift",
+    "Red Tide",
+    "Candy2"
   ]
 }
diff --git a/tests/components/wled/fixtures/rgb_websocket.json b/tests/components/wled/fixtures/rgb_websocket.json
index 4a0ed7b1ee5a5..f5a3e715654bd 100644
--- a/tests/components/wled/fixtures/rgb_websocket.json
+++ b/tests/components/wled/fixtures/rgb_websocket.json
@@ -1,26 +1,22 @@
 {
   "state": {
     "on": true,
-    "bri": 255,
+    "bri": 128,
     "transition": 7,
     "ps": -1,
     "pl": -1,
-    "ccnf": {
-      "min": 1,
-      "max": 5,
-      "time": 12
-    },
     "nl": {
       "on": false,
       "dur": 60,
-      "fade": true,
       "mode": 1,
       "tbri": 0,
       "rem": -1
     },
     "udpn": {
       "send": false,
-      "recv": true
+      "recv": true,
+      "sgrp": 1,
+      "rgrp": 1
     },
     "lor": 0,
     "mainseg": 0,
@@ -28,70 +24,89 @@
       {
         "id": 0,
         "start": 0,
-        "stop": 13,
-        "len": 13,
+        "stop": 30,
+        "len": 30,
         "grp": 1,
         "spc": 0,
+        "of": 0,
         "on": true,
+        "frz": false,
         "bri": 255,
+        "cct": 127,
+        "set": 0,
         "col": [
-          [255, 181, 218],
+          [127, 172, 255],
           [0, 0, 0],
           [0, 0, 0]
         ],
         "fx": 0,
-        "sx": 43,
+        "sx": 128,
         "ix": 128,
-        "pal": 2,
+        "pal": 0,
+        "c1": 128,
+        "c2": 128,
+        "c3": 16,
         "sel": true,
         "rev": false,
-        "mi": false
+        "mi": false,
+        "o1": false,
+        "o2": false,
+        "o3": false,
+        "si": 0,
+        "m12": 0
       }
     ]
   },
   "info": {
-    "ver": "0.12.0-b2",
-    "version_latest_stable": "0.11.0",
-    "version_latest_beta": "0.12.0-b2",
-    "vid": 2103220,
+    "ver": "0.99.0",
+    "vid": 2405180,
     "leds": {
-      "count": 13,
+      "count": 30,
+      "pwr": 536,
+      "fps": 5,
+      "maxpwr": 850,
+      "maxseg": 32,
+      "seglc": [1],
+      "lc": 1,
       "rgbw": false,
-      "wv": false,
-      "pin": [2],
-      "pwr": 266,
-      "fps": 2,
-      "maxpwr": 1000,
-      "maxseg": 12,
-      "seglock": false
+      "wv": 0,
+      "cct": 0
     },
     "str": false,
     "name": "WLED WebSocket",
     "udpport": 21324,
     "live": false,
+    "liveseg": -1,
     "lm": "",
     "lip": "",
     "ws": 0,
-    "fxcount": 118,
-    "palcount": 56,
+    "fxcount": 187,
+    "palcount": 71,
+    "cpalcount": 0,
+    "maps": [
+      {
+        "id": 0
+      }
+    ],
     "wifi": {
       "bssid": "AA:AA:AA:AA:AA:BB",
-      "rssi": -68,
-      "signal": 64,
-      "channel": 6
+      "rssi": -44,
+      "signal": 100,
+      "channel": 11
     },
     "fs": {
-      "u": 40,
-      "t": 1024,
-      "pmt": 1623156685
+      "u": 12,
+      "t": 983,
+      "pmt": 0
     },
     "ndc": 1,
-    "arch": "esp8266",
-    "core": "2_7_4_7",
-    "lwip": 1,
-    "freeheap": 22752,
-    "uptime": 258411,
-    "opt": 127,
+    "arch": "esp32",
+    "core": "v3.3.6-16-gcc5440f6a2",
+    "lwip": 0,
+    "freeheap": 196960,
+    "uptime": 461,
+    "time": "1970-1-1, 00:07:41",
+    "opt": 79,
     "brand": "WLED",
     "product": "FOSS",
     "mac": "aabbccddeeff",
@@ -135,7 +150,7 @@
     "Colorful",
     "Traffic Light",
     "Sweep Random",
-    "Running 2",
+    "Chase 2",
     "Aurora",
     "Stream",
     "Scanner",
@@ -146,13 +161,13 @@
     "Fire Flicker",
     "Gradient",
     "Loading",
-    "Police",
-    "Police All",
+    "Rolling Balls",
+    "Fairy",
     "Two Dots",
-    "Two Areas",
-    "Circus",
-    "Halloween",
-    "Tri Chase",
+    "Fairytwinkle",
+    "Running Dual",
+    "RSVD",
+    "Chase 3",
     "Tri Wipe",
     "Tri Fade",
     "Lightning",
@@ -212,10 +227,79 @@
     "Chunchun",
     "Dancing Shadows",
     "Washing Machine",
-    "Candy Cane",
+    "RSVD",
     "Blends",
     "TV Simulator",
-    "Dynamic Smooth"
+    "Dynamic Smooth",
+    "Spaceships",
+    "Crazy Bees",
+    "Ghost Rider",
+    "Blobs",
+    "Scrolling Text",
+    "Drift Rose",
+    "Distortion Waves",
+    "Soap",
+    "Octopus",
+    "Waving Cell",
+    "Pixels",
+    "Pixelwave",
+    "Juggles",
+    "Matripix",
+    "Gravimeter",
+    "Plasmoid",
+    "Puddles",
+    "Midnoise",
+    "Noisemeter",
+    "Freqwave",
+    "Freqmatrix",
+    "GEQ",
+    "Waterfall",
+    "Freqpixels",
+    "RSVD",
+    "Noisefire",
+    "Puddlepeak",
+    "Noisemove",
+    "Noise2D",
+    "Perlin Move",
+    "Ripple Peak",
+    "Firenoise",
+    "Squared Swirl",
+    "RSVD",
+    "DNA",
+    "Matrix",
+    "Metaballs",
+    "Freqmap",
+    "Gravcenter",
+    "Gravcentric",
+    "Gravfreq",
+    "DJ Light",
+    "Funky Plank",
+    "RSVD",
+    "Pulser",
+    "Blurz",
+    "Drift",
+    "Waverly",
+    "Sun Radiation",
+    "Colored Bursts",
+    "Julia",
+    "RSVD",
+    "RSVD",
+    "RSVD",
+    "Game Of Life",
+    "Tartan",
+    "Polar Lights",
+    "Swirl",
+    "Lissajous",
+    "Frizzles",
+    "Plasma Ball",
+    "Flow Stripe",
+    "Hiphotic",
+    "Sindots",
+    "DNA Spiral",
+    "Black Hole",
+    "Wavesins",
+    "Rocktaves",
+    "Akemi"
   ],
   "palettes": [
     "Default",
@@ -240,11 +324,11 @@
     "Splash",
     "Pastel",
     "Sunset 2",
-    "Beech",
+    "Beach",
     "Vintage",
     "Departure",
     "Landscape",
-    "Beach",
+    "Beech",
     "Sherbet",
     "Hult",
     "Hult 64",
@@ -273,6 +357,21 @@
     "C9 2",
     "C9 New",
     "Temperature",
-    "Aurora 2"
+    "Aurora 2",
+    "Retro Clown",
+    "Candy",
+    "Toxy Reaf",
+    "Fairy Reaf",
+    "Semi Blue",
+    "Pink Candy",
+    "Red Reaf",
+    "Aqua Flash",
+    "Yelblu Hot",
+    "Lite Light",
+    "Red Flash",
+    "Blink Red",
+    "Red Shift",
+    "Red Tide",
+    "Candy2"
   ]
 }
diff --git a/tests/components/wled/fixtures/rgbw.json b/tests/components/wled/fixtures/rgbw.json
index 100b3936900b6..285842605aefb 100644
--- a/tests/components/wled/fixtures/rgbw.json
+++ b/tests/components/wled/fixtures/rgbw.json
@@ -1,74 +1,115 @@
 {
   "state": {
     "on": true,
-    "bri": 140,
+    "bri": 128,
     "transition": 7,
-    "ps": 1,
-    "pl": 3,
+    "ps": -1,
+    "pl": -1,
     "nl": {
       "on": false,
       "dur": 60,
-      "fade": true,
-      "tbri": 0
+      "mode": 1,
+      "tbri": 0,
+      "rem": -1
     },
     "udpn": {
       "send": false,
-      "recv": true
+      "recv": true,
+      "sgrp": 1,
+      "rgrp": 1
     },
+    "lor": 0,
+    "mainseg": 0,
     "seg": [
       {
         "id": 0,
         "start": 0,
-        "stop": 13,
-        "len": 13,
+        "stop": 30,
+        "len": 30,
+        "grp": 1,
+        "spc": 0,
+        "of": 0,
+        "on": true,
+        "frz": false,
+        "bri": 255,
+        "cct": 127,
+        "set": 0,
         "col": [
           [255, 0, 0, 139],
           [0, 0, 0, 0],
           [0, 0, 0, 0]
         ],
-        "fx": 9,
-        "sx": 165,
+        "fx": 0,
+        "sx": 128,
         "ix": 128,
         "pal": 0,
+        "c1": 128,
+        "c2": 128,
+        "c3": 16,
         "sel": true,
         "rev": false,
-        "cln": -1
+        "mi": false,
+        "o1": false,
+        "o2": false,
+        "o3": false,
+        "si": 0,
+        "m12": 0
       }
     ]
   },
   "info": {
-    "ver": "0.8.6b4",
-    "version_latest_stable": "0.8.6",
-    "version_latest_beta": "0.8.6b5",
-    "vid": 1910255,
+    "ver": "0.99.0b1",
+    "vid": 2405180,
     "leds": {
-      "count": 13,
-      "rgbw": true,
-      "pin": [2],
-      "pwr": 208,
+      "count": 30,
+      "pwr": 536,
+      "fps": 5,
       "maxpwr": 850,
-      "maxseg": 10
+      "maxseg": 32,
+      "seglc": [3],
+      "lc": 3,
+      "rgbw": true,
+      "wv": 0,
+      "cct": 0
     },
+    "str": false,
     "name": "WLED RGBW Light",
     "udpport": 21324,
     "live": false,
-    "fxcount": 83,
-    "palcount": 50,
+    "liveseg": -1,
+    "lm": "",
+    "lip": "",
+    "ws": -1,
+    "fxcount": 187,
+    "palcount": 71,
+    "cpalcount": 0,
+    "maps": [
+      {
+        "id": 0
+      }
+    ],
     "wifi": {
       "bssid": "AA:AA:AA:AA:AA:BB",
-      "rssi": -62,
-      "signal": 76,
+      "rssi": -44,
+      "signal": 100,
       "channel": 11
     },
-    "arch": "esp8266",
-    "core": "2_5_2",
-    "freeheap": 20136,
-    "uptime": 5591,
-    "opt": 119,
+    "fs": {
+      "u": 12,
+      "t": 983,
+      "pmt": 0
+    },
+    "ndc": 1,
+    "arch": "esp32",
+    "core": "v3.3.6-16-gcc5440f6a2",
+    "lwip": 0,
+    "freeheap": 196960,
+    "uptime": 461,
+    "time": "1970-1-1, 00:07:41",
+    "opt": 79,
     "brand": "WLED",
-    "product": "DIY light",
-    "btype": "bin",
-    "mac": "aabbccddee11",
+    "product": "FOSS",
+    "mac": "aabbccddeeff",
     "ip": "127.0.0.1"
   },
   "effects": [
@@ -83,21 +124,21 @@
     "Colorloop",
     "Rainbow",
     "Scan",
-    "Dual Scan",
+    "Scan Dual",
     "Fade",
-    "Chase",
-    "Chase Rainbow",
+    "Theater",
+    "Theater Rainbow",
     "Running",
     "Saw",
     "Twinkle",
     "Dissolve",
     "Dissolve Rnd",
     "Sparkle",
-    "Dark Sparkle",
+    "Sparkle Dark",
     "Sparkle+",
     "Strobe",
     "Strobe Rainbow",
-    "Mega Strobe",
+    "Strobe Mega",
     "Blink Rainbow",
     "Android",
     "Chase",
@@ -109,30 +150,30 @@
     "Colorful",
     "Traffic Light",
     "Sweep Random",
-    "Running 2",
-    "Red & Blue",
+    "Chase 2",
+    "Aurora",
     "Stream",
     "Scanner",
     "Lighthouse",
     "Fireworks",
     "Rain",
-    "Merry Christmas",
+    "Tetrix",
     "Fire Flicker",
     "Gradient",
     "Loading",
-    "In Out",
-    "In In",
-    "Out Out",
-    "Out In",
-    "Circus",
-    "Halloween",
-    "Tri Chase",
+    "Rolling Balls",
+    "Fairy",
+    "Two Dots",
+    "Fairytwinkle",
+    "Running Dual",
+    "RSVD",
+    "Chase 3",
     "Tri Wipe",
     "Tri Fade",
     "Lightning",
     "ICU",
     "Multi Comet",
-    "Dual Scanner",
+    "Scanner Dual",
     "Stream 2",
     "Oscillate",
     "Pride 2015",
@@ -140,7 +181,7 @@
     "Palette",
     "Fire 2012",
     "Colorwaves",
-    "BPM",
+    "Bpm",
     "Fill Noise",
     "Noise 1",
     "Noise 2",
@@ -149,20 +190,124 @@
     "Colortwinkles",
     "Lake",
     "Meteor",
-    "Smooth Meteor",
+    "Meteor Smooth",
     "Railway",
     "Ripple",
     "Twinklefox",
     "Twinklecat",
-    "Halloween Eyes"
+    "Halloween Eyes",
+    "Solid Pattern",
+    "Solid Pattern Tri",
+    "Spots",
+    "Spots Fade",
+    "Glitter",
+    "Candle",
+    "Fireworks Starburst",
+    "Fireworks 1D",
+    "Bouncing Balls",
+    "Sinelon",
+    "Sinelon Dual",
+    "Sinelon Rainbow",
+    "Popcorn",
+    "Drip",
+    "Plasma",
+    "Percent",
+    "Ripple Rainbow",
+    "Heartbeat",
+    "Pacifica",
+    "Candle Multi",
+    "Solid Glitter",
+    "Sunrise",
+    "Phased",
+    "Twinkleup",
+    "Noise Pal",
+    "Sine",
+    "Phased Noise",
+    "Flow",
+    "Chunchun",
+    "Dancing Shadows",
+    "Washing Machine",
+    "RSVD",
+    "Blends",
+    "TV Simulator",
+    "Dynamic Smooth",
+    "Spaceships",
+    "Crazy Bees",
+    "Ghost Rider",
+    "Blobs",
+    "Scrolling Text",
+    "Drift Rose",
+    "Distortion Waves",
+    "Soap",
+    "Octopus",
+    "Waving Cell",
+    "Pixels",
+    "Pixelwave",
+    "Juggles",
+    "Matripix",
+    "Gravimeter",
+    "Plasmoid",
+    "Puddles",
+    "Midnoise",
+    "Noisemeter",
+    "Freqwave",
+    "Freqmatrix",
+    "GEQ",
+    "Waterfall",
+    "Freqpixels",
+    "RSVD",
+    "Noisefire",
+    "Puddlepeak",
+    "Noisemove",
+    "Noise2D",
+    "Perlin Move",
+    "Ripple Peak",
+    "Firenoise",
+    "Squared Swirl",
+    "RSVD",
+    "DNA",
+    "Matrix",
+    "Metaballs",
+    "Freqmap",
+    "Gravcenter",
+    "Gravcentric",
+    "Gravfreq",
+    "DJ Light",
+    "Funky Plank",
+    "RSVD",
+    "Pulser",
+    "Blurz",
+    "Drift",
+    "Waverly",
+    "Sun Radiation",
+    "Colored Bursts",
+    "Julia",
+    "RSVD",
+    "RSVD",
+    "RSVD",
+    "Game Of Life",
+    "Tartan",
+    "Polar Lights",
+    "Swirl",
+    "Lissajous",
+    "Frizzles",
+    "Plasma Ball",
+    "Flow Stripe",
+    "Hiphotic",
+    "Sindots",
+    "DNA Spiral",
+    "Black Hole",
+    "Wavesins",
+    "Rocktaves",
+    "Akemi"
   ],
   "palettes": [
     "Default",
-    "Random Cycle",
-    "Primary Color",
-    "Based on Primary",
-    "Set Colors",
-    "Based on Set",
+    "* Random Cycle",
+    "* Color 1",
+    "* Colors 1&2",
+    "* Color Gradient",
+    "* Colors Only",
     "Party",
     "Cloud",
     "Lava",
@@ -179,11 +324,11 @@
     "Splash",
     "Pastel",
     "Sunset 2",
-    "Beech",
+    "Beach",
     "Vintage",
     "Departure",
     "Landscape",
-    "Beach",
+    "Beech",
     "Sherbet",
     "Hult",
     "Hult 64",
@@ -206,36 +351,82 @@
     "April Night",
     "Orangery",
     "C9",
-    "Sakura"
+    "Sakura",
+    "Aurora",
+    "Atlantica",
+    "C9 2",
+    "C9 New",
+    "Temperature",
+    "Aurora 2",
+    "Retro Clown",
+    "Candy",
+    "Toxy Reaf",
+    "Fairy Reaf",
+    "Semi Blue",
+    "Pink Candy",
+    "Red Reaf",
+    "Aqua Flash",
+    "Yelblu Hot",
+    "Lite Light",
+    "Red Flash",
+    "Blink Red",
+    "Red Shift",
+    "Red Tide",
+    "Candy2"
   ],
   "presets": {
     "0": {},
     "1": {
-      "on": false,
-      "bri": 255,
+      "on": true,
+      "bri": 128,
       "transition": 7,
       "mainseg": 0,
       "seg": [
         {
           "id": 0,
           "start": 0,
-          "stop": 13,
+          "stop": 131,
           "grp": 1,
           "spc": 0,
+          "of": 0,
           "on": true,
+          "frz": false,
           "bri": 255,
+          "cct": 127,
+          "set": 0,
+          "n": "",
           "col": [
-            [97, 144, 255],
+            [40, 255, 3],
             [0, 0, 0],
             [0, 0, 0]
           ],
-          "fx": 9,
-          "sx": 183,
-          "ix": 255,
-          "pal": 1,
+          "fx": 0,
+          "sx": 128,
+          "ix": 128,
+          "pal": 0,
+          "c1": 128,
+          "c2": 128,
+          "c3": 16,
           "sel": true,
           "rev": false,
-          "mi": false
+          "mi": false,
+          "o1": false,
+          "o2": false,
+          "o3": false,
+          "si": 0,
+          "m12": 0
+        },
+        {
+          "stop": 0
+        },
+        {
+          "stop": 0
+        },
+        {
+          "stop": 0
+        },
+        {
+          "stop": 0
         },
         {
           "stop": 0
@@ -274,31 +465,56 @@
       "n": "Preset 1"
     },
     "2": {
-      "on": false,
-      "bri": 255,
+      "on": true,
+      "bri": 128,
       "transition": 7,
       "mainseg": 0,
       "seg": [
         {
           "id": 0,
           "start": 0,
-          "stop": 13,
+          "stop": 131,
           "grp": 1,
           "spc": 0,
+          "of": 0,
           "on": true,
+          "frz": false,
           "bri": 255,
+          "cct": 127,
+          "set": 0,
+          "n": "",
           "col": [
-            [97, 144, 255],
+            [51, 88, 255],
             [0, 0, 0],
             [0, 0, 0]
           ],
-          "fx": 9,
-          "sx": 183,
-          "ix": 255,
-          "pal": 1,
+          "fx": 0,
+          "sx": 128,
+          "ix": 128,
+          "pal": 0,
+          "c1": 128,
+          "c2": 128,
+          "c3": 16,
           "sel": true,
           "rev": false,
-          "mi": false
+          "mi": false,
+          "o1": false,
+          "o2": false,
+          "o3": false,
+          "si": 0,
+          "m12": 0
+        },
+        {
+          "stop": 0
+        },
+        {
+          "stop": 0
+        },
+        {
+          "stop": 0
+        },
+        {
+          "stop": 0
         },
         {
           "stop": 0
@@ -339,23 +555,25 @@
     "3": {
       "playlist": {
         "ps": [1, 2],
-        "dur": [30, 30],
+        "dur": [300, 300],
         "transition": [7, 7],
         "repeat": 0,
-        "r": false,
-        "end": 0
+        "end": 0,
+        "r": 0
       },
+      "on": true,
       "n": "Playlist 1"
     },
     "4": {
       "playlist": {
-        "ps": [1, 2],
-        "dur": [30, 30],
+        "ps": [2, 0],
+        "dur": [300, 300],
         "transition": [7, 7],
         "repeat": 0,
-        "r": false,
-        "end": 0
+        "end": 0,
+        "r": 0
       },
+      "on": true,
       "n": "Playlist 2"
     }
   }
diff --git a/tests/components/wled/snapshots/test_button.ambr b/tests/components/wled/snapshots/test_button.ambr
index 954350b0fb044..4e6260bc9bd58 100644
--- a/tests/components/wled/snapshots/test_button.ambr
+++ b/tests/components/wled/snapshots/test_button.ambr
@@ -59,7 +59,7 @@
     }),
     'disabled_by': None,
     'entry_type': None,
-    'hw_version': 'esp8266',
+    'hw_version': 'esp32',
     'id': <ANY>,
     'identifiers': set({
       tuple(
@@ -71,14 +71,14 @@
     'labels': set({
     }),
     'manufacturer': 'WLED',
-    'model': 'DIY light',
+    'model': 'FOSS',
     'model_id': None,
     'name': 'WLED RGB Light',
     'name_by_user': None,
     'primary_config_entry': <ANY>,
     'serial_number': None,
     'suggested_area': None,
-    'sw_version': '0.8.5',
+    'sw_version': '0.14.4',
     'via_device_id': None,
   })
 # ---
diff --git a/tests/components/wled/snapshots/test_diagnostics.ambr b/tests/components/wled/snapshots/test_diagnostics.ambr
index 643e5fe4ad02d..fea53e8ac03be 100644
--- a/tests/components/wled/snapshots/test_diagnostics.ambr
+++ b/tests/components/wled/snapshots/test_diagnostics.ambr
@@ -5,22 +5,109 @@
       '0': 'Solid',
       '1': 'Blink',
       '10': 'Scan',
-      '11': 'Dual Scan',
+      '100': 'Heartbeat',
+      '101': 'Pacifica',
+      '102': 'Candle Multi',
+      '103': 'Solid Glitter',
+      '104': 'Sunrise',
+      '105': 'Phased',
+      '106': 'Twinkleup',
+      '107': 'Noise Pal',
+      '108': 'Sine',
+      '109': 'Phased Noise',
+      '11': 'Scan Dual',
+      '110': 'Flow',
+      '111': 'Chunchun',
+      '112': 'Dancing Shadows',
+      '113': 'Washing Machine',
+      '114': 'RSVD',
+      '115': 'Blends',
+      '116': 'TV Simulator',
+      '117': 'Dynamic Smooth',
+      '118': 'Spaceships',
+      '119': 'Crazy Bees',
       '12': 'Fade',
-      '13': 'Chase',
-      '14': 'Chase Rainbow',
+      '120': 'Ghost Rider',
+      '121': 'Blobs',
+      '122': 'Scrolling Text',
+      '123': 'Drift Rose',
+      '124': 'Distortion Waves',
+      '125': 'Soap',
+      '126': 'Octopus',
+      '127': 'Waving Cell',
+      '128': 'Pixels',
+      '129': 'Pixelwave',
+      '13': 'Theater',
+      '130': 'Juggles',
+      '131': 'Matripix',
+      '132': 'Gravimeter',
+      '133': 'Plasmoid',
+      '134': 'Puddles',
+      '135': 'Midnoise',
+      '136': 'Noisemeter',
+      '137': 'Freqwave',
+      '138': 'Freqmatrix',
+      '139': 'GEQ',
+      '14': 'Theater Rainbow',
+      '140': 'Waterfall',
+      '141': 'Freqpixels',
+      '142': 'RSVD',
+      '143': 'Noisefire',
+      '144': 'Puddlepeak',
+      '145': 'Noisemove',
+      '146': 'Noise2D',
+      '147': 'Perlin Move',
+      '148': 'Ripple Peak',
+      '149': 'Firenoise',
       '15': 'Running',
+      '150': 'Squared Swirl',
+      '151': 'RSVD',
+      '152': 'DNA',
+      '153': 'Matrix',
+      '154': 'Metaballs',
+      '155': 'Freqmap',
+      '156': 'Gravcenter',
+      '157': 'Gravcentric',
+      '158': 'Gravfreq',
+      '159': 'DJ Light',
       '16': 'Saw',
+      '160': 'Funky Plank',
+      '161': 'RSVD',
+      '162': 'Pulser',
+      '163': 'Blurz',
+      '164': 'Drift',
+      '165': 'Waverly',
+      '166': 'Sun Radiation',
+      '167': 'Colored Bursts',
+      '168': 'Julia',
+      '169': 'RSVD',
       '17': 'Twinkle',
+      '170': 'RSVD',
+      '171': 'RSVD',
+      '172': 'Game Of Life',
+      '173': 'Tartan',
+      '174': 'Polar Lights',
+      '175': 'Swirl',
+      '176': 'Lissajous',
+      '177': 'Frizzles',
+      '178': 'Plasma Ball',
+      '179': 'Flow Stripe',
       '18': 'Dissolve',
+      '180': 'Hiphotic',
+      '181': 'Sindots',
+      '182': 'DNA Spiral',
+      '183': 'Black Hole',
+      '184': 'Wavesins',
+      '185': 'Rocktaves',
+      '186': 'Akemi',
       '19': 'Dissolve Rnd',
       '2': 'Breathe',
       '20': 'Sparkle',
-      '21': 'Dark Sparkle',
+      '21': 'Sparkle Dark',
       '22': 'Sparkle+',
       '23': 'Strobe',
       '24': 'Strobe Rainbow',
-      '25': 'Mega Strobe',
+      '25': 'Strobe Mega',
       '26': 'Blink Rainbow',
       '27': 'Android',
       '28': 'Chase',
@@ -33,33 +120,33 @@
       '34': 'Colorful',
       '35': 'Traffic Light',
       '36': 'Sweep Random',
-      '37': 'Running 2',
-      '38': 'Red & Blue',
+      '37': 'Chase 2',
+      '38': 'Aurora',
       '39': 'Stream',
       '4': 'Wipe Random',
       '40': 'Scanner',
       '41': 'Lighthouse',
       '42': 'Fireworks',
       '43': 'Rain',
-      '44': 'Merry Christmas',
+      '44': 'Tetrix',
       '45': 'Fire Flicker',
       '46': 'Gradient',
       '47': 'Loading',
-      '48': 'In Out',
-      '49': 'In In',
+      '48': 'Rolling Balls',
+      '49': 'Fairy',
       '5': 'Random Colors',
-      '50': 'Out Out',
-      '51': 'Out In',
-      '52': 'Circus',
-      '53': 'Halloween',
-      '54': 'Tri Chase',
+      '50': 'Two Dots',
+      '51': 'Fairytwinkle',
+      '52': 'Running Dual',
+      '53': 'RSVD',
+      '54': 'Chase 3',
       '55': 'Tri Wipe',
       '56': 'Tri Fade',
       '57': 'Lightning',
       '58': 'ICU',
       '59': 'Multi Comet',
       '6': 'Sweep',
-      '60': 'Dual Scanner',
+      '60': 'Scanner Dual',
       '61': 'Stream 2',
       '62': 'Oscillate',
       '63': 'Pride 2015',
@@ -67,55 +154,82 @@
       '65': 'Palette',
       '66': 'Fire 2012',
       '67': 'Colorwaves',
-      '68': 'BPM',
+      '68': 'Bpm',
       '69': 'Fill Noise',
       '7': 'Dynamic',
       '70': 'Noise 1',
       '71': 'Noise 2',
       '72': 'Noise 3',
       '73': 'Noise 4',
-      '74': 'Colortwinkle',
+      '74': 'Colortwinkles',
       '75': 'Lake',
       '76': 'Meteor',
-      '77': 'Smooth Meteor',
+      '77': 'Meteor Smooth',
       '78': 'Railway',
       '79': 'Ripple',
       '8': 'Colorloop',
       '80': 'Twinklefox',
+      '81': 'Twinklecat',
+      '82': 'Halloween Eyes',
+      '83': 'Solid Pattern',
+      '84': 'Solid Pattern Tri',
+      '85': 'Spots',
+      '86': 'Spots Fade',
+      '87': 'Glitter',
+      '88': 'Candle',
+      '89': 'Fireworks Starburst',
       '9': 'Rainbow',
+      '90': 'Fireworks 1D',
+      '91': 'Bouncing Balls',
+      '92': 'Sinelon',
+      '93': 'Sinelon Dual',
+      '94': 'Sinelon Rainbow',
+      '95': 'Popcorn',
+      '96': 'Drip',
+      '97': 'Plasma',
+      '98': 'Percent',
+      '99': 'Ripple Rainbow',
     }),
     'info': dict({
-      'architecture': 'esp8266',
-      'arduino_core_version': '2.4.2',
+      'arch': 'esp32',
       'brand': 'WLED',
-      'build_type': 'bin',
-      'effect_count': 81,
-      'filesystem': None,
-      'free_heap': 14600,
+      'core': 'v3.3.6-16-gcc5440f6a2',
+      'freeheap': 198384,
+      'fs': dict({
+        'pmt': 1718827787.0,
+        't': 983,
+        'u': 12,
+      }),
+      'fxcount': 187,
       'ip': '127.0.0.1',
       'leds': dict({
-        '__type': "<class 'wled.models.Leds'>",
-        'repr': 'Leds(cct=False, count=30, fps=None, light_capabilities=None, max_power=850, max_segments=10, power=470, rgbw=False, wv=True, segment_light_capabilities=None)',
+        'count': 30,
+        'fps': 5,
+        'light_capabilities': 1,
+        'max_power': 850,
+        'max_segments': 32,
+        'power': 515,
+        'segment_light_capabilities': list([
+          1,
+          1,
+        ]),
       }),
+      'lip': '',
       'live': False,
-      'live_ip': 'Unknown',
-      'live_mode': 'Unknown',
-      'mac_address': 'aabbccddeeff',
+      'lm': '',
+      'mac': 'aabbccddeeff',
       'name': 'WLED RGB Light',
-      'pallet_count': 50,
-      'product': 'DIY light',
-      'udp_port': 21324,
-      'uptime': 32,
-      'version': '0.8.5',
-      'version_id': 1909122,
-      'version_latest_beta': '0.13.0b1',
-      'version_latest_stable': '0.12.0',
-      'websocket': None,
+      'palcount': 71,
+      'product': 'FOSS',
+      'udpport': 21324,
+      'uptime': 966,
+      'ver': '0.14.4',
+      'vid': 2405180,
       'wifi': '**REDACTED**',
     }),
     'palettes': dict({
       '0': 'Default',
-      '1': 'Random Cycle',
+      '1': '* Random Cycle',
       '10': 'Forest',
       '11': 'Rainbow',
       '12': 'Rainbow Bands',
@@ -126,18 +240,18 @@
       '17': 'Yellowout',
       '18': 'Analogous',
       '19': 'Splash',
-      '2': 'Primary Color',
+      '2': '* Color 1',
       '20': 'Pastel',
       '21': 'Sunset 2',
-      '22': 'Beech',
+      '22': 'Beach',
       '23': 'Vintage',
       '24': 'Departure',
       '25': 'Landscape',
-      '26': 'Beach',
+      '26': 'Beech',
       '27': 'Sherbet',
       '28': 'Hult',
       '29': 'Hult 64',
-      '3': 'Based on Primary',
+      '3': '* Colors 1&2',
       '30': 'Drywet',
       '31': 'Jul',
       '32': 'Grintage',
@@ -148,7 +262,7 @@
       '37': 'Cyane',
       '38': 'Light Pink',
       '39': 'Autumn',
-      '4': 'Set Colors',
+      '4': '* Color Gradient',
       '40': 'Magenta',
       '41': 'Magred',
       '42': 'Yelmag',
@@ -159,9 +273,30 @@
       '47': 'Orangery',
       '48': 'C9',
       '49': 'Sakura',
-      '5': 'Based on Set',
+      '5': '* Colors Only',
+      '50': 'Aurora',
+      '51': 'Atlantica',
+      '52': 'C9 2',
+      '53': 'C9 New',
+      '54': 'Temperature',
+      '55': 'Aurora 2',
+      '56': 'Retro Clown',
+      '57': 'Candy',
+      '58': 'Toxy Reaf',
+      '59': 'Fairy Reaf',
       '6': 'Party',
+      '60': 'Semi Blue',
+      '61': 'Pink Candy',
+      '62': 'Red Reaf',
+      '63': 'Aqua Flash',
+      '64': 'Yelblu Hot',
+      '65': 'Lite Light',
+      '66': 'Red Flash',
+      '67': 'Blink Red',
+      '68': 'Red Shift',
+      '69': 'Red Tide',
       '7': 'Cloud',
+      '70': 'Candy2',
       '8': 'Lava',
       '9': 'Ocean',
     }),
@@ -170,30 +305,88 @@
     'presets': dict({
     }),
     'state': dict({
-      'brightness': 127,
+      'bri': 128,
       'lor': 0,
-      'nightlight': dict({
-        '__type': "<class 'wled.models.Nightlight'>",
-        'repr': 'Nightlight(duration=60, fade=True, on=False, mode=<NightlightMode.FADE: 1>, target_brightness=0)',
+      'nl': dict({
+        'dur': 60,
+        'mode': 1,
+        'on': False,
+        'tbri': 0,
       }),
       'on': True,
-      'playlist': -1,
-      'preset': -1,
-      'segments': list([
-        dict({
-          '__type': "<class 'wled.models.Segment'>",
-          'repr': "Segment(brightness=127, clones=-1, color_primary=(255, 159, 0), color_secondary=(0, 0, 0), color_tertiary=(0, 0, 0), effect=Effect(effect_id=0, name='Solid'), intensity=128, length=20, on=True, palette=Palette(name='Default', palette_id=0), reverse=False, segment_id=0, selected=True, speed=32, start=0, stop=19)",
+      'seg': dict({
+        '0': dict({
+          'bri': 255,
+          'cln': -1,
+          'col': list([
+            list([
+              127,
+              172,
+              255,
+            ]),
+            list([
+              0,
+              0,
+              0,
+            ]),
+            list([
+              0,
+              0,
+              0,
+            ]),
+          ]),
+          'fx': 0,
+          'id': 0,
+          'ix': 128,
+          'len': 15,
+          'on': True,
+          'pal': 0,
+          'rev': False,
+          'sel': False,
+          'start': 0,
+          'stop': 15,
+          'sx': 32,
         }),
-        dict({
-          '__type': "<class 'wled.models.Segment'>",
-          'repr': "Segment(brightness=127, clones=-1, color_primary=(0, 255, 123), color_secondary=(0, 0, 0), color_tertiary=(0, 0, 0), effect=Effect(effect_id=1, name='Blink'), intensity=64, length=10, on=True, palette=Palette(name='Random Cycle', palette_id=1), reverse=True, segment_id=1, selected=True, speed=16, start=20, stop=30)",
+        '1': dict({
+          'bri': 255,
+          'cln': -1,
+          'col': list([
+            list([
+              255,
+              170,
+              0,
+            ]),
+            list([
+              0,
+              0,
+              0,
+            ]),
+            list([
+              0,
+              0,
+              0,
+            ]),
+          ]),
+          'fx': 3,
+          'id': 1,
+          'ix': 64,
+          'len': 15,
+          'on': True,
+          'pal': 1,
+          'rev': True,
+          'sel': True,
+          'start': 15,
+          'stop': 30,
+          'sx': 16,
         }),
-      ]),
-      'sync': dict({
-        '__type': "<class 'wled.models.Sync'>",
-        'repr': 'Sync(receive=True, send=False)',
       }),
       'transition': 7,
+      'udpn': dict({
+        'recv': True,
+        'rgrp': 1,
+        'send': False,
+        'sgrp': 1,
+      }),
     }),
   })
 # ---
diff --git a/tests/components/wled/snapshots/test_number.ambr b/tests/components/wled/snapshots/test_number.ambr
index 6ed21dd3cbe3c..0fb6cff3d5185 100644
--- a/tests/components/wled/snapshots/test_number.ambr
+++ b/tests/components/wled/snapshots/test_number.ambr
@@ -67,7 +67,7 @@
     }),
     'disabled_by': None,
     'entry_type': None,
-    'hw_version': 'esp8266',
+    'hw_version': 'esp32',
     'id': <ANY>,
     'identifiers': set({
       tuple(
@@ -79,14 +79,14 @@
     'labels': set({
     }),
     'manufacturer': 'WLED',
-    'model': 'DIY light',
+    'model': 'FOSS',
     'model_id': None,
     'name': 'WLED RGB Light',
     'name_by_user': None,
     'primary_config_entry': <ANY>,
     'serial_number': None,
     'suggested_area': None,
-    'sw_version': '0.8.5',
+    'sw_version': '0.14.4',
     'via_device_id': None,
   })
 # ---
@@ -158,7 +158,7 @@
     }),
     'disabled_by': None,
     'entry_type': None,
-    'hw_version': 'esp8266',
+    'hw_version': 'esp32',
     'id': <ANY>,
     'identifiers': set({
       tuple(
@@ -170,183 +170,14 @@
     'labels': set({
     }),
     'manufacturer': 'WLED',
-    'model': 'DIY light',
+    'model': 'FOSS',
     'model_id': None,
     'name': 'WLED RGB Light',
     'name_by_user': None,
     'primary_config_entry': <ANY>,
     'serial_number': None,
     'suggested_area': None,
-    'sw_version': '0.8.5',
-    'via_device_id': None,
-  })
-# ---
-# name: test_speed_state[number.wled_rgb_light_segment_1_intensity-42-intensity]
-  StateSnapshot({
-    'attributes': ReadOnlyDict({
-      'friendly_name': 'WLED RGB Light Segment 1 Intensity',
-      'max': 255,
-      'min': 0,
-      'mode': <NumberMode.AUTO: 'auto'>,
-      'step': 1,
-    }),
-    'context': <ANY>,
-    'entity_id': 'number.wled_rgb_light_segment_1_intensity',
-    'last_changed': <ANY>,
-    'last_updated': <ANY>,
-    'state': '64',
-  })
-# ---
-# name: test_speed_state[number.wled_rgb_light_segment_1_intensity-42-intensity].1
-  EntityRegistryEntrySnapshot({
-    '_display_repr': <UndefinedType._singleton: 0>,
-    '_partial_repr': <UndefinedType._singleton: 0>,
-    'aliases': set({
-    }),
-    'area_id': None,
-    'capabilities': dict({
-      'max': 255,
-      'min': 0,
-      'mode': <NumberMode.AUTO: 'auto'>,
-      'step': 1,
-    }),
-    'config_entry_id': <ANY>,
-    'device_class': None,
-    'device_id': <ANY>,
-    'disabled_by': None,
-    'domain': 'number',
-    'entity_category': <EntityCategory.CONFIG: 'config'>,
-    'entity_id': 'number.wled_rgb_light_segment_1_intensity',
-    'has_entity_name': True,
-    'hidden_by': None,
-    'icon': None,
-    'id': <ANY>,
-    'name': None,
-    'options': dict({
-    }),
-    'original_device_class': None,
-    'original_icon': None,
-    'original_name': 'Segment 1 Intensity',
-    'platform': 'wled',
-    'supported_features': 0,
-    'translation_key': None,
-    'unique_id': 'aabbccddeeff_intensity_1',
-    'unit_of_measurement': None,
-  })
-# ---
-# name: test_speed_state[number.wled_rgb_light_segment_1_intensity-42-intensity].2
-  DeviceRegistryEntrySnapshot({
-    'area_id': None,
-    'config_entries': <ANY>,
-    'configuration_url': 'http://127.0.0.1',
-    'connections': set({
-      tuple(
-        'mac',
-        'aa:bb:cc:dd:ee:ff',
-      ),
-    }),
-    'disabled_by': None,
-    'entry_type': None,
-    'hw_version': 'esp8266',
-    'id': <ANY>,
-    'identifiers': set({
-      tuple(
-        'wled',
-        'aabbccddeeff',
-      ),
-    }),
-    'is_new': False,
-    'manufacturer': 'WLED',
-    'model': 'DIY light',
-    'name': 'WLED RGB Light',
-    'name_by_user': None,
-    'suggested_area': None,
-    'sw_version': '0.8.5',
-    'via_device_id': None,
-  })
-# ---
-# name: test_speed_state[number.wled_rgb_light_segment_1_speed-42-speed]
-  StateSnapshot({
-    'attributes': ReadOnlyDict({
-      'friendly_name': 'WLED RGB Light Segment 1 Speed',
-      'icon': 'mdi:speedometer',
-      'max': 255,
-      'min': 0,
-      'mode': <NumberMode.AUTO: 'auto'>,
-      'step': 1,
-    }),
-    'context': <ANY>,
-    'entity_id': 'number.wled_rgb_light_segment_1_speed',
-    'last_changed': <ANY>,
-    'last_updated': <ANY>,
-    'state': '16',
-  })
-# ---
-# name: test_speed_state[number.wled_rgb_light_segment_1_speed-42-speed].1
-  EntityRegistryEntrySnapshot({
-    '_display_repr': <UndefinedType._singleton: 0>,
-    '_partial_repr': <UndefinedType._singleton: 0>,
-    'aliases': set({
-    }),
-    'area_id': None,
-    'capabilities': dict({
-      'max': 255,
-      'min': 0,
-      'mode': <NumberMode.AUTO: 'auto'>,
-      'step': 1,
-    }),
-    'config_entry_id': <ANY>,
-    'device_class': None,
-    'device_id': <ANY>,
-    'disabled_by': None,
-    'domain': 'number',
-    'entity_category': <EntityCategory.CONFIG: 'config'>,
-    'entity_id': 'number.wled_rgb_light_segment_1_speed',
-    'has_entity_name': True,
-    'hidden_by': None,
-    'icon': None,
-    'id': <ANY>,
-    'name': None,
-    'options': dict({
-    }),
-    'original_device_class': None,
-    'original_icon': 'mdi:speedometer',
-    'original_name': 'Segment 1 Speed',
-    'platform': 'wled',
-    'supported_features': 0,
-    'translation_key': None,
-    'unique_id': 'aabbccddeeff_speed_1',
-    'unit_of_measurement': None,
-  })
-# ---
-# name: test_speed_state[number.wled_rgb_light_segment_1_speed-42-speed].2
-  DeviceRegistryEntrySnapshot({
-    'area_id': None,
-    'config_entries': <ANY>,
-    'configuration_url': 'http://127.0.0.1',
-    'connections': set({
-      tuple(
-        'mac',
-        'aa:bb:cc:dd:ee:ff',
-      ),
-    }),
-    'disabled_by': None,
-    'entry_type': None,
-    'hw_version': 'esp8266',
-    'id': <ANY>,
-    'identifiers': set({
-      tuple(
-        'wled',
-        'aabbccddeeff',
-      ),
-    }),
-    'is_new': False,
-    'manufacturer': 'WLED',
-    'model': 'DIY light',
-    'name': 'WLED RGB Light',
-    'name_by_user': None,
-    'suggested_area': None,
-    'sw_version': '0.8.5',
+    'sw_version': '0.14.4',
     'via_device_id': None,
   })
 # ---
diff --git a/tests/components/wled/snapshots/test_select.ambr b/tests/components/wled/snapshots/test_select.ambr
index f1a70db88cd7e..2998583f8b3a6 100644
--- a/tests/components/wled/snapshots/test_select.ambr
+++ b/tests/components/wled/snapshots/test_select.ambr
@@ -69,7 +69,7 @@
     }),
     'disabled_by': None,
     'entry_type': None,
-    'hw_version': 'esp8266',
+    'hw_version': 'esp32',
     'id': <ANY>,
     'identifiers': set({
       tuple(
@@ -81,14 +81,14 @@
     'labels': set({
     }),
     'manufacturer': 'WLED',
-    'model': 'DIY light',
+    'model': 'FOSS',
     'model_id': None,
     'name': 'WLED RGB Light',
     'name_by_user': None,
     'primary_config_entry': <ANY>,
     'serial_number': None,
     'suggested_area': None,
-    'sw_version': '0.8.5',
+    'sw_version': '0.14.4',
     'via_device_id': None,
   })
 # ---
@@ -97,56 +97,77 @@
     'attributes': ReadOnlyDict({
       'friendly_name': 'WLED RGB Light Segment 1 color palette',
       'options': list([
+        'Default',
+        '* Random Cycle',
+        '* Color 1',
+        '* Colors 1&2',
+        '* Color Gradient',
+        '* Colors Only',
+        'Party',
+        'Cloud',
+        'Lava',
+        'Ocean',
+        'Forest',
+        'Rainbow',
+        'Rainbow Bands',
+        'Sunset',
+        'Rivendell',
+        'Breeze',
+        'Red & Blue',
+        'Yellowout',
         'Analogous',
-        'April Night',
-        'Autumn',
-        'Based on Primary',
-        'Based on Set',
+        'Splash',
+        'Pastel',
+        'Sunset 2',
         'Beach',
-        'Beech',
-        'Breeze',
-        'C9',
-        'Cloud',
-        'Cyane',
-        'Default',
+        'Vintage',
         'Departure',
-        'Drywet',
-        'Fire',
-        'Forest',
-        'Grintage',
+        'Landscape',
+        'Beech',
+        'Sherbet',
         'Hult',
         'Hult 64',
-        'Icefire',
+        'Drywet',
         'Jul',
-        'Landscape',
-        'Lava',
+        'Grintage',
+        'Rewhi',
+        'Tertiary',
+        'Fire',
+        'Icefire',
+        'Cyane',
         'Light Pink',
+        'Autumn',
         'Magenta',
         'Magred',
-        'Ocean',
+        'Yelmag',
+        'Yelblu',
         'Orange & Teal',
+        'Tiamat',
+        'April Night',
         'Orangery',
-        'Party',
-        'Pastel',
-        'Primary Color',
-        'Rainbow',
-        'Rainbow Bands',
-        'Random Cycle',
-        'Red & Blue',
-        'Rewhi',
-        'Rivendell',
+        'C9',
         'Sakura',
-        'Set Colors',
-        'Sherbet',
-        'Splash',
-        'Sunset',
-        'Sunset 2',
-        'Tertiary',
-        'Tiamat',
-        'Vintage',
-        'Yelblu',
-        'Yellowout',
-        'Yelmag',
+        'Aurora',
+        'Atlantica',
+        'C9 2',
+        'C9 New',
+        'Temperature',
+        'Aurora 2',
+        'Retro Clown',
+        'Candy',
+        'Toxy Reaf',
+        'Fairy Reaf',
+        'Semi Blue',
+        'Pink Candy',
+        'Red Reaf',
+        'Aqua Flash',
+        'Yelblu Hot',
+        'Lite Light',
+        'Red Flash',
+        'Blink Red',
+        'Red Shift',
+        'Red Tide',
+        'Candy2',
       ]),
     }),
     'context': <ANY>,
@@ -154,7 +175,7 @@
     'last_changed': <ANY>,
     'last_reported': <ANY>,
     'last_updated': <ANY>,
-    'state': 'Random Cycle',
+    'state': '* Random Cycle',
   })
 # ---
 # name: test_color_palette_state[rgb-select.wled_rgb_light_segment_1_color_palette-Icefire-segment-called_with0].1
@@ -164,56 +185,77 @@
     'area_id': None,
     'capabilities': dict({
       'options': list([
+        'Default',
+        '* Random Cycle',
+        '* Color 1',
+        '* Colors 1&2',
+        '* Color Gradient',
+        '* Colors Only',
+        'Party',
+        'Cloud',
+        'Lava',
+        'Ocean',
+        'Forest',
+        'Rainbow',
+        'Rainbow Bands',
+        'Sunset',
+        'Rivendell',
+        'Breeze',
+        'Red & Blue',
+        'Yellowout',
         'Analogous',
-        'April Night',
-        'Autumn',
-        'Based on Primary',
-        'Based on Set',
+        'Splash',
+        'Pastel',
+        'Sunset 2',
         'Beach',
-        'Beech',
-        'Breeze',
-        'C9',
-        'Cloud',
-        'Cyane',
-        'Default',
+        'Vintage',
         'Departure',
-        'Drywet',
-        'Fire',
-        'Forest',
-        'Grintage',
+        'Landscape',
+        'Beech',
+        'Sherbet',
         'Hult',
         'Hult 64',
-        'Icefire',
+        'Drywet',
         'Jul',
-        'Landscape',
-        'Lava',
+        'Grintage',
+        'Rewhi',
+        'Tertiary',
+        'Fire',
+        'Icefire',
+        'Cyane',
         'Light Pink',
+        'Autumn',
         'Magenta',
         'Magred',
-        'Ocean',
+        'Yelmag',
+        'Yelblu',
         'Orange & Teal',
+        'Tiamat',
+        'April Night',
         'Orangery',
-        'Party',
-        'Pastel',
-        'Primary Color',
-        'Rainbow',
-        'Rainbow Bands',
-        'Random Cycle',
-        'Red & Blue',
-        'Rewhi',
-        'Rivendell',
+        'C9',
         'Sakura',
-        'Set Colors',
-        'Sherbet',
-        'Splash',
-        'Sunset',
-        'Sunset 2',
-        'Tertiary',
-        'Tiamat',
-        'Vintage',
-        'Yelblu',
-        'Yellowout',
-        'Yelmag',
+        'Aurora',
+        'Atlantica',
+        'C9 2',
+        'C9 New',
+        'Temperature',
+        'Aurora 2',
+        'Retro Clown',
+        'Candy',
+        'Toxy Reaf',
+        'Fairy Reaf',
+        'Semi Blue',
+        'Pink Candy',
+        'Red Reaf',
+        'Aqua Flash',
+        'Yelblu Hot',
+        'Lite Light',
+        'Red Flash',
+        'Blink Red',
+        'Red Shift',
+        'Red Tide',
+        'Candy2',
       ]),
     }),
     'config_entry_id': <ANY>,
@@ -256,7 +298,7 @@
     }),
     'disabled_by': None,
     'entry_type': None,
-    'hw_version': 'esp8266',
+    'hw_version': 'esp32',
     'id': <ANY>,
     'identifiers': set({
       tuple(
@@ -268,14 +310,14 @@
     'labels': set({
     }),
     'manufacturer': 'WLED',
-    'model': 'DIY light',
+    'model': 'FOSS',
     'model_id': None,
     'name': 'WLED RGB Light',
     'name_by_user': None,
     'primary_config_entry': <ANY>,
     'serial_number': None,
     'suggested_area': None,
-    'sw_version': '0.8.5',
+    'sw_version': '0.14.4',
     'via_device_id': None,
   })
 # ---
@@ -293,7 +335,7 @@
     'last_changed': <ANY>,
     'last_reported': <ANY>,
     'last_updated': <ANY>,
-    'state': 'Playlist 1',
+    'state': 'unknown',
   })
 # ---
 # name: test_color_palette_state[rgbw-select.wled_rgbw_light_playlist-Playlist 2-playlist-called_with2].1
@@ -330,7 +372,7 @@
     'previous_unique_id': None,
     'supported_features': 0,
     'translation_key': 'playlist',
-    'unique_id': 'aabbccddee11_playlist',
+    'unique_id': 'aabbccddeeff_playlist',
     'unit_of_measurement': None,
   })
 # ---
@@ -342,31 +384,31 @@
     'connections': set({
       tuple(
         'mac',
-        'aa:bb:cc:dd:ee:11',
+        'aa:bb:cc:dd:ee:ff',
       ),
     }),
     'disabled_by': None,
     'entry_type': None,
-    'hw_version': 'esp8266',
+    'hw_version': 'esp32',
     'id': <ANY>,
     'identifiers': set({
       tuple(
         'wled',
-        'aabbccddee11',
+        'aabbccddeeff',
       ),
     }),
     'is_new': False,
     'labels': set({
     }),
     'manufacturer': 'WLED',
-    'model': 'DIY light',
+    'model': 'FOSS',
     'model_id': None,
     'name': 'WLED RGBW Light',
     'name_by_user': None,
     'primary_config_entry': <ANY>,
     'serial_number': None,
     'suggested_area': None,
-    'sw_version': '0.8.6b4',
+    'sw_version': '0.99.0b1',
     'via_device_id': None,
   })
 # ---
@@ -384,7 +426,7 @@
     'last_changed': <ANY>,
     'last_reported': <ANY>,
     'last_updated': <ANY>,
-    'state': 'Preset 1',
+    'state': 'unknown',
   })
 # ---
 # name: test_color_palette_state[rgbw-select.wled_rgbw_light_preset-Preset 2-preset-called_with3].1
@@ -421,7 +463,7 @@
     'previous_unique_id': None,
     'supported_features': 0,
     'translation_key': 'preset',
-    'unique_id': 'aabbccddee11_preset',
+    'unique_id': 'aabbccddeeff_preset',
     'unit_of_measurement': None,
   })
 # ---
@@ -433,31 +475,31 @@
     'connections': set({
       tuple(
         'mac',
-        'aa:bb:cc:dd:ee:11',
+        'aa:bb:cc:dd:ee:ff',
       ),
     }),
     'disabled_by': None,
     'entry_type': None,
-    'hw_version': 'esp8266',
+    'hw_version': 'esp32',
     'id': <ANY>,
     'identifiers': set({
       tuple(
         'wled',
-        'aabbccddee11',
+        'aabbccddeeff',
       ),
     }),
     'is_new': False,
     'labels': set({
     }),
     'manufacturer': 'WLED',
-    'model': 'DIY light',
+    'model': 'FOSS',
     'model_id': None,
     'name': 'WLED RGBW Light',
     'name_by_user': None,
     'primary_config_entry': <ANY>,
     'serial_number': None,
     'suggested_area': None,
-    'sw_version': '0.8.6b4',
+    'sw_version': '0.99.0b1',
     'via_device_id': None,
   })
 # ---
diff --git a/tests/components/wled/snapshots/test_switch.ambr b/tests/components/wled/snapshots/test_switch.ambr
index fb604dcdaec90..ee3a72ba872b6 100644
--- a/tests/components/wled/snapshots/test_switch.ambr
+++ b/tests/components/wled/snapshots/test_switch.ambr
@@ -3,7 +3,6 @@
   StateSnapshot({
     'attributes': ReadOnlyDict({
       'duration': 60,
-      'fade': True,
       'friendly_name': 'WLED RGB Light Nightlight',
       'target_brightness': 0,
     }),
@@ -61,7 +60,7 @@
     }),
     'disabled_by': None,
     'entry_type': None,
-    'hw_version': 'esp8266',
+    'hw_version': 'esp32',
     'id': <ANY>,
     'identifiers': set({
       tuple(
@@ -73,14 +72,14 @@
     'labels': set({
     }),
     'manufacturer': 'WLED',
-    'model': 'DIY light',
+    'model': 'FOSS',
     'model_id': None,
     'name': 'WLED RGB Light',
     'name_by_user': None,
     'primary_config_entry': <ANY>,
     'serial_number': None,
     'suggested_area': None,
-    'sw_version': '0.8.5',
+    'sw_version': '0.14.4',
     'via_device_id': None,
   })
 # ---
@@ -143,7 +142,7 @@
     }),
     'disabled_by': None,
     'entry_type': None,
-    'hw_version': 'esp8266',
+    'hw_version': 'esp32',
     'id': <ANY>,
     'identifiers': set({
       tuple(
@@ -155,14 +154,14 @@
     'labels': set({
     }),
     'manufacturer': 'WLED',
-    'model': 'DIY light',
+    'model': 'FOSS',
     'model_id': None,
     'name': 'WLED RGB Light',
     'name_by_user': None,
     'primary_config_entry': <ANY>,
     'serial_number': None,
     'suggested_area': None,
-    'sw_version': '0.8.5',
+    'sw_version': '0.14.4',
     'via_device_id': None,
   })
 # ---
@@ -226,7 +225,7 @@
     }),
     'disabled_by': None,
     'entry_type': None,
-    'hw_version': 'esp8266',
+    'hw_version': 'esp32',
     'id': <ANY>,
     'identifiers': set({
       tuple(
@@ -238,14 +237,14 @@
     'labels': set({
     }),
     'manufacturer': 'WLED',
-    'model': 'DIY light',
+    'model': 'FOSS',
     'model_id': None,
     'name': 'WLED RGB Light',
     'name_by_user': None,
     'primary_config_entry': <ANY>,
     'serial_number': None,
     'suggested_area': None,
-    'sw_version': '0.8.5',
+    'sw_version': '0.14.4',
     'via_device_id': None,
   })
 # ---
@@ -309,7 +308,7 @@
     }),
     'disabled_by': None,
     'entry_type': None,
-    'hw_version': 'esp8266',
+    'hw_version': 'esp32',
     'id': <ANY>,
     'identifiers': set({
       tuple(
@@ -321,14 +320,14 @@
     'labels': set({
     }),
     'manufacturer': 'WLED',
-    'model': 'DIY light',
+    'model': 'FOSS',
     'model_id': None,
     'name': 'WLED RGB Light',
     'name_by_user': None,
     'primary_config_entry': <ANY>,
     'serial_number': None,
     'suggested_area': None,
-    'sw_version': '0.8.5',
+    'sw_version': '0.14.4',
     'via_device_id': None,
   })
 # ---
diff --git a/tests/components/wled/test_config_flow.py b/tests/components/wled/test_config_flow.py
index a1529eda1c789..a1cf515a24b8d 100644
--- a/tests/components/wled/test_config_flow.py
+++ b/tests/components/wled/test_config_flow.py
@@ -33,9 +33,7 @@ async def test_full_user_flow_implementation(hass: HomeAssistant) -> None:
 
     assert result.get("title") == "WLED RGB Light"
     assert result.get("type") is FlowResultType.CREATE_ENTRY
-    assert "data" in result
     assert result["data"][CONF_HOST] == "192.168.1.123"
-    assert "result" in result
     assert result["result"].unique_id == "aabbccddeeff"
 
 
@@ -167,23 +165,6 @@ async def test_user_device_exists_abort(
     assert result.get("reason") == "already_configured"
 
 
-async def test_user_with_cct_channel_abort(
-    hass: HomeAssistant,
-    mock_wled: MagicMock,
-) -> None:
-    """Test we abort user flow if WLED device uses a CCT channel."""
-    mock_wled.update.return_value.info.leds.cct = True
-
-    result = await hass.config_entries.flow.async_init(
-        DOMAIN,
-        context={"source": SOURCE_USER},
-        data={CONF_HOST: "192.168.1.123"},
-    )
-
-    assert result.get("type") is FlowResultType.ABORT
-    assert result.get("reason") == "cct_unsupported"
-
-
 @pytest.mark.usefixtures("mock_wled")
 async def test_zeroconf_without_mac_device_exists_abort(
     hass: HomeAssistant,
@@ -234,31 +215,6 @@ async def test_zeroconf_with_mac_device_exists_abort(
     assert result.get("reason") == "already_configured"
 
 
-async def test_zeroconf_with_cct_channel_abort(
-    hass: HomeAssistant,
-    mock_wled: MagicMock,
-) -> None:
-    """Test we abort zeroconf flow if WLED device uses a CCT channel."""
-    mock_wled.update.return_value.info.leds.cct = True
-
-    result = await hass.config_entries.flow.async_init(
-        DOMAIN,
-        context={"source": SOURCE_ZEROCONF},
-        data=zeroconf.ZeroconfServiceInfo(
-            ip_address=ip_address("192.168.1.123"),
-            ip_addresses=[ip_address("192.168.1.123")],
-            hostname="example.local.",
-            name="mock_name",
-            port=None,
-            properties={CONF_MAC: "aabbccddeeff"},
-            type="mock_type",
-        ),
-    )
-
-    assert result.get("type") is FlowResultType.ABORT
-    assert result.get("reason") == "cct_unsupported"
-
-
 async def test_options_flow(
     hass: HomeAssistant, mock_config_entry: MockConfigEntry
 ) -> None:
diff --git a/tests/components/wled/test_init.py b/tests/components/wled/test_init.py
index f6f1da0d41ed8..9dfcabd55e3f8 100644
--- a/tests/components/wled/test_init.py
+++ b/tests/components/wled/test_init.py
@@ -7,7 +7,6 @@
 import pytest
 from wled import WLEDConnectionError
 
-from homeassistant.components.wled.const import DOMAIN
 from homeassistant.config_entries import ConfigEntryState
 from homeassistant.core import HomeAssistant
 
@@ -44,7 +43,6 @@ async def connect(callback: Callable):
 
     # Ensure everything is cleaned up nicely and are disconnected
     assert mock_wled.disconnect.call_count == 1
-    assert not hass.data.get(DOMAIN)
 
 
 @patch(
@@ -69,21 +67,3 @@ async def test_setting_unique_id(
     """Test we set unique ID if not set yet."""
     assert init_integration.runtime_data
     assert init_integration.unique_id == "aabbccddeeff"
-
-
-async def test_error_config_entry_with_cct_channel(
-    hass: HomeAssistant,
-    mock_config_entry: MockConfigEntry,
-    mock_wled: AsyncMock,
-    caplog: pytest.LogCaptureFixture,
-) -> None:
-    """Test the WLED fails entry setup with a CCT channel."""
-    mock_wled.update.return_value.info.leds.cct = True
-
-    mock_config_entry.add_to_hass(hass)
-    await hass.config_entries.async_setup(mock_config_entry.entry_id)
-    await hass.async_block_till_done()
-
-    # Ensure config entry is errored and are connected and disconnected
-    assert mock_config_entry.state is ConfigEntryState.SETUP_ERROR
-    assert "has a CCT channel, which is not supported" in caplog.text
diff --git a/tests/components/wled/test_light.py b/tests/components/wled/test_light.py
index 2b64619e306d0..032035f01415c 100644
--- a/tests/components/wled/test_light.py
+++ b/tests/components/wled/test_light.py
@@ -1,6 +1,5 @@
 """Tests for the WLED light platform."""
 
-import json
 from unittest.mock import MagicMock
 
 from freezegun.api import FrozenDateTimeFactory
@@ -9,14 +8,21 @@
 
 from homeassistant.components.light import (
     ATTR_BRIGHTNESS,
+    ATTR_COLOR_MODE,
     ATTR_EFFECT,
     ATTR_HS_COLOR,
     ATTR_RGB_COLOR,
     ATTR_RGBW_COLOR,
+    ATTR_SUPPORTED_COLOR_MODES,
     ATTR_TRANSITION,
     DOMAIN as LIGHT_DOMAIN,
+    ColorMode,
+)
+from homeassistant.components.wled.const import (
+    CONF_KEEP_MAIN_LIGHT,
+    DOMAIN,
+    SCAN_INTERVAL,
 )
-from homeassistant.components.wled.const import CONF_KEEP_MAIN_LIGHT, SCAN_INTERVAL
 from homeassistant.const import (
     ATTR_ENTITY_ID,
     ATTR_ICON,
@@ -30,7 +36,11 @@
 from homeassistant.exceptions import HomeAssistantError
 from homeassistant.helpers import entity_registry as er
 
-from tests.common import MockConfigEntry, async_fire_time_changed, load_fixture
+from tests.common import (
+    MockConfigEntry,
+    async_fire_time_changed,
+    load_json_object_fixture,
+)
 
 pytestmark = pytest.mark.usefixtures("init_integration")
 
@@ -41,9 +51,9 @@ async def test_rgb_light_state(
     """Test the creation and values of the WLED lights."""
     # First segment of the strip
     assert (state := hass.states.get("light.wled_rgb_light"))
-    assert state.attributes.get(ATTR_BRIGHTNESS) == 127
+    assert state.attributes.get(ATTR_BRIGHTNESS) == 255
     assert state.attributes.get(ATTR_EFFECT) == "Solid"
-    assert state.attributes.get(ATTR_HS_COLOR) == (37.412, 100.0)
+    assert state.attributes.get(ATTR_HS_COLOR) == (218.906, 50.196)
     assert state.attributes.get(ATTR_ICON) is None
     assert state.state == STATE_ON
 
@@ -52,9 +62,9 @@ async def test_rgb_light_state(
 
     # Second segment of the strip
     assert (state := hass.states.get("light.wled_rgb_light_segment_1"))
-    assert state.attributes.get(ATTR_BRIGHTNESS) == 127
-    assert state.attributes.get(ATTR_EFFECT) == "Blink"
-    assert state.attributes.get(ATTR_HS_COLOR) == (148.941, 100.0)
+    assert state.attributes.get(ATTR_BRIGHTNESS) == 255
+    assert state.attributes.get(ATTR_EFFECT) == "Wipe"
+    assert state.attributes.get(ATTR_HS_COLOR) == (40.0, 100.0)
     assert state.attributes.get(ATTR_ICON) is None
     assert state.state == STATE_ON
 
@@ -63,7 +73,7 @@ async def test_rgb_light_state(
 
     # Test main control of the lightstrip
     assert (state := hass.states.get("light.wled_rgb_light_main"))
-    assert state.attributes.get(ATTR_BRIGHTNESS) == 127
+    assert state.attributes.get(ATTR_BRIGHTNESS) == 128
     assert state.state == STATE_ON
 
     assert (entry := entity_registry.async_get("light.wled_rgb_light_main"))
@@ -188,8 +198,8 @@ async def test_dynamically_handle_segments(
     assert not hass.states.get("light.wled_rgb_light_segment_1")
 
     return_value = mock_wled.update.return_value
-    mock_wled.update.return_value = WLEDDevice(
-        json.loads(load_fixture("wled/rgb.json"))
+    mock_wled.update.return_value = WLEDDevice.from_dict(
+        load_json_object_fixture("rgb.json", DOMAIN)
     )
 
     freezer.tick(SCAN_INTERVAL)
@@ -327,6 +337,8 @@ async def test_rgbw_light(hass: HomeAssistant, mock_wled: MagicMock) -> None:
     """Test RGBW support for WLED."""
     assert (state := hass.states.get("light.wled_rgbw_light"))
     assert state.state == STATE_ON
+    assert state.attributes.get(ATTR_SUPPORTED_COLOR_MODES) == [ColorMode.RGBW]
+    assert state.attributes.get(ATTR_COLOR_MODE) == ColorMode.RGBW
     assert state.attributes.get(ATTR_RGBW_COLOR) == (255, 0, 0, 139)
 
     await hass.services.async_call(
diff --git a/tests/components/wled/test_number.py b/tests/components/wled/test_number.py
index b692de37282aa..344eb03bc065f 100644
--- a/tests/components/wled/test_number.py
+++ b/tests/components/wled/test_number.py
@@ -1,6 +1,5 @@
 """Tests for the WLED number platform."""
 
-import json
 from unittest.mock import MagicMock
 
 from freezegun.api import FrozenDateTimeFactory
@@ -13,13 +12,13 @@
     DOMAIN as NUMBER_DOMAIN,
     SERVICE_SET_VALUE,
 )
-from homeassistant.components.wled.const import SCAN_INTERVAL
+from homeassistant.components.wled.const import DOMAIN, SCAN_INTERVAL
 from homeassistant.const import ATTR_ENTITY_ID, STATE_UNAVAILABLE
 from homeassistant.core import HomeAssistant
 from homeassistant.exceptions import HomeAssistantError
 from homeassistant.helpers import device_registry as dr, entity_registry as er
 
-from tests.common import async_fire_time_changed, load_fixture
+from tests.common import async_fire_time_changed, load_json_object_fixture
 
 pytestmark = pytest.mark.usefixtures("init_integration")
 
@@ -128,8 +127,8 @@ async def test_speed_dynamically_handle_segments(
 
     # Test adding a segment dynamically...
     return_value = mock_wled.update.return_value
-    mock_wled.update.return_value = WLEDDevice(
-        json.loads(load_fixture("wled/rgb.json"))
+    mock_wled.update.return_value = WLEDDevice.from_dict(
+        load_json_object_fixture("rgb.json", DOMAIN)
     )
 
     freezer.tick(SCAN_INTERVAL)
diff --git a/tests/components/wled/test_select.py b/tests/components/wled/test_select.py
index 380af1a286a9c..364e5fc2034db 100644
--- a/tests/components/wled/test_select.py
+++ b/tests/components/wled/test_select.py
@@ -1,6 +1,5 @@
 """Tests for the WLED select platform."""
 
-import json
 from unittest.mock import MagicMock
 
 from freezegun.api import FrozenDateTimeFactory
@@ -9,18 +8,13 @@
 from wled import Device as WLEDDevice, WLEDConnectionError, WLEDError
 
 from homeassistant.components.select import ATTR_OPTION, DOMAIN as SELECT_DOMAIN
-from homeassistant.components.wled.const import SCAN_INTERVAL
-from homeassistant.const import (
-    ATTR_ENTITY_ID,
-    SERVICE_SELECT_OPTION,
-    STATE_UNAVAILABLE,
-    STATE_UNKNOWN,
-)
+from homeassistant.components.wled.const import DOMAIN, SCAN_INTERVAL
+from homeassistant.const import ATTR_ENTITY_ID, SERVICE_SELECT_OPTION, STATE_UNAVAILABLE
 from homeassistant.core import HomeAssistant
 from homeassistant.exceptions import HomeAssistantError
 from homeassistant.helpers import device_registry as dr, entity_registry as er
 
-from tests.common import async_fire_time_changed, load_fixture
+from tests.common import async_fire_time_changed, load_json_object_fixture
 
 pytestmark = pytest.mark.usefixtures("init_integration")
 
@@ -135,8 +129,8 @@ async def test_color_palette_dynamically_handle_segments(
     assert not hass.states.get("select.wled_rgb_light_segment_1_color_palette")
 
     return_value = mock_wled.update.return_value
-    mock_wled.update.return_value = WLEDDevice(
-        json.loads(load_fixture("wled/rgb.json"))
+    mock_wled.update.return_value = WLEDDevice.from_dict(
+        load_json_object_fixture("rgb.json", DOMAIN)
     )
 
     freezer.tick(SCAN_INTERVAL)
@@ -148,7 +142,7 @@ async def test_color_palette_dynamically_handle_segments(
     assert (
         segment1 := hass.states.get("select.wled_rgb_light_segment_1_color_palette")
     )
-    assert segment1.state == "Random Cycle"
+    assert segment1.state == "* Random Cycle"
 
     # Test adding if segment shows up again, including the master entity
     mock_wled.update.return_value = return_value
@@ -174,39 +168,3 @@ async def test_playlist_unavailable_without_playlists(hass: HomeAssistant) -> No
     """Test WLED playlist entity is unavailable when playlists are not available."""
     assert (state := hass.states.get("select.wled_rgb_light_playlist"))
     assert state.state == STATE_UNAVAILABLE
-
-
-@pytest.mark.parametrize("device_fixture", ["rgbw"])
-async def test_old_style_preset_active(
-    hass: HomeAssistant,
-    freezer: FrozenDateTimeFactory,
-    mock_wled: MagicMock,
-) -> None:
-    """Test unknown preset returned (when old style/unknown) preset is active."""
-    # Set device preset state to a random number
-    mock_wled.update.return_value.state.preset = 99
-
-    freezer.tick(SCAN_INTERVAL)
-    async_fire_time_changed(hass)
-    await hass.async_block_till_done()
-
-    assert (state := hass.states.get("select.wled_rgbw_light_preset"))
-    assert state.state == STATE_UNKNOWN
-
-
-@pytest.mark.parametrize("device_fixture", ["rgbw"])
-async def test_old_style_playlist_active(
-    hass: HomeAssistant,
-    freezer: FrozenDateTimeFactory,
-    mock_wled: MagicMock,
-) -> None:
-    """Test when old style playlist cycle is active."""
-    # Set device playlist to 0, which meant "cycle" previously.
-    mock_wled.update.return_value.state.playlist = 0
-
-    freezer.tick(SCAN_INTERVAL)
-    async_fire_time_changed(hass)
-    await hass.async_block_till_done()
-
-    assert (state := hass.states.get("select.wled_rgbw_light_playlist"))
-    assert state.state == STATE_UNKNOWN
diff --git a/tests/components/wled/test_sensor.py b/tests/components/wled/test_sensor.py
index 319622e7cb30d..8bd5431cf592f 100644
--- a/tests/components/wled/test_sensor.py
+++ b/tests/components/wled/test_sensor.py
@@ -44,7 +44,7 @@ async def test_sensors(
         == UnitOfElectricCurrent.MILLIAMPERE
     )
     assert state.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.CURRENT
-    assert state.state == "470"
+    assert state.state == "515"
 
     assert (
         entry := entity_registry.async_get("sensor.wled_rgb_light_estimated_current")
@@ -55,7 +55,7 @@ async def test_sensors(
     assert (state := hass.states.get("sensor.wled_rgb_light_uptime"))
     assert state.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.TIMESTAMP
     assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) is None
-    assert state.state == "2019-11-11T09:10:00+00:00"
+    assert state.state == "2019-11-11T08:54:26+00:00"
 
     assert (entry := entity_registry.async_get("sensor.wled_rgb_light_uptime"))
     assert entry.unique_id == "aabbccddeeff_uptime"
@@ -64,7 +64,7 @@ async def test_sensors(
     assert (state := hass.states.get("sensor.wled_rgb_light_free_memory"))
     assert state.attributes.get(ATTR_ICON) is None
     assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == UnitOfInformation.BYTES
-    assert state.state == "14600"
+    assert state.state == "198384"
     assert entry.entity_category is EntityCategory.DIAGNOSTIC
 
     assert (entry := entity_registry.async_get("sensor.wled_rgb_light_free_memory"))
@@ -74,7 +74,7 @@ async def test_sensors(
     assert (state := hass.states.get("sensor.wled_rgb_light_wi_fi_signal"))
     assert state.attributes.get(ATTR_ICON) is None
     assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == PERCENTAGE
-    assert state.state == "76"
+    assert state.state == "100"
     assert entry.entity_category is EntityCategory.DIAGNOSTIC
 
     assert (entry := entity_registry.async_get("sensor.wled_rgb_light_wi_fi_signal"))
@@ -87,7 +87,7 @@ async def test_sensors(
         state.attributes.get(ATTR_UNIT_OF_MEASUREMENT)
         == SIGNAL_STRENGTH_DECIBELS_MILLIWATT
     )
-    assert state.state == "-62"
+    assert state.state == "-43"
 
     assert (entry := entity_registry.async_get("sensor.wled_rgb_light_wi_fi_rssi"))
     assert entry.unique_id == "aabbccddeeff_wifi_rssi"
diff --git a/tests/components/wled/test_switch.py b/tests/components/wled/test_switch.py
index 6dfd62e363f0b..48331ffa9cc06 100644
--- a/tests/components/wled/test_switch.py
+++ b/tests/components/wled/test_switch.py
@@ -1,6 +1,5 @@
 """Tests for the WLED switch platform."""
 
-import json
 from unittest.mock import MagicMock
 
 from freezegun.api import FrozenDateTimeFactory
@@ -9,7 +8,7 @@
 from wled import Device as WLEDDevice, WLEDConnectionError, WLEDError
 
 from homeassistant.components.switch import DOMAIN as SWITCH_DOMAIN
-from homeassistant.components.wled.const import SCAN_INTERVAL
+from homeassistant.components.wled.const import DOMAIN, SCAN_INTERVAL
 from homeassistant.const import (
     ATTR_ENTITY_ID,
     SERVICE_TURN_OFF,
@@ -22,7 +21,7 @@
 from homeassistant.exceptions import HomeAssistantError
 from homeassistant.helpers import device_registry as dr, entity_registry as er
 
-from tests.common import async_fire_time_changed, load_fixture
+from tests.common import async_fire_time_changed, load_json_object_fixture
 
 pytestmark = pytest.mark.usefixtures("init_integration")
 
@@ -144,8 +143,8 @@ async def test_switch_dynamically_handle_segments(
 
     # Test adding a segment dynamically...
     return_value = mock_wled.update.return_value
-    mock_wled.update.return_value = WLEDDevice(
-        json.loads(load_fixture("wled/rgb.json"))
+    mock_wled.update.return_value = WLEDDevice.from_dict(
+        load_json_object_fixture("rgb.json", DOMAIN)
     )
 
     freezer.tick(SCAN_INTERVAL)
diff --git a/tests/components/wled/test_update.py b/tests/components/wled/test_update.py
index c576cdf16f98e..a27aa918385ee 100644
--- a/tests/components/wled/test_update.py
+++ b/tests/components/wled/test_update.py
@@ -2,8 +2,9 @@
 
 from unittest.mock import MagicMock
 
+from freezegun.api import FrozenDateTimeFactory
 import pytest
-from wled import WLEDError
+from wled import Releases, WLEDError
 
 from homeassistant.components.update import (
     ATTR_INSTALLED_VERSION,
@@ -16,6 +17,7 @@
     UpdateDeviceClass,
     UpdateEntityFeature,
 )
+from homeassistant.components.wled.const import RELEASES_SCAN_INTERVAL
 from homeassistant.const import (
     ATTR_DEVICE_CLASS,
     ATTR_ENTITY_ID,
@@ -31,6 +33,8 @@
 from homeassistant.core import HomeAssistant
 from homeassistant.helpers import entity_registry as er
 
+from tests.common import async_fire_time_changed
+
 pytestmark = pytest.mark.usefixtures("init_integration")
 
 
@@ -45,12 +49,12 @@ async def test_update_available(
         state.attributes[ATTR_ENTITY_PICTURE]
         == "https://brands.home-assistant.io/_/wled/icon.png"
     )
-    assert state.attributes[ATTR_INSTALLED_VERSION] == "0.8.5"
-    assert state.attributes[ATTR_LATEST_VERSION] == "0.12.0"
+    assert state.attributes[ATTR_INSTALLED_VERSION] == "0.14.4"
+    assert state.attributes[ATTR_LATEST_VERSION] == "0.99.0"
     assert state.attributes[ATTR_RELEASE_SUMMARY] is None
     assert (
         state.attributes[ATTR_RELEASE_URL]
-        == "https://github.com/Aircoookie/WLED/releases/tag/v0.12.0"
+        == "https://github.com/Aircoookie/WLED/releases/tag/v0.99.0"
     )
     assert (
         state.attributes[ATTR_SUPPORTED_FEATURES]
@@ -64,15 +68,26 @@ async def test_update_available(
     assert entry.entity_category is EntityCategory.CONFIG
 
 
-@pytest.mark.parametrize("device_fixture", ["rgb_no_update"])
 async def test_update_information_available(
-    hass: HomeAssistant, entity_registry: er.EntityRegistry
+    hass: HomeAssistant,
+    freezer: FrozenDateTimeFactory,
+    entity_registry: er.EntityRegistry,
+    mock_wled_releases: MagicMock,
 ) -> None:
     """Test having no update information available at all."""
+    mock_wled_releases.releases.return_value = Releases(
+        beta=None,
+        stable=None,
+    )
+
+    freezer.tick(RELEASES_SCAN_INTERVAL)
+    async_fire_time_changed(hass)
+    await hass.async_block_till_done()
+
     assert (state := hass.states.get("update.wled_rgb_light_firmware"))
     assert state.attributes.get(ATTR_DEVICE_CLASS) == UpdateDeviceClass.FIRMWARE
     assert state.state == STATE_UNKNOWN
-    assert state.attributes[ATTR_INSTALLED_VERSION] is None
+    assert state.attributes[ATTR_INSTALLED_VERSION] == "0.14.4"
     assert state.attributes[ATTR_LATEST_VERSION] is None
     assert state.attributes[ATTR_RELEASE_SUMMARY] is None
     assert state.attributes[ATTR_RELEASE_URL] is None
@@ -98,12 +113,12 @@ async def test_no_update_available(
     assert (state := hass.states.get("update.wled_websocket_firmware"))
     assert state.state == STATE_OFF
     assert state.attributes.get(ATTR_DEVICE_CLASS) == UpdateDeviceClass.FIRMWARE
-    assert state.attributes[ATTR_INSTALLED_VERSION] == "0.12.0-b2"
-    assert state.attributes[ATTR_LATEST_VERSION] == "0.12.0-b2"
+    assert state.attributes[ATTR_INSTALLED_VERSION] == "0.99.0"
+    assert state.attributes[ATTR_LATEST_VERSION] == "0.99.0"
     assert state.attributes[ATTR_RELEASE_SUMMARY] is None
     assert (
         state.attributes[ATTR_RELEASE_URL]
-        == "https://github.com/Aircoookie/WLED/releases/tag/v0.12.0-b2"
+        == "https://github.com/Aircoookie/WLED/releases/tag/v0.99.0"
     )
     assert (
         state.attributes[ATTR_SUPPORTED_FEATURES]
@@ -151,8 +166,8 @@ async def test_update_stay_stable(
     """
     assert (state := hass.states.get("update.wled_rgb_light_firmware"))
     assert state.state == STATE_ON
-    assert state.attributes[ATTR_INSTALLED_VERSION] == "0.8.5"
-    assert state.attributes[ATTR_LATEST_VERSION] == "0.12.0"
+    assert state.attributes[ATTR_INSTALLED_VERSION] == "0.14.4"
+    assert state.attributes[ATTR_LATEST_VERSION] == "0.99.0"
 
     await hass.services.async_call(
         UPDATE_DOMAIN,
@@ -161,7 +176,7 @@ async def test_update_stay_stable(
         blocking=True,
     )
     assert mock_wled.upgrade.call_count == 1
-    mock_wled.upgrade.assert_called_with(version="0.12.0")
+    mock_wled.upgrade.assert_called_with(version="0.99.0")
 
 
 @pytest.mark.parametrize("device_fixture", ["rgbw"])
@@ -177,8 +192,8 @@ async def test_update_beta_to_stable(
     """
     assert (state := hass.states.get("update.wled_rgbw_light_firmware"))
     assert state.state == STATE_ON
-    assert state.attributes[ATTR_INSTALLED_VERSION] == "0.8.6b4"
-    assert state.attributes[ATTR_LATEST_VERSION] == "0.8.6"
+    assert state.attributes[ATTR_INSTALLED_VERSION] == "0.99.0b1"
+    assert state.attributes[ATTR_LATEST_VERSION] == "0.99.0"
 
     await hass.services.async_call(
         UPDATE_DOMAIN,
@@ -187,7 +202,7 @@ async def test_update_beta_to_stable(
         blocking=True,
     )
     assert mock_wled.upgrade.call_count == 1
-    mock_wled.upgrade.assert_called_with(version="0.8.6")
+    mock_wled.upgrade.assert_called_with(version="0.99.0")
 
 
 @pytest.mark.parametrize("device_fixture", ["rgb_single_segment"])
@@ -202,8 +217,8 @@ async def test_update_stay_beta(
     """
     assert (state := hass.states.get("update.wled_rgb_light_firmware"))
     assert state.state == STATE_ON
-    assert state.attributes[ATTR_INSTALLED_VERSION] == "0.8.6b1"
-    assert state.attributes[ATTR_LATEST_VERSION] == "0.8.6b2"
+    assert state.attributes[ATTR_INSTALLED_VERSION] == "1.0.0b4"
+    assert state.attributes[ATTR_LATEST_VERSION] == "1.0.0b5"
 
     await hass.services.async_call(
         UPDATE_DOMAIN,
@@ -212,4 +227,4 @@ async def test_update_stay_beta(
         blocking=True,
     )
     assert mock_wled.upgrade.call_count == 1
-    mock_wled.upgrade.assert_called_with(version="0.8.6b2")
+    mock_wled.upgrade.assert_called_with(version="1.0.0b5")


Code review comments:
diff_hunk: @@ -101,17 +109,40 @@ async def close_websocket(_: Event) -> None:
     async def _async_update_data(self) -> WLEDDevice:
         """Fetch data from WLED."""
         try:
-            device = await self.wled.update(full_update=not self.last_update_success)
+            device = await self.wled.update()
         except WLEDError as error:
             raise UpdateFailed(f"Invalid response from API: {error}") from error
 
         # If the device supports a WebSocket, try activating it.
         if (
             device.info.websocket is not None
-            and device.info.leds.cct is not True
             and not self.wled.connected
             and not self.unsub
         ):
             self._use_websocket()
 
         return device
+
+
+class WLEDReleasesDataUpdateCoordinator(DataUpdateCoordinator[Releases]):
+    """Class to manage fetching WLED releases."""
+
+    def __init__(
+        self,
+        hass: HomeAssistant,
+    ) -> None:
path: homeassistant/components/wled/coordinator.py
text: @user1:
```suggestion
    def __init__(self, hass: HomeAssistant) -> None:
```

diff_hunk: @@ -36,11 +36,33 @@ class WLEDUpdateEntity(WLEDEntity, UpdateEntity):
     )
     _attr_title = "WLED"
 
-    def __init__(self, coordinator: WLEDDataUpdateCoordinator) -> None:
+    def __init__(
+        self,
+        coordinator: WLEDDataUpdateCoordinator,
+        releases_coordinator: WLEDReleasesDataUpdateCoordinator,
+    ) -> None:
         """Initialize the update entity."""
         super().__init__(coordinator=coordinator)
+        self.releases_coordinator = releases_coordinator
         self._attr_unique_id = coordinator.data.info.mac_address
 
+    async def async_added_to_hass(self) -> None:
+        """When entity is added to hass.
+
+        Register extra update listener for the releases coordinator.
+        """
+        await super().async_added_to_hass()
+        self.async_on_remove(
+            self.releases_coordinator.async_add_listener(
+                self._handle_coordinator_update
+            )
+        )
+
+    @property
+    def available(self) -> bool:
+        """Return if entity is available."""
+        return bool(super().available and self.releases_coordinator.last_update_success)
path: homeassistant/components/wled/update.py
text: @user1:
why the extra `bool`?

@author:
Welcome to `mypy` 😬 

But in this rare case, it is indeed not needed 😄 Will remove it

@author:
[d820a51](https://github.com/home-assistant/core/pull/122101/commits/d820a517ee8a3187a7b2fc2ec0337b05bb960ceb)