From 0f7c35859b81046a6dd3b8299f5ce1ce6f7dafb7 Mon Sep 17 00:00:00 2001
From: Julius Mittenzwei <jm@grin.com>
Date: Mon, 18 Sep 2017 21:44:26 +0200
Subject: [PATCH] Small improvement of KNX Covers (#9476)

* Refactoring of Cover abstraction. Fixes
https://github.com/XKNX/xknx/issues/57 and
https://github.com/home-assistant/home-assistant/issues/9414

* Requested changes by pvizeli
---
 homeassistant/components/cover/knx.py | 58 ++++++++-------------------
 homeassistant/components/knx.py       |  2 +-
 requirements_all.txt                  |  2 +-
 3 files changed, 18 insertions(+), 44 deletions(-)

diff --git a/homeassistant/components/cover/knx.py b/homeassistant/components/cover/knx.py
index 296d8d36394..ae7bcfee17e 100644
--- a/homeassistant/components/cover/knx.py
+++ b/homeassistant/components/cover/knx.py
@@ -50,7 +50,7 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
 
 
 @asyncio.coroutine
-def async_setup_platform(hass, config, add_devices,
+def async_setup_platform(hass, config, async_add_devices,
                          discovery_info=None):
     """Set up cover(s) for KNX platform."""
     if DATA_KNX not in hass.data \
@@ -58,25 +58,25 @@ def async_setup_platform(hass, config, add_devices,
         return False
 
     if discovery_info is not None:
-        async_add_devices_discovery(hass, discovery_info, add_devices)
+        async_add_devices_discovery(hass, discovery_info, async_add_devices)
     else:
-        async_add_devices_config(hass, config, add_devices)
+        async_add_devices_config(hass, config, async_add_devices)
 
     return True
 
 
 @callback
-def async_add_devices_discovery(hass, discovery_info, add_devices):
+def async_add_devices_discovery(hass, discovery_info, async_add_devices):
     """Set up covers for KNX platform configured via xknx.yaml."""
     entities = []
     for device_name in discovery_info[ATTR_DISCOVER_DEVICES]:
         device = hass.data[DATA_KNX].xknx.devices[device_name]
         entities.append(KNXCover(hass, device))
-    add_devices(entities)
+    async_add_devices(entities)
 
 
 @callback
-def async_add_devices_config(hass, config, add_devices):
+def async_add_devices_config(hass, config, async_add_devices):
     """Set up cover for KNX platform configured within plattform."""
     import xknx
     cover = xknx.devices.Cover(
@@ -90,23 +90,20 @@ def async_add_devices_config(hass, config, add_devices):
         group_address_angle_state=config.get(CONF_ANGLE_STATE_ADDRESS),
         group_address_position=config.get(CONF_POSITION_ADDRESS),
         travel_time_down=config.get(CONF_TRAVELLING_TIME_DOWN),
-        travel_time_up=config.get(CONF_TRAVELLING_TIME_UP))
+        travel_time_up=config.get(CONF_TRAVELLING_TIME_UP),
+        invert_position=config.get(CONF_INVERT_POSITION),
+        invert_angle=config.get(CONF_INVERT_ANGLE))
 
-    invert_position = config.get(CONF_INVERT_POSITION)
-    invert_angle = config.get(CONF_INVERT_ANGLE)
     hass.data[DATA_KNX].xknx.devices.add(cover)
-    add_devices([KNXCover(hass, cover, invert_position, invert_angle)])
+    async_add_devices([KNXCover(hass, cover)])
 
 
 class KNXCover(CoverDevice):
     """Representation of a KNX cover."""
 
-    def __init__(self, hass, device, invert_position=False,
-                 invert_angle=False):
+    def __init__(self, hass, device):
         """Initialize the cover."""
         self.device = device
-        self.invert_position = invert_position
-        self.invert_angle = invert_angle
         self.hass = hass
         self.async_register_callbacks()
 
@@ -144,9 +141,7 @@ class KNXCover(CoverDevice):
     @property
     def current_cover_position(self):
         """Return the current position of the cover."""
-        return int(self.from_knx_position(
-            self.device.current_position(),
-            self.invert_position))
+        return self.device.current_position()
 
     @property
     def is_closed(self):
@@ -172,8 +167,7 @@ class KNXCover(CoverDevice):
         """Move the cover to a specific position."""
         if ATTR_POSITION in kwargs:
             position = kwargs[ATTR_POSITION]
-            knx_position = self.to_knx_position(position, self.invert_position)
-            yield from self.device.set_position(knx_position)
+            yield from self.device.set_position(position)
             self.start_auto_updater()
 
     @asyncio.coroutine
@@ -187,17 +181,14 @@ class KNXCover(CoverDevice):
         """Return current tilt position of cover."""
         if not self.device.supports_angle:
             return None
-        return int(self.from_knx_position(
-            self.device.angle,
-            self.invert_angle))
+        return self.device.get_angle()
 
     @asyncio.coroutine
     def async_set_cover_tilt_position(self, **kwargs):
         """Move the cover tilt to a specific position."""
         if ATTR_TILT_POSITION in kwargs:
-            position = kwargs[ATTR_TILT_POSITION]
-            knx_position = self.to_knx_position(position, self.invert_angle)
-            yield from self.device.set_angle(knx_position)
+            tilt_position = kwargs[ATTR_TILT_POSITION]
+            yield from self.device.set_angle(tilt_position)
 
     def start_auto_updater(self):
         """Start the autoupdater to update HASS while cover is moving."""
@@ -220,20 +211,3 @@ class KNXCover(CoverDevice):
             self.stop_auto_updater()
 
         self.hass.add_job(self.device.auto_stop_if_necessary())
-
-    @staticmethod
-    def from_knx_position(raw, invert):
-        """Convert KNX position [0...255] to hass position [100...0]."""
-        position = round((raw/256)*100)
-        if not invert:
-            position = 100 - position
-        return position
-
-    @staticmethod
-    def to_knx_position(value, invert):
-        """Convert hass position [100...0] to KNX position [0...255]."""
-        knx_position = round(value/100*255.4)
-        if not invert:
-            knx_position = 255-knx_position
-        print(value, " -> ", knx_position)
-        return knx_position
diff --git a/homeassistant/components/knx.py b/homeassistant/components/knx.py
index a5015ff9454..047620860b9 100644
--- a/homeassistant/components/knx.py
+++ b/homeassistant/components/knx.py
@@ -35,7 +35,7 @@ ATTR_DISCOVER_DEVICES = 'devices'
 
 _LOGGER = logging.getLogger(__name__)
 
-REQUIREMENTS = ['xknx==0.7.13']
+REQUIREMENTS = ['xknx==0.7.14']
 
 TUNNELING_SCHEMA = vol.Schema({
     vol.Required(CONF_HOST): cv.string,
diff --git a/requirements_all.txt b/requirements_all.txt
index b58c1f846cf..8139567de9c 100644
--- a/requirements_all.txt
+++ b/requirements_all.txt
@@ -1028,7 +1028,7 @@ xbee-helper==0.0.7
 xboxapi==0.1.1
 
 # homeassistant.components.knx
-xknx==0.7.13
+xknx==0.7.14
 
 # homeassistant.components.media_player.bluesound
 # homeassistant.components.sensor.swiss_hydrological_data
-- 
GitLab