Fix BMW Connected Drive (#60938)

* Bump bimmer_connected to 0.8.5

* Always update HA states after service execution

* Fix BMW device tracker & vehicle_finder service

* Add charging_end_time sensor

* Fix pylint & pytest

* Remove unneeded DEFAULT_OPTION

* Revert adding charging_end_time & state_attributes

* Don't delete option data for CONF_USE_LOCATION

* Remove stale string

Co-authored-by: rikroe <rikroe@users.noreply.github.com>
This commit is contained in:
rikroe 2021-12-05 11:20:40 +01:00 committed by GitHub
parent e34d982bdb
commit 380c1a4be9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 18 additions and 25 deletions

View File

@ -35,7 +35,6 @@ from .const import (
CONF_ACCOUNT, CONF_ACCOUNT,
CONF_ALLOWED_REGIONS, CONF_ALLOWED_REGIONS,
CONF_READ_ONLY, CONF_READ_ONLY,
CONF_USE_LOCATION,
DATA_ENTRIES, DATA_ENTRIES,
DATA_HASS_CONFIG, DATA_HASS_CONFIG,
) )
@ -65,7 +64,6 @@ SERVICE_SCHEMA = vol.Schema(
DEFAULT_OPTIONS = { DEFAULT_OPTIONS = {
CONF_READ_ONLY: False, CONF_READ_ONLY: False,
CONF_USE_LOCATION: False,
} }
PLATFORMS = [ PLATFORMS = [
@ -215,13 +213,10 @@ def setup_account(
password: str = entry.data[CONF_PASSWORD] password: str = entry.data[CONF_PASSWORD]
region: str = entry.data[CONF_REGION] region: str = entry.data[CONF_REGION]
read_only: bool = entry.options[CONF_READ_ONLY] read_only: bool = entry.options[CONF_READ_ONLY]
use_location: bool = entry.options[CONF_USE_LOCATION]
_LOGGER.debug("Adding new account %s", name) _LOGGER.debug("Adding new account %s", name)
pos = ( pos = (hass.config.latitude, hass.config.longitude)
(hass.config.latitude, hass.config.longitude) if use_location else (None, None)
)
cd_account = BMWConnectedDriveAccount( cd_account = BMWConnectedDriveAccount(
username, password, region, name, read_only, *pos username, password, region, name, read_only, *pos
) )
@ -258,6 +253,13 @@ def setup_account(
function_call = getattr(vehicle.remote_services, function_name) function_call = getattr(vehicle.remote_services, function_name)
function_call() function_call()
if call.service in [
"find_vehicle",
"activate_air_conditioning",
"deactivate_air_conditioning",
]:
cd_account.update()
if not read_only: if not read_only:
# register the remote services # register the remote services
for service in _SERVICE_MAP: for service in _SERVICE_MAP:

View File

@ -13,7 +13,7 @@ from homeassistant.core import callback
from homeassistant.data_entry_flow import FlowResult from homeassistant.data_entry_flow import FlowResult
from . import DOMAIN from . import DOMAIN
from .const import CONF_ALLOWED_REGIONS, CONF_READ_ONLY, CONF_USE_LOCATION from .const import CONF_ALLOWED_REGIONS, CONF_READ_ONLY
DATA_SCHEMA = vol.Schema( DATA_SCHEMA = vol.Schema(
{ {
@ -115,10 +115,6 @@ class BMWConnectedDriveOptionsFlow(config_entries.OptionsFlow):
CONF_READ_ONLY, CONF_READ_ONLY,
default=self.config_entry.options.get(CONF_READ_ONLY, False), default=self.config_entry.options.get(CONF_READ_ONLY, False),
): bool, ): bool,
vol.Optional(
CONF_USE_LOCATION,
default=self.config_entry.options.get(CONF_USE_LOCATION, False),
): bool,
} }
), ),
) )

View File

@ -35,7 +35,7 @@ async def async_setup_entry(
for vehicle in account.account.vehicles: for vehicle in account.account.vehicles:
entities.append(BMWDeviceTracker(account, vehicle)) entities.append(BMWDeviceTracker(account, vehicle))
if not vehicle.status.is_vehicle_tracking_enabled: if not vehicle.is_vehicle_tracking_enabled:
_LOGGER.info( _LOGGER.info(
"Tracking is (currently) disabled for vehicle %s (%s), defaulting to unknown", "Tracking is (currently) disabled for vehicle %s (%s), defaulting to unknown",
vehicle.name, vehicle.name,
@ -83,6 +83,6 @@ class BMWDeviceTracker(BMWConnectedDriveBaseEntity, TrackerEntity):
self._attr_extra_state_attributes = self._attrs self._attr_extra_state_attributes = self._attrs
self._location = ( self._location = (
self._vehicle.status.gps_position self._vehicle.status.gps_position
if self._vehicle.status.is_vehicle_tracking_enabled if self._vehicle.is_vehicle_tracking_enabled
else None else None
) )

View File

@ -2,7 +2,7 @@
"domain": "bmw_connected_drive", "domain": "bmw_connected_drive",
"name": "BMW Connected Drive", "name": "BMW Connected Drive",
"documentation": "https://www.home-assistant.io/integrations/bmw_connected_drive", "documentation": "https://www.home-assistant.io/integrations/bmw_connected_drive",
"requirements": ["bimmer_connected==0.8.2"], "requirements": ["bimmer_connected==0.8.5"],
"codeowners": ["@gerard33", "@rikroe"], "codeowners": ["@gerard33", "@rikroe"],
"config_flow": true, "config_flow": true,
"iot_class": "cloud_polling" "iot_class": "cloud_polling"

View File

@ -21,8 +21,7 @@
"step": { "step": {
"account_options": { "account_options": {
"data": { "data": {
"read_only": "Read-only (only sensors and notify, no execution of services, no lock)", "read_only": "Read-only (only sensors and notify, no execution of services, no lock)"
"use_location": "Use Home Assistant location for car location polls (required for non i3/i8 vehicles produced before 7/2014)"
} }
} }
} }

View File

@ -387,7 +387,7 @@ beautifulsoup4==4.10.0
bellows==0.29.0 bellows==0.29.0
# homeassistant.components.bmw_connected_drive # homeassistant.components.bmw_connected_drive
bimmer_connected==0.8.2 bimmer_connected==0.8.5
# homeassistant.components.bizkaibus # homeassistant.components.bizkaibus
bizkaibus==0.1.1 bizkaibus==0.1.1

View File

@ -257,7 +257,7 @@ base36==0.1.1
bellows==0.29.0 bellows==0.29.0
# homeassistant.components.bmw_connected_drive # homeassistant.components.bmw_connected_drive
bimmer_connected==0.8.2 bimmer_connected==0.8.5
# homeassistant.components.blebox # homeassistant.components.blebox
blebox_uniapi==1.3.3 blebox_uniapi==1.3.3

View File

@ -3,10 +3,7 @@ from unittest.mock import patch
from homeassistant import config_entries, data_entry_flow from homeassistant import config_entries, data_entry_flow
from homeassistant.components.bmw_connected_drive.config_flow import DOMAIN from homeassistant.components.bmw_connected_drive.config_flow import DOMAIN
from homeassistant.components.bmw_connected_drive.const import ( from homeassistant.components.bmw_connected_drive.const import CONF_READ_ONLY
CONF_READ_ONLY,
CONF_USE_LOCATION,
)
from homeassistant.const import CONF_PASSWORD, CONF_REGION, CONF_USERNAME from homeassistant.const import CONF_PASSWORD, CONF_REGION, CONF_USERNAME
from tests.common import MockConfigEntry from tests.common import MockConfigEntry
@ -28,7 +25,7 @@ FIXTURE_CONFIG_ENTRY = {
CONF_PASSWORD: FIXTURE_USER_INPUT[CONF_PASSWORD], CONF_PASSWORD: FIXTURE_USER_INPUT[CONF_PASSWORD],
CONF_REGION: FIXTURE_USER_INPUT[CONF_REGION], CONF_REGION: FIXTURE_USER_INPUT[CONF_REGION],
}, },
"options": {CONF_READ_ONLY: False, CONF_USE_LOCATION: False}, "options": {CONF_READ_ONLY: False},
"source": config_entries.SOURCE_USER, "source": config_entries.SOURCE_USER,
"unique_id": f"{FIXTURE_USER_INPUT[CONF_REGION]}-{FIXTURE_USER_INPUT[CONF_REGION]}", "unique_id": f"{FIXTURE_USER_INPUT[CONF_REGION]}-{FIXTURE_USER_INPUT[CONF_REGION]}",
} }
@ -137,14 +134,13 @@ async def test_options_flow_implementation(hass):
result = await hass.config_entries.options.async_configure( result = await hass.config_entries.options.async_configure(
result["flow_id"], result["flow_id"],
user_input={CONF_READ_ONLY: False, CONF_USE_LOCATION: False}, user_input={CONF_READ_ONLY: False},
) )
await hass.async_block_till_done() await hass.async_block_till_done()
assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY
assert result["data"] == { assert result["data"] == {
CONF_READ_ONLY: False, CONF_READ_ONLY: False,
CONF_USE_LOCATION: False,
} }
assert len(mock_setup.mock_calls) == 1 assert len(mock_setup.mock_calls) == 1