ESPHome 2025.6.3
Loading...
Searching...
No Matches
mdns_component.cpp
Go to the documentation of this file.
2#ifdef USE_MDNS
4#include "esphome/core/log.h"
6#include "mdns_component.h"
7
8#ifdef USE_API
10#endif
11#ifdef USE_DASHBOARD_IMPORT
13#endif
14
15namespace esphome {
16namespace mdns {
17
18static const char *const TAG = "mdns";
19
20#ifndef USE_WEBSERVER_PORT
21#define USE_WEBSERVER_PORT 80 // NOLINT
22#endif
23
25 this->hostname_ = App.get_name();
26
27 this->services_.clear();
28#ifdef USE_API
29 if (api::global_api_server != nullptr) {
30 MDNSService service{};
31 service.service_type = "_esphomelib";
32 service.proto = "_tcp";
33 service.port = api::global_api_server->get_port();
34 if (!App.get_friendly_name().empty()) {
35 service.txt_records.push_back({"friendly_name", App.get_friendly_name()});
36 }
37 service.txt_records.push_back({"version", ESPHOME_VERSION});
38 service.txt_records.push_back({"mac", get_mac_address()});
39 const char *platform = nullptr;
40#ifdef USE_ESP8266
41 platform = "ESP8266";
42#endif
43#ifdef USE_ESP32
44 platform = "ESP32";
45#endif
46#ifdef USE_RP2040
47 platform = "RP2040";
48#endif
49#ifdef USE_LIBRETINY
50 platform = lt_cpu_get_model_name();
51#endif
52 if (platform != nullptr) {
53 service.txt_records.push_back({"platform", platform});
54 }
55
56 service.txt_records.push_back({"board", ESPHOME_BOARD});
57
58#if defined(USE_WIFI)
59 service.txt_records.push_back({"network", "wifi"});
60#elif defined(USE_ETHERNET)
61 service.txt_records.push_back({"network", "ethernet"});
62#elif defined(USE_OPENTHREAD)
63 service.txt_records.push_back({"network", "thread"});
64#endif
65
66#ifdef USE_API_NOISE
67 if (api::global_api_server->get_noise_ctx()->has_psk()) {
68 service.txt_records.push_back({"api_encryption", "Noise_NNpsk0_25519_ChaChaPoly_SHA256"});
69 } else {
70 service.txt_records.push_back({"api_encryption_supported", "Noise_NNpsk0_25519_ChaChaPoly_SHA256"});
71 }
72#endif
73
74#ifdef ESPHOME_PROJECT_NAME
75 service.txt_records.push_back({"project_name", ESPHOME_PROJECT_NAME});
76 service.txt_records.push_back({"project_version", ESPHOME_PROJECT_VERSION});
77#endif // ESPHOME_PROJECT_NAME
78
79#ifdef USE_DASHBOARD_IMPORT
80 service.txt_records.push_back({"package_import_url", dashboard_import::get_package_import_url()});
81#endif
82
83 this->services_.push_back(service);
84 }
85#endif // USE_API
86
87#ifdef USE_PROMETHEUS
88 {
89 MDNSService service{};
90 service.service_type = "_prometheus-http";
91 service.proto = "_tcp";
92 service.port = USE_WEBSERVER_PORT;
93 this->services_.push_back(service);
94 }
95#endif
96
97#ifdef USE_WEBSERVER
98 {
99 MDNSService service{};
100 service.service_type = "_http";
101 service.proto = "_tcp";
102 service.port = USE_WEBSERVER_PORT;
103 this->services_.push_back(service);
104 }
105#endif
106
107 this->services_.insert(this->services_.end(), this->services_extra_.begin(), this->services_extra_.end());
108
109 if (this->services_.empty()) {
110 // Publish "http" service if not using native API
111 // This is just to have *some* mDNS service so that .local resolution works
112 MDNSService service{};
113 service.service_type = "_http";
114 service.proto = "_tcp";
115 service.port = USE_WEBSERVER_PORT;
116 service.txt_records.push_back({"version", ESPHOME_VERSION});
117 this->services_.push_back(service);
118 }
119}
120
122 ESP_LOGCONFIG(TAG,
123 "mDNS:\n"
124 " Hostname: %s",
125 this->hostname_.c_str());
126 ESP_LOGV(TAG, " Services:");
127 for (const auto &service : this->services_) {
128 ESP_LOGV(TAG, " - %s, %s, %d", service.service_type.c_str(), service.proto.c_str(),
129 const_cast<TemplatableValue<uint16_t> &>(service.port).value());
130 for (const auto &record : service.txt_records) {
131 ESP_LOGV(TAG, " TXT: %s = %s", record.key.c_str(),
132 const_cast<TemplatableValue<std::string> &>(record.value).value().c_str());
133 }
134 }
135}
136
137std::vector<MDNSService> MDNSComponent::get_services() { return this->services_; }
138
139} // namespace mdns
140} // namespace esphome
141#endif
const std::string & get_friendly_name() const
Get the friendly name of this Application set by pre_setup().
const std::string & get_name() const
Get the name of this Application set by pre_setup().
uint16_t get_port() const
std::vector< MDNSService > services_
std::vector< MDNSService > get_services()
APIServer * global_api_server
Providing packet encoding functions for exchanging data with a remote host.
Definition a01nyub.cpp:7
std::string get_mac_address()
Get the device MAC address as a string, in lowercase hex notation.
Definition helpers.cpp:726
Application App
Global storage of Application pointer - only one Application can exist.