From bcd0f83ef685485b8c39de553439c8955a03465d Mon Sep 17 00:00:00 2001 From: thesaint1975 <68971528+thesaint1975@users.noreply.github.com> Date: Tue, 5 Jul 2022 21:42:24 +0200 Subject: [PATCH 01/12] Update shade.py --- warema_wms/shade.py | 58 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 56 insertions(+), 2 deletions(-) diff --git a/warema_wms/shade.py b/warema_wms/shade.py index 92966cd..9f5c44b 100644 --- a/warema_wms/shade.py +++ b/warema_wms/shade.py @@ -9,7 +9,7 @@ class Shade: def __init__(self, wms_ctrl: WmsController, room, channel, - time_between_cmds=0.1, num_retries=3, position=0, is_moving=False): + time_between_cmds=0.1, num_retries=3, position=0, tilt_position=0, is_moving=False): """ Initializes a Shade entity :param wms_ctrl: Allows to pass in your own version of a WmsController @@ -28,6 +28,7 @@ def __init__(self, wms_ctrl: WmsController, room, channel, self.time_between_cmds = time_between_cmds self.num_retries = num_retries self.position = position # 0 for open 100 for closed + self.tilt_position = tilt_position # lets see what happens now # self.is_moving = is_moving self.state_last_updated = None @@ -48,6 +49,7 @@ def update_shade_state(self): try: self.is_moving = False if shutter_xml.find('fahrt').text == '0' else True self.position = int(shutter_xml.find('position').text) / 2 + self.tilt_position = int(shutter_xml.find('winkel').text) / 2 self.state_last_updated = datetime.now() return True except AttributeError: @@ -67,7 +69,7 @@ def get_shade_state(self, force_update=False): """ if force_update or self.state_last_updated is None: self.update_shade_state() - return self.position, self.is_moving, self.state_last_updated + return self.position, self.is_moving, self.tilt_position, self.state_last_updated def set_shade_position(self, new_position): """ @@ -88,6 +90,40 @@ def set_shade_position(self, new_position): .format(self.room.name, self.channel.name, new_position)) return False + def set_shade_tilt_position(self, new_tilt_position): + """ + Sets shade to new_tilt. + :param new_tilt: New tilt of shade + """ + for _ in range(self.num_retries): + self._try_cmd_n_times(lambda: self.wms_ctrl.send_rx_check_ready(self.room.id, self.channel.id), + self.num_retries) + time.sleep(self.time_between_cmds) + self.wms_ctrl.send_tx_tilt_shade(self.room.id, self.channel.id, new_tilt_position * 2) + # This cmd is sent by the JS app of the web control server but its purpose is unclear and the feedback + # is always 0 + # self.wms_ctrl.send_rx_move_shutter(self.room.id, self.channel.id) + if self._verify_tilt_cmd_sent(new_tilt_position): + return True + logger.warning("Shade {}:{} could not be set to target tilt {}" + .format(self.room.name, self.channel.name, new_tilt_position)) + return False + + def stop_moving_shade(self): + """ + Stops a moving shade. + """ + for _ in range(self.num_retries): + self._try_cmd_n_times(lambda: self.wms_ctrl.send_rx_check_ready(self.room.id, self.channel.id), + self.num_retries) + time.sleep(self.time_between_cmds) + self.wms_ctrl.send_tx_stop_shade(self.room.id, self.channel.id) + if self._verify_stop_cmd_sent(): + return True + logger.warning("Shade {}:{} could not be stopped." + .format(self.room.name, self.channel.name)) + return False + def _try_cmd_n_times(self, cmd, n=3): for i in range(n): ret = cmd() @@ -105,6 +141,24 @@ def _verify_set_cmd_sent(self, target_position): time.sleep(self.time_between_cmds) return False + def _verify_tilt_cmd_sent(self, target_tilt_position): + time.sleep(self.time_between_cmds) + for _ in range(self.num_retries): + self.update_shade_state() + if self.is_moving or self.tilt_position == target_tilt_position: + return True + time.sleep(self.time_between_cmds) + return False + + def _verify_stop_cmd_sent(self): + time.sleep(self.time_between_cmds) + for _ in range(self.num_retries): + self.update_shade_state() + if not self.is_moving: + return True + time.sleep(self.time_between_cmds) + return False + @staticmethod def get_all_shades(wms_ctrl=None, time_between_cmds=0.1, num_retries=3): """ From effe410a783fdceb6235bd15c7c607df3e58864b Mon Sep 17 00:00:00 2001 From: thesaint1975 <68971528+thesaint1975@users.noreply.github.com> Date: Tue, 5 Jul 2022 21:43:12 +0200 Subject: [PATCH 02/12] Update wms_controller.py --- warema_wms/wms_controller.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/warema_wms/wms_controller.py b/warema_wms/wms_controller.py index 55c3235..788dfcc 100644 --- a/warema_wms/wms_controller.py +++ b/warema_wms/wms_controller.py @@ -18,16 +18,17 @@ RX_SHADE_STATE = '0431' TX_MOVE_SHADE = '0821' -SHADE_POSITION = '03{}ffffff' +SHADE_POSITION = '03{}dfffff' +TILT_POSITION = '03ff{}ffff' +STOP_SHADE = '01ffffffff' logger = logging.getLogger('warema_wms') - +logging.debug class WmsController: """ This class is in charge of sending single commands to the WebControl server. Commands should contain no (or as little as possible) logic. - Set log level to DEBUG to get a trace of sent commands and responses. """ def _retrieve_setup(self): @@ -69,6 +70,7 @@ def _increment(self): self.initial_ts += 1 return res + def _send_command(self, cmd, additional_str=''): cc, ts = self._increment() params = {GET_PARAM1: CMD_PREFIX + format(cc, '02x') + cmd + additional_str, GET_PARAM2: str(ts)} @@ -93,6 +95,13 @@ def send_tx_move_shade(self, room_id, channel_id, new_shade_pos): return self._send_command(TX_MOVE_SHADE, format(room_id, '02x') + format(channel_id, '02x') + SHADE_POSITION.format(format(new_shade_pos, '02x'))) + def send_tx_tilt_shade(self, room_id, channel_id, new_tilt_pos): + return self._send_command(TX_MOVE_SHADE, format(room_id, '02x') + format(channel_id, '02x') + + TILT_POSITION.format(format(new_tilt_pos, '02x'))) + + def send_tx_stop_shade(self, room_id, channel_id): + return self._send_command(TX_MOVE_SHADE, format(room_id, '02x') + format(channel_id, '02x') + STOP_SHADE) + def send_rx_move_shade(self, room_id, channel_id): """ This cmd is send out by the JS app of the web control server after the cmd to set a new shade position From 192120f4388e51567a708b386fc01a5bea1c4c76 Mon Sep 17 00:00:00 2001 From: thesaint1975 <68971528+thesaint1975@users.noreply.github.com> Date: Tue, 5 Jul 2022 23:14:10 +0200 Subject: [PATCH 03/12] Update wms_controller.py --- warema_wms/wms_controller.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/warema_wms/wms_controller.py b/warema_wms/wms_controller.py index 788dfcc..7a5172a 100644 --- a/warema_wms/wms_controller.py +++ b/warema_wms/wms_controller.py @@ -18,9 +18,9 @@ RX_SHADE_STATE = '0431' TX_MOVE_SHADE = '0821' -SHADE_POSITION = '03{}dfffff' +SHADE_POSITION = '03{}dfffff' # df = trial to move raffstores in tilt closed pos., working in console but not in HA TILT_POSITION = '03ff{}ffff' -STOP_SHADE = '01ffffffff' +STOP_SHADE = '01ffffffff' # at least at my setup it works (instead of STOP_SHADE = '0001ffffff') logger = logging.getLogger('warema_wms') logging.debug From 7e57aec269d45b77f7c67137a3d9a4b541a19282 Mon Sep 17 00:00:00 2001 From: thesaint1975 <68971528+thesaint1975@users.noreply.github.com> Date: Tue, 5 Jul 2022 23:23:16 +0200 Subject: [PATCH 04/12] Update shade.py --- warema_wms/shade.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/warema_wms/shade.py b/warema_wms/shade.py index 9f5c44b..6a2c4a2 100644 --- a/warema_wms/shade.py +++ b/warema_wms/shade.py @@ -28,7 +28,7 @@ def __init__(self, wms_ctrl: WmsController, room, channel, self.time_between_cmds = time_between_cmds self.num_retries = num_retries self.position = position # 0 for open 100 for closed - self.tilt_position = tilt_position # lets see what happens now # + self.tilt_position = tilt_position # lets see what happens now # 30=tilt open 100=tilt closed, 6 Raffstores show different values here, from 20 - 28 & 101 - 104 self.is_moving = is_moving self.state_last_updated = None From 7e13f4b4cae3d6e06f21cd64f463a8e4d82e4456 Mon Sep 17 00:00:00 2001 From: thesaint1975 <68971528+thesaint1975@users.noreply.github.com> Date: Wed, 6 Jul 2022 09:02:18 +0200 Subject: [PATCH 05/12] Update README.md added usage for tilt position --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index bd0cd96..3c957d0 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,7 @@ from warema_wms import Shade shades = Shade.get_all_shades() shades[0].set_shade_position(25) #0=open; 100=closed +shades[1].set_shade_tilt_position(100) #30=tilt open; 100=tilt closed shades[1].get_shade_state(True) #Force update and get shade state ``` From bf0196c375b6fa680479238cb889b243f4e0e764 Mon Sep 17 00:00:00 2001 From: thesaint1975 <68971528+thesaint1975@users.noreply.github.com> Date: Wed, 6 Jul 2022 10:01:05 +0200 Subject: [PATCH 06/12] Update warema_wms/shade.py Co-authored-by: Cornelius Mund <4417017+cornim@users.noreply.github.com> --- warema_wms/shade.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/warema_wms/shade.py b/warema_wms/shade.py index 6a2c4a2..fee588d 100644 --- a/warema_wms/shade.py +++ b/warema_wms/shade.py @@ -9,7 +9,7 @@ class Shade: def __init__(self, wms_ctrl: WmsController, room, channel, - time_between_cmds=0.1, num_retries=3, position=0, tilt_position=0, is_moving=False): + time_between_cmds=0.1, num_retries=3, position=0, tilt_position=30, is_moving=False): """ Initializes a Shade entity :param wms_ctrl: Allows to pass in your own version of a WmsController From bf980c1a004de348fc67b5e3a5e58d629b5da6ff Mon Sep 17 00:00:00 2001 From: thesaint1975 <68971528+thesaint1975@users.noreply.github.com> Date: Wed, 6 Jul 2022 10:02:11 +0200 Subject: [PATCH 07/12] Update warema_wms/shade.py Co-authored-by: Cornelius Mund <4417017+cornim@users.noreply.github.com> --- warema_wms/shade.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/warema_wms/shade.py b/warema_wms/shade.py index fee588d..80dbbad 100644 --- a/warema_wms/shade.py +++ b/warema_wms/shade.py @@ -28,7 +28,7 @@ def __init__(self, wms_ctrl: WmsController, room, channel, self.time_between_cmds = time_between_cmds self.num_retries = num_retries self.position = position # 0 for open 100 for closed - self.tilt_position = tilt_position # lets see what happens now # 30=tilt open 100=tilt closed, 6 Raffstores show different values here, from 20 - 28 & 101 - 104 + self.tilt_position = tilt_position # 30=tilt open 100=tilt closed, 6 Raffstores show different values here, from 20 - 28 & 101 - 104 self.is_moving = is_moving self.state_last_updated = None From ef4a12fe0de0b0512b3921ea815be4c5f9cb6942 Mon Sep 17 00:00:00 2001 From: thesaint1975 <68971528+thesaint1975@users.noreply.github.com> Date: Wed, 6 Jul 2022 10:02:33 +0200 Subject: [PATCH 08/12] Update warema_wms/shade.py Co-authored-by: Cornelius Mund <4417017+cornim@users.noreply.github.com> --- warema_wms/shade.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/warema_wms/shade.py b/warema_wms/shade.py index 80dbbad..13268c5 100644 --- a/warema_wms/shade.py +++ b/warema_wms/shade.py @@ -93,7 +93,7 @@ def set_shade_position(self, new_position): def set_shade_tilt_position(self, new_tilt_position): """ Sets shade to new_tilt. - :param new_tilt: New tilt of shade + :param new_tilt: New tilt of shade (30=open, 100=closed) """ for _ in range(self.num_retries): self._try_cmd_n_times(lambda: self.wms_ctrl.send_rx_check_ready(self.room.id, self.channel.id), From 00bcd910f77e8f567199be78fa2f8598743b6ede Mon Sep 17 00:00:00 2001 From: thesaint1975 <68971528+thesaint1975@users.noreply.github.com> Date: Wed, 6 Jul 2022 10:02:50 +0200 Subject: [PATCH 09/12] Update warema_wms/shade.py Co-authored-by: Cornelius Mund <4417017+cornim@users.noreply.github.com> --- warema_wms/shade.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/warema_wms/shade.py b/warema_wms/shade.py index 13268c5..db7c654 100644 --- a/warema_wms/shade.py +++ b/warema_wms/shade.py @@ -100,9 +100,6 @@ def set_shade_tilt_position(self, new_tilt_position): self.num_retries) time.sleep(self.time_between_cmds) self.wms_ctrl.send_tx_tilt_shade(self.room.id, self.channel.id, new_tilt_position * 2) - # This cmd is sent by the JS app of the web control server but its purpose is unclear and the feedback - # is always 0 - # self.wms_ctrl.send_rx_move_shutter(self.room.id, self.channel.id) if self._verify_tilt_cmd_sent(new_tilt_position): return True logger.warning("Shade {}:{} could not be set to target tilt {}" From 7433d487d38de36afb28475067f4381215028650 Mon Sep 17 00:00:00 2001 From: thesaint1975 <68971528+thesaint1975@users.noreply.github.com> Date: Wed, 6 Jul 2022 11:15:17 +0200 Subject: [PATCH 10/12] Update warema_wms/wms_controller.py Co-authored-by: Cornelius Mund <4417017+cornim@users.noreply.github.com> --- warema_wms/wms_controller.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/warema_wms/wms_controller.py b/warema_wms/wms_controller.py index 7a5172a..82bd9df 100644 --- a/warema_wms/wms_controller.py +++ b/warema_wms/wms_controller.py @@ -18,7 +18,7 @@ RX_SHADE_STATE = '0431' TX_MOVE_SHADE = '0821' -SHADE_POSITION = '03{}dfffff' # df = trial to move raffstores in tilt closed pos., working in console but not in HA +SHADE_POSITION = '03{}ffffff' TILT_POSITION = '03ff{}ffff' STOP_SHADE = '01ffffffff' # at least at my setup it works (instead of STOP_SHADE = '0001ffffff') From 262b2ef6292f8e3f5db0f9bc821b1f23a9e6a771 Mon Sep 17 00:00:00 2001 From: thesaint1975 <68971528+thesaint1975@users.noreply.github.com> Date: Wed, 6 Jul 2022 12:07:35 +0200 Subject: [PATCH 11/12] Update warema_wms/wms_controller.py Co-authored-by: Cornelius Mund <4417017+cornim@users.noreply.github.com> --- warema_wms/wms_controller.py | 1 - 1 file changed, 1 deletion(-) diff --git a/warema_wms/wms_controller.py b/warema_wms/wms_controller.py index 82bd9df..7c5ce80 100644 --- a/warema_wms/wms_controller.py +++ b/warema_wms/wms_controller.py @@ -70,7 +70,6 @@ def _increment(self): self.initial_ts += 1 return res - def _send_command(self, cmd, additional_str=''): cc, ts = self._increment() params = {GET_PARAM1: CMD_PREFIX + format(cc, '02x') + cmd + additional_str, GET_PARAM2: str(ts)} From 3145b14f26f93db790122b3ddec9a41c97b09ef4 Mon Sep 17 00:00:00 2001 From: thesaint1975 <68971528+thesaint1975@users.noreply.github.com> Date: Wed, 6 Jul 2022 12:31:13 +0200 Subject: [PATCH 12/12] Update warema_wms/wms_controller.py Co-authored-by: Cornelius Mund <4417017+cornim@users.noreply.github.com> --- warema_wms/wms_controller.py | 1 - 1 file changed, 1 deletion(-) diff --git a/warema_wms/wms_controller.py b/warema_wms/wms_controller.py index 7c5ce80..24d534c 100644 --- a/warema_wms/wms_controller.py +++ b/warema_wms/wms_controller.py @@ -23,7 +23,6 @@ STOP_SHADE = '01ffffffff' # at least at my setup it works (instead of STOP_SHADE = '0001ffffff') logger = logging.getLogger('warema_wms') -logging.debug class WmsController: """