Skip to content

Commit

Permalink
Default is 0=Closed 1=Open, according to HA specs.
Browse files Browse the repository at this point in the history
"invert_position" available to return to previous setup.
Round values for open/close of 0.05/0.95 are changed to 0.15/0.85.
  • Loading branch information
ualex73 committed Apr 5, 2020
1 parent 92f0a05 commit 89d0b8e
Show file tree
Hide file tree
Showing 4 changed files with 51 additions and 56 deletions.
60 changes: 31 additions & 29 deletions custom_components/slide/__init__.py
Original file line number Diff line number Diff line change
@@ -1,36 +1,38 @@
"""Component for the Slide API."""

from datetime import timedelta
import logging

import voluptuous as vol
from goslideapi import GoSlideCloud, goslideapi
import voluptuous as vol

from homeassistant.const import (
CONF_USERNAME,
CONF_PASSWORD,
CONF_SCAN_INTERVAL,
STATE_OPEN,
CONF_USERNAME,
STATE_CLOSED,
STATE_OPENING,
STATE_CLOSING,
STATE_OPEN,
STATE_OPENING,
)
from homeassistant.helpers import config_validation as cv
from homeassistant.helpers.discovery import async_load_platform
from homeassistant.helpers.event import async_track_time_interval, async_call_later
from homeassistant.helpers.event import async_call_later, async_track_time_interval

from .const import (
DATA_API,
DATA_RETRY,
DATA_SLIDES,
DATA_TIMER,
API,
COMPONENT,
CONF_INVERT_POSITION,
DEFAULT_OFFSET,
DEFAULT_RETRY,
DEFAULT_SCAN_INTERVAL,
DOMAIN,
SLIDES,
)

_LOGGER = logging.getLogger(__name__)

DEFAULT_SCAN_INTERVAL = timedelta(seconds=30)

