Merge pull request #467 from adrienbrault/sensor-path-nossl

Allow to skip ssl and specify variable path for rest sensor
This commit is contained in:
Paulus Schoutsen 2015-09-30 23:14:24 -07:00
commit c7e22e6910

View file

@ -33,6 +33,7 @@ def setup_platform(hass, config, add_devices, discovery_info=None):
resource = config.get('resource', None) resource = config.get('resource', None)
method = config.get('method', DEFAULT_METHOD) method = config.get('method', DEFAULT_METHOD)
payload = config.get('payload', None) payload = config.get('payload', None)
verify_ssl = config.get('verify_ssl', False)
if method == 'GET': if method == 'GET':
use_get = True use_get = True
@ -41,9 +42,10 @@ def setup_platform(hass, config, add_devices, discovery_info=None):
try: try:
if use_get: if use_get:
response = requests.get(resource, timeout=10) response = requests.get(resource, timeout=10, verify=verify_ssl)
elif use_post: elif use_post:
response = requests.post(resource, data=payload, timeout=10) response = requests.post(resource, data=payload, timeout=10,
verify=verify_ssl)
if not response.ok: if not response.ok:
_LOGGER.error('Response status is "%s"', response.status_code) _LOGGER.error('Response status is "%s"', response.status_code)
return False return False
@ -63,16 +65,16 @@ def setup_platform(hass, config, add_devices, discovery_info=None):
return False return False
try: try:
data[config.get('variable')] RestSensor.extract_value(data, config.get('variable'))
except KeyError: except KeyError:
_LOGGER.error('Variable "%s" not found in response: "%s"', _LOGGER.error('Variable "%s" not found in response: "%s"',
config.get('variable'), data) config.get('variable'), data)
return False return False
if use_get: if use_get:
rest = RestDataGet(resource) rest = RestDataGet(resource, verify_ssl)
elif use_post: elif use_post:
rest = RestDataPost(resource, payload) rest = RestDataPost(resource, payload, verify_ssl)
add_devices([RestSensor(rest, add_devices([RestSensor(rest,
config.get('name', DEFAULT_NAME), config.get('name', DEFAULT_NAME),
@ -97,6 +99,16 @@ class RestSensor(Entity):
self._decimal_places = decimal_places self._decimal_places = decimal_places
self.update() self.update()
@classmethod
def extract_value(cls, data, variable):
""" Extracts the value using a key name or a path. """
if isinstance(variable, list):
for variable_item in variable:
data = data[variable_item]
return data
else:
return data[variable]
@property @property
def name(self): def name(self):
""" The name of the sensor. """ """ The name of the sensor. """
@ -122,35 +134,38 @@ class RestSensor(Entity):
else: else:
try: try:
if value is not None: if value is not None:
value = RestSensor.extract_value(value, self._variable)
if self._corr_factor is not None \ if self._corr_factor is not None \
and self._decimal_places is not None: and self._decimal_places is not None:
self._state = round( self._state = round(
(float(value[self._variable]) * (float(value) *
float(self._corr_factor)), float(self._corr_factor)),
self._decimal_places) self._decimal_places)
elif self._corr_factor is not None \ elif self._corr_factor is not None \
and self._decimal_places is None: and self._decimal_places is None:
self._state = round(float(value[self._variable]) * self._state = round(float(value) *
float(self._corr_factor)) float(self._corr_factor))
else: else:
self._state = value[self._variable] self._state = value
except ValueError: except ValueError:
self._state = value[self._variable] self._state = RestSensor.extract_value(value, self._variable)
# pylint: disable=too-few-public-methods # pylint: disable=too-few-public-methods
class RestDataGet(object): class RestDataGet(object):
""" Class for handling the data retrieval with GET method. """ """ Class for handling the data retrieval with GET method. """
def __init__(self, resource): def __init__(self, resource, verify_ssl):
self._resource = resource self._resource = resource
self._verify_ssl = verify_ssl
self.data = dict() self.data = dict()
@Throttle(MIN_TIME_BETWEEN_UPDATES) @Throttle(MIN_TIME_BETWEEN_UPDATES)
def update(self): def update(self):
""" Gets the latest data from REST service with GET method. """ """ Gets the latest data from REST service with GET method. """
try: try:
response = requests.get(self._resource, timeout=10) response = requests.get(self._resource, timeout=10,
verify=self._verify_ssl)
if 'error' in self.data: if 'error' in self.data:
del self.data['error'] del self.data['error']
self.data = response.json() self.data = response.json()
@ -163,9 +178,10 @@ class RestDataGet(object):
class RestDataPost(object): class RestDataPost(object):
""" Class for handling the data retrieval with POST method. """ """ Class for handling the data retrieval with POST method. """
def __init__(self, resource, payload): def __init__(self, resource, payload, verify_ssl):
self._resource = resource self._resource = resource
self._payload = payload self._payload = payload
self._verify_ssl = verify_ssl
self.data = dict() self.data = dict()
@Throttle(MIN_TIME_BETWEEN_UPDATES) @Throttle(MIN_TIME_BETWEEN_UPDATES)
@ -173,7 +189,7 @@ class RestDataPost(object):
""" Gets the latest data from REST service with POST method. """ """ Gets the latest data from REST service with POST method. """
try: try:
response = requests.post(self._resource, data=self._payload, response = requests.post(self._resource, data=self._payload,
timeout=10) timeout=10, verify=self._verify_ssl)
if 'error' in self.data: if 'error' in self.data:
del self.data['error'] del self.data['error']
self.data = response.json() self.data = response.json()