From 7006806e2d7ab229fc66844d0d081dbff2ea7bdc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Moritz=20Schmitz=20von=20H=C3=BClst?= Date: Sun, 2 Aug 2020 18:16:47 +0200 Subject: [PATCH] Add query params for REST sensors. --- .../components/dwd_weather_warnings/sensor.py | 8 ++++++-- homeassistant/components/pvoutput/sensor.py | 2 +- .../components/rest/binary_sensor.py | 7 ++++++- homeassistant/components/rest/sensor.py | 19 +++++++++++++++++-- homeassistant/components/scrape/sensor.py | 5 ++++- homeassistant/const.py | 1 + tests/components/rest/test_sensor.py | 9 ++++++++- 7 files changed, 43 insertions(+), 8 deletions(-) diff --git a/homeassistant/components/dwd_weather_warnings/sensor.py b/homeassistant/components/dwd_weather_warnings/sensor.py index 152c757424ced..a7c9d0b845e43 100644 --- a/homeassistant/components/dwd_weather_warnings/sensor.py +++ b/homeassistant/components/dwd_weather_warnings/sensor.py @@ -182,12 +182,16 @@ class DwdWeatherWarningsAPI: def __init__(self, region_name): """Initialize the data object.""" - resource = "https://www.dwd.de/DWD/warnungen/warnapp_landkreise/json/warnings.json?jsonp=loadWarnings" + resource = ( + "https://www.dwd.de/DWD/warnungen/warnapp_landkreise/json/warnings.json" + ) # a User-Agent is necessary for this rest api endpoint (#29496) headers = {"User-Agent": HA_USER_AGENT} - self._rest = RestData("GET", resource, None, headers, None, True) + params = {"jsonp": "loadWarnings"} + + self._rest = RestData("GET", resource, None, headers, params, None, True) self.region_name = region_name self.region_id = None self.region_state = None diff --git a/homeassistant/components/pvoutput/sensor.py b/homeassistant/components/pvoutput/sensor.py index 169086af3fc57..b97cbeb403216 100644 --- a/homeassistant/components/pvoutput/sensor.py +++ b/homeassistant/components/pvoutput/sensor.py @@ -53,7 +53,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None): verify_ssl = DEFAULT_VERIFY_SSL headers = {"X-Pvoutput-Apikey": api_key, "X-Pvoutput-SystemId": system_id} - rest = RestData(method, _ENDPOINT, auth, headers, payload, verify_ssl) + rest = RestData(method, _ENDPOINT, auth, headers, None, payload, verify_ssl) rest.update() if rest.data is None: diff --git a/homeassistant/components/rest/binary_sensor.py b/homeassistant/components/rest/binary_sensor.py index a78c6aa5f2be2..91dfe4f020466 100644 --- a/homeassistant/components/rest/binary_sensor.py +++ b/homeassistant/components/rest/binary_sensor.py @@ -16,6 +16,7 @@ CONF_HEADERS, CONF_METHOD, CONF_NAME, + CONF_PARAMS, CONF_PASSWORD, CONF_PAYLOAD, CONF_RESOURCE, @@ -48,6 +49,7 @@ [HTTP_BASIC_AUTHENTICATION, HTTP_DIGEST_AUTHENTICATION] ), vol.Optional(CONF_HEADERS): {cv.string: cv.string}, + vol.Optional(CONF_PARAMS): {cv.string: cv.string}, vol.Optional(CONF_METHOD, default=DEFAULT_METHOD): vol.In(["POST", "GET"]), vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, vol.Optional(CONF_PASSWORD): cv.string, @@ -78,6 +80,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None): username = config.get(CONF_USERNAME) password = config.get(CONF_PASSWORD) headers = config.get(CONF_HEADERS) + params = config.get(CONF_PARAMS) device_class = config.get(CONF_DEVICE_CLASS) value_template = config.get(CONF_VALUE_TEMPLATE) force_update = config.get(CONF_FORCE_UPDATE) @@ -97,7 +100,9 @@ def setup_platform(hass, config, add_entities, discovery_info=None): else: auth = None - rest = RestData(method, resource, auth, headers, payload, verify_ssl, timeout) + rest = RestData( + method, resource, auth, headers, params, payload, verify_ssl, timeout + ) rest.update() if rest.data is None: raise PlatformNotReady diff --git a/homeassistant/components/rest/sensor.py b/homeassistant/components/rest/sensor.py index 2c8df9625cd7c..c1b7232c0ae3c 100644 --- a/homeassistant/components/rest/sensor.py +++ b/homeassistant/components/rest/sensor.py @@ -18,6 +18,7 @@ CONF_HEADERS, CONF_METHOD, CONF_NAME, + CONF_PARAMS, CONF_PASSWORD, CONF_PAYLOAD, CONF_RESOURCE, @@ -55,6 +56,7 @@ [HTTP_BASIC_AUTHENTICATION, HTTP_DIGEST_AUTHENTICATION] ), vol.Optional(CONF_HEADERS): vol.Schema({cv.string: cv.string}), + vol.Optional(CONF_PARAMS): vol.Schema({cv.string: cv.string}), vol.Optional(CONF_JSON_ATTRS, default=[]): cv.ensure_list_csv, vol.Optional(CONF_METHOD, default=DEFAULT_METHOD): vol.In(METHODS), vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, @@ -87,6 +89,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None): username = config.get(CONF_USERNAME) password = config.get(CONF_PASSWORD) headers = config.get(CONF_HEADERS) + params = config.get(CONF_PARAMS) unit = config.get(CONF_UNIT_OF_MEASUREMENT) device_class = config.get(CONF_DEVICE_CLASS) value_template = config.get(CONF_VALUE_TEMPLATE) @@ -109,7 +112,9 @@ def setup_platform(hass, config, add_entities, discovery_info=None): auth = HTTPBasicAuth(username, password) else: auth = None - rest = RestData(method, resource, auth, headers, payload, verify_ssl, timeout) + rest = RestData( + method, resource, auth, headers, params, payload, verify_ssl, timeout + ) rest.update() if rest.data is None: raise PlatformNotReady @@ -262,13 +267,22 @@ class RestData: """Class for handling the data retrieval.""" def __init__( - self, method, resource, auth, headers, data, verify_ssl, timeout=DEFAULT_TIMEOUT + self, + method, + resource, + auth, + headers, + params, + data, + verify_ssl, + timeout=DEFAULT_TIMEOUT, ): """Initialize the data object.""" self._method = method self._resource = resource self._auth = auth self._headers = headers + self._params = params self._request_data = data self._verify_ssl = verify_ssl self._timeout = timeout @@ -292,6 +306,7 @@ def update(self): self._method, self._resource, headers=self._headers, + params=self._params, auth=self._auth, data=self._request_data, timeout=self._timeout, diff --git a/homeassistant/components/scrape/sensor.py b/homeassistant/components/scrape/sensor.py index 3d25e4a34aef8..0a2f2703c695c 100644 --- a/homeassistant/components/scrape/sensor.py +++ b/homeassistant/components/scrape/sensor.py @@ -11,6 +11,7 @@ CONF_AUTHENTICATION, CONF_HEADERS, CONF_NAME, + CONF_PARAMS, CONF_PASSWORD, CONF_RESOURCE, CONF_UNIT_OF_MEASUREMENT, @@ -43,6 +44,7 @@ [HTTP_BASIC_AUTHENTICATION, HTTP_DIGEST_AUTHENTICATION] ), vol.Optional(CONF_HEADERS): vol.Schema({cv.string: cv.string}), + vol.Optional(CONF_PARAMS): vol.Schema({cv.string: cv.string}), vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, vol.Optional(CONF_PASSWORD): cv.string, vol.Optional(CONF_UNIT_OF_MEASUREMENT): cv.string, @@ -60,6 +62,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None): method = "GET" payload = None headers = config.get(CONF_HEADERS) + params = config.get(CONF_PARAMS) verify_ssl = config.get(CONF_VERIFY_SSL) select = config.get(CONF_SELECT) attr = config.get(CONF_ATTR) @@ -78,7 +81,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None): auth = HTTPBasicAuth(username, password) else: auth = None - rest = RestData(method, resource, auth, headers, payload, verify_ssl) + rest = RestData(method, resource, auth, headers, params, payload, verify_ssl) rest.update() if rest.data is None: diff --git a/homeassistant/const.py b/homeassistant/const.py index cedfced2f7c73..6ac5f7156eb5b 100644 --- a/homeassistant/const.py +++ b/homeassistant/const.py @@ -124,6 +124,7 @@ CONF_OFFSET = "offset" CONF_OPTIMISTIC = "optimistic" CONF_PACKAGES = "packages" +CONF_PARAMS = "params" CONF_PASSWORD = "password" CONF_PATH = "path" CONF_PAYLOAD = "payload" diff --git a/tests/components/rest/test_sensor.py b/tests/components/rest/test_sensor.py index 90a8b8d361ebd..d2f8849bd6a42 100644 --- a/tests/components/rest/test_sensor.py +++ b/tests/components/rest/test_sensor.py @@ -662,7 +662,14 @@ def setUp(self): self.verify_ssl = True self.timeout = 10 self.rest = rest.RestData( - self.method, self.resource, None, None, None, self.verify_ssl, self.timeout + self.method, + self.resource, + None, + None, + None, + None, + self.verify_ssl, + self.timeout, ) @requests_mock.Mocker()