Integration with lockitron (#6805)
* Integration with lockitron * Let super class deal with polling and updating
This commit is contained in:
parent
7c614a6738
commit
c935bfce2a
2 changed files with 93 additions and 0 deletions
|
@ -235,6 +235,7 @@ omit =
|
||||||
homeassistant/components/light/zengge.py
|
homeassistant/components/light/zengge.py
|
||||||
homeassistant/components/lirc.py
|
homeassistant/components/lirc.py
|
||||||
homeassistant/components/lock/nuki.py
|
homeassistant/components/lock/nuki.py
|
||||||
|
homeassistant/components/lock/lockitron.py
|
||||||
homeassistant/components/media_player/anthemav.py
|
homeassistant/components/media_player/anthemav.py
|
||||||
homeassistant/components/media_player/apple_tv.py
|
homeassistant/components/media_player/apple_tv.py
|
||||||
homeassistant/components/media_player/aquostv.py
|
homeassistant/components/media_player/aquostv.py
|
||||||
|
|
92
homeassistant/components/lock/lockitron.py
Normal file
92
homeassistant/components/lock/lockitron.py
Normal file
|
@ -0,0 +1,92 @@
|
||||||
|
"""
|
||||||
|
Lockitron lock platform.
|
||||||
|
|
||||||
|
For more details about this platform, please refer to the documentation
|
||||||
|
https://home-assistant.io/components/lockitron/
|
||||||
|
"""
|
||||||
|
import logging
|
||||||
|
|
||||||
|
import requests
|
||||||
|
import voluptuous as vol
|
||||||
|
|
||||||
|
import homeassistant.helpers.config_validation as cv
|
||||||
|
from homeassistant.components.lock import LockDevice, PLATFORM_SCHEMA
|
||||||
|
from homeassistant.const import CONF_ACCESS_TOKEN, CONF_ID
|
||||||
|
|
||||||
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
DOMAIN = 'lockitron'
|
||||||
|
|
||||||
|
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
|
||||||
|
vol.Required(CONF_ACCESS_TOKEN): cv.string,
|
||||||
|
vol.Required(CONF_ID): cv.string
|
||||||
|
})
|
||||||
|
BASE_URL = 'https://api.lockitron.com'
|
||||||
|
API_STATE_URL = BASE_URL + '/v2/locks/{}?access_token={}'
|
||||||
|
API_ACTION_URL = BASE_URL + '/v2/locks/{}?access_token={}&state={}'
|
||||||
|
|
||||||
|
|
||||||
|
# pylint: disable=unused-argument
|
||||||
|
def setup_platform(hass, config, add_devices, discovery_info=None):
|
||||||
|
"""Setup the Lockitron platform."""
|
||||||
|
access_token = config.get(CONF_ACCESS_TOKEN)
|
||||||
|
device_id = config.get(CONF_ID)
|
||||||
|
response = requests.get(API_STATE_URL.format(device_id, access_token))
|
||||||
|
if response.status_code == 200:
|
||||||
|
add_devices([Lockitron(response.json()['state'], access_token,
|
||||||
|
device_id)])
|
||||||
|
else:
|
||||||
|
_LOGGER.error('Error retrieving lock status during init: %s',
|
||||||
|
response.text)
|
||||||
|
|
||||||
|
|
||||||
|
class Lockitron(LockDevice):
|
||||||
|
"""Representation of a Lockitron lock."""
|
||||||
|
|
||||||
|
LOCK_STATE = 'lock'
|
||||||
|
UNLOCK_STATE = 'unlock'
|
||||||
|
|
||||||
|
def __init__(self, state, access_token, device_id):
|
||||||
|
"""Initialize the lock."""
|
||||||
|
self._state = state
|
||||||
|
self.access_token = access_token
|
||||||
|
self.device_id = device_id
|
||||||
|
|
||||||
|
@property
|
||||||
|
def name(self):
|
||||||
|
"""Return the name of the device."""
|
||||||
|
return DOMAIN
|
||||||
|
|
||||||
|
@property
|
||||||
|
def is_locked(self):
|
||||||
|
"""Return True if the lock is currently locked, else False."""
|
||||||
|
return self._state == Lockitron.LOCK_STATE
|
||||||
|
|
||||||
|
def lock(self, **kwargs):
|
||||||
|
"""Lock the device."""
|
||||||
|
self._state = self.do_change_request(Lockitron.LOCK_STATE)
|
||||||
|
|
||||||
|
def unlock(self, **kwargs):
|
||||||
|
"""Unlock the device."""
|
||||||
|
self._state = self.do_change_request(Lockitron.UNLOCK_STATE)
|
||||||
|
|
||||||
|
def update(self):
|
||||||
|
"""Update the internal state of the device."""
|
||||||
|
response = requests \
|
||||||
|
.get(API_STATE_URL.format(self.device_id, self.access_token))
|
||||||
|
if response.status_code == 200:
|
||||||
|
self._state = response.json()['state']
|
||||||
|
else:
|
||||||
|
_LOGGER.error('Error retrieving lock status: %s', response.text)
|
||||||
|
|
||||||
|
def do_change_request(self, requested_state):
|
||||||
|
"""Execute the change request and pull out the new state."""
|
||||||
|
response = requests.put(
|
||||||
|
API_ACTION_URL.format(self.device_id, self.access_token,
|
||||||
|
requested_state))
|
||||||
|
if response.status_code == 200:
|
||||||
|
return response.json()['state']
|
||||||
|
else:
|
||||||
|
_LOGGER.error('Error setting lock state: %s\n%s',
|
||||||
|
requested_state, response.text)
|
||||||
|
return self._state
|
Loading…
Add table
Add a link
Reference in a new issue