mirror of
https://github.com/esphome/esphome.git
synced 2024-11-25 16:38:16 +01:00
Add next_url to improv serial component config (#4343)
This commit is contained in:
parent
4aac76c549
commit
79040c116d
8 changed files with 111 additions and 7 deletions
|
@ -107,6 +107,7 @@ esphome/components/hte501/* @Stock-M
|
||||||
esphome/components/hydreon_rgxx/* @functionpointer
|
esphome/components/hydreon_rgxx/* @functionpointer
|
||||||
esphome/components/i2c/* @esphome/core
|
esphome/components/i2c/* @esphome/core
|
||||||
esphome/components/i2s_audio/* @jesserockz
|
esphome/components/i2s_audio/* @jesserockz
|
||||||
|
esphome/components/improv_base/* @esphome/core
|
||||||
esphome/components/improv_serial/* @esphome/core
|
esphome/components/improv_serial/* @esphome/core
|
||||||
esphome/components/ina260/* @MrEditor97
|
esphome/components/ina260/* @MrEditor97
|
||||||
esphome/components/inkbird_ibsth1_mini/* @fkirill
|
esphome/components/inkbird_ibsth1_mini/* @fkirill
|
||||||
|
|
42
esphome/components/improv_base/__init__.py
Normal file
42
esphome/components/improv_base/__init__.py
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
import re
|
||||||
|
|
||||||
|
import esphome.config_validation as cv
|
||||||
|
import esphome.codegen as cg
|
||||||
|
|
||||||
|
from esphome.const import __version__
|
||||||
|
|
||||||
|
CODEOWNERS = ["@esphome/core"]
|
||||||
|
|
||||||
|
CONF_NEXT_URL = "next_url"
|
||||||
|
|
||||||
|
VALID_SUBSTITUTIONS = ["esphome_version", "ip_address", "device_name"]
|
||||||
|
|
||||||
|
|
||||||
|
def validate_next_url(value):
|
||||||
|
value = cv.url(value)
|
||||||
|
test = r"{{(?!" + r"\b|".join(VALID_SUBSTITUTIONS) + r"\b)(\w+)}}"
|
||||||
|
result = re.search(test, value)
|
||||||
|
if result:
|
||||||
|
raise cv.Invalid(
|
||||||
|
f"Invalid substitution(s) ({', '.join(result.groups())}) in next_url. Valid substitutions are: {', '.join(VALID_SUBSTITUTIONS)}"
|
||||||
|
)
|
||||||
|
return value
|
||||||
|
|
||||||
|
|
||||||
|
IMPROV_SCHEMA = cv.Schema(
|
||||||
|
{
|
||||||
|
cv.Optional(CONF_NEXT_URL): validate_next_url,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def _process_next_url(url: str):
|
||||||
|
if "{{esphome_version}}" in url:
|
||||||
|
url = url.replace("{{esphome_version}}", __version__)
|
||||||
|
return url
|
||||||
|
|
||||||
|
|
||||||
|
async def setup_improv_core(var, config):
|
||||||
|
if CONF_NEXT_URL in config:
|
||||||
|
cg.add(var.set_next_url(_process_next_url(config[CONF_NEXT_URL])))
|
||||||
|
cg.add_library("esphome/Improv", "1.2.3")
|
32
esphome/components/improv_base/improv_base.cpp
Normal file
32
esphome/components/improv_base/improv_base.cpp
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
#include "improv_base.h"
|
||||||
|
|
||||||
|
#include "esphome/components/network/util.h"
|
||||||
|
#include "esphome/core/application.h"
|
||||||
|
|
||||||
|
namespace esphome {
|
||||||
|
namespace improv_base {
|
||||||
|
|
||||||
|
std::string ImprovBase::get_formatted_next_url_() {
|
||||||
|
if (this->next_url_.empty()) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
std::string copy = this->next_url_;
|
||||||
|
// Device name
|
||||||
|
std::size_t pos = this->next_url_.find("{{device_name}}");
|
||||||
|
if (pos != std::string::npos) {
|
||||||
|
const std::string &device_name = App.get_name();
|
||||||
|
copy.replace(pos, 15, device_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ip address
|
||||||
|
pos = this->next_url_.find("{{ip_address}}");
|
||||||
|
if (pos != std::string::npos) {
|
||||||
|
std::string ip = network::IPAddress(network::get_ip_address()).str();
|
||||||
|
copy.replace(pos, 14, ip);
|
||||||
|
}
|
||||||
|
|
||||||
|
return copy;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace improv_base
|
||||||
|
} // namespace esphome
|
18
esphome/components/improv_base/improv_base.h
Normal file
18
esphome/components/improv_base/improv_base.h
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
namespace esphome {
|
||||||
|
namespace improv_base {
|
||||||
|
|
||||||
|
class ImprovBase {
|
||||||
|
public:
|
||||||
|
void set_next_url(const std::string &next_url) { this->next_url_ = next_url; }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
std::string get_formatted_next_url_();
|
||||||
|
std::string next_url_;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace improv_base
|
||||||
|
} // namespace esphome
|
|
@ -4,7 +4,9 @@ import esphome.codegen as cg
|
||||||
import esphome.config_validation as cv
|
import esphome.config_validation as cv
|
||||||
from esphome.core import CORE
|
from esphome.core import CORE
|
||||||
import esphome.final_validate as fv
|
import esphome.final_validate as fv
|
||||||
|
from esphome.components import improv_base
|
||||||
|
|
||||||
|
AUTO_LOAD = ["improv_base"]
|
||||||
CODEOWNERS = ["@esphome/core"]
|
CODEOWNERS = ["@esphome/core"]
|
||||||
DEPENDENCIES = ["logger", "wifi"]
|
DEPENDENCIES = ["logger", "wifi"]
|
||||||
|
|
||||||
|
@ -12,11 +14,15 @@ improv_serial_ns = cg.esphome_ns.namespace("improv_serial")
|
||||||
|
|
||||||
ImprovSerialComponent = improv_serial_ns.class_("ImprovSerialComponent", cg.Component)
|
ImprovSerialComponent = improv_serial_ns.class_("ImprovSerialComponent", cg.Component)
|
||||||
|
|
||||||
CONFIG_SCHEMA = cv.Schema(
|
CONFIG_SCHEMA = (
|
||||||
{
|
cv.Schema(
|
||||||
cv.GenerateID(): cv.declare_id(ImprovSerialComponent),
|
{
|
||||||
}
|
cv.GenerateID(): cv.declare_id(ImprovSerialComponent),
|
||||||
).extend(cv.COMPONENT_SCHEMA)
|
}
|
||||||
|
)
|
||||||
|
.extend(improv_base.IMPROV_SCHEMA)
|
||||||
|
.extend(cv.COMPONENT_SCHEMA)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def validate_logger(config):
|
def validate_logger(config):
|
||||||
|
@ -37,4 +43,4 @@ FINAL_VALIDATE_SCHEMA = validate_logger
|
||||||
async def to_code(config):
|
async def to_code(config):
|
||||||
var = cg.new_Pvariable(config[CONF_ID])
|
var = cg.new_Pvariable(config[CONF_ID])
|
||||||
await cg.register_component(var, config)
|
await cg.register_component(var, config)
|
||||||
cg.add_library("esphome/Improv", "1.2.3")
|
await improv_base.setup_improv_core(var, config)
|
||||||
|
|
|
@ -95,6 +95,9 @@ void ImprovSerialComponent::loop() {
|
||||||
|
|
||||||
std::vector<uint8_t> ImprovSerialComponent::build_rpc_settings_response_(improv::Command command) {
|
std::vector<uint8_t> ImprovSerialComponent::build_rpc_settings_response_(improv::Command command) {
|
||||||
std::vector<std::string> urls;
|
std::vector<std::string> urls;
|
||||||
|
if (!this->next_url_.empty()) {
|
||||||
|
urls.push_back(this->get_formatted_next_url_());
|
||||||
|
}
|
||||||
#ifdef USE_WEBSERVER
|
#ifdef USE_WEBSERVER
|
||||||
auto ip = wifi::global_wifi_component->wifi_sta_ip();
|
auto ip = wifi::global_wifi_component->wifi_sta_ip();
|
||||||
std::string webserver_url = "http://" + ip.str() + ":" + to_string(USE_WEBSERVER_PORT);
|
std::string webserver_url = "http://" + ip.str() + ":" + to_string(USE_WEBSERVER_PORT);
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include "esphome/components/improv_base/improv_base.h"
|
||||||
#include "esphome/components/wifi/wifi_component.h"
|
#include "esphome/components/wifi/wifi_component.h"
|
||||||
#include "esphome/core/component.h"
|
#include "esphome/core/component.h"
|
||||||
#include "esphome/core/defines.h"
|
#include "esphome/core/defines.h"
|
||||||
|
@ -27,7 +28,7 @@ enum ImprovSerialType : uint8_t {
|
||||||
|
|
||||||
static const uint8_t IMPROV_SERIAL_VERSION = 1;
|
static const uint8_t IMPROV_SERIAL_VERSION = 1;
|
||||||
|
|
||||||
class ImprovSerialComponent : public Component {
|
class ImprovSerialComponent : public Component, public improv_base::ImprovBase {
|
||||||
public:
|
public:
|
||||||
void setup() override;
|
void setup() override;
|
||||||
void loop() override;
|
void loop() override;
|
||||||
|
|
|
@ -298,6 +298,7 @@ logger:
|
||||||
esp8266_store_log_strings_in_flash: true
|
esp8266_store_log_strings_in_flash: true
|
||||||
|
|
||||||
improv_serial:
|
improv_serial:
|
||||||
|
next_url: https://esphome.io/?name={{device_name}}&version={{esphome_version}}&ip={{ip_address}}
|
||||||
|
|
||||||
deep_sleep:
|
deep_sleep:
|
||||||
run_duration: 20s
|
run_duration: 20s
|
||||||
|
|
Loading…
Reference in a new issue