Bump aioesphomeapi to 31.0.0 (#144778)

* aioesphomeapi update

* Bump aioesphomeapi to 31.0.0

There are some breaking changes with the protobuf naming and types
required some refactoring

changelog: https://github.com/esphome/aioesphomeapi/compare/v30.2.0...v31.0.0

* actually include the commit to bump the lib
This commit is contained in:
J. Nick Koston 2025-05-13 19:39:53 -05:00 committed by GitHub
parent 6d809b0b5a
commit c76239806d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
9 changed files with 91 additions and 123 deletions

View File

@ -63,7 +63,7 @@ class EsphomeFan(EsphomeEntity[FanInfo, FanState], FanEntity):
if self._supports_speed_levels:
data["speed_level"] = math.ceil(
percentage_to_ranged_value(
(1, self._static_info.supported_speed_levels), percentage
(1, self._static_info.supported_speed_count), percentage
)
)
else:
@ -121,7 +121,7 @@ class EsphomeFan(EsphomeEntity[FanInfo, FanState], FanEntity):
)
return ranged_value_to_percentage(
(1, self._static_info.supported_speed_levels), self._state.speed_level
(1, self._static_info.supported_speed_count), self._state.speed_level
)
@property
@ -164,7 +164,7 @@ class EsphomeFan(EsphomeEntity[FanInfo, FanState], FanEntity):
if not supports_speed_levels:
self._attr_speed_count = len(ORDERED_NAMED_FAN_SPEEDS)
else:
self._attr_speed_count = static_info.supported_speed_levels
self._attr_speed_count = static_info.supported_speed_count
async_setup_entry = partial(

View File

@ -8,6 +8,7 @@ from typing import TYPE_CHECKING, Any, cast
from aioesphomeapi import (
APIVersion,
ColorMode as ESPHomeColorMode,
EntityInfo,
LightColorCapability,
LightInfo,
@ -106,15 +107,15 @@ def _mired_to_kelvin(mired_temperature: float) -> int:
@lru_cache
def _color_mode_to_ha(mode: int) -> str:
def _color_mode_to_ha(mode: ESPHomeColorMode) -> ColorMode:
"""Convert an esphome color mode to a HA color mode constant.
Choose the color mode that best matches the feature-set.
"""
candidates = []
candidates: list[tuple[ColorMode, LightColorCapability]] = []
for ha_mode, cap_lists in _COLOR_MODE_MAPPING.items():
for caps in cap_lists:
if caps == mode:
if caps.value == mode:
# exact match
return ha_mode
if (mode & caps) == caps:
@ -131,8 +132,8 @@ def _color_mode_to_ha(mode: int) -> str:
@lru_cache
def _filter_color_modes(
supported: list[int], features: LightColorCapability
) -> tuple[int, ...]:
supported: list[ESPHomeColorMode], features: LightColorCapability
) -> tuple[ESPHomeColorMode, ...]:
"""Filter the given supported color modes.
Excluding all values that don't have the requested features.
@ -156,7 +157,7 @@ def _least_complex_color_mode(color_modes: tuple[int, ...]) -> int:
class EsphomeLight(EsphomeEntity[LightInfo, LightState], LightEntity):
"""A light implementation for ESPHome."""
_native_supported_color_modes: tuple[int, ...]
_native_supported_color_modes: tuple[ESPHomeColorMode, ...]
_supports_color_mode = False
@property

View File

@ -17,7 +17,7 @@
"mqtt": ["esphome/discover/#"],
"quality_scale": "platinum",
"requirements": [
"aioesphomeapi==30.2.0",
"aioesphomeapi==31.0.0",
"esphome-dashboard-api==1.3.0",
"bleak-esphome==2.15.1"
],

View File

@ -88,9 +88,9 @@ class EsphomeSensor(EsphomeEntity[SensorInfo, SensorState], SensorEntity):
return
if (
state_class == EsphomeSensorStateClass.MEASUREMENT
and static_info.last_reset_type == LastResetType.AUTO
and static_info.legacy_last_reset_type == LastResetType.AUTO
):
# Legacy, last_reset_type auto was the equivalent to the
# Legacy, legacy_last_reset_type auto was the equivalent to the
# TOTAL_INCREASING state class
self._attr_state_class = SensorStateClass.TOTAL_INCREASING
else:

2
requirements_all.txt generated
View File

@ -241,7 +241,7 @@ aioelectricitymaps==0.4.0
aioemonitor==1.0.5
# homeassistant.components.esphome
aioesphomeapi==30.2.0
aioesphomeapi==31.0.0
# homeassistant.components.flo
aioflo==2021.11.0

View File

@ -229,7 +229,7 @@ aioelectricitymaps==0.4.0
aioemonitor==1.0.5
# homeassistant.components.esphome
aioesphomeapi==30.2.0
aioesphomeapi==31.0.0
# homeassistant.components.flo
aioflo==2021.11.0

View File

@ -148,7 +148,7 @@ async def test_fan_entity_with_all_features_new_api(
key=1,
name="my fan",
unique_id="my_fan",
supported_speed_levels=4,
supported_speed_count=4,
supports_direction=True,
supports_speed=True,
supports_oscillation=True,

View File

@ -5,6 +5,7 @@ from unittest.mock import call
from aioesphomeapi import (
APIClient,
APIVersion,
ColorMode as ESPColorMode,
LightColorCapability,
LightInfo,
LightState,
@ -58,7 +59,7 @@ async def test_light_on_off(
unique_id="my_light",
min_mireds=153,
max_mireds=400,
supported_color_modes=[LightColorCapability.ON_OFF],
supported_color_modes=[ESPColorMode.ON_OFF],
)
]
states = [LightState(key=1, state=True)]
@ -218,12 +219,14 @@ async def test_light_brightness_on_off(
unique_id="my_light",
min_mireds=153,
max_mireds=400,
supported_color_modes=[
LightColorCapability.ON_OFF | LightColorCapability.BRIGHTNESS
],
supported_color_modes=[ESPColorMode.ON_OFF, ESPColorMode.BRIGHTNESS],
)
]
states = [
LightState(
key=1, state=True, brightness=100, color_mode=ESPColorMode.BRIGHTNESS
)
]
states = [LightState(key=1, state=True, brightness=100)]
user_service = []
await mock_generic_device_entry(
mock_client=mock_client,
@ -234,6 +237,10 @@ async def test_light_brightness_on_off(
state = hass.states.get("light.test_mylight")
assert state is not None
assert state.state == STATE_ON
assert state.attributes[ATTR_SUPPORTED_COLOR_MODES] == [
ColorMode.BRIGHTNESS,
]
assert state.attributes[ATTR_COLOR_MODE] == ColorMode.BRIGHTNESS
await hass.services.async_call(
LIGHT_DOMAIN,
@ -246,8 +253,7 @@ async def test_light_brightness_on_off(
call(
key=1,
state=True,
color_mode=LightColorCapability.ON_OFF
| LightColorCapability.BRIGHTNESS,
color_mode=ESPColorMode.BRIGHTNESS.value,
)
]
)
@ -264,8 +270,7 @@ async def test_light_brightness_on_off(
call(
key=1,
state=True,
color_mode=LightColorCapability.ON_OFF
| LightColorCapability.BRIGHTNESS,
color_mode=ESPColorMode.BRIGHTNESS.value,
brightness=pytest.approx(0.4980392156862745),
)
]
@ -407,13 +412,18 @@ async def test_light_brightness_on_off_with_unknown_color_mode(
min_mireds=153,
max_mireds=400,
supported_color_modes=[
LightColorCapability.ON_OFF
| LightColorCapability.BRIGHTNESS
| LIGHT_COLOR_CAPABILITY_UNKNOWN
ESPColorMode.ON_OFF,
ESPColorMode.BRIGHTNESS,
LIGHT_COLOR_CAPABILITY_UNKNOWN,
],
)
]
states = [LightState(key=1, state=True, brightness=100)]
entity_info[0].supported_color_modes.append(LIGHT_COLOR_CAPABILITY_UNKNOWN)
states = [
LightState(
key=1, state=True, brightness=100, color_mode=LIGHT_COLOR_CAPABILITY_UNKNOWN
)
]
user_service = []
await mock_generic_device_entry(
mock_client=mock_client,
@ -436,9 +446,7 @@ async def test_light_brightness_on_off_with_unknown_color_mode(
call(
key=1,
state=True,
color_mode=LightColorCapability.ON_OFF
| LightColorCapability.BRIGHTNESS
| LIGHT_COLOR_CAPABILITY_UNKNOWN,
color_mode=LIGHT_COLOR_CAPABILITY_UNKNOWN,
)
]
)
@ -455,9 +463,7 @@ async def test_light_brightness_on_off_with_unknown_color_mode(
call(
key=1,
state=True,
color_mode=LightColorCapability.ON_OFF
| LightColorCapability.BRIGHTNESS
| LIGHT_COLOR_CAPABILITY_UNKNOWN,
color_mode=ESPColorMode.BRIGHTNESS,
brightness=pytest.approx(0.4980392156862745),
)
]
@ -517,13 +523,10 @@ async def test_rgb_color_temp_light(
) -> None:
"""Test a generic light that supports color temp and RGB."""
color_modes = [
LightColorCapability.ON_OFF | LightColorCapability.BRIGHTNESS,
LightColorCapability.ON_OFF
| LightColorCapability.BRIGHTNESS
| LightColorCapability.COLOR_TEMPERATURE,
LightColorCapability.ON_OFF
| LightColorCapability.BRIGHTNESS
| LightColorCapability.RGB,
ESPColorMode.ON_OFF,
ESPColorMode.BRIGHTNESS,
ESPColorMode.COLOR_TEMPERATURE,
ESPColorMode.RGB,
]
mock_client.api_version = APIVersion(1, 7)
@ -538,7 +541,11 @@ async def test_rgb_color_temp_light(
supported_color_modes=color_modes,
)
]
states = [LightState(key=1, state=True, brightness=100)]
states = [
LightState(
key=1, state=True, brightness=100, color_mode=ESPColorMode.BRIGHTNESS
)
]
user_service = []
await mock_generic_device_entry(
mock_client=mock_client,
@ -561,8 +568,7 @@ async def test_rgb_color_temp_light(
call(
key=1,
state=True,
color_mode=LightColorCapability.ON_OFF
| LightColorCapability.BRIGHTNESS,
color_mode=ESPColorMode.BRIGHTNESS,
)
]
)
@ -579,8 +585,7 @@ async def test_rgb_color_temp_light(
call(
key=1,
state=True,
color_mode=LightColorCapability.ON_OFF
| LightColorCapability.BRIGHTNESS,
color_mode=ESPColorMode.BRIGHTNESS,
brightness=pytest.approx(0.4980392156862745),
)
]
@ -598,9 +603,7 @@ async def test_rgb_color_temp_light(
call(
key=1,
state=True,
color_mode=LightColorCapability.ON_OFF
| LightColorCapability.BRIGHTNESS
| LightColorCapability.COLOR_TEMPERATURE,
color_mode=ESPColorMode.COLOR_TEMPERATURE,
color_temperature=400,
)
]
@ -908,12 +911,14 @@ async def test_light_rgbww_with_cold_warm_white_support(
min_mireds=153,
max_mireds=400,
supported_color_modes=[
LightColorCapability.RGB
| LightColorCapability.WHITE
| LightColorCapability.COLOR_TEMPERATURE
| LightColorCapability.COLD_WARM_WHITE
| LightColorCapability.ON_OFF
| LightColorCapability.BRIGHTNESS
ESPColorMode.RGB,
ESPColorMode.WHITE,
ESPColorMode.COLOR_TEMPERATURE,
ESPColorMode.COLD_WARM_WHITE,
ESPColorMode.ON_OFF,
ESPColorMode.BRIGHTNESS,
ESPColorMode.RGB_COLD_WARM_WHITE,
ESPColorMode.RGB_WHITE,
],
)
]
@ -928,12 +933,7 @@ async def test_light_rgbww_with_cold_warm_white_support(
blue=1,
warm_white=1,
cold_white=1,
color_mode=LightColorCapability.RGB
| LightColorCapability.WHITE
| LightColorCapability.COLOR_TEMPERATURE
| LightColorCapability.COLD_WARM_WHITE
| LightColorCapability.ON_OFF
| LightColorCapability.BRIGHTNESS,
color_mode=ESPColorMode.RGB_COLD_WARM_WHITE,
)
]
user_service = []
@ -946,7 +946,13 @@ async def test_light_rgbww_with_cold_warm_white_support(
state = hass.states.get("light.test_mylight")
assert state is not None
assert state.state == STATE_ON
assert state.attributes[ATTR_SUPPORTED_COLOR_MODES] == [ColorMode.RGBWW]
assert state.attributes[ATTR_SUPPORTED_COLOR_MODES] == [
ColorMode.COLOR_TEMP,
ColorMode.RGB,
ColorMode.RGBW,
ColorMode.RGBWW,
ColorMode.WHITE,
]
assert state.attributes[ATTR_COLOR_MODE] == ColorMode.RGBWW
assert state.attributes[ATTR_RGBWW_COLOR] == (255, 255, 255, 255, 255)
@ -961,12 +967,7 @@ async def test_light_rgbww_with_cold_warm_white_support(
call(
key=1,
state=True,
color_mode=LightColorCapability.RGB
| LightColorCapability.WHITE
| LightColorCapability.COLOR_TEMPERATURE
| LightColorCapability.COLD_WARM_WHITE
| LightColorCapability.ON_OFF
| LightColorCapability.BRIGHTNESS,
color_mode=ESPColorMode.RGB_COLD_WARM_WHITE,
)
]
)
@ -983,12 +984,7 @@ async def test_light_rgbww_with_cold_warm_white_support(
call(
key=1,
state=True,
color_mode=LightColorCapability.RGB
| LightColorCapability.WHITE
| LightColorCapability.COLOR_TEMPERATURE
| LightColorCapability.COLD_WARM_WHITE
| LightColorCapability.ON_OFF
| LightColorCapability.BRIGHTNESS,
color_mode=ESPColorMode.RGB_COLD_WARM_WHITE,
brightness=pytest.approx(0.4980392156862745),
)
]
@ -1011,14 +1007,7 @@ async def test_light_rgbww_with_cold_warm_white_support(
key=1,
state=True,
color_brightness=1.0,
color_mode=LightColorCapability.RGB
| LightColorCapability.WHITE
| LightColorCapability.COLOR_TEMPERATURE
| LightColorCapability.COLD_WARM_WHITE
| LightColorCapability.ON_OFF
| LightColorCapability.BRIGHTNESS,
cold_white=0,
warm_white=0,
color_mode=ESPColorMode.RGB,
rgb=(pytest.approx(0.3333333333333333), 1.0, 0.0),
brightness=pytest.approx(0.4980392156862745),
)
@ -1037,16 +1026,9 @@ async def test_light_rgbww_with_cold_warm_white_support(
call(
key=1,
state=True,
color_brightness=pytest.approx(0.4235294117647059),
cold_white=1,
warm_white=1,
color_mode=LightColorCapability.RGB
| LightColorCapability.WHITE
| LightColorCapability.COLOR_TEMPERATURE
| LightColorCapability.COLD_WARM_WHITE
| LightColorCapability.ON_OFF
| LightColorCapability.BRIGHTNESS,
rgb=(0, pytest.approx(0.5462962962962963), 1.0),
color_brightness=1.0,
color_mode=ESPColorMode.RGB,
rgb=(1.0, 1.0, 1.0),
)
]
)
@ -1063,16 +1045,10 @@ async def test_light_rgbww_with_cold_warm_white_support(
call(
key=1,
state=True,
color_brightness=pytest.approx(0.4235294117647059),
cold_white=1,
warm_white=1,
color_mode=LightColorCapability.RGB
| LightColorCapability.WHITE
| LightColorCapability.COLOR_TEMPERATURE
| LightColorCapability.COLD_WARM_WHITE
| LightColorCapability.ON_OFF
| LightColorCapability.BRIGHTNESS,
rgb=(0, pytest.approx(0.5462962962962963), 1.0),
color_brightness=1.0,
white=1,
color_mode=ESPColorMode.RGB_WHITE,
rgb=(1.0, 1.0, 1.0),
)
]
)
@ -1095,12 +1071,7 @@ async def test_light_rgbww_with_cold_warm_white_support(
color_brightness=1,
cold_white=1,
warm_white=1,
color_mode=LightColorCapability.RGB
| LightColorCapability.WHITE
| LightColorCapability.COLOR_TEMPERATURE
| LightColorCapability.COLD_WARM_WHITE
| LightColorCapability.ON_OFF
| LightColorCapability.BRIGHTNESS,
color_mode=ESPColorMode.RGB_COLD_WARM_WHITE,
rgb=(1, 1, 1),
)
]
@ -1118,16 +1089,8 @@ async def test_light_rgbww_with_cold_warm_white_support(
call(
key=1,
state=True,
color_brightness=0,
cold_white=0,
warm_white=100,
color_mode=LightColorCapability.RGB
| LightColorCapability.WHITE
| LightColorCapability.COLOR_TEMPERATURE
| LightColorCapability.COLD_WARM_WHITE
| LightColorCapability.ON_OFF
| LightColorCapability.BRIGHTNESS,
rgb=(0, 0, 0),
color_temperature=400.0,
color_mode=ESPColorMode.COLOR_TEMPERATURE,
)
]
)
@ -1733,11 +1696,16 @@ async def test_light_effects(
max_mireds=400,
effects=["effect1", "effect2"],
supported_color_modes=[
LightColorCapability.ON_OFF | LightColorCapability.BRIGHTNESS,
ESPColorMode.ON_OFF,
ESPColorMode.BRIGHTNESS,
],
)
]
states = [LightState(key=1, state=True, brightness=100)]
states = [
LightState(
key=1, state=True, brightness=100, color_mode=ESPColorMode.BRIGHTNESS
)
]
user_service = []
await mock_generic_device_entry(
mock_client=mock_client,
@ -1761,8 +1729,7 @@ async def test_light_effects(
call(
key=1,
state=True,
color_mode=LightColorCapability.ON_OFF
| LightColorCapability.BRIGHTNESS,
color_mode=ESPColorMode.BRIGHTNESS,
effect="effect1",
)
]

View File

@ -203,7 +203,7 @@ async def test_generic_numeric_sensor_legacy_last_reset_convert(
key=1,
name="my sensor",
unique_id="my_sensor",
last_reset_type=LastResetType.AUTO,
legacy_last_reset_type=LastResetType.AUTO,
state_class=ESPHomeSensorStateClass.MEASUREMENT,
)
]