2015-03-08 14:14:44 +00:00
|
|
|
"""
|
|
|
|
Support for Vera switches.
|
2015-03-07 03:49:20 +00:00
|
|
|
|
|
|
|
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 config/configuration.yaml
|
2015-03-07 03:49:20 +00:00
|
|
|
|
|
|
|
switch:
|
|
|
|
platform: vera
|
|
|
|
vera_controller_url: http://YOUR_VERA_IP:3480/
|
2015-03-08 14:14:44 +00:00
|
|
|
device_data:
|
|
|
|
-
|
2015-03-07 03:49:20 +00:00
|
|
|
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-07 03:49:20 +00:00
|
|
|
|
2015-03-08 14:14:44 +00:00
|
|
|
VARIABLES:
|
2015-03-07 03:49:20 +00:00
|
|
|
|
|
|
|
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
|
2015-03-07 03:49:20 +00:00
|
|
|
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.
|
2015-03-07 03:49:20 +00:00
|
|
|
|
|
|
|
|
|
|
|
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
|
2015-03-07 03:49:20 +00:00
|
|
|
|
|
|
|
|
|
|
|
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-07 03:49:20 +00:00
|
|
|
|
|
|
|
"""
|
2015-03-02 10:09:00 +00:00
|
|
|
import logging
|
|
|
|
import time
|
|
|
|
|
|
|
|
from homeassistant.helpers import ToggleDevice
|
2015-03-08 14:14:44 +00:00
|
|
|
# pylint: disable=no-name-in-module, import-error
|
2015-03-02 11:05:03 +00:00
|
|
|
import homeassistant.external.vera.vera as veraApi
|
2015-03-02 10:09:00 +00:00
|
|
|
|
2015-03-08 12:52:50 +00:00
|
|
|
_LOGGER = logging.getLogger(__name__)
|
2015-03-02 10:09:00 +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. """
|
|
|
|
try:
|
|
|
|
base_url = config.get('vera_controller_url')
|
|
|
|
if not base_url:
|
2015-03-08 14:14:44 +00:00
|
|
|
_LOGGER.error("The required parameter 'vera_controller_url'"
|
|
|
|
" was not found in config")
|
2015-03-02 10:09:00 +00:00
|
|
|
return False
|
|
|
|
|
2015-03-08 12:52:50 +00:00
|
|
|
device_data = config.get('device_data', None)
|
2015-03-02 10:09:00 +00:00
|
|
|
|
|
|
|
vera_controller = veraApi.VeraController(base_url)
|
|
|
|
devices = vera_controller.get_devices(['Switch', 'Armable Sensor'])
|
|
|
|
|
|
|
|
vera_switches = []
|
|
|
|
for device in devices:
|
2015-03-08 12:52:50 +00:00
|
|
|
extra_data = get_extra_device_data(device_data, device.deviceId)
|
|
|
|
exclude = False
|
|
|
|
if extra_data:
|
|
|
|
exclude = extra_data.get('exclude', False)
|
|
|
|
|
2015-03-08 14:14:44 +00:00
|
|
|
if exclude is not True:
|
2015-03-08 12:52:50 +00:00
|
|
|
vera_switches.append(VeraSwitch(device, extra_data))
|
2015-03-02 10:09:00 +00:00
|
|
|
|
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 switches: %s", inst)
|
|
|
|
return False
|
|
|
|
|
|
|
|
return vera_switches
|
|
|
|
|
|
|
|
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:
|
2015-03-08 12:52:50 +00:00
|
|
|
if item.get('vera_id') == device_id:
|
2015-03-02 10:09:00 +00:00
|
|
|
return item
|
|
|
|
return None
|
|
|
|
|
|
|
|
|
2015-03-07 01:59:13 +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. """
|
2015-03-07 01:59:13 +00:00
|
|
|
add_devices(get_devices(hass, config))
|
2015-03-02 10:09:00 +00:00
|
|
|
|
|
|
|
class VeraSwitch(ToggleDevice):
|
|
|
|
""" Represents a Vera Switch """
|
|
|
|
is_on_status = False
|
|
|
|
#for debouncing status check after command is sent
|
|
|
|
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
|
|
|
|
|
|
|
|
@property
|
|
|
|
def name(self):
|
|
|
|
""" Get the mame of the switch. """
|
|
|
|
if self.extra_data and self.extra_data.get('name'):
|
|
|
|
return self.extra_data.get('name')
|
|
|
|
return self.vera_device.name
|
|
|
|
|
|
|
|
@property
|
|
|
|
def state_attributes(self):
|
|
|
|
attr = super().state_attributes
|
|
|
|
|
|
|
|
if self.vera_device.has_battery:
|
|
|
|
attr['Battery'] = self.vera_device.battery_level + '%'
|
|
|
|
|
|
|
|
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')
|
|
|
|
trip_time_str = time.strftime("%Y-%m-%d %H:%M",
|
|
|
|
time.localtime(int(last_tripped)))
|
|
|
|
|
|
|
|
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 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()
|
|
|
|
|