mirror of
https://github.com/esphome/esphome.git
synced 2025-10-08 21:03:49 +01:00
Merge branch 'mdns_services_const' into integration
This commit is contained in:
@@ -17,6 +17,11 @@ from esphome.coroutine import CoroPriority
|
|||||||
CODEOWNERS = ["@esphome/core"]
|
CODEOWNERS = ["@esphome/core"]
|
||||||
DEPENDENCIES = ["network"]
|
DEPENDENCIES = ["network"]
|
||||||
|
|
||||||
|
# Components that create mDNS services at runtime
|
||||||
|
# IMPORTANT: If you add a new component here, you must also update the corresponding
|
||||||
|
# #ifdef blocks in mdns_component.cpp compile_records_() method
|
||||||
|
COMPONENTS_WITH_MDNS_SERVICES = ("api", "prometheus", "web_server")
|
||||||
|
|
||||||
mdns_ns = cg.esphome_ns.namespace("mdns")
|
mdns_ns = cg.esphome_ns.namespace("mdns")
|
||||||
MDNSComponent = mdns_ns.class_("MDNSComponent", cg.Component)
|
MDNSComponent = mdns_ns.class_("MDNSComponent", cg.Component)
|
||||||
MDNSTXTRecord = mdns_ns.struct("MDNSTXTRecord")
|
MDNSTXTRecord = mdns_ns.struct("MDNSTXTRecord")
|
||||||
@@ -91,12 +96,20 @@ async def to_code(config):
|
|||||||
|
|
||||||
cg.add_define("USE_MDNS")
|
cg.add_define("USE_MDNS")
|
||||||
|
|
||||||
var = cg.new_Pvariable(config[CONF_ID])
|
# Calculate compile-time service count
|
||||||
await cg.register_component(var, config)
|
service_count = sum(
|
||||||
|
1 for key in COMPONENTS_WITH_MDNS_SERVICES if key in CORE.config
|
||||||
|
) + len(config[CONF_SERVICES])
|
||||||
|
|
||||||
if config[CONF_SERVICES]:
|
if config[CONF_SERVICES]:
|
||||||
cg.add_define("USE_MDNS_EXTRA_SERVICES")
|
cg.add_define("USE_MDNS_EXTRA_SERVICES")
|
||||||
|
|
||||||
|
# Ensure at least 1 service (fallback service)
|
||||||
|
cg.add_define("MDNS_SERVICE_COUNT", max(1, service_count))
|
||||||
|
|
||||||
|
var = cg.new_Pvariable(config[CONF_ID])
|
||||||
|
await cg.register_component(var, config)
|
||||||
|
|
||||||
for service in config[CONF_SERVICES]:
|
for service in config[CONF_SERVICES]:
|
||||||
txt = [
|
txt = [
|
||||||
cg.StructInitializer(
|
cg.StructInitializer(
|
||||||
|
@@ -73,33 +73,14 @@ MDNS_STATIC_CONST_CHAR(NETWORK_THREAD, "thread");
|
|||||||
|
|
||||||
void MDNSComponent::compile_records_() {
|
void MDNSComponent::compile_records_() {
|
||||||
this->hostname_ = App.get_name();
|
this->hostname_ = App.get_name();
|
||||||
|
this->services_count_ = 0;
|
||||||
|
|
||||||
// Calculate exact capacity needed for services vector
|
// IMPORTANT: The #ifdef blocks below must match COMPONENTS_WITH_MDNS_SERVICES
|
||||||
size_t services_count = 0;
|
// in mdns/__init__.py. If you add a new service here, update both locations.
|
||||||
#ifdef USE_API
|
|
||||||
if (api::global_api_server != nullptr) {
|
|
||||||
services_count++;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#ifdef USE_PROMETHEUS
|
|
||||||
services_count++;
|
|
||||||
#endif
|
|
||||||
#ifdef USE_WEBSERVER
|
|
||||||
services_count++;
|
|
||||||
#endif
|
|
||||||
#ifdef USE_MDNS_EXTRA_SERVICES
|
|
||||||
services_count += this->services_extra_.size();
|
|
||||||
#endif
|
|
||||||
// Reserve for fallback service if needed
|
|
||||||
if (services_count == 0) {
|
|
||||||
services_count = 1;
|
|
||||||
}
|
|
||||||
this->services_.reserve(services_count);
|
|
||||||
|
|
||||||
#ifdef USE_API
|
#ifdef USE_API
|
||||||
if (api::global_api_server != nullptr) {
|
if (api::global_api_server != nullptr) {
|
||||||
this->services_.emplace_back();
|
auto &service = this->services_[this->services_count_++];
|
||||||
auto &service = this->services_.back();
|
|
||||||
service.service_type = MDNS_STR(SERVICE_ESPHOMELIB);
|
service.service_type = MDNS_STR(SERVICE_ESPHOMELIB);
|
||||||
service.proto = MDNS_STR(SERVICE_TCP);
|
service.proto = MDNS_STR(SERVICE_TCP);
|
||||||
service.port = api::global_api_server->get_port();
|
service.port = api::global_api_server->get_port();
|
||||||
@@ -178,30 +159,29 @@ void MDNSComponent::compile_records_() {
|
|||||||
#endif // USE_API
|
#endif // USE_API
|
||||||
|
|
||||||
#ifdef USE_PROMETHEUS
|
#ifdef USE_PROMETHEUS
|
||||||
this->services_.emplace_back();
|
auto &prom_service = this->services_[this->services_count_++];
|
||||||
auto &prom_service = this->services_.back();
|
|
||||||
prom_service.service_type = MDNS_STR(SERVICE_PROMETHEUS);
|
prom_service.service_type = MDNS_STR(SERVICE_PROMETHEUS);
|
||||||
prom_service.proto = MDNS_STR(SERVICE_TCP);
|
prom_service.proto = MDNS_STR(SERVICE_TCP);
|
||||||
prom_service.port = USE_WEBSERVER_PORT;
|
prom_service.port = USE_WEBSERVER_PORT;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef USE_WEBSERVER
|
#ifdef USE_WEBSERVER
|
||||||
this->services_.emplace_back();
|
auto &web_service = this->services_[this->services_count_++];
|
||||||
auto &web_service = this->services_.back();
|
|
||||||
web_service.service_type = MDNS_STR(SERVICE_HTTP);
|
web_service.service_type = MDNS_STR(SERVICE_HTTP);
|
||||||
web_service.proto = MDNS_STR(SERVICE_TCP);
|
web_service.proto = MDNS_STR(SERVICE_TCP);
|
||||||
web_service.port = USE_WEBSERVER_PORT;
|
web_service.port = USE_WEBSERVER_PORT;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef USE_MDNS_EXTRA_SERVICES
|
#ifdef USE_MDNS_EXTRA_SERVICES
|
||||||
this->services_.insert(this->services_.end(), this->services_extra_.begin(), this->services_extra_.end());
|
for (const auto &extra_service : this->services_extra_) {
|
||||||
|
this->services_[this->services_count_++] = extra_service;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined(USE_API) && !defined(USE_PROMETHEUS) && !defined(USE_WEBSERVER) && !defined(USE_MDNS_EXTRA_SERVICES)
|
#if !defined(USE_API) && !defined(USE_PROMETHEUS) && !defined(USE_WEBSERVER) && !defined(USE_MDNS_EXTRA_SERVICES)
|
||||||
// Publish "http" service if not using native API or any other services
|
// Publish "http" service if not using native API or any other services
|
||||||
// This is just to have *some* mDNS service so that .local resolution works
|
// This is just to have *some* mDNS service so that .local resolution works
|
||||||
this->services_.emplace_back();
|
auto &fallback_service = this->services_[this->services_count_++];
|
||||||
auto &fallback_service = this->services_.back();
|
|
||||||
fallback_service.service_type = "_http";
|
fallback_service.service_type = "_http";
|
||||||
fallback_service.proto = "_tcp";
|
fallback_service.proto = "_tcp";
|
||||||
fallback_service.port = USE_WEBSERVER_PORT;
|
fallback_service.port = USE_WEBSERVER_PORT;
|
||||||
@@ -209,14 +189,21 @@ void MDNSComponent::compile_records_() {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef USE_MDNS_EXTRA_SERVICES
|
||||||
|
void MDNSComponent::add_extra_service(MDNSService service) {
|
||||||
|
this->services_[this->services_count_++] = std::move(service);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void MDNSComponent::dump_config() {
|
void MDNSComponent::dump_config() {
|
||||||
ESP_LOGCONFIG(TAG,
|
ESP_LOGCONFIG(TAG,
|
||||||
"mDNS:\n"
|
"mDNS:\n"
|
||||||
" Hostname: %s",
|
" Hostname: %s",
|
||||||
this->hostname_.c_str());
|
this->hostname_.c_str());
|
||||||
#if ESPHOME_LOG_LEVEL >= ESPHOME_LOG_LEVEL_VERY_VERBOSE
|
#if ESPHOME_LOG_LEVEL >= ESPHOME_LOG_LEVEL_VERBOSE
|
||||||
ESP_LOGV(TAG, " Services:");
|
ESP_LOGV(TAG, " Services:");
|
||||||
for (const auto &service : this->services_) {
|
for (uint8_t i = 0; i < this->services_count_; i++) {
|
||||||
|
const auto &service = this->services_[i];
|
||||||
ESP_LOGV(TAG, " - %s, %s, %d", service.service_type.c_str(), service.proto.c_str(),
|
ESP_LOGV(TAG, " - %s, %s, %d", service.service_type.c_str(), service.proto.c_str(),
|
||||||
const_cast<TemplatableValue<uint16_t> &>(service.port).value());
|
const_cast<TemplatableValue<uint16_t> &>(service.port).value());
|
||||||
for (const auto &record : service.txt_records) {
|
for (const auto &record : service.txt_records) {
|
||||||
@@ -227,8 +214,6 @@ void MDNSComponent::dump_config() {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<MDNSService> MDNSComponent::get_services() { return this->services_; }
|
|
||||||
|
|
||||||
} // namespace mdns
|
} // namespace mdns
|
||||||
} // namespace esphome
|
} // namespace esphome
|
||||||
#endif
|
#endif
|
||||||
|
@@ -1,14 +1,17 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "esphome/core/defines.h"
|
#include "esphome/core/defines.h"
|
||||||
#ifdef USE_MDNS
|
#ifdef USE_MDNS
|
||||||
|
#include <array>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
|
||||||
#include "esphome/core/automation.h"
|
#include "esphome/core/automation.h"
|
||||||
#include "esphome/core/component.h"
|
#include "esphome/core/component.h"
|
||||||
|
|
||||||
namespace esphome {
|
namespace esphome {
|
||||||
namespace mdns {
|
namespace mdns {
|
||||||
|
|
||||||
|
// Service count is calculated at compile time by Python codegen
|
||||||
|
// MDNS_SERVICE_COUNT will always be defined
|
||||||
|
|
||||||
struct MDNSTXTRecord {
|
struct MDNSTXTRecord {
|
||||||
std::string key;
|
std::string key;
|
||||||
TemplatableValue<std::string> value;
|
TemplatableValue<std::string> value;
|
||||||
@@ -36,18 +39,17 @@ class MDNSComponent : public Component {
|
|||||||
float get_setup_priority() const override { return setup_priority::AFTER_CONNECTION; }
|
float get_setup_priority() const override { return setup_priority::AFTER_CONNECTION; }
|
||||||
|
|
||||||
#ifdef USE_MDNS_EXTRA_SERVICES
|
#ifdef USE_MDNS_EXTRA_SERVICES
|
||||||
void add_extra_service(MDNSService service) { services_extra_.push_back(std::move(service)); }
|
void add_extra_service(MDNSService service);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
std::vector<MDNSService> get_services();
|
const std::array<MDNSService, MDNS_SERVICE_COUNT> &get_services() const { return services_; }
|
||||||
|
uint8_t get_services_count() const { return services_count_; }
|
||||||
|
|
||||||
void on_shutdown() override;
|
void on_shutdown() override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
#ifdef USE_MDNS_EXTRA_SERVICES
|
std::array<MDNSService, MDNS_SERVICE_COUNT> services_{};
|
||||||
std::vector<MDNSService> services_extra_{};
|
uint8_t services_count_{0};
|
||||||
#endif
|
|
||||||
std::vector<MDNSService> services_{};
|
|
||||||
std::string hostname_;
|
std::string hostname_;
|
||||||
void compile_records_();
|
void compile_records_();
|
||||||
};
|
};
|
||||||
|
@@ -143,11 +143,12 @@ void OpenThreadSrpComponent::setup() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Copy the mdns services to our local instance so that the c_str pointers remain valid for the lifetime of this
|
// Use mdns services directly - they remain valid for the lifetime of the mdns component
|
||||||
// component
|
const auto &mdns_services = this->mdns_->get_services();
|
||||||
this->mdns_services_ = this->mdns_->get_services();
|
uint8_t mdns_count = this->mdns_->get_services_count();
|
||||||
ESP_LOGD(TAG, "Setting up SRP services. count = %d\n", this->mdns_services_.size());
|
ESP_LOGD(TAG, "Setting up SRP services. count = %d\n", mdns_count);
|
||||||
for (const auto &service : this->mdns_services_) {
|
for (uint8_t i = 0; i < mdns_count; i++) {
|
||||||
|
const auto &service = mdns_services[i];
|
||||||
otSrpClientBuffersServiceEntry *entry = otSrpClientBuffersAllocateService(instance);
|
otSrpClientBuffersServiceEntry *entry = otSrpClientBuffersAllocateService(instance);
|
||||||
if (!entry) {
|
if (!entry) {
|
||||||
ESP_LOGW(TAG, "Failed to allocate service entry");
|
ESP_LOGW(TAG, "Failed to allocate service entry");
|
||||||
|
@@ -57,7 +57,6 @@ class OpenThreadSrpComponent : public Component {
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
esphome::mdns::MDNSComponent *mdns_{nullptr};
|
esphome::mdns::MDNSComponent *mdns_{nullptr};
|
||||||
std::vector<esphome::mdns::MDNSService> mdns_services_;
|
|
||||||
std::vector<std::unique_ptr<uint8_t[]>> memory_pool_;
|
std::vector<std::unique_ptr<uint8_t[]>> memory_pool_;
|
||||||
void *pool_alloc_(size_t size);
|
void *pool_alloc_(size_t size);
|
||||||
};
|
};
|
||||||
|
@@ -374,7 +374,7 @@ void Rtttl::loop() {
|
|||||||
this->last_note_ = millis();
|
this->last_note_ = millis();
|
||||||
}
|
}
|
||||||
|
|
||||||
#if ESPHOME_LOG_LEVEL >= ESPHOME_LOG_LEVEL_DEBUG
|
#if ESPHOME_LOG_LEVEL >= ESPHOME_LOG_LEVEL_VERBOSE
|
||||||
static const LogString *state_to_string(State state) {
|
static const LogString *state_to_string(State state) {
|
||||||
switch (state) {
|
switch (state) {
|
||||||
case STATE_STOPPED:
|
case STATE_STOPPED:
|
||||||
|
@@ -82,6 +82,7 @@
|
|||||||
#define USE_LVGL_TILEVIEW
|
#define USE_LVGL_TILEVIEW
|
||||||
#define USE_LVGL_TOUCHSCREEN
|
#define USE_LVGL_TOUCHSCREEN
|
||||||
#define USE_MDNS
|
#define USE_MDNS
|
||||||
|
#define MDNS_SERVICE_COUNT 3
|
||||||
#define USE_MEDIA_PLAYER
|
#define USE_MEDIA_PLAYER
|
||||||
#define USE_NEXTION_TFT_UPLOAD
|
#define USE_NEXTION_TFT_UPLOAD
|
||||||
#define USE_NUMBER
|
#define USE_NUMBER
|
||||||
|
Reference in New Issue
Block a user