core/homeassistant/components/sensor/vera.py

188 lines
5.9 KiB
Python
Raw Normal View History

2015-03-08 14:14:44 +00:00
"""
2015-05-13 17:18:30 +00:00
homeassistant.components.sensor.vera
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2015-03-08 14:14:44 +00:00
Support for Vera sensors.
Configuration:
2015-05-13 17:18:30 +00:00
2015-03-08 14:14:44 +00:00
To use the Vera sensors you will need to add something like the following to
your config/configuration.yaml
sensor:
platform: vera
vera_controller_url: http://YOUR_VERA_IP:3480/
2015-03-08 14:14:44 +00:00
device_data:
12:
name: My awesome sensor
exclude: true
13:
2015-03-08 14:14:44 +00:00
name: Another sensor
2015-05-13 17:18:30 +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 sensors configured in your Vera controller
will be added with default values. You should use the id of your vera device
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
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
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 Entity
from homeassistant.const import (
ATTR_BATTERY_LEVEL, ATTR_TRIPPED, ATTR_ARMED, ATTR_LAST_TRIP_TIME,
TEMP_CELCIUS, TEMP_FAHRENHEIT)
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 get_devices(hass, config):
""" Find and return Vera Sensors. """
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-08 20:03:56 +00:00
vera_controller = veraApi.VeraController(base_url)
categories = ['Temperature Sensor', 'Light Sensor', 'Sensor']
devices = []
try:
devices = vera_controller.get_devices(categories)
except RequestException:
# There was a network related error connecting to the vera controller
_LOGGER.exception("Error communicating with Vera API")
2015-03-08 20:03:56 +00:00
return False
vera_sensors = []
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_sensors.append(VeraSensor(device, extra_data))
2015-03-02 10:09:00 +00:00
return vera_sensors
2015-03-08 14:58:11 +00:00
def setup_platform(hass, config, add_devices, discovery_info=None):
2015-05-13 17:18:30 +00:00
""" Performs setup for Vera controller devices. """
add_devices(get_devices(hass, config))
2015-03-08 14:58:11 +00:00
class VeraSensor(Entity):
2015-05-13 17:18:30 +00:00
""" Represents a Vera Sensor. """
2015-03-02 10:09:00 +00:00
def __init__(self, vera_device, extra_data=None):
self.vera_device = vera_device
2015-03-08 14:14:44 +00:00
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.current_value = ''
self._temperature_units = None
2015-03-02 10:09:00 +00:00
def __str__(self):
2015-03-08 14:14:44 +00:00
return "%s %s %s" % (self.name, self.vera_device.deviceId, self.state)
2015-03-02 10:09:00 +00:00
@property
def state(self):
return self.current_value
@property
def name(self):
""" Get the mame of the sensor. """
2015-03-08 20:15:41 +00:00
return self._name
2015-03-02 10:09:00 +00:00
@property
def unit_of_measurement(self):
""" Unit of measurement of this entity, if any. """
return self._temperature_units
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[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 update(self):
if self.vera_device.category == "Temperature Sensor":
self.vera_device.refresh_value('CurrentTemperature')
2015-03-08 14:14:44 +00:00
current_temp = self.vera_device.get_value('CurrentTemperature')
vera_temp_units = self.vera_device.veraController.temperature_units
if vera_temp_units == 'F':
self._temperature_units = TEMP_FAHRENHEIT
else:
self._temperature_units = TEMP_CELCIUS
if self.hass:
temp = self.hass.config.temperature(
current_temp,
self._temperature_units)
current_temp, self._temperature_units = temp
self.current_value = current_temp
2015-03-02 10:09:00 +00:00
elif self.vera_device.category == "Light Sensor":
self.vera_device.refresh_value('CurrentLevel')
self.current_value = self.vera_device.get_value('CurrentLevel')
elif self.vera_device.category == "Sensor":
tripped = self.vera_device.refresh_value('Tripped')
self.current_value = 'Tripped' if tripped == '1' else 'Not Tripped'
else:
self.current_value = 'Unknown'