Skip to content

Commit 26d9baf

Browse files
committed
#296: Detect charging from BMS instead of car state
1 parent 149a792 commit 26d9baf

File tree

10 files changed

+126
-45
lines changed

10 files changed

+126
-45
lines changed

poetry.lock

Lines changed: 37 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ classifiers = [
2222

2323
[tool.poetry.dependencies]
2424
python = "^3.12"
25-
saic-ismart-client-ng = "0.5.4"
25+
saic-ismart-client-ng = "0.6.0"
2626
httpx = "^0.27.0"
2727
gmqtt = "^0.7.0"
2828
inflection = "^0.5.1"
@@ -47,7 +47,8 @@ build-backend = "poetry.core.masonry.api"
4747
norecursedirs = ".git build dist"
4848
testpaths = "tests"
4949
pythonpath = [
50-
"src"
50+
"src",
51+
"tests"
5152
]
5253
mock_use_standalone_module = true
5354
addopts = [

src/handlers/vehicle.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,6 @@ async def handle_vehicle(self) -> None:
124124

125125
async def __polling(self):
126126
vehicle_status = await self.update_vehicle_status()
127-
charge_status = None
128127

129128
if self.vehicle_state.is_ev:
130129
try:

src/integrations/abrp/api.py

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -45,21 +45,21 @@ def __init__(self, abrp_api_key: str, abrp_user_token: str, listener: Optional[A
4545
async def update_abrp(self, vehicle_status: VehicleStatusResp, charge_info: ChrgMgmtDataResp) \
4646
-> Tuple[bool, Any | None]:
4747

48-
charge_status = None if charge_info is None else charge_info.chrgMgmtData
48+
charge_mgmt_data = None if charge_info is None else charge_info.chrgMgmtData
49+
charge_status = None if charge_info is None else charge_info.rvsChargeStatus
4950

5051
if (
5152
self.abrp_api_key is not None
5253
and self.abrp_user_token is not None
5354
and vehicle_status is not None
54-
and charge_status is not None
55+
and charge_mgmt_data is not None
5556
):
5657
# Request
5758
tlm_send_url = f'{self.__base_uri}tlm/send'
5859
data = {
5960
# Guess the timestamp from either the API, GPS info or current machine time
6061
'utc': int(get_update_timestamp(vehicle_status).timestamp()),
61-
'soc': (charge_status.bmsPackSOCDsp / 10.0),
62-
'is_charging': vehicle_status.is_charging,
62+
'soc': (charge_mgmt_data.bmsPackSOCDsp / 10.0),
6363
'is_parked': vehicle_status.is_parked,
6464
}
6565

@@ -71,14 +71,21 @@ async def update_abrp(self, vehicle_status: VehicleStatusResp, charge_info: Chrg
7171

7272
# Skip invalid current values reported by the API
7373
is_valid_current = (
74-
charge_status.bmsPackCrntV != 1
75-
and value_in_range(charge_status.bmsPackCrnt, 0, 65535)
74+
charge_mgmt_data.bmsPackCrntV != 1
75+
and value_in_range(charge_mgmt_data.bmsPackCrnt, 0, 65535)
7676
)
7777
if is_valid_current:
78+
is_charging = (
79+
charge_status is not None
80+
and charge_status.chargingGunState
81+
and is_valid_current
82+
and charge_mgmt_data.decoded_current < 0
83+
)
7884
data.update({
79-
'power': charge_status.decoded_power,
80-
'voltage': charge_status.decoded_voltage,
81-
'current': charge_status.decoded_current
85+
'power': charge_mgmt_data.decoded_power,
86+
'voltage': charge_mgmt_data.decoded_voltage,
87+
'current': charge_mgmt_data.decoded_current,
88+
'is_charging': is_charging,
8289
})
8390

8491
basic_vehicle_status = vehicle_status.basicVehicleStatus

src/integrations/osmand/api.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ async def update_osmand(self, vehicle_status: VehicleStatusResp, charge_info: Ch
5656
'id': self.__device_id,
5757
# Guess the timestamp from either the API, GPS info or current machine time
5858
'timestamp': int(get_update_timestamp(vehicle_status).timestamp()),
59-
'is_charging': vehicle_status.is_charging,
6059
'is_parked': vehicle_status.is_parked,
6160
}
6261

@@ -85,10 +84,17 @@ async def update_osmand(self, vehicle_status: VehicleStatusResp, charge_info: Ch
8584
and value_in_range(charge_mgmt_data.bmsPackCrnt, 0, 65535)
8685
)
8786
if is_valid_current:
87+
is_charging = (
88+
charge_status is not None
89+
and charge_status.chargingGunState
90+
and is_valid_current
91+
and charge_mgmt_data.decoded_current < 0
92+
)
8893
data.update({
8994
'power': charge_mgmt_data.decoded_power,
9095
'voltage': charge_mgmt_data.decoded_voltage,
91-
'current': charge_mgmt_data.decoded_current
96+
'current': charge_mgmt_data.decoded_current,
97+
'is_charging': is_charging
9298
})
9399

94100
# Extract electric range if available

src/log_config.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,12 @@
44
from typing import Optional
55

66
MODULES_DEFAULT_LOG_LEVEL = {
7-
'httpx': 'WARNING',
7+
'asyncio': 'WARNING',
88
'gmqtt': 'WARNING',
9+
'httpcore': 'WARNING',
10+
'httpx': 'WARNING',
911
'saic_ismart_client_ng': 'WARNING',
12+
'tzlocal': 'WARNING',
1013
}
1114

1215
MODULES_REPLACE_ENV_PREFIX = {
@@ -28,6 +31,7 @@ def get_module_log_level(module_name: str) -> Optional[str]:
2831
env_prefix = MODULES_REPLACE_ENV_PREFIX.get(module_name, module_name.upper().replace('.', '_'))
2932
return os.getenv(f'{env_prefix}_LOG_LEVEL', default_log_level)
3033

34+
3135
def setup_logging():
3236
logger = logging.getLogger(__name__)
3337
# Read the default log level from the environment

0 commit comments

Comments
 (0)