core/homeassistant/components/light/vera.py

185 lines
5.2 KiB
Python
Raw Normal View History

2015-03-08 14:14:44 +00:00
"""
Support for Vera lights.
Configuration:
2015-03-08 14:14:44 +00:00
This component is useful if you wish for switches connected to your Vera
controller to appear as lights in homeassistant. All switches will be added
as a light unless you exclude them in the config.
2015-03-08 14:14:44 +00:00
To use the Vera lights you will need to add something like the following to
your config/configuration.yaml
light:
platform: vera
vera_controller_url: http://YOUR_VERA_IP:3480/
2015-03-08 14:14:44 +00:00
device_data:
-
vera_id: 12
name: My awesome switch
exclude: true
-
vera_id: 13
2015-03-08 14:14:44 +00:00
name: Another switch
2015-03-08 14:14:44 +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
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.
These are the variables for the device_data array:
vera_id
*Required
The Vera device id you wish these configuration options to be applied to
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
will be used
exclude
*Optional
2015-03-08 14:14:44 +00:00
This parameter allows you to exclude the specified device from homeassistant,
it should be set to "true" if you want this device excluded
"""
2015-03-02 10:09:00 +00:00
import logging
import time
2015-03-08 20:11:35 +00:00
from homeassistant.const import ATTR_BATTERY_LEVEL
2015-03-02 10:09:00 +00:00
from homeassistant.helpers import ToggleDevice
2015-03-08 14:14:44 +00:00
# pylint: disable=no-name-in-module, import-error
import homeassistant.external.vera.vera as veraApi
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 setup_platform(hass, config, add_devices_callback, discovery_info=None):
""" Find and return Vera lights. """
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
2015-03-08 20:03:56 +00:00
device_data = config.get('device_data', None)
2015-03-02 10:09:00 +00:00
2015-03-08 20:03:56 +00:00
controller = veraApi.VeraController(base_url)
devices = []
try:
devices = controller.get_devices('Switch')
2015-03-08 14:14:44 +00:00
# pylint: disable=broad-except
2015-03-02 10:09:00 +00:00
except Exception as inst:
_LOGGER.error("Could not find Vera lights: %s", inst)
return False
2015-03-08 20:03:56 +00:00
lights = []
for device in devices:
extra_data = get_extra_device_data(device_data, device.deviceId)
exclude = False
if extra_data:
exclude = extra_data.get('exclude', False)
if exclude is not True:
lights.append(VeraLight(device, extra_data))
add_devices_callback(lights)
2015-03-02 10:09:00 +00:00
def get_extra_device_data(device_data, device_id):
2015-03-08 14:14:44 +00:00
""" Gets the additional configuration data by Vera device Id """
2015-03-02 10:09:00 +00:00
if not device_data:
return None
for item in device_data:
if item.get('vera_id') == device_id:
2015-03-02 10:09:00 +00:00
return item
return None
class VeraLight(ToggleDevice):
""" Represents a Vera light """
is_on_status = False
2015-03-08 15:08:46 +00:00
# for debouncing status check after command is sent
2015-03-02 10:09:00 +00:00
last_command_send = 0
extra_data = None
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')
self._name = self.vera_device.name
2015-03-02 10:09:00 +00:00
@property
def name(self):
""" Get the mame of the light. """
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
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['Armed'] = 'True' if armed == '1' else 'False'
if self.vera_device.is_trippable:
2015-03-08 14:14:44 +00:00
last_tripped = self.vera_device.refresh_value('LastTrip')
2015-03-08 14:58:11 +00:00
trip_time_str = time.strftime(
"%Y-%m-%d %H:%M",
time.localtime(int(last_tripped))
)
2015-03-08 14:14:44 +00:00
attr['Last Tripped'] = trip_time_str
2015-03-02 10:09:00 +00:00
tripped = self.vera_device.refresh_value('Tripped')
attr['Tripped'] = 'True' if tripped == '1' else 'False'
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. """
self.update()
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 light 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()