From 26230002082369a1b28a2d4a2b078c0a4a5ec30b Mon Sep 17 00:00:00 2001 From: Friedrich Fell Date: Sat, 14 Dec 2024 20:10:57 +0100 Subject: [PATCH 1/2] Aiways SoC module --- packages/modules/vehicles/aiways/__init__.py | 0 packages/modules/vehicles/aiways/config.py | 28 ++++++++++ packages/modules/vehicles/aiways/soc.py | 56 ++++++++++++++++++++ 3 files changed, 84 insertions(+) create mode 100644 packages/modules/vehicles/aiways/__init__.py create mode 100644 packages/modules/vehicles/aiways/config.py create mode 100644 packages/modules/vehicles/aiways/soc.py diff --git a/packages/modules/vehicles/aiways/__init__.py b/packages/modules/vehicles/aiways/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/modules/vehicles/aiways/config.py b/packages/modules/vehicles/aiways/config.py new file mode 100644 index 0000000000..19f365e942 --- /dev/null +++ b/packages/modules/vehicles/aiways/config.py @@ -0,0 +1,28 @@ +from typing import Optional + +""" +The attributes for configuration can be retrieved with this guide: +https://community.home-assistant.io/t/read-aiways-u5-state-of-charge/466441/5 +""" + + +class AiwaysVehicleSocConfiguration: + def __init__(self, user_id: Optional[str] = None, vin: Optional[str] = None, device_id: Optional[str] = None, + register_id: Optional[str] = None, token: Optional[str] = None, + condition_url: Optional[str] = "https://coiapp-api-eu.ai-ways.com:10443/app/vc/getCondition") -> None: + self.user_id = user_id + self.vin = vin + self.device_id = device_id + self.register_id = register_id + self.token = token + self.condition_url = condition_url + + +class AiwaysVehicleSoc: + def __init__(self, + name: str = "Aiways SoC module", + type: str = "aiways", + configuration: AiwaysVehicleSocConfiguration = None) -> None: + self.name = name + self.type = type + self.configuration = configuration or AiwaysVehicleSocConfiguration() diff --git a/packages/modules/vehicles/aiways/soc.py b/packages/modules/vehicles/aiways/soc.py new file mode 100644 index 0000000000..1496b7ce45 --- /dev/null +++ b/packages/modules/vehicles/aiways/soc.py @@ -0,0 +1,56 @@ +#!/usr/bin/env python3 +import logging + +from modules.common import req +from modules.common.abstract_device import DeviceDescriptor +from modules.common.abstract_vehicle import VehicleUpdateData +from modules.common.component_state import CarState +from modules.common.configurable_vehicle import ConfigurableVehicle +from modules.vehicles.aiways.config import AiwaysVehicleSoc + +log = logging.getLogger(__name__) + +language = "de" +version = "1.3.0" +platform = "iOS" +apptimezone = "MEZ" +apptimezoneid = "Europe/Berlin" +content_type = "application/json; charset=utf-8" +accept_encoding = "gzip" +user_agent = "okhttp/4.3.1" + + +def fetch(vehicle_config: AiwaysVehicleSoc, vehicle_update_data: VehicleUpdateData) -> CarState: + response = req.get_http_session().post(vehicle_config.configuration.condition_url, timeout=10, + headers={"language": language, + "registerid": vehicle_config.configuration.register_id, + "deviceid": vehicle_config.configuration.device_id, + "version": version, + "platform": platform, + "token": vehicle_config.configuration.token, + "apptimezone": apptimezone, + "apptimezoneid": apptimezoneid, + "content-type": content_type, + "accept-encoding": accept_encoding, + "user-agent": user_agent}, + json={"userId": vehicle_config.configuration.user_id, + "vin": vehicle_config.configuration.vin}, verify=False) + response.raise_for_status() + json = response.json() + soc = float(json['data']['vc']['soc']) + range = float(json['data']['vc']['drivingRange']) + soc_timestamp = float(json['data']['vc']['dataTimeTS']) + return CarState(soc, range, soc_timestamp) + + +def create_vehicle(vehicle_config: AiwaysVehicleSoc, vehicle: int): + def updater(vehicle_update_data: VehicleUpdateData) -> CarState: + return fetch(vehicle_config, vehicle_update_data) + + return ConfigurableVehicle(vehicle_config=vehicle_config, + component_updater=updater, + vehicle=vehicle, + calc_while_charging=False) + + +device_descriptor = DeviceDescriptor(configuration_factory=AiwaysVehicleSoc) From 95c840713923582bef253fa5ea32bc2db6dcef57 Mon Sep 17 00:00:00 2001 From: Friedrich Fell Date: Sat, 4 Jan 2025 22:06:26 +0100 Subject: [PATCH 2/2] removed global variables --- packages/modules/vehicles/aiways/soc.py | 25 ++++++++----------------- 1 file changed, 8 insertions(+), 17 deletions(-) diff --git a/packages/modules/vehicles/aiways/soc.py b/packages/modules/vehicles/aiways/soc.py index 1496b7ce45..d554f4cbb8 100644 --- a/packages/modules/vehicles/aiways/soc.py +++ b/packages/modules/vehicles/aiways/soc.py @@ -10,29 +10,20 @@ log = logging.getLogger(__name__) -language = "de" -version = "1.3.0" -platform = "iOS" -apptimezone = "MEZ" -apptimezoneid = "Europe/Berlin" -content_type = "application/json; charset=utf-8" -accept_encoding = "gzip" -user_agent = "okhttp/4.3.1" - def fetch(vehicle_config: AiwaysVehicleSoc, vehicle_update_data: VehicleUpdateData) -> CarState: response = req.get_http_session().post(vehicle_config.configuration.condition_url, timeout=10, - headers={"language": language, + headers={"language": "de", "registerid": vehicle_config.configuration.register_id, "deviceid": vehicle_config.configuration.device_id, - "version": version, - "platform": platform, + "version": "1.3.0", + "platform": "iOS", "token": vehicle_config.configuration.token, - "apptimezone": apptimezone, - "apptimezoneid": apptimezoneid, - "content-type": content_type, - "accept-encoding": accept_encoding, - "user-agent": user_agent}, + "apptimezone": "MEZ", + "apptimezoneid": "Europe/Berlin", + "content-type": "application/json; charset=utf-8", + "accept-encoding": "gzip", + "user-agent": "okhttp/4.3.1"}, json={"userId": vehicle_config.configuration.user_id, "vin": vehicle_config.configuration.vin}, verify=False) response.raise_for_status()