CONFIG_SCHEMA = vol.Schema(
{
DOMAIN: vol.Schema(
Expand All @@ -53,7 +55,7 @@ async def async_setup(hass, config):

async def update_slides(now=None):
"""Update slide information."""
result = await hass.data[DOMAIN][DATA_API].slides_overview()
result = await hass.data[DOMAIN][API].slides_overview()

if result is None:
_LOGGER.error("Slide API does not work or returned an error")
Expand All @@ -67,13 +69,12 @@ async def update_slides(now=None):
for slide in result:
if "device_id" not in slide:
_LOGGER.error(
"Found invalid Slide entry, device_id is " "missing. Entry=%s",
slide,
"Found invalid Slide entry, device_id is missing. Entry=%s", slide
)
continue

uid = slide["device_id"].replace("slide_", "")
slidenew = hass.data[DOMAIN][DATA_SLIDES].setdefault(uid, {})
slidenew = hass.data[DOMAIN][SLIDES].setdefault(uid, {})
slidenew["mac"] = uid
slidenew["id"] = slide["id"]
slidenew["name"] = slide["device_name"]
Expand All @@ -100,23 +101,28 @@ async def update_slides(now=None):

if oldpos is None or oldpos == slidenew["pos"]:
slidenew["state"] = (
STATE_CLOSED if slidenew["pos"] > 0.95 else STATE_OPEN
STATE_CLOSED
if slidenew["pos"] > (1 - DEFAULT_OFFSET)
else STATE_OPEN
)
elif oldpos < slidenew["pos"]:
slidenew["state"] = (
STATE_CLOSED if slidenew["pos"] >= 0.95 else STATE_CLOSING
STATE_CLOSED
if slidenew["pos"] >= (1 - DEFAULT_OFFSET)
else STATE_CLOSING
)
else:
slidenew["state"] = (
STATE_OPEN if slidenew["pos"] <= 0.05 else STATE_OPENING
STATE_OPEN
if slidenew["pos"] <= DEFAULT_OFFSET
else STATE_OPENING
)
elif "code" in slide["device_info"] and "message" in slide["device_info"]:
elif "code" in slide["device_info"]:
_LOGGER.warning(
"Slide %s (%s) is offline with " "code=%s (%s)",
"Slide %s (%s) is offline with code=%s",
slide["id"],
slidenew["mac"],
slide["device_info"]["code"],
slide["device_info"]["message"],
)
else:
_LOGGER.error(
Expand All @@ -133,25 +139,23 @@ async def retry_setup(now):
await async_setup(hass, config)

hass.data[DOMAIN] = {}
hass.data[DOMAIN][DATA_SLIDES] = {}
hass.data[DOMAIN][SLIDES] = {}

username = config[DOMAIN][CONF_USERNAME]
password = config[DOMAIN][CONF_PASSWORD]
scaninterval = config[DOMAIN][CONF_SCAN_INTERVAL]

hass.data[DOMAIN][DATA_API] = GoSlideCloud(username, password)
hass.data[DOMAIN][API] = GoSlideCloud(username, password)

try:
result = await hass.data[DOMAIN][DATA_API].login()
result = await hass.data[DOMAIN][API].login()
except (goslideapi.ClientConnectionError, goslideapi.ClientTimeoutError) as err:
_LOGGER.error(
"Error connecting to Slide Cloud: %s, going to retry in %s seconds",
err,
DEFAULT_RETRY,
)
hass.data[DOMAIN][DATA_RETRY] = async_call_later(
hass, DEFAULT_RETRY, retry_setup
)
async_call_later(hass, DEFAULT_RETRY, retry_setup)
return True

if not result:
Expand All @@ -164,8 +168,6 @@ async def retry_setup(now):

hass.async_create_task(async_load_platform(hass, COMPONENT, DOMAIN, {}, config))

hass.data[DOMAIN][DATA_TIMER] = async_track_time_interval(
hass, update_slides, scaninterval
)
async_track_time_interval(hass, update_slides, scaninterval)

return True
9 changes: 3 additions & 6 deletions custom_components/slide/const.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,9 @@
"""Define constants for the Slide component."""

API = "api"
COMPONENT = "cover"
CONF_INVERT_POSITION = "invert_position"
DOMAIN = "slide"
DATA_API = "api"
DATA_RETRY = "retry"
DATA_SLIDES = "slides"
DATA_TIMER = "timer"
DEFAULT_NAME = "Slide Curtain(s)"
SLIDES = "slides"
DEFAULT_OFFSET = 0.15
DEFAULT_RETRY = 120
DEFAULT_SCAN_INTERVAL = 30
29 changes: 15 additions & 14 deletions custom_components/slide/cover.py
Original file line number Diff line number Diff line change
@@ -1,17 +1,18 @@
"""Support for Slide curtains."""
"""Support for Slide slides."""

import logging

from homeassistant.const import ATTR_ID
from homeassistant.components.cover import (
ATTR_POSITION,
DEVICE_CLASS_CURTAIN,
STATE_CLOSED,
STATE_OPENING,
STATE_CLOSING,
DEVICE_CLASS_CURTAIN,
STATE_OPENING,
CoverDevice,
)
from .const import DATA_API, DATA_SLIDES, DOMAIN
from homeassistant.const import ATTR_ID

from .const import API, DEFAULT_OFFSET, DOMAIN, SLIDES

_LOGGER = logging.getLogger(__name__)

Expand All @@ -24,9 +25,9 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info=

entities = []

for slide in hass.data[DOMAIN][DATA_SLIDES].values():
for slide in hass.data[DOMAIN][SLIDES].values():
_LOGGER.debug("Setting up Slide entity: %s", slide)
entities.append(SlideCover(hass.data[DOMAIN][DATA_API], slide))
entities.append(SlideCover(hass.data[DOMAIN][API], slide))

async_add_entities(entities)

Expand Down Expand Up @@ -95,10 +96,11 @@ def current_cover_position(self):
"""Return the current position of cover shutter."""
pos = self._slide["pos"]
if pos is not None:
if self._invert:
pos = 100 - int(pos * 100)
else:
pos = int(pos * 100)
if (1 - pos) <= DEFAULT_OFFSET or pos <= DEFAULT_OFFSET:
pos = round(pos)
if not self._invert:
pos = 1 - pos
pos = int(pos * 100)
return pos

async def async_open_cover(self, **kwargs):
Expand All @@ -118,14 +120,13 @@ async def async_stop_cover(self, **kwargs):
async def async_set_cover_position(self, **kwargs):
"""Move the cover to a specific position."""
position = kwargs[ATTR_POSITION] / 100
if not self._invert:
position = 1 - position

if self._slide["pos"] is not None:
if position > self._slide["pos"]:
self._slide["state"] = STATE_CLOSING
else:
self._slide["state"] = STATE_OPENING

if self._invert:
position = 1 - position

await self._api.slide_set_position(self._id, position)
9 changes: 2 additions & 7 deletions custom_components/slide/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,6 @@
"domain": "slide",
"name": "Slide",
"documentation": "https://www.home-assistant.io/integrations/slide",
"requirements": [
"goslide-api==0.5.1"
],
"dependencies": [],
"codeowners": [
"@ualex73"
]
"requirements": ["goslide-api==0.5.1"],
"codeowners": ["@ualex73"]
}

0 comments on commit 89d0b8e

Please sign in to comment.