Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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" },
]
Expand Down
2 changes: 1 addition & 1 deletion soliscloud_api/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,5 +18,5 @@
from .helpers import Helpers # noqa: F401

# VERSION
VERSION = '1.3.1'
VERSION = '1.3.2'
__version__ = VERSION
48 changes: 7 additions & 41 deletions soliscloud_api/types.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion test/test_entities.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand Down
26 changes: 10 additions & 16 deletions test/test_types.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import pytest
import math
from enum import IntEnum
from soliscloud_api.types import (
GenericType,
SiType,
Expand All @@ -12,7 +13,6 @@
FrequencyType,
TemperatureType,
CurrencyType,
EnumType,
ListType,
DictType,
State,
Expand Down Expand Up @@ -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"
Expand All @@ -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


Expand All @@ -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
20 changes: 10 additions & 10 deletions test/test_types_factory.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@
PowerType,
EnergyType,
CurrencyType,
EnumType,
FrequencyType,
)
from datetime import datetime
from enum import IntEnum

mocked_inverter_data_units = {
"dcInputtype": 2,
Expand Down Expand Up @@ -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"
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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"
Expand Down