mirror of
https://github.com/esphome/esphome.git
synced 2025-07-28 22:26:36 +00:00
Add support for custom request headers in online_image component (#8985)
This commit is contained in:
parent
e8aa7cff36
commit
052f558131
@ -2,6 +2,7 @@ import logging
|
|||||||
|
|
||||||
from esphome import automation
|
from esphome import automation
|
||||||
import esphome.codegen as cg
|
import esphome.codegen as cg
|
||||||
|
from esphome.components.const import CONF_REQUEST_HEADERS
|
||||||
from esphome.components.http_request import CONF_HTTP_REQUEST_ID, HttpRequestComponent
|
from esphome.components.http_request import CONF_HTTP_REQUEST_ID, HttpRequestComponent
|
||||||
from esphome.components.image import (
|
from esphome.components.image import (
|
||||||
CONF_INVERT_ALPHA,
|
CONF_INVERT_ALPHA,
|
||||||
@ -24,6 +25,7 @@ from esphome.const import (
|
|||||||
CONF_TYPE,
|
CONF_TYPE,
|
||||||
CONF_URL,
|
CONF_URL,
|
||||||
)
|
)
|
||||||
|
from esphome.core import Lambda
|
||||||
|
|
||||||
AUTO_LOAD = ["image"]
|
AUTO_LOAD = ["image"]
|
||||||
DEPENDENCIES = ["display", "http_request"]
|
DEPENDENCIES = ["display", "http_request"]
|
||||||
@ -124,6 +126,9 @@ ONLINE_IMAGE_SCHEMA = (
|
|||||||
cv.GenerateID(CONF_HTTP_REQUEST_ID): cv.use_id(HttpRequestComponent),
|
cv.GenerateID(CONF_HTTP_REQUEST_ID): cv.use_id(HttpRequestComponent),
|
||||||
# Online Image specific options
|
# Online Image specific options
|
||||||
cv.Required(CONF_URL): cv.url,
|
cv.Required(CONF_URL): cv.url,
|
||||||
|
cv.Optional(CONF_REQUEST_HEADERS): cv.All(
|
||||||
|
cv.Schema({cv.string: cv.templatable(cv.string)})
|
||||||
|
),
|
||||||
cv.Required(CONF_FORMAT): cv.one_of(*IMAGE_FORMATS, upper=True),
|
cv.Required(CONF_FORMAT): cv.one_of(*IMAGE_FORMATS, upper=True),
|
||||||
cv.Optional(CONF_PLACEHOLDER): cv.use_id(Image_),
|
cv.Optional(CONF_PLACEHOLDER): cv.use_id(Image_),
|
||||||
cv.Optional(CONF_BUFFER_SIZE, default=65536): cv.int_range(256, 65536),
|
cv.Optional(CONF_BUFFER_SIZE, default=65536): cv.int_range(256, 65536),
|
||||||
@ -207,6 +212,13 @@ async def to_code(config):
|
|||||||
await cg.register_component(var, config)
|
await cg.register_component(var, config)
|
||||||
await cg.register_parented(var, config[CONF_HTTP_REQUEST_ID])
|
await cg.register_parented(var, config[CONF_HTTP_REQUEST_ID])
|
||||||
|
|
||||||
|
for key, value in config.get(CONF_REQUEST_HEADERS, {}).items():
|
||||||
|
if isinstance(value, Lambda):
|
||||||
|
template_ = await cg.templatable(value, [], cg.std_string)
|
||||||
|
cg.add(var.add_request_header(key, template_))
|
||||||
|
else:
|
||||||
|
cg.add(var.add_request_header(key, value))
|
||||||
|
|
||||||
if placeholder_id := config.get(CONF_PLACEHOLDER):
|
if placeholder_id := config.get(CONF_PLACEHOLDER):
|
||||||
placeholder = await cg.get_variable(placeholder_id)
|
placeholder = await cg.get_variable(placeholder_id)
|
||||||
cg.add(var.set_placeholder(placeholder))
|
cg.add(var.set_placeholder(placeholder))
|
||||||
|
@ -143,6 +143,10 @@ void OnlineImage::update() {
|
|||||||
|
|
||||||
headers.push_back(accept_header);
|
headers.push_back(accept_header);
|
||||||
|
|
||||||
|
for (auto &header : this->request_headers_) {
|
||||||
|
headers.push_back(http_request::Header{header.first, header.second.value()});
|
||||||
|
}
|
||||||
|
|
||||||
this->downloader_ = this->parent_->get(this->url_, headers, {ETAG_HEADER_NAME, LAST_MODIFIED_HEADER_NAME});
|
this->downloader_ = this->parent_->get(this->url_, headers, {ETAG_HEADER_NAME, LAST_MODIFIED_HEADER_NAME});
|
||||||
|
|
||||||
if (this->downloader_ == nullptr) {
|
if (this->downloader_ == nullptr) {
|
||||||
|
@ -67,6 +67,11 @@ class OnlineImage : public PollingComponent,
|
|||||||
this->last_modified_ = "";
|
this->last_modified_ = "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Add the request header */
|
||||||
|
template<typename V> void add_request_header(const std::string &header, V value) {
|
||||||
|
this->request_headers_.push_back(std::pair<std::string, TemplatableValue<std::string> >(header, value));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Set the image that needs to be shown as long as the downloaded image
|
* @brief Set the image that needs to be shown as long as the downloaded image
|
||||||
* is not available.
|
* is not available.
|
||||||
@ -153,6 +158,8 @@ class OnlineImage : public PollingComponent,
|
|||||||
|
|
||||||
std::string url_{""};
|
std::string url_{""};
|
||||||
|
|
||||||
|
std::vector<std::pair<std::string, TemplatableValue<std::string> > > request_headers_;
|
||||||
|
|
||||||
/** width requested on configuration, or 0 if non specified. */
|
/** width requested on configuration, or 0 if non specified. */
|
||||||
const int fixed_width_;
|
const int fixed_width_;
|
||||||
/** height requested on configuration, or 0 if non specified. */
|
/** height requested on configuration, or 0 if non specified. */
|
||||||
|
@ -11,6 +11,9 @@ online_image:
|
|||||||
format: PNG
|
format: PNG
|
||||||
type: BINARY
|
type: BINARY
|
||||||
resize: 50x50
|
resize: 50x50
|
||||||
|
request_headers:
|
||||||
|
X-Test1: 'Test1'
|
||||||
|
X-Test2: !lambda 'static int x; return to_string(x++);'
|
||||||
on_download_finished:
|
on_download_finished:
|
||||||
lambda: |-
|
lambda: |-
|
||||||
if (cached) {
|
if (cached) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user