Skip to content

Commit

Permalink
Initial PR for virtual device
Browse files Browse the repository at this point in the history
  • Loading branch information
kingsleyadam committed Nov 21, 2024
1 parent 977a608 commit 33f18d0
Show file tree
Hide file tree
Showing 21 changed files with 100 additions and 9 deletions.
18 changes: 17 additions & 1 deletion src/abbfreeathome/devices/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ def __init__(
api: FreeAtHomeApi,
floor_name: str | None = None,
room_name: str | None = None,
virtual_device: bool = False,
) -> None:
"""Initialize the Free@Home Base class."""
self._device_id = device_id
Expand All @@ -41,6 +42,7 @@ def __init__(
self._floor_name = floor_name
self._room_name = room_name
self._callbacks = set()
self._virtual_device = virtual_device

# Set the initial state of the device based on output
self._refresh_state_from_outputs()
Expand Down Expand Up @@ -75,6 +77,11 @@ def room_name(self) -> str | None:
"""Get the room name of the device."""
return self._room_name

@property
def virtual_device(self) -> bool:
"""Get the virtual_device state of the device."""
return self._virtual_device

def get_input_by_pairing(self, pairing: Pairing) -> tuple[str, Any]:
"""Get the channel input by pairing id."""
for _input_id, _input in self._inputs.items():
Expand All @@ -95,7 +102,7 @@ def get_output_by_pairing(self, pairing: Pairing) -> tuple[str, Any]:
self.device_id, self.channel_id, pairing.value
)

