diff --git a/homewizard_energy/models.py b/homewizard_energy/models.py index 783a82d..1e76086 100644 --- a/homewizard_energy/models.py +++ b/homewizard_energy/models.py @@ -701,8 +701,8 @@ class Permissions(StrEnum): "deserialize": lambda x: Batteries.Mode.__members__.get(x.upper(), None) }, ) - permissions: list[Permissions] = field( - default_factory=list, + permissions: list[Permissions] | None = field( + default=None, metadata={ "deserialize": lambda lst: [ perm @@ -710,6 +710,8 @@ class Permissions(StrEnum): if (perm := Batteries.Permissions.__members__.get(item.upper(), None)) is not None ] + if lst is not None + else None }, ) power_w: float = field() @@ -720,21 +722,34 @@ class Permissions(StrEnum): @classmethod def __post_deserialize__(cls, obj: Batteries) -> Batteries: - """Set correct mode based on permissions after deserialization.""" + """Set correct mode based on permissions after deserialization. + If permissions is missing and mode is ZERO, keep mode as ZERO for backwards compatibility. + If permissions is present (even if empty), apply the mapping logic. + """ # Only adjust if mode is ZERO - if obj.mode == cls.Mode.ZERO: - perms = set(obj.permissions) - if perms == {cls.Permissions.CHARGE_ALLOWED}: - obj.mode = cls.Mode.ZERO_CHARGE_ONLY - elif perms == {cls.Permissions.DISCHARGE_ALLOWED}: - obj.mode = cls.Mode.ZERO_DISCHARGE_ONLY - elif perms == { - cls.Permissions.CHARGE_ALLOWED, - cls.Permissions.DISCHARGE_ALLOWED, - }: - obj.mode = cls.Mode.ZERO - elif perms == set(): - obj.mode = cls.Mode.STANDBY + if obj.mode != cls.Mode.ZERO: + return obj + + # Detect if 'permissions' was present in the original data + # If using mashumaro, the original dict is not available here, so we infer: + # If permissions is None, treat as 'not provided'. If it's an empty list, treat as 'provided but empty'. + if obj.permissions is None: + # Permissions not provided, keep mode as ZERO (backwards compatibility) + return obj + + perms = set(obj.permissions) + if perms == {cls.Permissions.CHARGE_ALLOWED}: + obj.mode = cls.Mode.ZERO_CHARGE_ONLY + elif perms == {cls.Permissions.DISCHARGE_ALLOWED}: + obj.mode = cls.Mode.ZERO_DISCHARGE_ONLY + elif perms == { + cls.Permissions.CHARGE_ALLOWED, + cls.Permissions.DISCHARGE_ALLOWED, + }: + obj.mode = cls.Mode.ZERO + elif perms == set(): + obj.mode = cls.Mode.STANDBY + return obj diff --git a/tests/v2/__snapshots__/test_v2_batteries.ambr b/tests/v2/__snapshots__/test_v2_batteries.ambr index a2e55dc..0aa593d 100644 --- a/tests/v2/__snapshots__/test_v2_batteries.ambr +++ b/tests/v2/__snapshots__/test_v2_batteries.ambr @@ -6,5 +6,8 @@ Batteries(mode=, permissions=[, ], 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] + Batteries(mode=, permissions=None, power_w=-404.0, target_power_w=-400.0, max_consumption_w=1600.0, max_production_w=800.0, battery_count=None) +# --- +# name: test_batteries[HWE-P1-fixtures0].1 Batteries(mode=, permissions=[, ], power_w=-404.0, target_power_w=-400.0, max_consumption_w=1600.0, max_production_w=800.0, battery_count=2) # --- diff --git a/tests/v2/fixtures/HWE-P1/batteries_2_1_0.json b/tests/v2/fixtures/HWE-P1/batteries_2_1_0.json new file mode 100644 index 0000000..47f0eae --- /dev/null +++ b/tests/v2/fixtures/HWE-P1/batteries_2_1_0.json @@ -0,0 +1,7 @@ +{ + "mode": "zero", + "power_w": -404, + "target_power_w": -400, + "max_consumption_w": 1600, + "max_production_w": 800 +} diff --git a/tests/v2/fixtures/HWE-P1/batteries_2_2_0.json b/tests/v2/fixtures/HWE-P1/batteries_2_2_0.json new file mode 100644 index 0000000..cb36b2d --- /dev/null +++ b/tests/v2/fixtures/HWE-P1/batteries_2_2_0.json @@ -0,0 +1,9 @@ +{ + "mode": "zero", + "permissions": ["charge_allowed", "discharge_allowed"], + "battery_count": 2, + "power_w": -404, + "target_power_w": -400, + "max_consumption_w": 1600, + "max_production_w": 800 +} diff --git a/tests/v2/test_v2_batteries.py b/tests/v2/test_v2_batteries.py index 91deb24..46a882c 100644 --- a/tests/v2/test_v2_batteries.py +++ b/tests/v2/test_v2_batteries.py @@ -15,7 +15,7 @@ @pytest.mark.parametrize( ("model", "fixtures"), [ - ("HWE-P1", ["batteries"]), + ("HWE-P1", ["batteries_2_1_0", "batteries_2_2_0"]), ("HWE-KWH1", ["batteries"]), ("HWE-KWH3", ["batteries"]), ], @@ -109,6 +109,9 @@ def test_batteries_update_modes_and_permissions( (Batteries.Mode.ZERO, [], Batteries.Mode.STANDBY), (Batteries.Mode.STANDBY, [], Batteries.Mode.STANDBY), (Batteries.Mode.TO_FULL, [], Batteries.Mode.TO_FULL), + (Batteries.Mode.ZERO, None, Batteries.Mode.ZERO), + (Batteries.Mode.STANDBY, None, Batteries.Mode.STANDBY), + (Batteries.Mode.TO_FULL, None, Batteries.Mode.TO_FULL), ], ) def test_set_mode_based_on_permissions(mode, permissions, expected_mode):