# pylint: disable=no-value-for-parameter
import logging
from aiohap import Accessory, Category, characteristics, services
from .base import Link
logger = logging.getLogger(__name__)
[docs]class LockMechanismAccessory(Accessory):
category = Category.DOORLOCK
info = services.AccessoryInformation
lock = services.LockMechanism
[docs]class LockMechanismLink(Link):
meadow_service_type = 'lock-mechanism'
def _create_link(self):
super()._create_link()
self._md_lock = self._md_service
self._hk_lock = LockMechanismAccessory(self._md_lock.name)
self._fill_accessory_info(self._hk_lock)
self._hk_lock.lock.set(current_state=characteristics.LockCurrentState.State.SECURED,
target_state=characteristics.LockTargetState.State.SECURED)
self.bridge.accessory_server.add_accessory(self._hk_lock)
async def _setup(self):
self._hk_lock.lock.target_state.handle_write(self._handle_target_state_write)
self._md_lock.target_state.subscribe(self._handle_meadow_target_state_update)
self._md_lock.state.subscribe(self._handle_meadow_state_update)
async def _reload_state(self):
await self._md_lock.target_state.enable_notifications()
await self._md_lock.state.enable_notifications()
current_state = await self._md_lock.state.read()
await self._handle_meadow_state_update(current_state)
await self._handle_meadow_target_state_update(current_state)
def _meadow_state_to_homekit(self, state):
state_map = dict(unsecured=characteristics.LockCurrentState.State.UNSECURED,
secured=characteristics.LockCurrentState.State.SECURED)
return state_map.get(state, characteristics.LockCurrentState.State.UNKNOWN)
def _homekit_state_to_meadow(self, state):
state_map = {
characteristics.LockCurrentState.State.UNSECURED: 'unsecured',
characteristics.LockCurrentState.State.SECURED: 'secured'
}
return state_map[state]
async def _handle_meadow_target_state_update(self, value, **kwargs):
value = self._meadow_state_to_homekit(value)
self._hk_lock.lock.target_state.value = value
async def _handle_meadow_state_update(self, value, **kwargs):
value = self._meadow_state_to_homekit(value)
self._hk_lock.lock.current_state.value = value
async def _handle_target_state_write(self, value, **kwargs):
hk_value = self._homekit_state_to_meadow(value)
await self._md_lock.target_state.write(hk_value)
self._hk_lock.lock.target_state.value = value