def update_device(self, datapoint_key: str, datapoint_value: str):
async def update_device(self, datapoint_key: str, datapoint_value: str):
"""Update the device state."""
_LOGGER.info(
"%s received updated data: %s: %s",
Expand All @@ -110,6 +117,10 @@ def update_device(self, datapoint_key: str, datapoint_value: str):
self._outputs[_io_key]["value"] = datapoint_value
_refreshed = self._refresh_state_from_output(output=self._outputs[_io_key])

# If this is a virtual device and the update was an input, ack the request.
if self.virtual_device and _io_key in self._inputs:
await self._vd_acknowledgement(datapoint_key, datapoint_value)

if _refreshed and self._callbacks:
for callback in self._callbacks:
callback()
Expand Down Expand Up @@ -149,3 +160,8 @@ def _refresh_state_from_outputs(self):
"""Refresh the state of the device from the _outputs."""
for _output in self._outputs.values():
self._refresh_state_from_output(_output)

async def _vd_acknowledgement(
self, datapoint_key: str, datapoint_value: str
) -> bool:
"""Acknowledge a request from free@home to control the device."""
2 changes: 2 additions & 0 deletions src/abbfreeathome/devices/blind_sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ def __init__(
api: FreeAtHomeApi,
floor_name: str | None = None,
room_name: str | None = None,
virtual_device: bool = False,
) -> None:
"""Initialize the Free@Home BlindSensor class."""
self._state: BlindSensorState = BlindSensorState.unknown
Expand All @@ -55,6 +56,7 @@ def __init__(
api,
floor_name,
room_name,
virtual_device,
)

@property
Expand Down
2 changes: 2 additions & 0 deletions src/abbfreeathome/devices/brightness_sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ def __init__(
api: FreeAtHomeApi,
floor_name: str | None = None,
room_name: str | None = None,
virtual_device: bool = False,
) -> None:
"""Initialize the Free@Home BrightnessSensor class."""
self._state: float | None = None
Expand All @@ -43,6 +44,7 @@ def __init__(
api,
floor_name,
room_name,
virtual_device,
)

@property
Expand Down
2 changes: 2 additions & 0 deletions src/abbfreeathome/devices/carbon_monoxide_sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ def __init__(
api: FreeAtHomeApi,
floor_name: str | None = None,
room_name: str | None = None,
virtual_device: bool = False,
) -> None:
"""Initialize the Free@Home CarbonMonoxideSensor class."""
self._state: bool | None = None
Expand All @@ -41,6 +42,7 @@ def __init__(
api,
floor_name,
room_name,
virtual_device,
)

@property
Expand Down
2 changes: 2 additions & 0 deletions src/abbfreeathome/devices/cover_actuator.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ def __init__(
api: FreeAtHomeApi,
floor_name: str | None = None,
room_name: str | None = None,
virtual_device: bool = False,
) -> None:
"""Initialize the Free@Home CoverActuator class."""
self._state: CoverActuatorState = CoverActuatorState.unknown
Expand All @@ -69,6 +70,7 @@ def __init__(
api,
floor_name,
room_name,
virtual_device,
)

@property
Expand Down
2 changes: 2 additions & 0 deletions src/abbfreeathome/devices/des_door_opener_actuator.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ def __init__(
api: FreeAtHomeApi,
floor_name: str | None = None,
room_name: str | None = None,
virtual_device: bool = False,
) -> None:
"""Initialize the Free@Home DesDoorOpenerActuator class."""
self._state: bool | None = None
Expand All @@ -41,6 +42,7 @@ def __init__(
api,
floor_name,
room_name,
virtual_device,
)

@property
Expand Down
2 changes: 2 additions & 0 deletions src/abbfreeathome/devices/des_door_ringing_sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ def __init__(
api: FreeAtHomeApi,
floor_name: str | None = None,
room_name: str | None = None,
virtual_device: bool = False,
) -> None:
"""Initialize the Free@Home SwitchSensor class."""
super().__init__(
Expand All @@ -39,6 +40,7 @@ def __init__(
api,
floor_name,
room_name,
virtual_device,
)

def _refresh_state_from_output(self, output: dict[str, Any]) -> bool:
Expand Down
2 changes: 2 additions & 0 deletions src/abbfreeathome/devices/dimming_actuator.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ def __init__(
api: FreeAtHomeApi,
floor_name: str | None = None,
room_name: str | None = None,
virtual_device: bool = False,
) -> None:
"""Initialize the Free@Home DimmingActuator class."""
self._state: bool | None = None
Expand All @@ -57,6 +58,7 @@ def __init__(
api,
floor_name,
room_name,
virtual_device,
)

@property
Expand Down
2 changes: 2 additions & 0 deletions src/abbfreeathome/devices/force_on_off_sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ def __init__(
api: FreeAtHomeApi,
floor_name: str | None = None,
room_name: str | None = None,
virtual_device: bool = False,
) -> None:
"""Initialize the Free@Home ForceOnOffSensor class."""
self._state: ForceOnOffSensorState = ForceOnOffSensorState.unknown
Expand All @@ -50,6 +51,7 @@ def __init__(
api,
floor_name,
room_name,
virtual_device,
)

@property
Expand Down
2 changes: 2 additions & 0 deletions src/abbfreeathome/devices/heating_actuator.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ def __init__(
api: FreeAtHomeApi,
floor_name: str | None = None,
room_name: str | None = None,
virtual_device: bool = False,
) -> None:
"""Initialize the Free@Home HeatingActuator class."""
self._position: int | None = None
Expand All @@ -41,6 +42,7 @@ def __init__(
api,
floor_name,
room_name,
virtual_device,
)

@property
Expand Down
2 changes: 2 additions & 0 deletions src/abbfreeathome/devices/movement_detector.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ def __init__(
api: FreeAtHomeApi,
floor_name: str | None = None,
room_name: str | None = None,
virtual_device: bool = False,
) -> None:
"""Initialize the Free@Home SwitchActuator class."""
self._state: bool | None = None
Expand All @@ -43,6 +44,7 @@ def __init__(
api,
floor_name,
room_name,
virtual_device,
)

@property
Expand Down
2 changes: 2 additions & 0 deletions src/abbfreeathome/devices/rain_sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ def __init__(
api: FreeAtHomeApi,
floor_name: str | None = None,
room_name: str | None = None,
virtual_device: bool = False,
) -> None:
"""Initialize the Free@Home RainSensor class."""
self._state: bool | None = None
Expand All @@ -41,6 +42,7 @@ def __init__(
api,
floor_name,
room_name,
virtual_device,
)

@property
Expand Down
2 changes: 2 additions & 0 deletions src/abbfreeathome/devices/room_temperature_controller.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ def __init__(
api: FreeAtHomeApi,
floor_name: str | None = None,
room_name: str | None = None,
virtual_device: bool = False,
) -> None:
"""Initialize the Free@Home RoomTemperatureController class."""
self._state: bool | None = None
Expand All @@ -50,6 +51,7 @@ def __init__(
api,
floor_name,
room_name,
virtual_device,
)

@property
Expand Down
2 changes: 2 additions & 0 deletions src/abbfreeathome/devices/smoke_detector.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ def __init__(
api: FreeAtHomeApi,
floor_name: str | None = None,
room_name: str | None = None,
virtual_device: bool = False,
) -> None:
"""Initialize the Free@Home SmokeDetector class."""
self._state: bool | None = None
Expand All @@ -41,6 +42,7 @@ def __init__(
api,
floor_name,
room_name,
virtual_device,
)

@property
Expand Down
37 changes: 33 additions & 4 deletions src/abbfreeathome/devices/switch_actuator.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ def __init__(
api: FreeAtHomeApi,
floor_name: str | None = None,
room_name: str | None = None,
virtual_device: bool = False,
) -> None:
"""Initialize the Free@Home SwitchActuator class."""
self._state: bool | None = None
Expand All @@ -55,6 +56,7 @@ def __init__(
api,
floor_name,
room_name,
virtual_device,
)

@property
Expand Down Expand Up @@ -93,6 +95,28 @@ async def set_forced_position(self, forced_position_name: str):

self._forced_position = _position

async def _vd_acknowledgement(
self, datapoint_key: str, datapoint_value: str
) -> bool:
_io_key = datapoint_key.split("/")[-1]

try:
_input = self._inputs[_io_key]
except KeyError:
return False

if _input.get("pairingID") == Pairing.AL_SWITCH_ON_OFF.value:
_switch_datapoint_id, _switch_datapoint_value = self.get_output_by_pairing(
pairing=Pairing.AL_INFO_ON_OFF
)
return await self._api.set_datapoint(
device_id=self.device_id,
channel_id=self.channel_id,
datapoint=_switch_datapoint_id,
value=datapoint_value,
)
return False

def _refresh_state_from_output(self, output: dict[str, Any]) -> bool:
"""
Refresh the state of the device from a given output.
Expand All @@ -114,13 +138,18 @@ def _refresh_state_from_output(self, output: dict[str, Any]) -> bool:

async def _set_switching_datapoint(self, value: str):
"""Set the switching datapoint on the api."""
_switch_input_id, _switch_input_value = self.get_input_by_pairing(
pairing=Pairing.AL_SWITCH_ON_OFF
)
if self.virtual_device:
_switch_datapoint_id, _switch_datapoint_value = self.get_output_by_pairing(
pairing=Pairing.AL_INFO_ON_OFF
)
else:
_switch_datapoint_id, _switch_datapoint_value = self.get_input_by_pairing(
pairing=Pairing.AL_SWITCH_ON_OFF
)
return await self._api.set_datapoint(
device_id=self.device_id,
channel_id=self.channel_id,
datapoint=_switch_input_id,
datapoint=_switch_datapoint_id,
value=value,
)

Expand Down
2 changes: 2 additions & 0 deletions src/abbfreeathome/devices/switch_sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ def __init__(
api: FreeAtHomeApi,
floor_name: str | None = None,
room_name: str | None = None,
virtual_device: bool = False,
) -> None:
"""Initialize the Free@Home SwitchSensor class."""
self._state: SwitchSensorState | DimmingSensorState = SwitchSensorState.unknown
Expand All @@ -63,6 +64,7 @@ def __init__(
api,
floor_name,
room_name,
virtual_device,
)

@property
Expand Down
2 changes: 2 additions & 0 deletions src/abbfreeathome/devices/temperature_sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ def __init__(
api: FreeAtHomeApi,
floor_name: str | None = None,
room_name: str | None = None,
virtual_device: bool = False,
) -> None:
"""Initialize the Free@Home TemperatureSensor class."""
self._state: float | None = None
Expand All @@ -43,6 +44,7 @@ def __init__(
api,
floor_name,
room_name,
virtual_device,
)

@property
Expand Down
2 changes: 2 additions & 0 deletions src/abbfreeathome/devices/trigger.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ def __init__(
api: FreeAtHomeApi,
floor_name: str | None = None,
room_name: str | None = None,
virtual_device: bool = False,
) -> None:
"""Initialize the Free@Home Trigger class."""
super().__init__(
Expand All @@ -38,6 +39,7 @@ def __init__(
api,
floor_name,
room_name,
virtual_device,
)

async def press(self):
Expand Down
2 changes: 2 additions & 0 deletions src/abbfreeathome/devices/wind_sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ def __init__(
api: FreeAtHomeApi,
floor_name: str | None = None,
room_name: str | None = None,
virtual_device: bool = False,
) -> None:
"""Initialize the Free@Home WindSensor class."""
self._state: float | None = None
Expand All @@ -45,6 +46,7 @@ def __init__(
api,
floor_name,
room_name,
virtual_device,
)

@property
Expand Down
Loading

0 comments on commit 33f18d0

Please sign in to comment.