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:
commit
c7e22e6910
1 changed files with 29 additions and 13 deletions
|
@ -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()
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue