From 6f140605af1e7110a8e9842f6accc967ce27737c Mon Sep 17 00:00:00 2001 From: vuffiraa72 Date: Sat, 7 Jun 2025 19:37:15 +0200 Subject: [PATCH 1/2] delete skodaconnect module --- packages/modules/conftest.py | 2 - .../modules/vehicles/skodaconnect/__init__.py | 0 packages/modules/vehicles/skodaconnect/api.py | 89 ------------------- .../vehicles/skodaconnect/config-disabled.py | 26 ------ .../vehicles/skodaconnect/soc-disabled.py | 44 --------- 5 files changed, 161 deletions(-) delete mode 100755 packages/modules/vehicles/skodaconnect/__init__.py delete mode 100755 packages/modules/vehicles/skodaconnect/api.py delete mode 100755 packages/modules/vehicles/skodaconnect/config-disabled.py delete mode 100755 packages/modules/vehicles/skodaconnect/soc-disabled.py diff --git a/packages/modules/conftest.py b/packages/modules/conftest.py index 06b423dcdf..70bb2a186b 100644 --- a/packages/modules/conftest.py +++ b/packages/modules/conftest.py @@ -13,8 +13,6 @@ sys.modules['pkce'] = type(sys)('pkce') sys.modules['msal'] = type(sys)('msal') sys.modules['smb'] = type(sys)('smb') -sys.modules['skodaconnect'] = type(sys)('skodaconnect') -sys.modules['skodaconnect.Connection'] = type(sys)('skodaconnect.Connection') sys.modules['socketserver'] = type(sys)('socketserver') sys.modules['grpc'] = type(sys)('grpc') sys.modules['pycarwings3'] = type(sys)('pycarwings3') diff --git a/packages/modules/vehicles/skodaconnect/__init__.py b/packages/modules/vehicles/skodaconnect/__init__.py deleted file mode 100755 index e69de29bb2..0000000000 diff --git a/packages/modules/vehicles/skodaconnect/api.py b/packages/modules/vehicles/skodaconnect/api.py deleted file mode 100755 index 7c40d772eb..0000000000 --- a/packages/modules/vehicles/skodaconnect/api.py +++ /dev/null @@ -1,89 +0,0 @@ -#!/usr/bin/env python3 - -import aiohttp -import asyncio -import logging -from dataclass_utils import asdict -from helpermodules.pub import Pub -from modules.vehicles.skodaconnect.config import SkodaConnect, SkodaConnectConfiguration -from skodaconnect import Connection -from typing import Union - - -log = logging.getLogger("soc."+__name__) - - -class SkodaConnectApi(): - - def __init__(self, conf: SkodaConnect, vehicle: int) -> None: - self.user_id = conf.configuration.user_id - self.password = conf.configuration.password - self.vin = conf.configuration.vin - self.refresh_token = conf.configuration.refresh_token - self.vehicle = vehicle - - def fetch_soc(self) -> Union[int, float]: - # prepare and call async method - loop = asyncio.new_event_loop() - asyncio.set_event_loop(loop) - - soc, range = loop.run_until_complete(self._fetch_soc()) - return soc, range - - async def _fetch_soc(self) -> Union[int, float]: - async with aiohttp.ClientSession(headers={'Connection': 'keep-alive'}) as session: - soc = 0 - range = 0.0 - login_success = False - - log.debug(f"Initiating new session to Skoda Connect with {self.user_id} as username") - try: - connection = Connection(session, self.user_id, self.password) - if self.refresh_token is not None: - log.debug("Attempting restore of tokens") - if await connection.restore_tokens(self.refresh_token): - log.debug("Token restore succeeded") - login_success = True - - if not login_success: - log.debug("Attempting to login to the Skoda Connect service") - login_success = await connection.doLogin() - except Exception: - log.exception("Login failed!") - - if login_success: - log.debug('Login success!') - tokens = await connection.save_tokens() - log.debug('Fetching charging data.') - chargingState = await connection.getCharging(self.vin) - if chargingState: - if 'error_description' in chargingState: - log.error(f"Failed to fetch charging data: {chargingState.get('error_description')}") - if 'battery' in chargingState: - batteryState = chargingState.get('battery') - soc = batteryState.get('stateOfChargeInPercent') - log.debug(f"Battery level: {soc}") - range = int(batteryState.get('cruisingRangeElectricInMeters'))/1000 - log.debug(f"Electric range: {range}") - if tokens: - self._persist_refresh_tokens(tokens) - elif self.refresh_token is not None: - # token seems to be invalid - self._persist_refresh_tokens(None) - return soc, range - - def _persist_refresh_tokens(self, tokens: dict) -> None: - log.debug('Persist refresh tokens.') - conf = SkodaConnect( - configuration=SkodaConnectConfiguration( - self.user_id, - self.password, - self.vin, - tokens)) - self._publish_refresh_tokens(asdict(conf)) - - def _publish_refresh_tokens(self, config={}) -> None: - try: - Pub().pub("openWB/set/vehicle/" + self.vehicle + "/soc_module/config", config) - except Exception as e: - log.exception('Token mqtt write exception ' + str(e)) diff --git a/packages/modules/vehicles/skodaconnect/config-disabled.py b/packages/modules/vehicles/skodaconnect/config-disabled.py deleted file mode 100755 index fae080e27a..0000000000 --- a/packages/modules/vehicles/skodaconnect/config-disabled.py +++ /dev/null @@ -1,26 +0,0 @@ -from typing import Optional - - -class SkodaConnectConfiguration: - def __init__(self, - user_id: Optional[str] = None, # show in UI - password: Optional[str] = None, # show in UI - vin: Optional[str] = None, # show in UI - refresh_token: Optional[dict] = None # DON'T show in UI! - ): - self.user_id = user_id - self.password = password - self.vin = vin - self.refresh_token = refresh_token - - -class SkodaConnect: - def __init__(self, - name: str = "SkodaConnect", - type: str = "skodaconnect", - official: bool = False, - configuration: SkodaConnectConfiguration = None) -> None: - self.name = name - self.type = type - self.official = official - self.configuration = configuration or SkodaConnectConfiguration() diff --git a/packages/modules/vehicles/skodaconnect/soc-disabled.py b/packages/modules/vehicles/skodaconnect/soc-disabled.py deleted file mode 100755 index 138ad3f8b7..0000000000 --- a/packages/modules/vehicles/skodaconnect/soc-disabled.py +++ /dev/null @@ -1,44 +0,0 @@ -from typing import Union, List - -import logging - -from dataclass_utils import dataclass_from_dict -from helpermodules.cli import run_using_positional_cli_args -from modules.common import store -from modules.common.abstract_device import DeviceDescriptor -from modules.common.abstract_vehicle import AbstractSoc -from modules.common.component_context import SingleComponentUpdateContext -from modules.common.component_state import CarState -from modules.common.fault_state import ComponentInfo, FaultState -from modules.vehicles.skodaconnect.api import SkodaConnectApi -from modules.vehicles.skodaconnect.config import SkodaConnect, SkodaConnectConfiguration - - -log = logging.getLogger("soc."+__name__) - - -class Soc(AbstractSoc): - def __init__(self, device_config: Union[dict, SkodaConnect], vehicle: int): - self.config = dataclass_from_dict(SkodaConnect, device_config) - self.vehicle = vehicle - self.store = store.get_car_value_store(self.vehicle) - self.fault_state = FaultState(ComponentInfo(self.vehicle, self.config.name, "vehicle")) - - def update(self, charge_state: bool = False) -> None: - with SingleComponentUpdateContext(self.fault_state): - soc, range = SkodaConnectApi(self.config, self.vehicle).fetch_soc() - self.store.set(CarState(soc, range)) - - -def skodaconnect_update(user_id: str, password: str, vin: str, refresh_token: str, charge_point: int): - log.debug("skodaconnect: user_id="+user_id+"vin="+vin+"charge_point="+str(charge_point)) - Soc( - SkodaConnect(configuration=SkodaConnectConfiguration(user_id, password, vin, refresh_token)), - charge_point).update() - - -def main(argv: List[str]): - run_using_positional_cli_args(skodaconnect_update, argv) - - -device_descriptor = DeviceDescriptor(configuration_factory=SkodaConnect) From fca936dc8c0df0f1e7c1e46a6d599631e2cac874 Mon Sep 17 00:00:00 2001 From: vuffiraa72 Date: Sat, 7 Jun 2025 19:37:39 +0200 Subject: [PATCH 2/2] remove unused dependency from requirements --- requirements.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 687e6239ee..6785508443 100644 --- a/requirements.txt +++ b/requirements.txt @@ -10,7 +10,6 @@ schedule==1.1.0 PyJWT==2.6.0 bs4==0.0.1 pkce==1.0.3 -# skodaconnect==1.3.4 evdev==1.5.0 cryptography==44.0.1 msal==1.31.1