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
1 change: 1 addition & 0 deletions .coveragerc
Original file line number Diff line number Diff line change
Expand Up @@ -607,6 +607,7 @@ omit =
homeassistant/components/plugwise/binary_sensor.py
homeassistant/components/plugwise/climate.py
homeassistant/components/plugwise/sensor.py
homeassistant/components/plugwise/switch.py
homeassistant/components/plum_lightpad/*
homeassistant/components/pocketcasts/sensor.py
homeassistant/components/point/*
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/plugwise/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
_LOGGER = logging.getLogger(__name__)

SENSOR_PLATFORMS = ["sensor"]
ALL_PLATFORMS = ["binary_sensor", "climate", "sensor"]
ALL_PLATFORMS = ["binary_sensor", "climate", "sensor", "switch"]


async def async_setup(hass: HomeAssistant, config: dict):
Expand Down
84 changes: 84 additions & 0 deletions homeassistant/components/plugwise/switch.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
"""Plugwise Switch component for HomeAssistant."""

import logging

from Plugwise_Smile.Smile import Smile

from homeassistant.components.switch import SwitchEntity
from homeassistant.core import callback

from . import SmileGateway
from .const import DOMAIN

_LOGGER = logging.getLogger(__name__)


async def async_setup_entry(hass, config_entry, async_add_entities):
"""Set up the Smile switches from a config entry."""
api = hass.data[DOMAIN][config_entry.entry_id]["api"]
coordinator = hass.data[DOMAIN][config_entry.entry_id]["coordinator"]

entities = []
all_devices = api.get_all_devices()
for dev_id, device_properties in all_devices.items():
if "plug" in device_properties["types"]:
model = "Metered Switch"
entities.append(
PwSwitch(api, coordinator, device_properties["name"], dev_id, model)
)

async_add_entities(entities, True)


class PwSwitch(SmileGateway, SwitchEntity):
"""Representation of a Plugwise plug."""

def __init__(self, api, coordinator, name, dev_id, model):
"""Set up the Plugwise API."""
super().__init__(api, coordinator, name, dev_id)

self._model = model

self._is_on = False

self._unique_id = f"{dev_id}-plug"

@property
def is_on(self):
"""Return true if device is on."""
return self._is_on

async def async_turn_on(self, **kwargs):
"""Turn the device on."""
try:
if await self._api.set_relay_state(self._dev_id, "on"):
self._is_on = True
self.async_write_ha_state()
except Smile.PlugwiseError:
_LOGGER.error("Error while communicating to device")

async def async_turn_off(self, **kwargs):
"""Turn the device off."""
try:
if await self._api.set_relay_state(self._dev_id, "off"):
self._is_on = False
self.async_write_ha_state()
except Smile.PlugwiseError:
_LOGGER.error("Error while communicating to device")

@callback
def _async_process_data(self):
"""Update the data from the Plugs."""
_LOGGER.debug("Update switch called")

data = self._api.get_device_data(self._dev_id)

if not data:
_LOGGER.error("Received no data for device %s.", self._name)
self.async_write_ha_state()
return

if "relay" in data:
self._is_on = data["relay"]

self.async_write_ha_state()