22
33from __future__ import annotations
44
5- from dataclasses import dataclass
65import logging
76
87import voluptuous as vol
98
10- from homeassistant .config_entries import ConfigEntry
119from homeassistant .const import CONF_DEVICE_ID , CONF_ENTITY_ID , CONF_NAME , Platform
1210from homeassistant .core import HomeAssistant , callback
1311from homeassistant .helpers import (
12+ config_validation as cv ,
1413 device_registry as dr ,
1514 discovery ,
1615 entity_registry as er ,
17- issue_registry as ir ,
1816)
19- import homeassistant .helpers .config_validation as cv
2017
2118from .const import ATTR_VIN , CONF_READ_ONLY , DOMAIN
22- from .coordinator import BMWDataUpdateCoordinator
19+ from .coordinator import BMWConfigEntry , BMWDataUpdateCoordinator
2320
2421_LOGGER = logging .getLogger (__name__ )
2522
5047SERVICE_UPDATE_STATE = "update_state"
5148
5249
53- type BMWConfigEntry = ConfigEntry [BMWData ]
54-
55-
56- @dataclass
57- class BMWData :
58- """Class to store BMW runtime data."""
59-
60- coordinator : BMWDataUpdateCoordinator
61-
62-
6350@callback
6451def _async_migrate_options_from_data_if_missing (
65- hass : HomeAssistant , entry : ConfigEntry
52+ hass : HomeAssistant , entry : BMWConfigEntry
6653) -> None :
6754 data = dict (entry .data )
6855 options = dict (entry .options )
@@ -86,23 +73,29 @@ async def _async_migrate_entries(
8673 @callback
8774 def update_unique_id (entry : er .RegistryEntry ) -> dict [str , str ] | None :
8875 replacements = {
89- "charging_level_hv" : "fuel_and_battery.remaining_battery_percent" ,
90- "fuel_percent" : "fuel_and_battery.remaining_fuel_percent" ,
91- "ac_current_limit" : "charging_profile.ac_current_limit" ,
92- "charging_start_time" : "fuel_and_battery.charging_start_time" ,
93- "charging_end_time" : "fuel_and_battery.charging_end_time" ,
94- "charging_status" : "fuel_and_battery.charging_status" ,
95- "charging_target" : "fuel_and_battery.charging_target" ,
96- "remaining_battery_percent" : "fuel_and_battery.remaining_battery_percent" ,
97- "remaining_range_total" : "fuel_and_battery.remaining_range_total" ,
98- "remaining_range_electric" : "fuel_and_battery.remaining_range_electric" ,
99- "remaining_range_fuel" : "fuel_and_battery.remaining_range_fuel" ,
100- "remaining_fuel" : "fuel_and_battery.remaining_fuel" ,
101- "remaining_fuel_percent" : "fuel_and_battery.remaining_fuel_percent" ,
102- "activity" : "climate.activity" ,
76+ Platform .SENSOR .value : {
77+ "charging_level_hv" : "fuel_and_battery.remaining_battery_percent" ,
78+ "fuel_percent" : "fuel_and_battery.remaining_fuel_percent" ,
79+ "ac_current_limit" : "charging_profile.ac_current_limit" ,
80+ "charging_start_time" : "fuel_and_battery.charging_start_time" ,
81+ "charging_end_time" : "fuel_and_battery.charging_end_time" ,
82+ "charging_status" : "fuel_and_battery.charging_status" ,
83+ "charging_target" : "fuel_and_battery.charging_target" ,
84+ "remaining_battery_percent" : "fuel_and_battery.remaining_battery_percent" ,
85+ "remaining_range_total" : "fuel_and_battery.remaining_range_total" ,
86+ "remaining_range_electric" : "fuel_and_battery.remaining_range_electric" ,
87+ "remaining_range_fuel" : "fuel_and_battery.remaining_range_fuel" ,
88+ "remaining_fuel" : "fuel_and_battery.remaining_fuel" ,
89+ "remaining_fuel_percent" : "fuel_and_battery.remaining_fuel_percent" ,
90+ "activity" : "climate.activity" ,
91+ }
10392 }
104- if (key := entry .unique_id .split ("-" )[- 1 ]) in replacements :
105- new_unique_id = entry .unique_id .replace (key , replacements [key ])
93+ if (key := entry .unique_id .split ("-" )[- 1 ]) in replacements .get (
94+ entry .domain , []
95+ ):
96+ new_unique_id = entry .unique_id .replace (
97+ key , replacements [entry .domain ][key ]
98+ )
10699 _LOGGER .debug (
107100 "Migrating entity '%s' unique_id from '%s' to '%s'" ,
108101 entry .entity_id ,
@@ -128,30 +121,21 @@ def update_unique_id(entry: er.RegistryEntry) -> dict[str, str] | None:
128121 return True
129122
130123
131- async def async_setup_entry (hass : HomeAssistant , entry : ConfigEntry ) -> bool :
124+ async def async_setup_entry (hass : HomeAssistant , entry : BMWConfigEntry ) -> bool :
132125 """Set up BMW Connected Drive from a config entry."""
133126
134- ir .async_create_issue (
135- hass ,
136- DOMAIN ,
137- "stop_using_custom_component" ,
138- is_fixable = False ,
139- severity = ir .IssueSeverity .ERROR ,
140- translation_key = "stop_using_custom_component" ,
141- )
142-
143127 _async_migrate_options_from_data_if_missing (hass , entry )
144128
145129 await _async_migrate_entries (hass , entry )
146130
147131 # Set up one data coordinator per account/config entry
148132 coordinator = BMWDataUpdateCoordinator (
149133 hass ,
150- entry = entry ,
134+ config_entry = entry ,
151135 )
152136 await coordinator .async_config_entry_first_refresh ()
153137
154- entry .runtime_data = BMWData ( coordinator )
138+ entry .runtime_data = coordinator
155139
156140 # Set up all platforms except notify
157141 await hass .config_entries .async_forward_entry_setups (
@@ -185,7 +169,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
185169 return True
186170
187171
188- async def async_unload_entry (hass : HomeAssistant , entry : ConfigEntry ) -> bool :
172+ async def async_unload_entry (hass : HomeAssistant , entry : BMWConfigEntry ) -> bool :
189173 """Unload a config entry."""
190174
191175 return await hass .config_entries .async_unload_platforms (
0 commit comments