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..d554f4cbb8 --- /dev/null +++ b/packages/modules/vehicles/aiways/soc.py @@ -0,0 +1,47 @@ +#!/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__) + + +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": "de", + "registerid": vehicle_config.configuration.register_id, + "deviceid": vehicle_config.configuration.device_id, + "version": "1.3.0", + "platform": "iOS", + "token": vehicle_config.configuration.token, + "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() + 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)