Add support for resource_template for rest sensor (#27869)
* add support for resource_template * fix tests * updated tests and xor(CONF_RESOURCE_TEMPLATE, CONF_RESOURCE)
This commit is contained in:
parent
4cb984842a
commit
09d8a4204a
3 changed files with 65 additions and 1 deletions
|
@ -16,6 +16,7 @@ from homeassistant.const import (
|
|||
CONF_PASSWORD,
|
||||
CONF_PAYLOAD,
|
||||
CONF_RESOURCE,
|
||||
CONF_RESOURCE_TEMPLATE,
|
||||
CONF_UNIT_OF_MEASUREMENT,
|
||||
CONF_USERNAME,
|
||||
CONF_TIMEOUT,
|
||||
|
@ -42,7 +43,8 @@ METHODS = ["POST", "GET"]
|
|||
|
||||
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(
|
||||
{
|
||||
vol.Required(CONF_RESOURCE): cv.url,
|
||||
vol.Exclusive(CONF_RESOURCE, CONF_RESOURCE): cv.url,
|
||||
vol.Exclusive(CONF_RESOURCE_TEMPLATE, CONF_RESOURCE): cv.template,
|
||||
vol.Optional(CONF_AUTHENTICATION): vol.In(
|
||||
[HTTP_BASIC_AUTHENTICATION, HTTP_DIGEST_AUTHENTICATION]
|
||||
),
|
||||
|
@ -62,11 +64,16 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(
|
|||
}
|
||||
)
|
||||
|
||||
PLATFORM_SCHEMA = vol.All(
|
||||
cv.has_at_least_one_key(CONF_RESOURCE, CONF_RESOURCE_TEMPLATE), PLATFORM_SCHEMA
|
||||
)
|
||||
|
||||
|
||||
def setup_platform(hass, config, add_entities, discovery_info=None):
|
||||
"""Set up the RESTful sensor."""
|
||||
name = config.get(CONF_NAME)
|
||||
resource = config.get(CONF_RESOURCE)
|
||||
resource_template = config.get(CONF_RESOURCE_TEMPLATE)
|
||||
method = config.get(CONF_METHOD)
|
||||
payload = config.get(CONF_PAYLOAD)
|
||||
verify_ssl = config.get(CONF_VERIFY_SSL)
|
||||
|
@ -83,6 +90,10 @@ def setup_platform(hass, config, add_entities, discovery_info=None):
|
|||
if value_template is not None:
|
||||
value_template.hass = hass
|
||||
|
||||
if resource_template is not None:
|
||||
resource_template.hass = hass
|
||||
resource = resource_template.render()
|
||||
|
||||
if username and password:
|
||||
if config.get(CONF_AUTHENTICATION) == HTTP_DIGEST_AUTHENTICATION:
|
||||
auth = HTTPDigestAuth(username, password)
|
||||
|
@ -108,6 +119,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None):
|
|||
value_template,
|
||||
json_attrs,
|
||||
force_update,
|
||||
resource_template,
|
||||
)
|
||||
],
|
||||
True,
|
||||
|
@ -127,6 +139,7 @@ class RestSensor(Entity):
|
|||
value_template,
|
||||
json_attrs,
|
||||
force_update,
|
||||
resource_template,
|
||||
):
|
||||
"""Initialize the REST sensor."""
|
||||
self._hass = hass
|
||||
|
@ -139,6 +152,7 @@ class RestSensor(Entity):
|
|||
self._json_attrs = json_attrs
|
||||
self._attributes = None
|
||||
self._force_update = force_update
|
||||
self._resource_template = resource_template
|
||||
|
||||
@property
|
||||
def name(self):
|
||||
|
@ -172,6 +186,9 @@ class RestSensor(Entity):
|
|||
|
||||
def update(self):
|
||||
"""Get the latest data from REST API and update the state."""
|
||||
if self._resource_template is not None:
|
||||
self.rest.set_url(self._resource_template.render())
|
||||
|
||||
self.rest.update()
|
||||
value = self.rest.data
|
||||
|
||||
|
@ -217,6 +234,10 @@ class RestData:
|
|||
self._timeout = timeout
|
||||
self.data = None
|
||||
|
||||
def set_url(self, url):
|
||||
"""Set url."""
|
||||
self._request.prepare_url(url, None)
|
||||
|
||||
def update(self):
|
||||
"""Get the latest data from REST service with provided method."""
|
||||
_LOGGER.debug("Updating from %s", self._request.url)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue