From 34f8e94ca9be9d660751cb259dea1045ffe39a5d Mon Sep 17 00:00:00 2001 From: Garrett <7310260+G-Two@users.noreply.github.com> Date: Sat, 4 Mar 2023 16:26:16 -0500 Subject: [PATCH] Bump subarulink to 0.7.5 (#89162) --- homeassistant/components/subaru/__init__.py | 7 ++-- homeassistant/components/subaru/const.py | 3 +- homeassistant/components/subaru/manifest.json | 2 +- homeassistant/components/subaru/sensor.py | 33 +++++++++++++------ requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- tests/components/subaru/api_responses.py | 25 ++++++++++---- tests/components/subaru/conftest.py | 14 ++++++++ .../fixtures/diagnostics_config_entry.json | 2 +- .../subaru/fixtures/diagnostics_device.json | 2 +- tests/components/subaru/test_init.py | 14 ++++---- 11 files changed, 71 insertions(+), 35 deletions(-) diff --git a/homeassistant/components/subaru/__init__.py b/homeassistant/components/subaru/__init__.py index 3e72b079adf..49ad3cf0d98 100644 --- a/homeassistant/components/subaru/__init__.py +++ b/homeassistant/components/subaru/__init__.py @@ -66,7 +66,8 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: vehicle_info = {} for vin in controller.get_vehicles(): - vehicle_info[vin] = get_vehicle_info(controller, vin) + if controller.get_subscription_status(vin): + vehicle_info[vin] = get_vehicle_info(controller, vin) async def async_update_data(): """Fetch data from API endpoint.""" @@ -116,10 +117,6 @@ async def refresh_subaru_data(config_entry, vehicle_info, controller): for vehicle in vehicle_info.values(): vin = vehicle[VEHICLE_VIN] - # Active subscription required - if not vehicle[VEHICLE_HAS_SAFETY_SERVICE]: - continue - # Optionally send an "update" remote command to vehicle (throttled with update_interval) if config_entry.options.get(CONF_UPDATE_ENABLED, False): await update_subaru(vehicle, controller) diff --git a/homeassistant/components/subaru/const.py b/homeassistant/components/subaru/const.py index 3de4930a691..42badfc0185 100644 --- a/homeassistant/components/subaru/const.py +++ b/homeassistant/components/subaru/const.py @@ -28,11 +28,12 @@ VEHICLE_HAS_REMOTE_START = "has_res" VEHICLE_HAS_REMOTE_SERVICE = "has_remote" VEHICLE_HAS_SAFETY_SERVICE = "has_safety" VEHICLE_LAST_UPDATE = "last_update" -VEHICLE_STATUS = "status" +VEHICLE_STATUS = "vehicle_status" API_GEN_1 = "g1" API_GEN_2 = "g2" +API_GEN_3 = "g3" MANUFACTURER = "Subaru" PLATFORMS = [ diff --git a/homeassistant/components/subaru/manifest.json b/homeassistant/components/subaru/manifest.json index 1aade946543..5852136ca45 100644 --- a/homeassistant/components/subaru/manifest.json +++ b/homeassistant/components/subaru/manifest.json @@ -6,5 +6,5 @@ "documentation": "https://www.home-assistant.io/integrations/subaru", "iot_class": "cloud_polling", "loggers": ["stdiomask", "subarulink"], - "requirements": ["subarulink==0.7.0"] + "requirements": ["subarulink==0.7.5"] } diff --git a/homeassistant/components/subaru/sensor.py b/homeassistant/components/subaru/sensor.py index 5479f56cf96..6c8e8fc100b 100644 --- a/homeassistant/components/subaru/sensor.py +++ b/homeassistant/components/subaru/sensor.py @@ -31,12 +31,12 @@ from homeassistant.util.unit_system import ( from . import get_device_info from .const import ( API_GEN_2, + API_GEN_3, DOMAIN, ENTRY_COORDINATOR, ENTRY_VEHICLES, VEHICLE_API_GEN, VEHICLE_HAS_EV, - VEHICLE_HAS_SAFETY_SERVICE, VEHICLE_STATUS, VEHICLE_VIN, ) @@ -51,7 +51,7 @@ FUEL_CONSUMPTION_MILES_PER_GALLON = "mi/gal" L_PER_GAL = VolumeConverter.convert(1, UnitOfVolume.GALLONS, UnitOfVolume.LITERS) KM_PER_MI = DistanceConverter.convert(1, UnitOfLength.MILES, UnitOfLength.KILOMETERS) -# Sensor available to "Subaru Safety Plus" subscribers with Gen1 or Gen2 vehicles +# Sensor available for Gen1 or Gen2 vehicles SAFETY_SENSORS = [ SensorEntityDescription( key=sc.ODOMETER, @@ -63,7 +63,7 @@ SAFETY_SENSORS = [ ), ] -# Sensors available to "Subaru Safety Plus" subscribers with Gen2 vehicles +# Sensors available to subscribers with Gen2/Gen3 vehicles API_GEN_2_SENSORS = [ SensorEntityDescription( key=sc.AVG_FUEL_CONSUMPTION, @@ -110,7 +110,18 @@ API_GEN_2_SENSORS = [ ), ] -# Sensors available to "Subaru Safety Plus" subscribers with PHEV vehicles +# Sensors available for Gen3 vehicles +API_GEN_3_SENSORS = [ + SensorEntityDescription( + key=sc.REMAINING_FUEL_PERCENT, + icon="mdi:gas-station", + name="Fuel level", + native_unit_of_measurement=PERCENTAGE, + state_class=SensorStateClass.MEASUREMENT, + ), +] + +# Sensors available to subscribers with PHEV vehicles EV_SENSORS = [ SensorEntityDescription( key=sc.EV_DISTANCE_TO_EMPTY, @@ -156,14 +167,16 @@ def create_vehicle_sensors( ) -> list[SubaruSensor]: """Instantiate all available sensors for the vehicle.""" sensor_descriptions_to_add = [] - if vehicle_info[VEHICLE_HAS_SAFETY_SERVICE]: - sensor_descriptions_to_add.extend(SAFETY_SENSORS) + sensor_descriptions_to_add.extend(SAFETY_SENSORS) - if vehicle_info[VEHICLE_API_GEN] == API_GEN_2: - sensor_descriptions_to_add.extend(API_GEN_2_SENSORS) + if vehicle_info[VEHICLE_API_GEN] in [API_GEN_2, API_GEN_3]: + sensor_descriptions_to_add.extend(API_GEN_2_SENSORS) - if vehicle_info[VEHICLE_HAS_EV]: - sensor_descriptions_to_add.extend(EV_SENSORS) + if vehicle_info[VEHICLE_API_GEN] == API_GEN_3: + sensor_descriptions_to_add.extend(API_GEN_3_SENSORS) + + if vehicle_info[VEHICLE_HAS_EV]: + sensor_descriptions_to_add.extend(EV_SENSORS) return [ SubaruSensor( diff --git a/requirements_all.txt b/requirements_all.txt index 5c01403688e..96bd1d20f0b 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -2434,7 +2434,7 @@ streamlabswater==1.0.1 stringcase==1.2.0 # homeassistant.components.subaru -subarulink==0.7.0 +subarulink==0.7.5 # homeassistant.components.solarlog sunwatcher==0.2.1 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index b458207aacc..896ded1d1ca 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -1734,7 +1734,7 @@ stookwijzer==1.3.0 stringcase==1.2.0 # homeassistant.components.subaru -subarulink==0.7.0 +subarulink==0.7.5 # homeassistant.components.solarlog sunwatcher==0.2.1 diff --git a/tests/components/subaru/api_responses.py b/tests/components/subaru/api_responses.py index 315530c15b3..e2fdf9ae508 100644 --- a/tests/components/subaru/api_responses.py +++ b/tests/components/subaru/api_responses.py @@ -5,22 +5,28 @@ from datetime import datetime, timezone from homeassistant.components.subaru.const import ( API_GEN_1, API_GEN_2, + API_GEN_3, VEHICLE_API_GEN, VEHICLE_HAS_EV, VEHICLE_HAS_REMOTE_SERVICE, VEHICLE_HAS_REMOTE_START, VEHICLE_HAS_SAFETY_SERVICE, + VEHICLE_MODEL_NAME, + VEHICLE_MODEL_YEAR, VEHICLE_NAME, + VEHICLE_STATUS, VEHICLE_VIN, ) TEST_VIN_1_G1 = "JF2ABCDE6L0000001" TEST_VIN_2_EV = "JF2ABCDE6L0000002" -TEST_VIN_3_G2 = "JF2ABCDE6L0000003" +TEST_VIN_3_G3 = "JF2ABCDE6L0000003" VEHICLE_DATA = { TEST_VIN_1_G1: { VEHICLE_VIN: TEST_VIN_1_G1, + VEHICLE_MODEL_YEAR: "2017", + VEHICLE_MODEL_NAME: "Outback", VEHICLE_NAME: "test_vehicle_1", VEHICLE_HAS_EV: False, VEHICLE_API_GEN: API_GEN_1, @@ -30,6 +36,8 @@ VEHICLE_DATA = { }, TEST_VIN_2_EV: { VEHICLE_VIN: TEST_VIN_2_EV, + VEHICLE_MODEL_YEAR: "2019", + VEHICLE_MODEL_NAME: "Crosstrek", VEHICLE_NAME: "test_vehicle_2", VEHICLE_HAS_EV: True, VEHICLE_API_GEN: API_GEN_2, @@ -37,11 +45,13 @@ VEHICLE_DATA = { VEHICLE_HAS_REMOTE_SERVICE: True, VEHICLE_HAS_SAFETY_SERVICE: True, }, - TEST_VIN_3_G2: { - VEHICLE_VIN: TEST_VIN_3_G2, + TEST_VIN_3_G3: { + VEHICLE_VIN: TEST_VIN_3_G3, + VEHICLE_MODEL_YEAR: "2022", + VEHICLE_MODEL_NAME: "Ascent", VEHICLE_NAME: "test_vehicle_3", VEHICLE_HAS_EV: False, - VEHICLE_API_GEN: API_GEN_2, + VEHICLE_API_GEN: API_GEN_3, VEHICLE_HAS_REMOTE_START: True, VEHICLE_HAS_REMOTE_SERVICE: True, VEHICLE_HAS_SAFETY_SERVICE: True, @@ -51,7 +61,7 @@ VEHICLE_DATA = { MOCK_DATETIME = datetime.fromtimestamp(1595560000, timezone.utc) VEHICLE_STATUS_EV = { - "status": { + VEHICLE_STATUS: { "AVG_FUEL_CONSUMPTION": 2.3, "DISTANCE_TO_EMPTY_FUEL": 707, "DOOR_BOOT_LOCK_STATUS": "UNKNOWN", @@ -120,8 +130,8 @@ VEHICLE_STATUS_EV = { } -VEHICLE_STATUS_G2 = { - "status": { +VEHICLE_STATUS_G3 = { + VEHICLE_STATUS: { "AVG_FUEL_CONSUMPTION": 2.3, "DISTANCE_TO_EMPTY_FUEL": 707, "DOOR_BOOT_LOCK_STATUS": "UNKNOWN", @@ -136,6 +146,7 @@ VEHICLE_STATUS_G2 = { "DOOR_REAR_LEFT_POSITION": "CLOSED", "DOOR_REAR_RIGHT_LOCK_STATUS": "UNKNOWN", "DOOR_REAR_RIGHT_POSITION": "CLOSED", + "REMAINING_FUEL_PERCENT": 77, "ODOMETER": 1234, "POSITION_HEADING_DEGREE": 150, "POSITION_SPEED_KMPH": "0", diff --git a/tests/components/subaru/conftest.py b/tests/components/subaru/conftest.py index 94b803fea01..678e8ba5034 100644 --- a/tests/components/subaru/conftest.py +++ b/tests/components/subaru/conftest.py @@ -17,6 +17,8 @@ from homeassistant.components.subaru.const import ( VEHICLE_HAS_REMOTE_SERVICE, VEHICLE_HAS_REMOTE_START, VEHICLE_HAS_SAFETY_SERVICE, + VEHICLE_MODEL_NAME, + VEHICLE_MODEL_YEAR, VEHICLE_NAME, ) from homeassistant.config_entries import ConfigEntryState @@ -40,10 +42,13 @@ MOCK_API_UPDATE_SAVED_PIN = f"{MOCK_API}update_saved_pin" MOCK_API_GET_VEHICLES = f"{MOCK_API}get_vehicles" MOCK_API_VIN_TO_NAME = f"{MOCK_API}vin_to_name" MOCK_API_GET_API_GEN = f"{MOCK_API}get_api_gen" +MOCK_API_GET_MODEL_NAME = f"{MOCK_API}get_model_name" +MOCK_API_GET_MODEL_YEAR = f"{MOCK_API}get_model_year" MOCK_API_GET_EV_STATUS = f"{MOCK_API}get_ev_status" MOCK_API_GET_RES_STATUS = f"{MOCK_API}get_res_status" MOCK_API_GET_REMOTE_STATUS = f"{MOCK_API}get_remote_status" MOCK_API_GET_SAFETY_STATUS = f"{MOCK_API}get_safety_status" +MOCK_API_GET_SUBSCRIPTION_STATUS = f"{MOCK_API}get_subscription_status" MOCK_API_GET_DATA = f"{MOCK_API}get_data" MOCK_API_UPDATE = f"{MOCK_API}update" MOCK_API_FETCH = f"{MOCK_API}fetch" @@ -114,6 +119,12 @@ async def setup_subaru_config_entry( ), patch( MOCK_API_GET_API_GEN, return_value=vehicle_data[VEHICLE_API_GEN], + ), patch( + MOCK_API_GET_MODEL_NAME, + return_value=vehicle_data[VEHICLE_MODEL_NAME], + ), patch( + MOCK_API_GET_MODEL_YEAR, + return_value=vehicle_data[VEHICLE_MODEL_YEAR], ), patch( MOCK_API_GET_EV_STATUS, return_value=vehicle_data[VEHICLE_HAS_EV], @@ -126,6 +137,9 @@ async def setup_subaru_config_entry( ), patch( MOCK_API_GET_SAFETY_STATUS, return_value=vehicle_data[VEHICLE_HAS_SAFETY_SERVICE], + ), patch( + MOCK_API_GET_SUBSCRIPTION_STATUS, + return_value=True, ), patch( MOCK_API_GET_DATA, return_value=vehicle_status, diff --git a/tests/components/subaru/fixtures/diagnostics_config_entry.json b/tests/components/subaru/fixtures/diagnostics_config_entry.json index 32e9ac070be..327b0c48174 100644 --- a/tests/components/subaru/fixtures/diagnostics_config_entry.json +++ b/tests/components/subaru/fixtures/diagnostics_config_entry.json @@ -11,7 +11,7 @@ }, "data": [ { - "status": { + "vehicle_status": { "AVG_FUEL_CONSUMPTION": 2.3, "DISTANCE_TO_EMPTY_FUEL": 707, "DOOR_BOOT_LOCK_STATUS": "UNKNOWN", diff --git a/tests/components/subaru/fixtures/diagnostics_device.json b/tests/components/subaru/fixtures/diagnostics_device.json index c3762925d04..f67be94a171 100644 --- a/tests/components/subaru/fixtures/diagnostics_device.json +++ b/tests/components/subaru/fixtures/diagnostics_device.json @@ -10,7 +10,7 @@ "update_enabled": true }, "data": { - "status": { + "vehicle_status": { "AVG_FUEL_CONSUMPTION": 2.3, "DISTANCE_TO_EMPTY_FUEL": 707, "DOOR_BOOT_LOCK_STATUS": "UNKNOWN", diff --git a/tests/components/subaru/test_init.py b/tests/components/subaru/test_init.py index 1723bd062fc..e82d7a1d72c 100644 --- a/tests/components/subaru/test_init.py +++ b/tests/components/subaru/test_init.py @@ -16,10 +16,10 @@ from homeassistant.setup import async_setup_component from .api_responses import ( TEST_VIN_1_G1, TEST_VIN_2_EV, - TEST_VIN_3_G2, + TEST_VIN_3_G3, VEHICLE_DATA, VEHICLE_STATUS_EV, - VEHICLE_STATUS_G2, + VEHICLE_STATUS_G3, ) from .conftest import ( MOCK_API_FETCH, @@ -43,14 +43,14 @@ async def test_setup_ev(hass: HomeAssistant, ev_entry) -> None: assert check_entry.state is ConfigEntryState.LOADED -async def test_setup_g2(hass: HomeAssistant, subaru_config_entry) -> None: - """Test setup with a G2 vehcile .""" +async def test_setup_g3(hass: HomeAssistant, subaru_config_entry) -> None: + """Test setup with a G3 vehicle .""" await setup_subaru_config_entry( hass, subaru_config_entry, - vehicle_list=[TEST_VIN_3_G2], - vehicle_data=VEHICLE_DATA[TEST_VIN_3_G2], - vehicle_status=VEHICLE_STATUS_G2, + vehicle_list=[TEST_VIN_3_G3], + vehicle_data=VEHICLE_DATA[TEST_VIN_3_G3], + vehicle_status=VEHICLE_STATUS_G3, ) check_entry = hass.config_entries.async_get_entry(subaru_config_entry.entry_id) assert check_entry