Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 0 additions & 4 deletions homeassistant/components/cover/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -300,10 +300,6 @@ def state_attributes(self) -> dict[str, Any]:
def supported_features(self) -> CoverEntityFeature:
"""Flag supported features."""
if (features := self._attr_supported_features) is not None:
if type(features) is int:
new_features = CoverEntityFeature(features)
self._report_deprecated_supported_features_values(new_features)
return new_features
return features

supported_features = (
Expand Down
53 changes: 19 additions & 34 deletions homeassistant/components/media_player/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -814,19 +814,6 @@ def supported_features(self) -> MediaPlayerEntityFeature:
"""Flag media player features that are supported."""
return self._attr_supported_features

@property
def supported_features_compat(self) -> MediaPlayerEntityFeature:
"""Return the supported features as MediaPlayerEntityFeature.

Remove this compatibility shim in 2025.1 or later.
"""
features = self.supported_features
if type(features) is int:
new_features = MediaPlayerEntityFeature(features)
self._report_deprecated_supported_features_values(new_features)
return new_features
return features

def turn_on(self) -> None:
"""Turn the media player on."""
raise NotImplementedError
Expand Down Expand Up @@ -966,87 +953,85 @@ async def async_set_repeat(self, repeat: RepeatMode) -> None:
@property
def support_play(self) -> bool:
"""Boolean if play is supported."""
return MediaPlayerEntityFeature.PLAY in self.supported_features_compat
return MediaPlayerEntityFeature.PLAY in self.supported_features

@final
@property
def support_pause(self) -> bool:
"""Boolean if pause is supported."""
return MediaPlayerEntityFeature.PAUSE in self.supported_features_compat
return MediaPlayerEntityFeature.PAUSE in self.supported_features

@final
@property
def support_stop(self) -> bool:
"""Boolean if stop is supported."""
return MediaPlayerEntityFeature.STOP in self.supported_features_compat
return MediaPlayerEntityFeature.STOP in self.supported_features

@final
@property
def support_seek(self) -> bool:
"""Boolean if seek is supported."""
return MediaPlayerEntityFeature.SEEK in self.supported_features_compat
return MediaPlayerEntityFeature.SEEK in self.supported_features

@final
@property
def support_volume_set(self) -> bool:
"""Boolean if setting volume is supported."""
return MediaPlayerEntityFeature.VOLUME_SET in self.supported_features_compat
return MediaPlayerEntityFeature.VOLUME_SET in self.supported_features

@final
@property
def support_volume_mute(self) -> bool:
"""Boolean if muting volume is supported."""
return MediaPlayerEntityFeature.VOLUME_MUTE in self.supported_features_compat
return MediaPlayerEntityFeature.VOLUME_MUTE in self.supported_features

@final
@property
def support_previous_track(self) -> bool:
"""Boolean if previous track command supported."""
return MediaPlayerEntityFeature.PREVIOUS_TRACK in self.supported_features_compat
return MediaPlayerEntityFeature.PREVIOUS_TRACK in self.supported_features

@final
@property
def support_next_track(self) -> bool:
"""Boolean if next track command supported."""
return MediaPlayerEntityFeature.NEXT_TRACK in self.supported_features_compat
return MediaPlayerEntityFeature.NEXT_TRACK in self.supported_features

@final
@property
def support_play_media(self) -> bool:
"""Boolean if play media command supported."""
return MediaPlayerEntityFeature.PLAY_MEDIA in self.supported_features_compat
return MediaPlayerEntityFeature.PLAY_MEDIA in self.supported_features

@final
@property
def support_select_source(self) -> bool:
"""Boolean if select source command supported."""
return MediaPlayerEntityFeature.SELECT_SOURCE in self.supported_features_compat
return MediaPlayerEntityFeature.SELECT_SOURCE in self.supported_features

@final
@property
def support_select_sound_mode(self) -> bool:
"""Boolean if select sound mode command supported."""
return (
MediaPlayerEntityFeature.SELECT_SOUND_MODE in self.supported_features_compat
)
return MediaPlayerEntityFeature.SELECT_SOUND_MODE in self.supported_features

@final
@property
def support_clear_playlist(self) -> bool:
"""Boolean if clear playlist command supported."""
return MediaPlayerEntityFeature.CLEAR_PLAYLIST in self.supported_features_compat
return MediaPlayerEntityFeature.CLEAR_PLAYLIST in self.supported_features

@final
@property
def support_shuffle_set(self) -> bool:
"""Boolean if shuffle is supported."""
return MediaPlayerEntityFeature.SHUFFLE_SET in self.supported_features_compat
return MediaPlayerEntityFeature.SHUFFLE_SET in self.supported_features

@final
@property
def support_grouping(self) -> bool:
"""Boolean if player grouping is supported."""
return MediaPlayerEntityFeature.GROUPING in self.supported_features_compat
return MediaPlayerEntityFeature.GROUPING in self.supported_features

async def async_toggle(self) -> None:
"""Toggle the power on the media player."""
Expand Down Expand Up @@ -1074,7 +1059,7 @@ async def async_volume_up(self) -> None:
if (
self.volume_level is not None
and self.volume_level < 1
and MediaPlayerEntityFeature.VOLUME_SET in self.supported_features_compat
and MediaPlayerEntityFeature.VOLUME_SET in self.supported_features
):
await self.async_set_volume_level(
min(1, self.volume_level + self.volume_step)
Expand All @@ -1092,7 +1077,7 @@ async def async_volume_down(self) -> None:
if (
self.volume_level is not None
and self.volume_level > 0
and MediaPlayerEntityFeature.VOLUME_SET in self.supported_features_compat
and MediaPlayerEntityFeature.VOLUME_SET in self.supported_features
):
await self.async_set_volume_level(
max(0, self.volume_level - self.volume_step)
Expand Down Expand Up @@ -1135,7 +1120,7 @@ def media_image_local(self) -> str | None:
def capability_attributes(self) -> dict[str, Any]:
"""Return capability attributes."""
data: dict[str, Any] = {}
supported_features = self.supported_features_compat
supported_features = self.supported_features

if (
source_list := self.source_list
Expand Down Expand Up @@ -1364,7 +1349,7 @@ async def websocket_browse_media(
connection.send_error(msg["id"], "entity_not_found", "Entity not found")
return

if MediaPlayerEntityFeature.BROWSE_MEDIA not in player.supported_features_compat:
if MediaPlayerEntityFeature.BROWSE_MEDIA not in player.supported_features:
connection.send_message(
websocket_api.error_message(
msg["id"], ERR_NOT_SUPPORTED, "Player does not support browsing media"
Expand Down Expand Up @@ -1447,7 +1432,7 @@ async def websocket_search_media(
connection.send_error(msg["id"], "entity_not_found", "Entity not found")
return

if MediaPlayerEntityFeature.SEARCH_MEDIA not in player.supported_features_compat:
if MediaPlayerEntityFeature.SEARCH_MEDIA not in player.supported_features:
connection.send_message(
websocket_api.error_message(
msg["id"], ERR_NOT_SUPPORTED, "Player does not support searching media"
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/nextdns/strings.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
"api_key": "[%key:common::config_flow::data::api_key%]"
},
"data_description": {
"api_key": "The API Key for your NextDNS account"
"api_key": "The API key for your NextDNS account"
}
},
"profiles": {
Expand Down
3 changes: 2 additions & 1 deletion homeassistant/components/smarla/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,13 @@ async def async_setup_entry(hass: HomeAssistant, entry: FederwiegeConfigEntry) -

federwiege = Federwiege(hass.loop, connection)
federwiege.register()
federwiege.connect()

entry.runtime_data = federwiege

await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)

federwiege.connect()

return True


Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/smarla/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,5 @@
"iot_class": "cloud_push",
"loggers": ["pysmarlaapi", "pysignalr"],
"quality_scale": "bronze",
"requirements": ["pysmarlaapi==0.8.2"]
"requirements": ["pysmarlaapi==0.9.0"]
}
5 changes: 3 additions & 2 deletions homeassistant/components/smarla/number.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,9 +53,10 @@ class SmarlaNumber(SmarlaBaseEntity, NumberEntity):
_property: Property[int]

@property
def native_value(self) -> float:
def native_value(self) -> float | None:
"""Return the entity value to represent the entity state."""
return self._property.get()
v = self._property.get()
return float(v) if v is not None else None

def set_native_value(self, value: float) -> None:
"""Update to the smarla device."""
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/smarla/switch.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ class SmarlaSwitch(SmarlaBaseEntity, SwitchEntity):
_property: Property[bool]

@property
def is_on(self) -> bool:
def is_on(self) -> bool | None:
"""Return the entity value to represent the entity state."""
return self._property.get()

Expand Down
17 changes: 2 additions & 15 deletions homeassistant/components/vacuum/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -312,7 +312,7 @@ def battery_icon(self) -> str:
@property
def capability_attributes(self) -> dict[str, Any] | None:
"""Return capability attributes."""
if VacuumEntityFeature.FAN_SPEED in self.supported_features_compat:
if VacuumEntityFeature.FAN_SPEED in self.supported_features:
return {ATTR_FAN_SPEED_LIST: self.fan_speed_list}
return None

Expand All @@ -330,7 +330,7 @@ def fan_speed_list(self) -> list[str]:
def state_attributes(self) -> dict[str, Any]:
"""Return the state attributes of the vacuum cleaner."""
data: dict[str, Any] = {}
supported_features = self.supported_features_compat
supported_features = self.supported_features

if VacuumEntityFeature.BATTERY in supported_features:
data[ATTR_BATTERY_LEVEL] = self.battery_level
Expand Down Expand Up @@ -369,19 +369,6 @@ def supported_features(self) -> VacuumEntityFeature:
"""Flag vacuum cleaner features that are supported."""
return self._attr_supported_features

@property
def supported_features_compat(self) -> VacuumEntityFeature:
"""Return the supported features as VacuumEntityFeature.

Remove this compatibility shim in 2025.1 or later.
"""
features = self.supported_features
if type(features) is int:
new_features = VacuumEntityFeature(features)
self._report_deprecated_supported_features_values(new_features)
return new_features
return features

def stop(self, **kwargs: Any) -> None:
"""Stop the vacuum cleaner."""
raise NotImplementedError
Expand Down
2 changes: 1 addition & 1 deletion requirements_all.txt

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion requirements_test_all.txt

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

29 changes: 1 addition & 28 deletions tests/components/cover/test_init.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@

from enum import Enum

import pytest

from homeassistant.components import cover
from homeassistant.components.cover import CoverState
from homeassistant.const import ATTR_ENTITY_ID, CONF_PLATFORM, SERVICE_TOGGLE
Expand All @@ -13,11 +11,7 @@

from .common import MockCover

from tests.common import (
MockEntityPlatform,
help_test_all,
setup_test_component_platform,
)
from tests.common import help_test_all, setup_test_component_platform


async def test_services(
Expand Down Expand Up @@ -159,24 +153,3 @@ def _create_tuples(enum: type[Enum], constant_prefix: str) -> list[tuple[Enum, s
def test_all() -> None:
"""Test module.__all__ is correctly set."""
help_test_all(cover)


def test_deprecated_supported_features_ints(
hass: HomeAssistant, caplog: pytest.LogCaptureFixture
) -> None:
"""Test deprecated supported features ints."""

class MockCoverEntity(cover.CoverEntity):
_attr_supported_features = 1

entity = MockCoverEntity()
entity.hass = hass
entity.platform = MockEntityPlatform(hass)
assert entity.supported_features is cover.CoverEntityFeature(1)
assert "MockCoverEntity" in caplog.text
assert "is using deprecated supported features values" in caplog.text
assert "Instead it should use" in caplog.text
assert "CoverEntityFeature.OPEN" in caplog.text
caplog.clear()
assert entity.supported_features is cover.CoverEntityFeature(1)
assert "is using deprecated supported features values" not in caplog.text
28 changes: 3 additions & 25 deletions tests/components/media_player/test_init.py
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,9 @@ def test_support_properties(hass: HomeAssistant, property_suffix: str) -> None:
entity4 = MediaPlayerEntity()
entity4.hass = hass
entity4.platform = MockEntityPlatform(hass)
entity4._attr_supported_features = all_features - feature
entity4._attr_supported_features = media_player.MediaPlayerEntityFeature(
all_features - feature
)

assert getattr(entity1, f"support_{property_suffix}") is False
assert getattr(entity2, f"support_{property_suffix}") is True
Expand Down Expand Up @@ -652,27 +654,3 @@ async def test_get_async_get_browse_image_quoting(
url = player.get_browse_image_url("album", media_content_id)
await client.get(url)
mock_browse_image.assert_called_with("album", media_content_id, None)


def test_deprecated_supported_features_ints(
hass: HomeAssistant, caplog: pytest.LogCaptureFixture
) -> None:
"""Test deprecated supported features ints."""

class MockMediaPlayerEntity(MediaPlayerEntity):
@property
def supported_features(self) -> int:
"""Return supported features."""
return 1

entity = MockMediaPlayerEntity()
entity.hass = hass
entity.platform = MockEntityPlatform(hass)
assert entity.supported_features_compat is MediaPlayerEntityFeature(1)
assert "MockMediaPlayerEntity" in caplog.text
assert "is using deprecated supported features values" in caplog.text
assert "Instead it should use" in caplog.text
assert "MediaPlayerEntityFeature.PAUSE" in caplog.text
caplog.clear()
assert entity.supported_features_compat is MediaPlayerEntityFeature(1)
assert "is using deprecated supported features values" not in caplog.text
2 changes: 1 addition & 1 deletion tests/components/smarla/snapshots/test_number.ambr
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,6 @@
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '1',
'state': '1.0',
})
# ---
4 changes: 2 additions & 2 deletions tests/components/smarla/test_number.py
Original file line number Diff line number Diff line change
Expand Up @@ -93,11 +93,11 @@ async def test_number_state_update(

entity_id = entity_info["entity_id"]

assert hass.states.get(entity_id).state == "1"
assert hass.states.get(entity_id).state == "1.0"

mock_number_property.get.return_value = 100

await update_property_listeners(mock_number_property)
await hass.async_block_till_done()

assert hass.states.get(entity_id).state == "100"
assert hass.states.get(entity_id).state == "100.0"
Loading
Loading