From 3470fea9b8b7bd36576d17c47d11f8f10a66e8d7 Mon Sep 17 00:00:00 2001 From: Guy Khmelnitsky Date: Sun, 5 Jul 2026 11:35:52 +0300 Subject: [PATCH] fix: API fixes for IEC API --- example.py | 6 +++--- iec_api/data.py | 8 ++++++-- iec_api/iec_client.py | 7 +++++-- iec_api/models/device.py | 8 ++++++-- iec_api/models/device_type.py | 8 +++++++- 5 files changed, 27 insertions(+), 10 deletions(-) diff --git a/example.py b/example.py index 5172832..93cdbab 100755 --- a/example.py +++ b/example.py @@ -67,9 +67,9 @@ async def main(): reading = await client.get_last_meter_reading(customer.bp_number, contracts[0].contract_id) print(reading) - device_in = await client.get_device_in() - if device_in and device_in.devices: - device = device_in.devices[0] + devices = await client.get_devices() + if devices: + device = devices[0] print(device) if device.device_number and device.device_code: diff --git a/iec_api/data.py b/iec_api/data.py index 6a2ea8a..6a291e9 100644 --- a/iec_api/data.py +++ b/iec_api/data.py @@ -425,9 +425,13 @@ async def get_social_discount(session: ClientSession, token: JWT, bp_number: str return SocialDiscount.from_dict(response) -async def get_device_in(session: ClientSession, token: JWT, contract_id: str) -> Optional[DeviceInResponse]: +async def get_device_in( + session: ClientSession, token: JWT, contract_id: str, recaptcha_token: Optional[str] = None +) -> Optional[DeviceInResponse]: """Get device information from DeviceIn endpoint.""" - headers = commons.add_auth_bearer_to_headers(HEADERS_WITH_AUTH, token.id_token) + headers = commons.add_auth_bearer_to_headers(HEADERS_WITH_AUTH.copy(), token.id_token) + if recaptcha_token: + headers["RecaptchaToken"] = recaptcha_token response = await commons.send_get_request( session=session, url=GET_DEVICE_IN_URL.format(contract_id=contract_id), headers=headers ) diff --git a/iec_api/iec_client.py b/iec_api/iec_client.py index e28d100..06747fb 100644 --- a/iec_api/iec_client.py +++ b/iec_api/iec_client.py @@ -667,12 +667,15 @@ async def get_social_discount(self, bp_number: Optional[str] = None) -> Optional return await data.get_social_discount(self._session, self._token, bp_number) - async def get_device_in(self, contract_id: Optional[str] = None) -> Optional[DeviceInResponse]: + async def get_device_in( + self, contract_id: Optional[str] = None, recaptcha_token: Optional[str] = None + ) -> Optional[DeviceInResponse]: """ Get device information for active devices Args: self: The instance of the class. contract_id (str): The Contract ID. Defaults to client's Contract ID. + recaptcha_token (str, optional): Recaptcha token for the DeviceIn endpoint. Returns: DeviceInResponse: Device information including status and device list """ @@ -684,7 +687,7 @@ async def get_device_in(self, contract_id: Optional[str] = None) -> Optional[Dev if not contract_id: raise ValueError("Contract ID must be provided") - return await data.get_device_in(self._session, self._token, contract_id) + return await data.get_device_in(self._session, self._token, contract_id, recaptcha_token) async def get_touz_compatibility( self, contract_id: Optional[str] = None, bp_number: Optional[str] = None diff --git a/iec_api/models/device.py b/iec_api/models/device.py index 7c6b327..4d4a26a 100644 --- a/iec_api/models/device.py +++ b/iec_api/models/device.py @@ -55,7 +55,10 @@ class Device(DataClassDictMixin): device_type: Optional[int] = field(default=None, metadata=field_options(alias="deviceType")) device_number: Optional[str] = field(default=None, metadata=field_options(alias="deviceNumber")) device_code: Optional[str] = field(default=None, metadata=field_options(alias="deviceCode")) - + report_result_status: Optional[int] = field(default=None, metadata=field_options(alias="reportResultStatus")) + disconnect_reason: Optional[str] = field(default=None, metadata=field_options(alias="disconnectReason")) + is_disconnected: Optional[bool] = field(default=None, metadata=field_options(alias="isDisconnected")) + is_electronic: Optional[bool] = field(default=None, metadata=field_options(alias="isElectronic")) @dataclass class ConnectionSize(DataClassDictMixin): @@ -76,9 +79,10 @@ class CounterDevice(DataClassDictMixin): last_mr_type: str = field(metadata=field_options(alias="lastMRType")) last_mr_type_desc: str = field(metadata=field_options(alias="lastMRTypeDesc")) connection_size: ConnectionSize = field(metadata=field_options(alias="connectionSize")) + last_mr_type_code: Optional[int] = field(default=None, metadata=field_options(alias="lastMrTypeCode")) + device_digit_length: Optional[int] = field(default=None, metadata=field_options(alias="deviceDigitLength")) last_mr_date: Optional[date] = field(default=None, metadata=field_options(alias="lastMRDate")) - @dataclass class Devices(DataClassDictMixin): """Devices dataclass.""" diff --git a/iec_api/models/device_type.py b/iec_api/models/device_type.py index 5f51b32..5fd487d 100644 --- a/iec_api/models/device_type.py +++ b/iec_api/models/device_type.py @@ -21,7 +21,10 @@ # "balanceTime": null, # "balanceDate": null, # "isActive": true, -# "numberOfDevices": 1 +# "numberOfDevices": 1, +# "isElectronic": false, +# "disconnectReason": "", +# "isDisconnected": false # }, # "reponseDescriptor": { # "isSuccess": true, @@ -40,6 +43,8 @@ class DeviceType(DataClassDictMixin): device_type: int = field(metadata=field_options(alias="deviceType")) is_active: bool = field(metadata=field_options(alias="isActive")) number_of_devices: int = field(metadata=field_options(alias="numberOfDevices")) + is_electronic: bool = field(metadata=field_options(alias="isElectronic")) + is_disconnected: bool = field(metadata=field_options(alias="isDisconnected")) device_balance: Optional[int] = field(default=None, metadata=field_options(alias="deviceBalance")) estimated_days_by_week: Optional[int] = field(default=None, metadata=field_options(alias="estimatedDaysByWeek")) average_usage_cost_by_week: Optional[int] = field( @@ -51,6 +56,7 @@ class DeviceType(DataClassDictMixin): ) balance_time: Optional[str] = field(default=None, metadata=field_options(alias="balanceTime")) balance_date: Optional[str] = field(default=None, metadata=field_options(alias="balanceDate")) + disconnect_reason: Optional[str] = field(default=None, metadata=field_options(alias="disconnectReason")) decoder = BasicDecoder(ResponseWithDescriptor[DeviceType])