-
-
Notifications
You must be signed in to change notification settings - Fork 38.3k
Add support for KIWI Door Locks #14485
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 14 commits
d9a0d7d
8624d6e
b823b06
15483cd
41f7ea8
2ba5154
c4f4a00
a14adc6
19891aa
41422b3
9644328
9c1792b
ec8d4d9
d917dd3
7107c3f
4593daf
2e796d7
428ed07
b6894ef
a32744b
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,103 @@ | ||
| """ | ||
| 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'] | ||
|
|
||
| _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 e: | ||
| _LOGGER.error(e.msg) | ||
| return False | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Don't return
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. That is horrible to read. I prefer
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Nothing is checking the return value.
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Check the platform example -
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. That example needs updating. It doesn't improve readability. It gives the wrong impression what happens when the function returns. It also makes the return inconsistent.
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ok, I created an Issue (home-assistant/developers.home-assistant#21) and will change it to |
||
| add_devices([KiwiLock(lock, kiwi) for lock in kiwi.get_locks()], True) | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. A log entry that there are no locks found would help the users. Also, the setup can be terminated if there are no locks. |
||
|
|
||
|
|
||
| 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 | ||
| async_call_later(self.hass, UNLOCK_MAINTAIN_TIME, | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This is a callback so have to be run from within the event loop. Use
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. doesn't
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
self.hass.add_job(
async_call_later, self.hass, UNLOCK_MAINTAIN_TIME, self.clear_unlock_state) |
||
| self.clear_unlock_state) | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Linter is failing here. Please use eg
excinstead ofe.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
that's sad.... 😢