Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add switch platform to Comelit SmartHome #102233

Merged
merged 6 commits into from
Oct 18, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
1 change: 1 addition & 0 deletions .coveragerc
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,7 @@ omit =
homeassistant/components/comelit/cover.py
homeassistant/components/comelit/coordinator.py
homeassistant/components/comelit/light.py
homeassistant/components/comelit/switch.py
homeassistant/components/comfoconnect/fan.py
homeassistant/components/concord232/alarm_control_panel.py
homeassistant/components/concord232/binary_sensor.py
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/comelit/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
from .const import DEFAULT_PORT, DOMAIN
from .coordinator import ComelitSerialBridge

PLATFORMS = [Platform.COVER, Platform.LIGHT]
PLATFORMS = [Platform.COVER, Platform.LIGHT, Platform.SWITCH]


async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
Expand Down
79 changes: 79 additions & 0 deletions homeassistant/components/comelit/switch.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
"""Support for switches."""
from __future__ import annotations

from typing import Any

from aiocomelit import ComelitSerialBridgeObject
from aiocomelit.const import IRRIGATION, OTHER

from homeassistant.components.switch import SwitchDeviceClass, SwitchEntity
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.update_coordinator import CoordinatorEntity

from .const import DOMAIN, STATE_OFF, STATE_ON
from .coordinator import ComelitSerialBridge


async def async_setup_entry(
hass: HomeAssistant,
config_entry: ConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Set up Comelit switches."""

coordinator: ComelitSerialBridge = hass.data[DOMAIN][config_entry.entry_id]

# Use config_entry.entry_id as base for unique_id because no serial number or mac is available
async_add_entities(
ComelitSwitchEntity(coordinator, device, config_entry.entry_id)
for device in (
coordinator.data[OTHER].values(),
coordinator.data[IRRIGATION].values(),
)
)


class ComelitSwitchEntity(CoordinatorEntity[ComelitSerialBridge], SwitchEntity):
"""Switch device."""

_attr_has_entity_name = True
_attr_name = None
_attr_device_class = SwitchDeviceClass.OUTLET

def __init__(
self,
coordinator: ComelitSerialBridge,
device: ComelitSerialBridgeObject,
config_entry_entry_id: str,
) -> None:
"""Init light entity."""
self._api = coordinator.api
self._device = device
super().__init__(coordinator)
self._attr_unique_id = f"{config_entry_entry_id}-{device.index}"
self._attr_device_info = self.coordinator.platform_device_info(device)

async def _switch_set_state(self, state: int) -> None:
"""Set desired light state."""
await self.coordinator.api.set_device_status(
self._device.type, self._device.index, state
)
await self.coordinator.async_request_refresh()

async def async_turn_on(self, **kwargs: Any) -> None:
"""Turn the light on."""
await self._switch_set_state(STATE_ON)

async def async_turn_off(self, **kwargs: Any) -> None:
"""Turn the entity off."""
await self._switch_set_state(STATE_OFF)

@property
def is_on(self) -> bool:
"""Return True if entity is on."""
return (
self.coordinator.data[self._device.type][self._device.index].status
== STATE_ON
)