mirror of
https://github.com/home-assistant/core.git
synced 2026-08-06 13:26:29 +01:00
Use proper command set for Edifier R2000DB and R2730DB (#177472)
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
This commit is contained in:
@@ -19,7 +19,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
|
||||
|
||||
async def async_migrate_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
|
||||
"""Migrate old config entries."""
|
||||
if entry.version > 2:
|
||||
if entry.version > 3:
|
||||
return False
|
||||
|
||||
if entry.version == 1:
|
||||
@@ -38,6 +38,19 @@ async def async_migrate_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
|
||||
version=2,
|
||||
)
|
||||
|
||||
if entry.version == 2:
|
||||
data = {**entry.data}
|
||||
# The R2000DB and R2730DB/RC10D1 models got their own command sets,
|
||||
# split from the R1280DB one, which they were incorrectly grouped with.
|
||||
command_set = MODEL_TO_COMMAND_SET[EdifierModel(data[CONF_MODEL])]
|
||||
data[CONF_COMMAND_SET] = command_set.value
|
||||
hass.config_entries.async_update_entry(
|
||||
entry,
|
||||
data=data,
|
||||
unique_id=f"{command_set.value}_{data[CONF_INFRARED_ENTITY_ID]}",
|
||||
version=3,
|
||||
)
|
||||
|
||||
return True
|
||||
|
||||
|
||||
|
||||
@@ -8,6 +8,8 @@ from infrared_protocols.codes.edifier.r1280db import EdifierR1280DBCode
|
||||
from infrared_protocols.codes.edifier.r1700bt_2017 import EdifierR1700BT2017Code
|
||||
from infrared_protocols.codes.edifier.r1700bt_pre_2017 import EdifierR1700BTPre2017Code
|
||||
from infrared_protocols.codes.edifier.r1700bts import EdifierR1700BTsCode
|
||||
from infrared_protocols.codes.edifier.r2000db import EdifierR2000DBCode
|
||||
from infrared_protocols.codes.edifier.r2730db import EdifierR2730DBCode
|
||||
from infrared_protocols.codes.edifier.rc20g import EdifierRC20GCode
|
||||
from infrared_protocols.codes.edifier.s360db import EdifierS360DBCode
|
||||
from infrared_protocols.codes.edifier.s3000pro import EdifierS3000ProCode
|
||||
@@ -114,6 +116,65 @@ COMMAND_SET_BUTTONS: dict[
|
||||
command_code=EdifierR1280DBCode.COAX,
|
||||
),
|
||||
),
|
||||
EdifierCommandSet.R2000DB: (
|
||||
EdifierIrButtonEntityDescription(
|
||||
key="bluetooth",
|
||||
translation_key="bluetooth",
|
||||
command_code=EdifierR2000DBCode.BLUETOOTH,
|
||||
),
|
||||
EdifierIrButtonEntityDescription(
|
||||
key="line_1",
|
||||
translation_key="line_1",
|
||||
command_code=EdifierR2000DBCode.LINE_1,
|
||||
),
|
||||
EdifierIrButtonEntityDescription(
|
||||
key="line_2",
|
||||
translation_key="line_2",
|
||||
command_code=EdifierR2000DBCode.LINE_2,
|
||||
),
|
||||
EdifierIrButtonEntityDescription(
|
||||
key="optical",
|
||||
translation_key="optical",
|
||||
command_code=EdifierR2000DBCode.OPTICAL,
|
||||
),
|
||||
EdifierIrButtonEntityDescription(
|
||||
key="eq_classic",
|
||||
translation_key="eq_classic",
|
||||
command_code=EdifierR2000DBCode.EQ_CLASSIC,
|
||||
),
|
||||
EdifierIrButtonEntityDescription(
|
||||
key="eq_dynamic",
|
||||
translation_key="eq_dynamic",
|
||||
command_code=EdifierR2000DBCode.EQ_DYNAMIC,
|
||||
),
|
||||
),
|
||||
EdifierCommandSet.R2730DB: (
|
||||
EdifierIrButtonEntityDescription(
|
||||
key="bluetooth",
|
||||
translation_key="bluetooth",
|
||||
command_code=EdifierR2730DBCode.BLUETOOTH,
|
||||
),
|
||||
EdifierIrButtonEntityDescription(
|
||||
key="line_1",
|
||||
translation_key="line_1",
|
||||
command_code=EdifierR2730DBCode.LINE_1,
|
||||
),
|
||||
EdifierIrButtonEntityDescription(
|
||||
key="line_2",
|
||||
translation_key="line_2",
|
||||
command_code=EdifierR2730DBCode.LINE_2,
|
||||
),
|
||||
EdifierIrButtonEntityDescription(
|
||||
key="optical",
|
||||
translation_key="optical",
|
||||
command_code=EdifierR2730DBCode.OPTICAL,
|
||||
),
|
||||
EdifierIrButtonEntityDescription(
|
||||
key="coax",
|
||||
translation_key="coax",
|
||||
command_code=EdifierR2730DBCode.COAX,
|
||||
),
|
||||
),
|
||||
EdifierCommandSet.S360DB: (
|
||||
EdifierIrButtonEntityDescription(
|
||||
key="bluetooth",
|
||||
|
||||
@@ -25,7 +25,7 @@ from .const import CONF_COMMAND_SET, CONF_INFRARED_ENTITY_ID, DOMAIN
|
||||
class EdifierIrConfigFlow(ConfigFlow, domain=DOMAIN):
|
||||
"""Handle config flow for Edifier IR."""
|
||||
|
||||
VERSION = 2
|
||||
VERSION = 3
|
||||
MINOR_VERSION = 1
|
||||
|
||||
@override
|
||||
|
||||
@@ -5,6 +5,8 @@ from infrared_protocols.codes.edifier.r1280t import EdifierR1280TCode
|
||||
from infrared_protocols.codes.edifier.r1700bt_2017 import EdifierR1700BT2017Code
|
||||
from infrared_protocols.codes.edifier.r1700bt_pre_2017 import EdifierR1700BTPre2017Code
|
||||
from infrared_protocols.codes.edifier.r1700bts import EdifierR1700BTsCode
|
||||
from infrared_protocols.codes.edifier.r2000db import EdifierR2000DBCode
|
||||
from infrared_protocols.codes.edifier.r2730db import EdifierR2730DBCode
|
||||
from infrared_protocols.codes.edifier.rc20g import EdifierRC20GCode
|
||||
from infrared_protocols.codes.edifier.s360db import EdifierS360DBCode
|
||||
from infrared_protocols.codes.edifier.s3000pro import EdifierS3000ProCode
|
||||
@@ -19,6 +21,8 @@ type EdifierCode = (
|
||||
| EdifierR1700BTsCode
|
||||
| EdifierR1280DBCode
|
||||
| EdifierR1280TCode
|
||||
| EdifierR2000DBCode
|
||||
| EdifierR2730DBCode
|
||||
| EdifierS360DBCode
|
||||
| EdifierRC20GCode
|
||||
| EdifierS3000ProCode
|
||||
|
||||
@@ -8,6 +8,8 @@ from infrared_protocols.codes.edifier.r1280t import EdifierR1280TCode
|
||||
from infrared_protocols.codes.edifier.r1700bt_2017 import EdifierR1700BT2017Code
|
||||
from infrared_protocols.codes.edifier.r1700bt_pre_2017 import EdifierR1700BTPre2017Code
|
||||
from infrared_protocols.codes.edifier.r1700bts import EdifierR1700BTsCode
|
||||
from infrared_protocols.codes.edifier.r2000db import EdifierR2000DBCode
|
||||
from infrared_protocols.codes.edifier.r2730db import EdifierR2730DBCode
|
||||
from infrared_protocols.codes.edifier.rc20g import EdifierRC20GCode
|
||||
from infrared_protocols.codes.edifier.s360db import EdifierS360DBCode
|
||||
from infrared_protocols.codes.edifier.s3000pro import EdifierS3000ProCode
|
||||
@@ -86,6 +88,24 @@ COMMAND_SET_COMMANDS: dict[
|
||||
),
|
||||
MediaPlayerEntityFeature.VOLUME_MUTE: (EdifierR1280TCode.MUTE,),
|
||||
},
|
||||
EdifierCommandSet.R2000DB: {
|
||||
MediaPlayerEntityFeature.TURN_ON: (EdifierR2000DBCode.POWER,),
|
||||
MediaPlayerEntityFeature.TURN_OFF: (EdifierR2000DBCode.POWER,),
|
||||
MediaPlayerEntityFeature.VOLUME_STEP: (
|
||||
(EdifierR2000DBCode.VOLUME_UP,),
|
||||
(EdifierR2000DBCode.VOLUME_DOWN,),
|
||||
),
|
||||
MediaPlayerEntityFeature.VOLUME_MUTE: (EdifierR2000DBCode.MUTE,),
|
||||
},
|
||||
EdifierCommandSet.R2730DB: {
|
||||
MediaPlayerEntityFeature.TURN_ON: (EdifierR2730DBCode.POWER,),
|
||||
MediaPlayerEntityFeature.TURN_OFF: (EdifierR2730DBCode.POWER,),
|
||||
MediaPlayerEntityFeature.VOLUME_STEP: (
|
||||
(EdifierR2730DBCode.VOLUME_UP,),
|
||||
(EdifierR2730DBCode.VOLUME_DOWN,),
|
||||
),
|
||||
MediaPlayerEntityFeature.VOLUME_MUTE: (EdifierR2730DBCode.MUTE,),
|
||||
},
|
||||
EdifierCommandSet.S360DB: {
|
||||
MediaPlayerEntityFeature.TURN_ON: (EdifierS360DBCode.POWER,),
|
||||
MediaPlayerEntityFeature.TURN_OFF: (EdifierS360DBCode.POWER,),
|
||||
|
||||
@@ -35,7 +35,7 @@ def mock_config_entry() -> MockConfigEntry:
|
||||
CONF_COMMAND_SET: EdifierCommandSet.R1700BTS.value,
|
||||
},
|
||||
unique_id=f"r1700bts_{MOCK_INFRARED_EMITTER_ENTITY_ID}",
|
||||
version=2,
|
||||
version=3,
|
||||
)
|
||||
|
||||
|
||||
|
||||
@@ -26,6 +26,8 @@ from tests.components.infrared import EMITTER_ENTITY_ID
|
||||
(EdifierModel.R1700BTS, EdifierCommandSet.R1700BTS),
|
||||
(EdifierModel.R1280DB, EdifierCommandSet.R1280DB),
|
||||
(EdifierModel.R1280T, EdifierCommandSet.R1280T),
|
||||
(EdifierModel.R2000DB, EdifierCommandSet.R2000DB),
|
||||
(EdifierModel.R2730DB, EdifierCommandSet.R2730DB),
|
||||
(EdifierModel.S360DB, EdifierCommandSet.S360DB),
|
||||
(EdifierModel.RC20G, EdifierCommandSet.RC20G),
|
||||
(EdifierModel.S3000PRO, EdifierCommandSet.S3000PRO),
|
||||
|
||||
@@ -45,7 +45,7 @@ async def test_setup_and_unload_entry(
|
||||
],
|
||||
)
|
||||
@pytest.mark.usefixtures("mock_infrared_emitter_entity", "mock_edifier_code_to_command")
|
||||
async def test_migrate_entry_v1_to_v2(
|
||||
async def test_migrate_entry_from_v1(
|
||||
hass: HomeAssistant,
|
||||
old_model: str,
|
||||
old_command_set: str,
|
||||
@@ -70,7 +70,47 @@ async def test_migrate_entry_v1_to_v2(
|
||||
await hass.async_block_till_done()
|
||||
|
||||
assert entry.state is ConfigEntryState.LOADED
|
||||
assert entry.version == 2
|
||||
assert entry.version == 3
|
||||
assert entry.data[CONF_MODEL] == expected_model
|
||||
assert entry.data[CONF_COMMAND_SET] == expected_command_set
|
||||
assert entry.unique_id == f"{expected_command_set}_{EMITTER_ENTITY_ID}"
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
("model", "old_command_set", "expected_command_set"),
|
||||
[
|
||||
pytest.param("R2000DB", "r1280db", "r2000db", id="r2000db-split"),
|
||||
pytest.param("R2730DB", "r1280db", "r2730db", id="r2730db-split"),
|
||||
pytest.param("RC10D1", "r1280db", "r2730db", id="rc10d1-split"),
|
||||
pytest.param("R1280DB", "r1280db", "r1280db", id="unchanged-model"),
|
||||
],
|
||||
)
|
||||
@pytest.mark.usefixtures("mock_infrared_emitter_entity", "mock_edifier_code_to_command")
|
||||
async def test_migrate_entry_from_v2(
|
||||
hass: HomeAssistant,
|
||||
model: str,
|
||||
old_command_set: str,
|
||||
expected_command_set: str,
|
||||
) -> None:
|
||||
"""Test v2 config entries are migrated to the split R2000DB command set."""
|
||||
entry = MockConfigEntry(
|
||||
domain=DOMAIN,
|
||||
title=f"Edifier {model} via Test IR emitter",
|
||||
data={
|
||||
CONF_INFRARED_ENTITY_ID: EMITTER_ENTITY_ID,
|
||||
CONF_MODEL: model,
|
||||
CONF_COMMAND_SET: old_command_set,
|
||||
},
|
||||
unique_id=f"{old_command_set}_{EMITTER_ENTITY_ID}",
|
||||
version=2,
|
||||
)
|
||||
entry.add_to_hass(hass)
|
||||
|
||||
await hass.config_entries.async_setup(entry.entry_id)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
assert entry.state is ConfigEntryState.LOADED
|
||||
assert entry.version == 3
|
||||
assert entry.data[CONF_MODEL] == model
|
||||
assert entry.data[CONF_COMMAND_SET] == expected_command_set
|
||||
assert entry.unique_id == f"{expected_command_set}_{EMITTER_ENTITY_ID}"
|
||||
|
||||
Reference in New Issue
Block a user