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
6 changes: 6 additions & 0 deletions homewizard_energy/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,9 @@ def supported_battery_modes(self) -> list[Batteries.Mode] | None:
Batteries.Mode.ZERO_DISCHARGE_ONLY,
]

if self.api_version >= AwesomeVersion("2.3.0"):
modes += [Batteries.Mode.PREDICTIVE]

return modes


Expand Down Expand Up @@ -667,6 +670,8 @@ def from_mode(
)
case Batteries.Mode.TO_FULL:
return BatteriesUpdate(mode=Batteries.Mode.TO_FULL)
case Batteries.Mode.PREDICTIVE:
return BatteriesUpdate(mode=Batteries.Mode.PREDICTIVE)
case Batteries.Mode.STANDBY:
return BatteriesUpdate(mode=Batteries.Mode.STANDBY, permissions=[])

Expand All @@ -686,6 +691,7 @@ class Mode(StrEnum):

ZERO = "zero"
TO_FULL = "to_full"
PREDICTIVE = "predictive"
STANDBY = "standby"
ZERO_CHARGE_ONLY = "zero_charge_only"
ZERO_DISCHARGE_ONLY = "zero_discharge_only"
Expand Down
3 changes: 3 additions & 0 deletions tests/v2/__snapshots__/test_v2_batteries.ambr
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,6 @@
# name: test_batteries[HWE-P1-fixtures0].1
Batteries(mode=<Mode.ZERO: 'zero'>, permissions=[<Permissions.CHARGE_ALLOWED: 'charge_allowed'>, <Permissions.DISCHARGE_ALLOWED: 'discharge_allowed'>], power_w=-404.0, target_power_w=-400.0, max_consumption_w=1600.0, max_production_w=800.0, battery_count=2)
# ---
# name: test_batteries[HWE-P1-fixtures0].2
Batteries(mode=<Mode.PREDICTIVE: 'predictive'>, permissions=[<Permissions.CHARGE_ALLOWED: 'charge_allowed'>, <Permissions.DISCHARGE_ALLOWED: 'discharge_allowed'>], power_w=-404.0, target_power_w=-400.0, max_consumption_w=1600.0, max_production_w=800.0, battery_count=2)
# ---
10 changes: 10 additions & 0 deletions tests/v2/fixtures/HWE-P1/batteries_2_3_0.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"mode": "predictive",
"permissions": ["charge_allowed", "discharge_allowed"],
"charge_to_full": false,
"battery_count": 2,
"power_w": -404,
"target_power_w": -400,
"max_consumption_w": 1600,
"max_production_w": 800
}
38 changes: 37 additions & 1 deletion tests/v2/test_v2_batteries.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
@pytest.mark.parametrize(
("model", "fixtures"),
[
("HWE-P1", ["batteries_2_1_0", "batteries_2_2_0"]),
("HWE-P1", ["batteries_2_1_0", "batteries_2_2_0", "batteries_2_3_0"]),
("HWE-KWH1", ["batteries"]),
("HWE-KWH3", ["batteries"]),
],
Expand Down Expand Up @@ -72,6 +72,7 @@ def test_batteries_battery_count_optional():
[Batteries.Permissions.DISCHARGE_ALLOWED],
),
(Batteries.Mode.TO_FULL, Batteries.Mode.TO_FULL, None),
(Batteries.Mode.PREDICTIVE, Batteries.Mode.PREDICTIVE, None),
(Batteries.Mode.STANDBY, Batteries.Mode.STANDBY, []),
],
)
Expand Down Expand Up @@ -111,6 +112,7 @@ def test_batteries_update_modes_and_permissions(
(Batteries.Mode.TO_FULL, [], Batteries.Mode.TO_FULL),
(Batteries.Mode.ZERO, None, Batteries.Mode.ZERO),
(Batteries.Mode.STANDBY, None, Batteries.Mode.STANDBY),
(Batteries.Mode.PREDICTIVE, None, Batteries.Mode.PREDICTIVE),
(Batteries.Mode.TO_FULL, None, Batteries.Mode.TO_FULL),
],
)
Expand All @@ -129,6 +131,40 @@ def test_set_mode_based_on_permissions(mode, permissions, expected_mode):
assert model.mode == expected_mode


@pytest.mark.parametrize(
"permissions",
[
([]),
([Batteries.Permissions.DISCHARGE_ALLOWED]),
(
[
Batteries.Permissions.CHARGE_ALLOWED,
]
),
(
[
Batteries.Permissions.CHARGE_ALLOWED,
Batteries.Permissions.DISCHARGE_ALLOWED,
]
),
],
)
def test_predictive_mode_with_various_permissions(permissions):
"""Test setting Batteries mode to PREDICTIVE with various permissions."""
model = Batteries.from_dict(
{
"mode": "predictive",
"permissions": permissions,
"power_w": 0.0,
"target_power_w": 0.0,
"max_consumption_w": 0.0,
"max_production_w": 0.0,
}
)
assert model.mode == Batteries.Mode.PREDICTIVE
assert model.permissions == permissions


def test_set_batteries_update_with_invalid_permissions_raises():
"""Test BatteriesUpdate with invalid permissions raises ValueError."""
with pytest.raises(ValueError):
Expand Down
60 changes: 60 additions & 0 deletions tests/v2/test_v2_device.py
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,66 @@ async def test_device_support_functions(
Batteries.Mode.ZERO_DISCHARGE_ONLY,
],
),
(
Model.P1_METER,
"2.3.0",
[
Batteries.Mode.ZERO,
Batteries.Mode.TO_FULL,
Batteries.Mode.STANDBY,
Batteries.Mode.ZERO_CHARGE_ONLY,
Batteries.Mode.ZERO_DISCHARGE_ONLY,
Batteries.Mode.PREDICTIVE,
],
),
(
Model.ENERGY_METER_1_PHASE,
"2.3.0",
[
Batteries.Mode.ZERO,
Batteries.Mode.TO_FULL,
Batteries.Mode.STANDBY,
Batteries.Mode.ZERO_CHARGE_ONLY,
Batteries.Mode.ZERO_DISCHARGE_ONLY,
Batteries.Mode.PREDICTIVE,
],
),
(
Model.ENERGY_METER_3_PHASE,
"2.3.0",
[
Batteries.Mode.ZERO,
Batteries.Mode.TO_FULL,
Batteries.Mode.STANDBY,
Batteries.Mode.ZERO_CHARGE_ONLY,
Batteries.Mode.ZERO_DISCHARGE_ONLY,
Batteries.Mode.PREDICTIVE,
],
),
(
Model.ENERGY_METER_EASTRON_SDM230,
"2.3.0",
[
Batteries.Mode.ZERO,
Batteries.Mode.TO_FULL,
Batteries.Mode.STANDBY,
Batteries.Mode.ZERO_CHARGE_ONLY,
Batteries.Mode.ZERO_DISCHARGE_ONLY,
Batteries.Mode.PREDICTIVE,
],
),
(
Model.ENERGY_METER_EASTRON_SDM630,
"2.3.0",
[
Batteries.Mode.ZERO,
Batteries.Mode.TO_FULL,
Batteries.Mode.STANDBY,
Batteries.Mode.ZERO_CHARGE_ONLY,
Batteries.Mode.ZERO_DISCHARGE_ONLY,
Batteries.Mode.PREDICTIVE,
],
),
],
)
def test_supported_battery_modes(product_type, api_version, expected_modes):
Expand Down
Loading