From cebb666460d48156c814d722084218bb24ed6369 Mon Sep 17 00:00:00 2001 From: hultenvp <61835400+hultenvp@users.noreply.github.com> Date: Sat, 3 Jan 2026 13:27:38 +0100 Subject: [PATCH 1/7] Remove EnumType --- soliscloud_api/types.py | 48 ++++++----------------------------------- 1 file changed, 7 insertions(+), 41 deletions(-) diff --git a/soliscloud_api/types.py b/soliscloud_api/types.py index f260e86..3c15501 100644 --- a/soliscloud_api/types.py +++ b/soliscloud_api/types.py @@ -323,40 +323,6 @@ def _normalize(self): pass -class EnumType(UserDict): - - def __init__(self, value: IntEnum): - if isinstance(value, IntEnum): - super().__init__( - {'value': value.value, 'name': value.name.title()}) - else: - raise TypeError(f"{value} not of type IntEnum") - - def __str__(self): - s = f"{self['value']}" - if self['name'] is not None: - s += f" {self['name']}" - return s + f" ({self.__class__.__name__})" - - def __eq__(self, other): - if isinstance(other, self.__class__): - return self.value == other.value and self.name == other.name - elif isinstance(other, int): - return self.value == other - elif isinstance(other, str): - return self.name == other - else: - return False - - @property - def value(self): - return self['value'] - - @property - def name(self): - return self['name'] - - class ListType(UserList): def __init__(self, value): if type(value) is list: @@ -588,21 +554,21 @@ def _create_typed_value( else: match(key): case 'state' | 'current_state': - p = EnumType(State(int(value))) + p = State(int(value)) case 'state_exception_flag': - p = EnumType(InverterOfflineState(value)) + p = InverterOfflineState(value) case 'ac_output_type': - p = EnumType(AcOutputType(0 if int(value) == 0 else 1)) + p = AcOutputType(0 if int(value) == 0 else 1) case 'inverter_meter_model': - p = EnumType(InverterModel(int(value))) + p = InverterModel(int(value)) case 'station_type': - p = EnumType(PlantType(int(value))) + p = PlantType(int(value)) case 'type': match(type): case EntityType.PLANT: - p = EnumType(PlantType(int(value))) + p = PlantType(int(value)) case EntityType.INVERTER: - p = EnumType(InverterType(int(value))) + p = InverterType(int(value)) case _: p = int(value) case _ if re.search('pec$|percent$', key, re.IGNORECASE) is not None: # noqa: E501 From fd22665f0c6e91389a2508e7d9acbb8bcdb063aa Mon Sep 17 00:00:00 2001 From: hultenvp <61835400+hultenvp@users.noreply.github.com> Date: Sat, 3 Jan 2026 13:28:32 +0100 Subject: [PATCH 2/7] Change inverter state name assertion to uppercase --- test/test_entities.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_entities.py b/test/test_entities.py index 5587115..8028fbc 100644 --- a/test/test_entities.py +++ b/test/test_entities.py @@ -20,7 +20,7 @@ def validate_inverter(inverter: Inverter, inverter_data: dict): assert inverter.inverter_id == inverter_data['id'] assert inverter.data_timestamp == int(inverter_data['dataTimestamp'])/1e3 assert inverter.data["state"].value == 1 - assert inverter.data["state"].name == "Online" + assert inverter.data["state"].name == "ONLINE" assert inverter.data["power"].value == 1500 assert inverter.data["power"].unit == "W" From d63de60148c6f1dd67f0297b85592fe50db123de Mon Sep 17 00:00:00 2001 From: hultenvp <61835400+hultenvp@users.noreply.github.com> Date: Sat, 3 Jan 2026 13:29:45 +0100 Subject: [PATCH 3/7] Change to IntEnum and type names to uppercase Updated assertions to reflect enum naming conventions. --- test/test_types_factory.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/test/test_types_factory.py b/test/test_types_factory.py index 20704d9..29d5852 100644 --- a/test/test_types_factory.py +++ b/test/test_types_factory.py @@ -8,10 +8,10 @@ PowerType, EnergyType, CurrencyType, - EnumType, FrequencyType, ) from datetime import datetime +from enum import IntEnum mocked_inverter_data_units = { "dcInputtype": 2, @@ -120,12 +120,12 @@ def test_solis_data_factory_inverter_nested(mocker): inverter = SolisDataFactory.create( EntityType.INVERTER, mocked_inverter_nested) assert inverter["state"].value == 1 - assert inverter["state"].name == "Online" + assert inverter["state"].name == "ONLINE" assert inverter["inverter_id"] == 12345 assert inverter["inverter_name"] == "Test Inverter" assert inverter["data_timestamp"] == datetime.fromtimestamp(1687924800) assert inverter["type"].value == 1 - assert inverter["type"].name == "Grid" + assert inverter["type"].name == "GRID" nested_list = inverter["nested_list"] assert nested_list[0]["inverter_id"] == 1 assert nested_list[0]["inverter_name"] == "Inverter 1" @@ -168,16 +168,16 @@ def test_solis_data_factory_inverter_no_units(mocker): assert inverter["year_income"].unit == "EUR" assert inverter["money"] == "EUR" assert inverter["state"].value == 1 - assert inverter["state"].name == "Online" + assert inverter["state"].name == "ONLINE" assert inverter["inverter_id"] == 12345 assert inverter["inverter_name"] == "Test Inverter" assert inverter["ac_output_power"].value == 3000 assert inverter["ac_output_power"].unit == "W" assert inverter["data_timestamp"] == datetime.fromtimestamp(1687924800) assert inverter["state_exception_flag"].value == 0 - assert inverter["state_exception_flag"].name == "Normal_Offline" + assert inverter["state_exception_flag"].name == "NORMAL_OFFLINE" assert inverter["type"].value == 1 - assert inverter["type"].name == "Grid" + assert inverter["type"].name == "GRID" assert inverter["voltage"].value == 230 assert inverter["voltage"].unit == "V" assert inverter["current"].value == 10 @@ -241,19 +241,19 @@ def test_solis_data_factory_inverter(mocker): assert inverter["pow_1"].value == 0 assert inverter["pow_1"].unit == 'W' assert not hasattr(inverter, 'pow2') - assert isinstance(inverter["current_state"], EnumType) + assert isinstance(inverter["current_state"], IntEnum) assert inverter["year_income"].value == 115.21 assert inverter["year_income"].unit == "EUR" assert inverter["money"] == "EUR" assert inverter["state"].value == 1 - assert inverter["state"].name == "Online" + assert inverter["state"].name == "ONLINE" assert inverter["id"] == '111111' assert isinstance(inverter["data_timestamp"], datetime) assert inverter["state_exception_flag"].value == 0 - assert inverter["state_exception_flag"].name == "Normal_Offline" + assert inverter["state_exception_flag"].name == "NORMAL_OFFLINE" # TODO: type is missing in real data. # assert inverter["type"].value == 1 - # assert inverter["type"].name == "Grid" + # assert inverter["type"].name == "GRID" assert isinstance(inverter["fac"], FrequencyType) assert inverter["fac"].value == 49.97 assert inverter["fac"].unit == "Hz" From 20006f715d7df0146d2af136a03881d6b601f8a1 Mon Sep 17 00:00:00 2001 From: hultenvp <61835400+hultenvp@users.noreply.github.com> Date: Sat, 3 Jan 2026 13:30:49 +0100 Subject: [PATCH 4/7] Refactor EnumType usage to IntEnum in tests --- test/test_types.py | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/test/test_types.py b/test/test_types.py index cd9df41..992cea4 100644 --- a/test/test_types.py +++ b/test/test_types.py @@ -1,5 +1,6 @@ import pytest import math +from enum import IntEnum from soliscloud_api.types import ( GenericType, SiType, @@ -12,7 +13,6 @@ FrequencyType, TemperatureType, CurrencyType, - EnumType, ListType, DictType, State, @@ -215,22 +215,16 @@ def test_currency_type_unit(mocker): def test_enum_type(mocker): - et = EnumType(State(State.ONLINE)) + et = State(State.ONLINE) assert et.value == State.ONLINE - assert f"{et}" == "1 Online (EnumType)" - et = EnumType(State(State.OFFLINE)) + et = State(State.OFFLINE) assert et.value == State.OFFLINE - assert f"{et}" == "2 Offline (EnumType)" - with pytest.raises(TypeError): - et = EnumType(3) # noqa: F841 - with pytest.raises(TypeError): - et = EnumType("ONLINE") # noqa: F841 def test_enum_type_equality(mocker): - et1 = EnumType(State(State.ONLINE)) - et2 = EnumType(State(State.ONLINE)) - et3 = EnumType(State(State.OFFLINE)) + et1 = State(State.ONLINE) + et2 = State(State.ONLINE) + et3 = State(State.OFFLINE) et4 = State(State.ONLINE) et5 = 1 et6 = "Online" @@ -240,7 +234,7 @@ def test_enum_type_equality(mocker): assert et1 == et4 assert et3 != et4 assert et1 == et5 - assert et1 == et6 + assert et1.name.title() == et6 assert et1 != 0.003 @@ -263,12 +257,12 @@ def test_dict_type(mocker): assert dt.data == {'a': 1, 'b': 2} assert f"{dt}" == "{\n a: 1,\n b: 2\n}" lt = ListType([EnergyType(1, 'kWh'), EnergyType(2000, 'Wh')]) - dt = DictType({'energy_values': lt, 'status': EnumType(State(State.ONLINE))}) # noqa: E501 + dt = DictType({'energy_values': lt, 'status': State(State.ONLINE)}) # noqa: E501 assert isinstance(dt.data['energy_values'], ListType) - assert isinstance(dt.data['status'], EnumType) + assert isinstance(dt.data['status'], IntEnum) assert dt.data['energy_values'].data[0].value == 1 assert dt.data['energy_values'].data[1].value == 2 assert dt.data['status'].value == State.ONLINE - assert f"{dt}" == "{\n energy_values: [\n 1 kWh (EnergyType),\n 2 kWh (EnergyType)\n ],\n status: 1 Online (EnumType)\n}" # noqa: E501 + assert f"{dt}" == "{\n energy_values: [\n 1 kWh (EnergyType),\n 2 kWh (EnergyType)\n ],\n status: 1\n}" # noqa: E501 with pytest.raises(TypeError): dt = DictType(3) # noqa: F841 From aa2c6760b9df123e0ea57e1caa7276be2ce343ec Mon Sep 17 00:00:00 2001 From: hultenvp <61835400+hultenvp@users.noreply.github.com> Date: Sat, 3 Jan 2026 13:31:13 +0100 Subject: [PATCH 5/7] Bump version from 1.3.1 to 1.3.2 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index a0bac09..4872dd8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "hatchling.build" [project] name = "soliscloud-api" -version = "1.3.1" +version = "1.3.2" authors = [ { name="Peter van Hulten", email="peter.vanhulten@gmx.net" }, ] From 6efd290d58ab1ef13071d6960d88632559c49680 Mon Sep 17 00:00:00 2001 From: hultenvp <61835400+hultenvp@users.noreply.github.com> Date: Sat, 3 Jan 2026 13:31:42 +0100 Subject: [PATCH 6/7] Update version to 1.3.2 --- soliscloud_api/__init__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/soliscloud_api/__init__.py b/soliscloud_api/__init__.py index 5db9958..af6e7eb 100644 --- a/soliscloud_api/__init__.py +++ b/soliscloud_api/__init__.py @@ -18,5 +18,6 @@ from .helpers import Helpers # noqa: F401 # VERSION -VERSION = '1.3.1' +VERSION = '1.3.2' __version__ = VERSION + From 242bfa76c2ccae86e28a9e1e75e745afeaa83288 Mon Sep 17 00:00:00 2001 From: hultenvp <61835400+hultenvp@users.noreply.github.com> Date: Sat, 3 Jan 2026 13:33:32 +0100 Subject: [PATCH 7/7] Remove empty lines --- soliscloud_api/__init__.py | 1 - 1 file changed, 1 deletion(-) diff --git a/soliscloud_api/__init__.py b/soliscloud_api/__init__.py index af6e7eb..d7cddc7 100644 --- a/soliscloud_api/__init__.py +++ b/soliscloud_api/__init__.py @@ -20,4 +20,3 @@ # VERSION VERSION = '1.3.2' __version__ = VERSION -