Update to new "b2vapi" of BMW ConnectedDrive (#13305)
* updated to new "b2vapi" of bimmer_connected * updated requirements_all.txt * updated 2 more vehicle names after rebase * cleanup of import statements * found one more broken name... * removed unused constant * cleanup of import statements 2
This commit is contained in:
parent
8bd5f66c57
commit
4d52875229
6 changed files with 44 additions and 37 deletions
|
@ -7,8 +7,8 @@ https://home-assistant.io/components/binary_sensor.bmw_connected_drive/
|
||||||
import asyncio
|
import asyncio
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
from homeassistant.components.bmw_connected_drive import DOMAIN as BMW_DOMAIN
|
|
||||||
from homeassistant.components.binary_sensor import BinarySensorDevice
|
from homeassistant.components.binary_sensor import BinarySensorDevice
|
||||||
|
from homeassistant.components.bmw_connected_drive import DOMAIN as BMW_DOMAIN
|
||||||
|
|
||||||
DEPENDENCIES = ['bmw_connected_drive']
|
DEPENDENCIES = ['bmw_connected_drive']
|
||||||
|
|
||||||
|
@ -45,7 +45,7 @@ class BMWConnectedDriveSensor(BinarySensorDevice):
|
||||||
self._account = account
|
self._account = account
|
||||||
self._vehicle = vehicle
|
self._vehicle = vehicle
|
||||||
self._attribute = attribute
|
self._attribute = attribute
|
||||||
self._name = '{} {}'.format(self._vehicle.modelName, self._attribute)
|
self._name = '{} {}'.format(self._vehicle.name, self._attribute)
|
||||||
self._sensor_name = sensor_name
|
self._sensor_name = sensor_name
|
||||||
self._device_class = device_class
|
self._device_class = device_class
|
||||||
self._state = None
|
self._state = None
|
||||||
|
@ -75,7 +75,7 @@ class BMWConnectedDriveSensor(BinarySensorDevice):
|
||||||
"""Return the state attributes of the binary sensor."""
|
"""Return the state attributes of the binary sensor."""
|
||||||
vehicle_state = self._vehicle.state
|
vehicle_state = self._vehicle.state
|
||||||
result = {
|
result = {
|
||||||
'car': self._vehicle.modelName
|
'car': self._vehicle.name
|
||||||
}
|
}
|
||||||
|
|
||||||
if self._attribute == 'lids':
|
if self._attribute == 'lids':
|
||||||
|
@ -91,6 +91,7 @@ class BMWConnectedDriveSensor(BinarySensorDevice):
|
||||||
|
|
||||||
def update(self):
|
def update(self):
|
||||||
"""Read new state data from the library."""
|
"""Read new state data from the library."""
|
||||||
|
from bimmer_connected.state import LockState
|
||||||
vehicle_state = self._vehicle.state
|
vehicle_state = self._vehicle.state
|
||||||
|
|
||||||
# device class opening: On means open, Off means closed
|
# device class opening: On means open, Off means closed
|
||||||
|
@ -101,9 +102,9 @@ class BMWConnectedDriveSensor(BinarySensorDevice):
|
||||||
self._state = not vehicle_state.all_windows_closed
|
self._state = not vehicle_state.all_windows_closed
|
||||||
# device class safety: On means unsafe, Off means safe
|
# device class safety: On means unsafe, Off means safe
|
||||||
if self._attribute == 'door_lock_state':
|
if self._attribute == 'door_lock_state':
|
||||||
# Possible values: LOCKED, SECURED, SELECTIVELOCKED, UNLOCKED
|
# Possible values: LOCKED, SECURED, SELECTIVE_LOCKED, UNLOCKED
|
||||||
self._state = bool(vehicle_state.door_lock_state.value
|
self._state = vehicle_state.door_lock_state not in \
|
||||||
in ('SELECTIVELOCKED', 'UNLOCKED'))
|
[LockState.LOCKED, LockState.SECURED]
|
||||||
|
|
||||||
def update_callback(self):
|
def update_callback(self):
|
||||||
"""Schedule a state update."""
|
"""Schedule a state update."""
|
||||||
|
|
|
@ -4,30 +4,29 @@ Reads vehicle status from BMW connected drive portal.
|
||||||
For more details about this platform, please refer to the documentation at
|
For more details about this platform, please refer to the documentation at
|
||||||
https://home-assistant.io/components/bmw_connected_drive/
|
https://home-assistant.io/components/bmw_connected_drive/
|
||||||
"""
|
"""
|
||||||
import logging
|
|
||||||
import datetime
|
import datetime
|
||||||
|
import logging
|
||||||
|
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
|
from homeassistant.const import CONF_USERNAME, CONF_PASSWORD
|
||||||
from homeassistant.helpers import discovery
|
from homeassistant.helpers import discovery
|
||||||
from homeassistant.helpers.event import track_utc_time_change
|
from homeassistant.helpers.event import track_utc_time_change
|
||||||
|
|
||||||
import homeassistant.helpers.config_validation as cv
|
import homeassistant.helpers.config_validation as cv
|
||||||
from homeassistant.const import (
|
|
||||||
CONF_USERNAME, CONF_PASSWORD
|
|
||||||
)
|
|
||||||
|
|
||||||
REQUIREMENTS = ['bimmer_connected==0.4.1']
|
REQUIREMENTS = ['bimmer_connected==0.5.0']
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
DOMAIN = 'bmw_connected_drive'
|
DOMAIN = 'bmw_connected_drive'
|
||||||
CONF_VALUES = 'values'
|
CONF_REGION = 'region'
|
||||||
CONF_COUNTRY = 'country'
|
|
||||||
|
|
||||||
ACCOUNT_SCHEMA = vol.Schema({
|
ACCOUNT_SCHEMA = vol.Schema({
|
||||||
vol.Required(CONF_USERNAME): cv.string,
|
vol.Required(CONF_USERNAME): cv.string,
|
||||||
vol.Required(CONF_PASSWORD): cv.string,
|
vol.Required(CONF_PASSWORD): cv.string,
|
||||||
vol.Required(CONF_COUNTRY): cv.string,
|
vol.Required(CONF_REGION): vol.Any('north_america', 'china',
|
||||||
|
'rest_of_world'),
|
||||||
})
|
})
|
||||||
|
|
||||||
CONFIG_SCHEMA = vol.Schema({
|
CONFIG_SCHEMA = vol.Schema({
|
||||||
|
@ -47,9 +46,9 @@ def setup(hass, config):
|
||||||
for name, account_config in config[DOMAIN].items():
|
for name, account_config in config[DOMAIN].items():
|
||||||
username = account_config[CONF_USERNAME]
|
username = account_config[CONF_USERNAME]
|
||||||
password = account_config[CONF_PASSWORD]
|
password = account_config[CONF_PASSWORD]
|
||||||
country = account_config[CONF_COUNTRY]
|
region = account_config[CONF_REGION]
|
||||||
_LOGGER.debug('Adding new account %s', name)
|
_LOGGER.debug('Adding new account %s', name)
|
||||||
bimmer = BMWConnectedDriveAccount(username, password, country, name)
|
bimmer = BMWConnectedDriveAccount(username, password, region, name)
|
||||||
accounts.append(bimmer)
|
accounts.append(bimmer)
|
||||||
|
|
||||||
# update every UPDATE_INTERVAL minutes, starting now
|
# update every UPDATE_INTERVAL minutes, starting now
|
||||||
|
@ -75,12 +74,15 @@ def setup(hass, config):
|
||||||
class BMWConnectedDriveAccount(object):
|
class BMWConnectedDriveAccount(object):
|
||||||
"""Representation of a BMW vehicle."""
|
"""Representation of a BMW vehicle."""
|
||||||
|
|
||||||
def __init__(self, username: str, password: str, country: str,
|
def __init__(self, username: str, password: str, region_str: str,
|
||||||
name: str) -> None:
|
name: str) -> None:
|
||||||
"""Constructor."""
|
"""Constructor."""
|
||||||
from bimmer_connected.account import ConnectedDriveAccount
|
from bimmer_connected.account import ConnectedDriveAccount
|
||||||
|
from bimmer_connected.country_selector import get_region_from_name
|
||||||
|
|
||||||
self.account = ConnectedDriveAccount(username, password, country)
|
region = get_region_from_name(region_str)
|
||||||
|
|
||||||
|
self.account = ConnectedDriveAccount(username, password, region)
|
||||||
self.name = name
|
self.name = name
|
||||||
self._update_listeners = []
|
self._update_listeners = []
|
||||||
|
|
||||||
|
|
|
@ -37,15 +37,15 @@ class BMWDeviceTracker(object):
|
||||||
|
|
||||||
def update(self) -> None:
|
def update(self) -> None:
|
||||||
"""Update the device info."""
|
"""Update the device info."""
|
||||||
dev_id = slugify(self.vehicle.modelName)
|
dev_id = slugify(self.vehicle.name)
|
||||||
_LOGGER.debug('Updating %s', dev_id)
|
_LOGGER.debug('Updating %s', dev_id)
|
||||||
attrs = {
|
attrs = {
|
||||||
'trackr_id': dev_id,
|
'trackr_id': dev_id,
|
||||||
'id': dev_id,
|
'id': dev_id,
|
||||||
'name': self.vehicle.modelName
|
'name': self.vehicle.name
|
||||||
}
|
}
|
||||||
self._see(
|
self._see(
|
||||||
dev_id=dev_id, host_name=self.vehicle.modelName,
|
dev_id=dev_id, host_name=self.vehicle.name,
|
||||||
gps=self.vehicle.state.gps_position, attributes=attrs,
|
gps=self.vehicle.state.gps_position, attributes=attrs,
|
||||||
icon='mdi:car'
|
icon='mdi:car'
|
||||||
)
|
)
|
||||||
|
|
|
@ -37,7 +37,7 @@ class BMWLock(LockDevice):
|
||||||
self._account = account
|
self._account = account
|
||||||
self._vehicle = vehicle
|
self._vehicle = vehicle
|
||||||
self._attribute = attribute
|
self._attribute = attribute
|
||||||
self._name = '{} {}'.format(self._vehicle.modelName, self._attribute)
|
self._name = '{} {}'.format(self._vehicle.name, self._attribute)
|
||||||
self._sensor_name = sensor_name
|
self._sensor_name = sensor_name
|
||||||
self._state = None
|
self._state = None
|
||||||
|
|
||||||
|
@ -59,7 +59,7 @@ class BMWLock(LockDevice):
|
||||||
"""Return the state attributes of the lock."""
|
"""Return the state attributes of the lock."""
|
||||||
vehicle_state = self._vehicle.state
|
vehicle_state = self._vehicle.state
|
||||||
return {
|
return {
|
||||||
'car': self._vehicle.modelName,
|
'car': self._vehicle.name,
|
||||||
'door_lock_state': vehicle_state.door_lock_state.value
|
'door_lock_state': vehicle_state.door_lock_state.value
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -70,7 +70,7 @@ class BMWLock(LockDevice):
|
||||||
|
|
||||||
def lock(self, **kwargs):
|
def lock(self, **kwargs):
|
||||||
"""Lock the car."""
|
"""Lock the car."""
|
||||||
_LOGGER.debug("%s: locking doors", self._vehicle.modelName)
|
_LOGGER.debug("%s: locking doors", self._vehicle.name)
|
||||||
# Optimistic state set here because it takes some time before the
|
# Optimistic state set here because it takes some time before the
|
||||||
# update callback response
|
# update callback response
|
||||||
self._state = STATE_LOCKED
|
self._state = STATE_LOCKED
|
||||||
|
@ -79,7 +79,7 @@ class BMWLock(LockDevice):
|
||||||
|
|
||||||
def unlock(self, **kwargs):
|
def unlock(self, **kwargs):
|
||||||
"""Unlock the car."""
|
"""Unlock the car."""
|
||||||
_LOGGER.debug("%s: unlocking doors", self._vehicle.modelName)
|
_LOGGER.debug("%s: unlocking doors", self._vehicle.name)
|
||||||
# Optimistic state set here because it takes some time before the
|
# Optimistic state set here because it takes some time before the
|
||||||
# update callback response
|
# update callback response
|
||||||
self._state = STATE_UNLOCKED
|
self._state = STATE_UNLOCKED
|
||||||
|
@ -88,13 +88,17 @@ class BMWLock(LockDevice):
|
||||||
|
|
||||||
def update(self):
|
def update(self):
|
||||||
"""Update state of the lock."""
|
"""Update state of the lock."""
|
||||||
_LOGGER.debug("%s: updating data for %s", self._vehicle.modelName,
|
from bimmer_connected.state import LockState
|
||||||
|
|
||||||
|
_LOGGER.debug("%s: updating data for %s", self._vehicle.name,
|
||||||
self._attribute)
|
self._attribute)
|
||||||
vehicle_state = self._vehicle.state
|
vehicle_state = self._vehicle.state
|
||||||
|
|
||||||
# Possible values: LOCKED, SECURED, SELECTIVELOCKED, UNLOCKED
|
# Possible values: LOCKED, SECURED, SELECTIVE_LOCKED, UNLOCKED
|
||||||
self._state = (STATE_LOCKED if vehicle_state.door_lock_state.value
|
self._state = STATE_LOCKED \
|
||||||
in ('LOCKED', 'SECURED') else STATE_UNLOCKED)
|
if vehicle_state.door_lock_state \
|
||||||
|
in [LockState.LOCKED, LockState.SECURED] \
|
||||||
|
else STATE_UNLOCKED
|
||||||
|
|
||||||
def update_callback(self):
|
def update_callback(self):
|
||||||
"""Schedule a state update."""
|
"""Schedule a state update."""
|
||||||
|
|
|
@ -4,8 +4,8 @@ Reads vehicle status from BMW connected drive portal.
|
||||||
For more details about this platform, please refer to the documentation at
|
For more details about this platform, please refer to the documentation at
|
||||||
https://home-assistant.io/components/sensor.bmw_connected_drive/
|
https://home-assistant.io/components/sensor.bmw_connected_drive/
|
||||||
"""
|
"""
|
||||||
import logging
|
|
||||||
import asyncio
|
import asyncio
|
||||||
|
import logging
|
||||||
|
|
||||||
from homeassistant.components.bmw_connected_drive import DOMAIN as BMW_DOMAIN
|
from homeassistant.components.bmw_connected_drive import DOMAIN as BMW_DOMAIN
|
||||||
from homeassistant.helpers.entity import Entity
|
from homeassistant.helpers.entity import Entity
|
||||||
|
@ -51,7 +51,7 @@ class BMWConnectedDriveSensor(Entity):
|
||||||
self._attribute = attribute
|
self._attribute = attribute
|
||||||
self._state = None
|
self._state = None
|
||||||
self._unit_of_measurement = None
|
self._unit_of_measurement = None
|
||||||
self._name = '{} {}'.format(self._vehicle.modelName, self._attribute)
|
self._name = '{} {}'.format(self._vehicle.name, self._attribute)
|
||||||
self._sensor_name = sensor_name
|
self._sensor_name = sensor_name
|
||||||
self._icon = icon
|
self._icon = icon
|
||||||
|
|
||||||
|
@ -88,19 +88,19 @@ class BMWConnectedDriveSensor(Entity):
|
||||||
def device_state_attributes(self):
|
def device_state_attributes(self):
|
||||||
"""Return the state attributes of the binary sensor."""
|
"""Return the state attributes of the binary sensor."""
|
||||||
return {
|
return {
|
||||||
'car': self._vehicle.modelName
|
'car': self._vehicle.name
|
||||||
}
|
}
|
||||||
|
|
||||||
def update(self) -> None:
|
def update(self) -> None:
|
||||||
"""Read new state data from the library."""
|
"""Read new state data from the library."""
|
||||||
_LOGGER.debug('Updating %s', self._vehicle.modelName)
|
_LOGGER.debug('Updating %s', self._vehicle.name)
|
||||||
vehicle_state = self._vehicle.state
|
vehicle_state = self._vehicle.state
|
||||||
self._state = getattr(vehicle_state, self._attribute)
|
self._state = getattr(vehicle_state, self._attribute)
|
||||||
|
|
||||||
if self._attribute in LENGTH_ATTRIBUTES:
|
if self._attribute in LENGTH_ATTRIBUTES:
|
||||||
self._unit_of_measurement = vehicle_state.unit_of_length
|
self._unit_of_measurement = 'km'
|
||||||
elif self._attribute == 'remaining_fuel':
|
elif self._attribute == 'remaining_fuel':
|
||||||
self._unit_of_measurement = vehicle_state.unit_of_volume
|
self._unit_of_measurement = 'l'
|
||||||
else:
|
else:
|
||||||
self._unit_of_measurement = None
|
self._unit_of_measurement = None
|
||||||
|
|
||||||
|
|
|
@ -137,7 +137,7 @@ beautifulsoup4==4.6.0
|
||||||
bellows==0.5.1
|
bellows==0.5.1
|
||||||
|
|
||||||
# homeassistant.components.bmw_connected_drive
|
# homeassistant.components.bmw_connected_drive
|
||||||
bimmer_connected==0.4.1
|
bimmer_connected==0.5.0
|
||||||
|
|
||||||
# homeassistant.components.blink
|
# homeassistant.components.blink
|
||||||
blinkpy==0.6.0
|
blinkpy==0.6.0
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue