Skip to content

Commit 6ff597c

Browse files
committed
0.5.3: Initial V2X support
1 parent 4ad0c9b commit 6ff597c

File tree

4 files changed

+85
-2
lines changed

4 files changed

+85
-2
lines changed

.gitignore

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,4 +188,7 @@ fabric.properties
188188

189189
tests/test_saic_api_no_mock.py
190190
run_decoder.sh
191-
junit/
191+
junit/
192+
193+
# CodeBuddy
194+
.codebuddy/

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[tool.poetry]
22
name = "saic_ismart_client_ng"
33
homepage = "https://github.com/SAIC-iSmart-API/saic-python-client-ng"
4-
version = "0.5.2"
4+
version = "0.5.3"
55
description = "SAIC next gen client library (MG iSMART)"
66
authors = [
77
"Giovanni Condello <[email protected]>",

src/saic_ismart_client_ng/api/vehicle_charging/__init__.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,14 @@ async def control_charging(self, vin: str, *, stop_charging: bool) -> ChargingCo
5555
)
5656
return await self.send_vehicle_charging_control(vin, body)
5757

58+
async def control_v2x(self, vin: str, *, stop_v2x: bool) -> ChargingControlResp:
59+
body = ChargingControlRequest(
60+
chrgCtrlReq=0,
61+
tboxV2XReq=2 if stop_v2x else 1,
62+
tboxEleccLckCtrlReq=0,
63+
)
64+
return await self.send_vehicle_charging_control(vin, body)
65+
5866
async def send_vehicle_charging_reservation(
5967
self,
6068
vin: str,
@@ -170,6 +178,15 @@ async def send_vehicle_charging_settings(self, vin: str, body: ChargingSettingRe
170178
out_type=ChargingSettingResp
171179
)
172180

181+
async def get_vehicle_charging_settings(self, vin: str) -> ChargingSettingResp:
182+
body = ChargingSettingRequest(
183+
altngChrgCrntReq=0,
184+
onBdChrgTrgtSOCReq=0,
185+
tboxV2XSpSOCReq=0,
186+
vin=sha256_hex_digest(vin)
187+
)
188+
return await self.send_vehicle_charging_settings(vin, body)
189+
173190
async def set_target_battery_soc(
174191
self,
175192
vin: str,
@@ -183,3 +200,16 @@ async def set_target_battery_soc(
183200
vin=sha256_hex_digest(vin)
184201
)
185202
return await self.send_vehicle_charging_settings(vin, body)
203+
204+
async def set_v2x_target_battery_soc(
205+
self,
206+
vin: str,
207+
target_soc: TargetBatteryCode
208+
) -> ChargingSettingResp:
209+
body = ChargingSettingRequest(
210+
onBdChrgTrgtSOCReq=0,
211+
altngChrgCrntReq=0,
212+
tboxV2XSpSOCReq=target_soc.value,
213+
vin=sha256_hex_digest(vin)
214+
)
215+
return await self.send_vehicle_charging_settings(vin, body)

src/saic_ismart_client_ng/api/vehicle_charging/schema.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ def to_code(code: int):
104104

105105

106106
class TargetBatteryCode(Enum):
107+
P_IGNORE = 0
107108
P_40 = 1
108109
P_50 = 2
109110
P_60 = 3
@@ -257,6 +258,14 @@ def charge_target_soc(self) -> Optional[TargetBatteryCode]:
257258
except ValueError:
258259
return None
259260

261+
@property
262+
def charge_current_limit(self) -> Optional[ChargeCurrentLimitCode]:
263+
raw_charge_current_limit = self.bmsAltngChrgCrntDspCmd
264+
try:
265+
return ChargeCurrentLimitCode(raw_charge_current_limit)
266+
except ValueError:
267+
return None
268+
260269
@property
261270
def is_battery_heating(self) -> bool:
262271
return self.bmsPTCHeatReqDspCmd == 1
@@ -349,6 +358,30 @@ class ChargingSettingResp:
349358
def rvc_req_sts_decoded(self) -> Optional[bytes]:
350359
return decode_bytes(input_value=self.rvcReqSts, field_name='rvcReqSts')
351360

361+
@property
362+
def charge_target_soc(self) -> Optional[TargetBatteryCode]:
363+
raw_target_soc = self.bmsOnBdChrgTrgtSOCDspCmd
364+
try:
365+
return TargetBatteryCode(raw_target_soc)
366+
except ValueError:
367+
return None
368+
369+
@property
370+
def charge_current_limit(self) -> Optional[ChargeCurrentLimitCode]:
371+
raw_charge_current_limit = self.bmsAltngChrgCrntDspCmd
372+
try:
373+
return ChargeCurrentLimitCode(raw_charge_current_limit)
374+
except ValueError:
375+
return None
376+
377+
@property
378+
def v2x_target_soc(self) -> Optional[TargetBatteryCode]:
379+
raw_target_soc = self.imcuDschrgTrgtSOCDspCmd
380+
try:
381+
return TargetBatteryCode(raw_target_soc)
382+
except ValueError:
383+
return None
384+
352385

353386
@dataclass
354387
class ScheduledChargingRequest:
@@ -399,6 +432,7 @@ def heating_stop_reason(self) -> HeatingStopReason | None:
399432
return HeatingStopReason.to_code(self.ptcHeatResp)
400433
return None
401434

435+
402436
@dataclass
403437
class ChargingControlRequest:
404438
chrgCtrlReq: int = None
@@ -477,6 +511,22 @@ def charge_target_soc(self) -> Optional[TargetBatteryCode]:
477511
except ValueError:
478512
return None
479513

514+
@property
515+
def charge_current_limit(self) -> Optional[ChargeCurrentLimitCode]:
516+
raw_charge_current_limit = self.bmsAltngChrgCrntDspCmd
517+
try:
518+
return ChargeCurrentLimitCode(raw_charge_current_limit)
519+
except ValueError:
520+
return None
521+
522+
@property
523+
def v2x_target_soc(self) -> Optional[TargetBatteryCode]:
524+
raw_target_soc = self.imcuDschrgTrgtSOCDspCmd
525+
try:
526+
return TargetBatteryCode(raw_target_soc)
527+
except ValueError:
528+
return None
529+
480530
@property
481531
def is_battery_heating(self) -> bool:
482532
return self.bmsPTCHeatReqDspCmd == 1

0 commit comments

Comments
 (0)