# pylint: disable=no-value-for-parameter
import logging
from aiohap import Accessory, Category, services
from .base import Link
logger = logging.getLogger(__name__)
[docs]class BlindsAccessory(Accessory):
category = Category.WINDOW_COVERING
info = services.AccessoryInformation
covering = services.WindowCovering
[docs]class BlindsLink(Link):
meadow_service_type = 'blinds'
def _create_link(self):
super()._create_link()
self._md_blinds = self._md_service
include = ('covering:current_horizontal_tilt_angle',
'covering:target_horizontal_tilt_angle')
self._hk_blinds = BlindsAccessory(self._md_blinds.name, include=include)
self._fill_accessory_info(self._hk_blinds)
self._hk_blinds.covering.set(current_position=0, target_position=0, position_state=2)
self._hk_blinds.covering.set(current_horizontal_tilt_angle=0,
target_horizontal_tilt_angle=0)
self.bridge.accessory_server.add_accessory(self._hk_blinds)
async def _setup(self):
self._hk_blinds.covering.target_position.handle_write(self._handle_target_position_write)
self._hk_blinds.covering.target_horizontal_tilt_angle.handle_write(
self._handle_target_angle_write)
self._md_blinds.target_blind.subscribe(self._handle_meadow_target_blind_update)
self._md_blinds.blind.subscribe(self._handle_meadow_blind_update)
self._md_blinds.movement.subscribe(self._handle_meadow_movement_update)
self._md_blinds.tilt.subscribe(self._handle_meadow_tilt_update)
self._md_blinds.target_tilt.subscribe(self._handle_meadow_target_tilt_update)
async def _reload_state(self):
# read current values
await self._md_blinds.enable_notifications()
await self._handle_meadow_tilt_update(await self._md_blinds.tilt.read())
await self._handle_meadow_target_tilt_update(await self._md_blinds.target_tilt.read())
await self._handle_meadow_blind_update(await self._md_blinds.blind.read())
await self._handle_meadow_target_blind_update(await self._md_blinds.target_blind.read())
async def _handle_target_position_write(self, value, **kwargs):
blind = (100.0 - value) / 100.0
await self._md_blinds.target_blind.write(blind)
self._hk_blinds.covering.target_position.value = value
async def _handle_target_angle_write(self, value, **kwargs):
await self._md_blinds.target_tilt.write(float(value))
self._hk_blinds.covering.target_horizontal_tilt_angle.value = value
async def _handle_meadow_target_blind_update(self, value, **kwargs):
position = (1 - value) * 100
self._hk_blinds.covering.target_position.value = position
async def _handle_meadow_blind_update(self, value, **kwargs):
position = (1 - value) * 100
if abs(position - self._hk_blinds.covering.target_position.value) < 10:
position = self._hk_blinds.covering.target_position.value
self._hk_blinds.covering.current_position.value = position
async def _handle_meadow_tilt_update(self, value, **kwargs):
self._hk_blinds.covering.current_horizontal_tilt_angle.value = int(value)
async def _handle_meadow_target_tilt_update(self, value, **kwargs):
angle = int(value)
if abs(angle - self._hk_blinds.covering.target_horizontal_tilt_angle.value) < 10:
angle = self._hk_blinds.covering.target_horizontal_tilt_angle.value
self._hk_blinds.covering.target_horizontal_tilt_angle.value = angle
async def _handle_meadow_movement_update(self, value, **kwargs):
state_map = dict(up=1, down=0, steady=2)
self._hk_blinds.covering.position_state.value = state_map[value]