1
mirror of https://github.com/home-assistant/core synced 2024-08-31 05:57:13 +02:00
ha-core/homeassistant/components/soma/cover.py
badguy99 b9e4d5988f
Soma: fix battery drain issue caused by excess update requests (#45104)
* split up update and throttle update on sensor

* Update imports

* Add blank lines for isort
2021-01-13 15:14:15 +01:00

92 lines
3.1 KiB
Python

"""Support for Soma Covers."""
import logging
from requests import RequestException
from homeassistant.components.cover import ATTR_POSITION, CoverEntity
from homeassistant.components.soma import API, DEVICES, DOMAIN, SomaEntity
_LOGGER = logging.getLogger(__name__)
async def async_setup_entry(hass, config_entry, async_add_entities):
"""Set up the Soma cover platform."""
devices = hass.data[DOMAIN][DEVICES]
async_add_entities(
[SomaCover(cover, hass.data[DOMAIN][API]) for cover in devices], True
)
class SomaCover(SomaEntity, CoverEntity):
"""Representation of a Soma cover device."""
def close_cover(self, **kwargs):
"""Close the cover."""
response = self.api.set_shade_position(self.device["mac"], 100)
if response["result"] != "success":
_LOGGER.error(
"Unable to reach device %s (%s)", self.device["name"], response["msg"]
)
def open_cover(self, **kwargs):
"""Open the cover."""
response = self.api.set_shade_position(self.device["mac"], 0)
if response["result"] != "success":
_LOGGER.error(
"Unable to reach device %s (%s)", self.device["name"], response["msg"]
)
def stop_cover(self, **kwargs):
"""Stop the cover."""
# Set cover position to some value where up/down are both enabled
self.current_position = 50
response = self.api.stop_shade(self.device["mac"])
if response["result"] != "success":
_LOGGER.error(
"Unable to reach device %s (%s)", self.device["name"], response["msg"]
)
def set_cover_position(self, **kwargs):
"""Move the cover shutter to a specific position."""
self.current_position = kwargs[ATTR_POSITION]
response = self.api.set_shade_position(
self.device["mac"], 100 - kwargs[ATTR_POSITION]
)
if response["result"] != "success":
_LOGGER.error(
"Unable to reach device %s (%s)", self.device["name"], response["msg"]
)
@property
def current_cover_position(self):
"""Return the current position of cover shutter."""
return self.current_position
@property
def is_closed(self):
"""Return if the cover is closed."""
return self.current_position == 0
async def async_update(self):
"""Update the cover with the latest data."""
try:
_LOGGER.debug("Soma Cover Update")
response = await self.hass.async_add_executor_job(
self.api.get_shade_state, self.device["mac"]
)
except RequestException:
_LOGGER.error("Connection to SOMA Connect failed")
self.is_available = False
return
if response["result"] != "success":
_LOGGER.error(
"Unable to reach device %s (%s)", self.device["name"], response["msg"]
)
self.is_available = False
return
self.current_position = 100 - response["position"]
self.is_available = True