Skip to content

Commit

Permalink
Change forced_position to enum (#101)
Browse files Browse the repository at this point in the history
  • Loading branch information
derjoerg authored Nov 8, 2024
1 parent 95075b3 commit 389a459
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 25 deletions.
43 changes: 24 additions & 19 deletions src/abbfreeathome/devices/cover_actuator.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,22 @@
"""Free@Home abstract CoverActuator Class."""

import enum
from typing import Any

from ..api import FreeAtHomeApi
from ..bin.pairing import Pairing
from .base import Base


class CoverActuatorForcePosition(enum.Enum):
"""An Enum class for the force_position states."""

unknown = None
deactivated = "0"
forced_open = "2"
forced_close = "3"


class CoverActuator(Base):
"""Free@Home CoverActuator Class."""

Expand All @@ -33,7 +43,9 @@ def __init__(
"""Initialize the Free@Home CoverActuator class."""
self._state: int | None = None
self._position: int | None = None
self._forced_position: int | None = None
self._forced_position: CoverActuatorForcePosition = (
CoverActuatorForcePosition.unknown
)
self._tilt_position: int | None = None

super().__init__(
Expand All @@ -60,9 +72,9 @@ def position(self) -> int | None:
return self._position

@property
def forced_position(self) -> int | None:
def forced_position(self) -> str | None:
"""Get the information, if the position is forced."""
return self._forced_position
return self._forced_position.name

def is_cover_closed(self):
"""Helper-Function returns true if the cover is closed."""
Expand All @@ -89,16 +101,11 @@ async def stop(self):
if self.state in [2, 3]:
await self._set_stop_datapoint()

async def force_position(self, value: int):
"""
Force the position of the cover.
0 means none
2 means open
3 means close
"""
if value in [0, 2, 3]:
await self._set_force_datapoint(str(value))
async def set_force_position(self, value: CoverActuatorForcePosition):
"""Force the position of the cover."""
if value is not CoverActuatorForcePosition.unknown:
await self._set_force_datapoint(str(value.value))
self._forced_position = value

async def set_position(self, value: int):
"""
Expand Down Expand Up @@ -134,12 +141,10 @@ def _refresh_state_from_output(self, output: dict[str, Any]) -> bool:
self._state = int(output.get("value"))
return True
if output.get("pairingID") == Pairing.AL_INFO_FORCE.value:
"""
0 means none
2 means open
3 means close
"""
self._forced_position = int(output.get("value"))
try:
self._forced_position = CoverActuatorForcePosition(output.get("value"))
except ValueError:
self._forced_position = CoverActuatorForcePosition.unknown
return True
if (
output.get("pairingID")
Expand Down
26 changes: 20 additions & 6 deletions tests/test_cover_actuator.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,11 @@
import pytest

from src.abbfreeathome.api import FreeAtHomeApi
from src.abbfreeathome.devices.cover_actuator import CoverActuator, ShutterActuator
from src.abbfreeathome.devices.cover_actuator import (
CoverActuator,
CoverActuatorForcePosition,
ShutterActuator,
)


@pytest.fixture
Expand Down Expand Up @@ -162,29 +166,36 @@ async def test_stop(cover_actuator):


@pytest.mark.asyncio
async def test_force_position(cover_actuator):
async def test_set_force_position(cover_actuator):
"""Test to force a position of a cover."""
await cover_actuator.force_position(0)
await cover_actuator.set_force_position(CoverActuatorForcePosition.deactivated)
cover_actuator._api.set_datapoint.assert_called_with(
device_id="ABB2AC253651",
channel_id="ch0003",
datapoint="idp0004",
value="0",
)
await cover_actuator.force_position(2)
assert cover_actuator.forced_position == CoverActuatorForcePosition.deactivated.name

await cover_actuator.set_force_position(CoverActuatorForcePosition.forced_open)
cover_actuator._api.set_datapoint.assert_called_with(
device_id="ABB2AC253651",
channel_id="ch0003",
datapoint="idp0004",
value="2",
)
await cover_actuator.force_position(3)
assert cover_actuator.forced_position == CoverActuatorForcePosition.forced_open.name

await cover_actuator.set_force_position(CoverActuatorForcePosition.forced_close)
cover_actuator._api.set_datapoint.assert_called_with(
device_id="ABB2AC253651",
channel_id="ch0003",
datapoint="idp0004",
value="3",
)
assert (
cover_actuator.forced_position == CoverActuatorForcePosition.forced_close.name
)


@pytest.mark.asyncio
Expand Down Expand Up @@ -260,7 +271,10 @@ async def test_refresh_state_from_output(cover_actuator):

# Check output that affects the forced position
cover_actuator._refresh_state_from_output(output={"pairingID": 257, "value": "2"})
assert cover_actuator.forced_position == 2
assert cover_actuator.forced_position == CoverActuatorForcePosition.forced_open.name

cover_actuator._refresh_state_from_output(output={"pairingID": 257, "value": "4"})
assert cover_actuator.forced_position == CoverActuatorForcePosition.unknown.name

# Check output that affects the position
cover_actuator._refresh_state_from_output(output={"pairingID": 289, "value": "35"})
Expand Down

0 comments on commit 389a459

Please sign in to comment.