Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .coveragerc
Original file line number Diff line number Diff line change
Expand Up @@ -457,6 +457,7 @@ omit =
homeassistant/components/light/yeelightsunflower.py
homeassistant/components/light/zengge.py
homeassistant/components/lirc.py
homeassistant/components/lock/kiwi.py
homeassistant/components/lock/lockitron.py
homeassistant/components/lock/nello.py
homeassistant/components/lock/nuki.py
Expand Down
110 changes: 110 additions & 0 deletions homeassistant/components/lock/kiwi.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
"""
Support for the KIWI.KI lock platform.

For more details about this platform, please refer to the documentation
https://home-assistant.io/components/lock.kiwi/
"""
import logging

import voluptuous as vol

import homeassistant.helpers.config_validation as cv
from homeassistant.components.lock import (LockDevice, PLATFORM_SCHEMA)
from homeassistant.const import (
CONF_PASSWORD, CONF_USERNAME, ATTR_ID, ATTR_LONGITUDE, ATTR_LATITUDE,
STATE_LOCKED, STATE_UNLOCKED)
from homeassistant.helpers.event import async_call_later
from homeassistant.core import callback

REQUIREMENTS = ['kiwiki-client==0.1.1']

_LOGGER = logging.getLogger(__name__)

ATTR_TYPE = 'hardware_type'
ATTR_PERMISSION = 'permission'
ATTR_CAN_INVITE = 'can_invite_others'

UNLOCK_MAINTAIN_TIME = 5

PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
vol.Required(CONF_USERNAME): cv.string,
vol.Required(CONF_PASSWORD): cv.string
})


def setup_platform(hass, config, add_devices, discovery_info=None):
"""Set up the KIWI lock platform."""
from kiwiki import KiwiClient, KiwiException
try:
kiwi = KiwiClient(config[CONF_USERNAME], config[CONF_PASSWORD])
except KiwiException as exc:
_LOGGER.error(exc)
return
available_locks = kiwi.get_locks()
if not available_locks:
# No locks found; abort setup routine.
_LOGGER.info("No KIWI locks found in your account.")
return
add_devices([KiwiLock(lock, kiwi) for lock in available_locks], True)


class KiwiLock(LockDevice):
"""Representation of a Kiwi lock."""

def __init__(self, kiwi_lock, client):
"""Initialize the lock."""
self._sensor = kiwi_lock
self._client = client
self.lock_id = kiwi_lock['sensor_id']
self._state = STATE_LOCKED

address = kiwi_lock.get('address')
address.update({
ATTR_LATITUDE: address.pop('lat', None),
ATTR_LONGITUDE: address.pop('lng', None)
})

self._device_attrs = {
ATTR_ID: self.lock_id,
ATTR_TYPE: kiwi_lock.get('hardware_type'),
ATTR_PERMISSION: kiwi_lock.get('highest_permission'),
ATTR_CAN_INVITE: kiwi_lock.get('can_invite'),
**address
}

@property
def name(self):
"""Return the name of the lock."""
name = self._sensor.get('name')
specifier = self._sensor['address'].get('specifier')
return name or specifier

@property
def is_locked(self):
"""Return true if lock is locked."""
return self._state == STATE_LOCKED

@property
def device_state_attributes(self):
"""Return the device specific state attributes."""
return self._device_attrs

@callback
def clear_unlock_state(self, _):
"""Clear unlock state automatically."""
self._state = STATE_LOCKED
self.async_schedule_update_ha_state()

def unlock(self, **kwargs):
"""Unlock the device."""
from kiwiki import KiwiException
try:
self._client.open_door(self.lock_id)
except KiwiException:
_LOGGER.error("failed to open door")
else:
self._state = STATE_UNLOCKED
self.hass.add_job(
async_call_later, self.hass, UNLOCK_MAINTAIN_TIME,
self.clear_unlock_state
)
3 changes: 3 additions & 0 deletions requirements_all.txt
Original file line number Diff line number Diff line change
Expand Up @@ -464,6 +464,9 @@ keyring==12.2.0
# homeassistant.scripts.keyring
keyrings.alt==3.1

# homeassistant.components.lock.kiwi
kiwiki-client==0.1.1

# homeassistant.components.konnected
konnected==0.1.2

Expand Down