From 26230002082369a1b28a2d4a2b078c0a4a5ec30b Mon Sep 17 00:00:00 2001 From: Friedrich Fell Date: Sat, 14 Dec 2024 20:10:57 +0100 Subject: [PATCH] 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)