core/homeassistant/components/switch/vera.py

169 lines
5.2 KiB
Python
Raw Normal View History

2015-03-08 14:14:44 +00:00
"""
2015-08-08 17:09:37 +00:00
homeassistant.components.switch.vera
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2015-03-08 14:14:44 +00:00
Support for Vera switches.
Configuration:
2015-03-08 14:14:44 +00:00
To use the Vera lights you will need to add something like the following to
your configuration.yaml file.
switch:
platform: vera
vera_controller_url: http://YOUR_VERA_IP:3480/
2015-03-08 14:14:44 +00:00
device_data:
12:
name: My awesome switch
exclude: true
13:
2015-03-08 14:14:44 +00:00
name: Another Switch
2015-08-08 17:09:37 +00:00
Variables:
vera_controller_url
*Required
2015-03-08 14:14:44 +00:00
This is the base URL of your vera controller including the port number if not
2015-08-08 17:09:37 +00:00
running on 80. Example: http://192.168.1.21:3480/
device_data
*Optional
2015-03-08 14:14:44 +00:00
This contains an array additional device info for your Vera devices. It is not
required and if not specified all lights configured in your Vera controller
will be added with default values. You should use the id of your vera device
2015-08-08 17:09:37 +00:00
as the key for the device within device_data.
These are the variables for the device_data array:
name
*Optional
2015-03-08 14:14:44 +00:00
This parameter allows you to override the name of your Vera device in the HA
interface, if not specified the value configured for the device in your Vera
2015-08-08 17:09:37 +00:00
will be used.
exclude
*Optional
2015-03-08 14:14:44 +00:00
This parameter allows you to exclude the specified device from homeassistant,
2015-08-08 17:09:37 +00:00
it should be set to "true" if you want this device excluded.
"""
2015-03-02 10:09:00 +00:00
import logging
import time
from requests.exceptions import RequestException
import homeassistant.util.dt as dt_util
2015-03-02 10:09:00 +00:00
from homeassistant.helpers.entity import ToggleEntity
from homeassistant.const import (
ATTR_BATTERY_LEVEL, ATTR_TRIPPED, ATTR_ARMED, ATTR_LAST_TRIP_TIME)
2015-09-09 03:11:25 +00:00
REQUIREMENTS = ['https://github.com/balloob/home-assistant-vera-api/archive/'
'a8f823066ead6c7da6fb5e7abaf16fef62e63364.zip'
'#python-vera==0.1']
2015-03-02 10:09:00 +00:00
_LOGGER = logging.getLogger(__name__)
2015-03-02 10:09:00 +00:00
2015-03-08 14:58:11 +00:00
2015-03-08 14:14:44 +00:00
# pylint: disable=unused-argument
2015-03-02 10:09:00 +00:00
def get_devices(hass, config):
""" Find and return Vera switches. """
2015-09-09 03:11:25 +00:00
import pyvera as veraApi
2015-03-02 10:09:00 +00:00
2015-03-08 20:03:56 +00:00
base_url = config.get('vera_controller_url')
if not base_url:
_LOGGER.error(
"The required parameter 'vera_controller_url'"
" was not found in config"
)
return False
device_data = config.get('device_data', {})
2015-03-02 10:09:00 +00:00
2015-03-08 20:03:56 +00:00
vera_controller = veraApi.VeraController(base_url)
devices = []
try:
devices = vera_controller.get_devices([
'Switch', 'Armable Sensor', 'On/Off Switch'])
except RequestException:
2015-08-08 17:09:37 +00:00
# There was a network related error connecting to the vera controller.
_LOGGER.exception("Error communicating with Vera API")
2015-03-02 10:09:00 +00:00
return False
2015-03-08 20:03:56 +00:00
vera_switches = []
for device in devices:
extra_data = device_data.get(device.deviceId, {})
exclude = extra_data.get('exclude', False)
2015-03-08 20:03:56 +00:00
if exclude is not True:
vera_switches.append(VeraSwitch(device, extra_data))
2015-03-02 10:09:00 +00:00
return vera_switches
2015-03-08 14:58:11 +00:00
def setup_platform(hass, config, add_devices, discovery_info=None):
2015-03-08 14:14:44 +00:00
""" Find and return Vera lights. """
add_devices(get_devices(hass, config))
2015-03-02 10:09:00 +00:00
2015-03-08 14:58:11 +00:00
class VeraSwitch(ToggleEntity):
2015-08-08 17:09:37 +00:00
""" Represents a Vera Switch. """
2015-03-02 10:09:00 +00:00
def __init__(self, vera_device, extra_data=None):
self.vera_device = vera_device
self.extra_data = extra_data
2015-03-08 20:15:41 +00:00
if self.extra_data and self.extra_data.get('name'):
self._name = self.extra_data.get('name')
else:
self._name = self.vera_device.name
2015-03-09 04:16:02 +00:00
self.is_on_status = False
# for debouncing status check after command is sent
self.last_command_send = 0
2015-03-02 10:09:00 +00:00
@property
def name(self):
""" Get the mame of the switch. """
2015-03-08 20:15:41 +00:00
return self._name
2015-03-02 10:09:00 +00:00
@property
def state_attributes(self):
attr = super().state_attributes or {}
2015-03-02 10:09:00 +00:00
if self.vera_device.has_battery:
2015-03-08 20:11:35 +00:00
attr[ATTR_BATTERY_LEVEL] = self.vera_device.battery_level + '%'
2015-03-02 10:09:00 +00:00
if self.vera_device.is_armable:
armed = self.vera_device.refresh_value('Armed')
attr[ATTR_ARMED] = 'True' if armed == '1' else 'False'
2015-03-02 10:09:00 +00:00
if self.vera_device.is_trippable:
2015-03-08 14:14:44 +00:00
last_tripped = self.vera_device.refresh_value('LastTrip')
if last_tripped is not None:
utc_time = dt_util.utc_from_timestamp(int(last_tripped))
attr[ATTR_LAST_TRIP_TIME] = dt_util.datetime_to_str(
utc_time)
else:
attr[ATTR_LAST_TRIP_TIME] = None
2015-03-02 10:09:00 +00:00
tripped = self.vera_device.refresh_value('Tripped')
attr[ATTR_TRIPPED] = 'True' if tripped == '1' else 'False'
2015-03-02 10:09:00 +00:00
attr['Vera Device Id'] = self.vera_device.vera_device_id
return attr
def turn_on(self, **kwargs):
self.last_command_send = time.time()
self.vera_device.switch_on()
self.is_on_status = True
def turn_off(self, **kwargs):
self.last_command_send = time.time()
self.vera_device.switch_off()
self.is_on_status = False
@property
def is_on(self):
""" True if device is on. """
return self.is_on_status
def update(self):
2015-03-08 14:14:44 +00:00
# We need to debounce the status call after turning switch on or off
2015-03-02 10:09:00 +00:00
# because the vera has some lag in updating the device status
if (self.last_command_send + 5) < time.time():
self.is_on_status = self.vera_device.is_switched_on()