From 9b8041b7fe3795f79438c8ff0f016f2f99772623 Mon Sep 17 00:00:00 2001 From: Brendan Dahl Date: Fri, 26 Nov 2021 12:14:55 -0500 Subject: [PATCH] feat: set charge limits (usa kia) (#169) * feat: set charge limits (usa kia) * fix: remove excess comments --- README.md | 1 + custom_components/kia_uvo/KiaUvoAPIUSA.py | 19 +++++++++++++++ custom_components/kia_uvo/KiaUvoApiImpl.py | 3 +++ custom_components/kia_uvo/Vehicle.py | 10 ++++++++ custom_components/kia_uvo/__init__.py | 9 ++++++++ custom_components/kia_uvo/services.yaml | 27 ++++++++++++++++++++++ 6 files changed, 69 insertions(+) diff --git a/README.md b/README.md index d1167193..83c9ef1f 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,7 @@ You can install this either manually copying files or using HACS. Configuration - force_update: this will make a call to your vehicle to get its latest data, do not overuse this! - start_climate / stop_climate: I am not able to test this as I own an PHEV but looking for volunteers to help on this - start_charge / stop_charge: You can control your charging using these services +- set_charge_limits: You can control your charging capacity limits using this services I have posted an example screenshot from my own car. diff --git a/custom_components/kia_uvo/KiaUvoAPIUSA.py b/custom_components/kia_uvo/KiaUvoAPIUSA.py index 0bd18011..1df906f5 100644 --- a/custom_components/kia_uvo/KiaUvoAPIUSA.py +++ b/custom_components/kia_uvo/KiaUvoAPIUSA.py @@ -409,3 +409,22 @@ def stop_charge(self, token: Token): token=token, url=url ) self.last_action_xid = response.headers["Xid"] + + def set_charge_limits(self, token: Token, ac_limit: int, dc_limit: int): + url = self.API_URL + "evc/sts" + body = { + "targetSOClist": [ + { + "plugType": 0, + "targetSOClevel": dc_limit, + }, + { + "plugType": 1, + "targetSOClevel": ac_limit, + }, + ] + } + response = self.post_request_with_logging_and_active_session( + token=token, url=url, json_body=body + ) + self.last_action_xid = response.headers["Xid"] diff --git a/custom_components/kia_uvo/KiaUvoApiImpl.py b/custom_components/kia_uvo/KiaUvoApiImpl.py index fed35c72..0d481f22 100644 --- a/custom_components/kia_uvo/KiaUvoApiImpl.py +++ b/custom_components/kia_uvo/KiaUvoApiImpl.py @@ -78,6 +78,9 @@ def start_charge(self, token: Token): def stop_charge(self, token: Token): pass + def set_charge_limits(self, token: Token, ac_limit: int, dc_limit: int): + pass + def get_timezone_by_region(self) -> tzinfo: if REGIONS[self.region] == REGION_CANADA: return dt_util.UTC diff --git a/custom_components/kia_uvo/Vehicle.py b/custom_components/kia_uvo/Vehicle.py index 8a5d64e5..a9d768c9 100644 --- a/custom_components/kia_uvo/Vehicle.py +++ b/custom_components/kia_uvo/Vehicle.py @@ -226,6 +226,16 @@ async def stop_charge(self): await self.hass.async_add_executor_job(self.kia_uvo_api.stop_charge, self.token) await self.force_update_loop_start() + async def set_charge_limits(self, ac_limit: int, dc_limit: int): + if ac_limit is None: + ac_limit = 90 + if dc_limit is None: + dc_limit = 90 + await self.hass.async_add_executor_job( + self.kia_uvo_api.set_charge_limits, self.token, ac_limit, dc_limit + ) + await self.force_update_loop_start() + def login(self): self.token = self.kia_uvo_api.login() diff --git a/custom_components/kia_uvo/__init__.py b/custom_components/kia_uvo/__init__.py index 1296e0c0..1932140c 100644 --- a/custom_components/kia_uvo/__init__.py +++ b/custom_components/kia_uvo/__init__.py @@ -103,12 +103,21 @@ async def async_handle_stop_charge(call): vehicle: Vehicle = hass.data[DOMAIN][DATA_VEHICLE_INSTANCE] await vehicle.stop_charge() + async def async_handle_set_charge_limits(call): + ac_limit = call.data.get("ac_limit") + dc_limit = call.data.get("dc_limit") + vehicle: Vehicle = hass.data[DOMAIN][DATA_VEHICLE_INSTANCE] + await vehicle.set_charge_limits(ac_limit, dc_limit) + hass.services.async_register(DOMAIN, "force_update", async_handle_force_update) hass.services.async_register(DOMAIN, "update", async_handle_update) hass.services.async_register(DOMAIN, "start_climate", async_handle_start_climate) hass.services.async_register(DOMAIN, "stop_climate", async_handle_stop_climate) hass.services.async_register(DOMAIN, "start_charge", async_handle_start_charge) hass.services.async_register(DOMAIN, "stop_charge", async_handle_stop_charge) + hass.services.async_register( + DOMAIN, "set_charge_limits", async_handle_set_charge_limits + ) return True diff --git a/custom_components/kia_uvo/services.yaml b/custom_components/kia_uvo/services.yaml index 36cc15ff..a8e971ce 100644 --- a/custom_components/kia_uvo/services.yaml +++ b/custom_components/kia_uvo/services.yaml @@ -64,3 +64,30 @@ lock: description: Lock the vehicle unlock: description: Unlock the vehicle +set_charge_limits: + description: sets ac and dc charge capacity limits + fields: + dc_limit: + name: DC Charge limit + description: max charge capacity using DC charger + required: false + example: 50 + default: 90 + selector: + number: + min: 50 + max: 100 + step: 10 + unit_of_measurement: '%' + ac_limit: + name: AC Charge limit + description: max charge capacity using AC charger + required: false + example: 50 + default: 90 + selector: + number: + min: 50 + max: 100 + step: 10 + unit_of_measurement: '%'