ESPHome 2026.8.0b4
Loading...
Searching...
No Matches
wifi_info_text_sensor.cpp
Go to the documentation of this file.
2#ifdef USE_WIFI
4#include "esphome/core/log.h"
5
6#ifdef USE_ESP8266
7#include <pgmspace.h>
8#endif
9
11
12static const char *const TAG = "wifi_info";
13
14#ifdef USE_WIFI_IP_STATE_LISTENERS
15
16/********************
17 * IPAddressWiFiInfo
18 *******************/
19
21
22void IPAddressWiFiInfo::dump_config() { LOG_TEXT_SENSOR("", "IP Address", this); }
23
25 const network::IPAddress &dns2) {
26 char buf[network::IP_ADDRESS_BUFFER_SIZE];
27 ips[0].str_to(buf);
28 this->publish_state(buf);
29 uint8_t sensor = 0;
30 for (const auto &ip : ips) {
31 if (ip.is_set()) {
32 if (this->ip_sensors_[sensor] != nullptr) {
33 ip.str_to(buf);
34 this->ip_sensors_[sensor]->publish_state(buf);
35 }
36 sensor++;
37 }
38 }
39}
40
41/*********************
42 * DNSAddressWifiInfo
43 ********************/
44
46
47void DNSAddressWifiInfo::dump_config() { LOG_TEXT_SENSOR("", "DNS Address", this); }
48
50 const network::IPAddress &dns2) {
51 // IP_ADDRESS_BUFFER_SIZE (40) = max IP (39) + null; space reuses first null's slot
52 char buf[network::IP_ADDRESS_BUFFER_SIZE * 2];
53 dns1.str_to(buf);
54 size_t len1 = strlen(buf);
55 buf[len1] = ' ';
56 dns2.str_to(buf + len1 + 1);
57 this->publish_state(buf);
58}
59
60#endif // USE_WIFI_IP_STATE_LISTENERS
61
62#ifdef USE_WIFI_SCAN_RESULTS_LISTENERS
63
64/**********************
65 * ScanResultsWiFiInfo
66 *********************/
67
69
70void ScanResultsWiFiInfo::dump_config() { LOG_TEXT_SENSOR("", "Scan Results", this); }
71
72// Format: "SSID: -XXdB\n" - caller must ensure ssid_len + 9 bytes available in buffer
73static char *format_scan_entry(char *buf, const char *ssid, size_t ssid_len, int8_t rssi) {
74 memcpy(buf, ssid, ssid_len);
75 buf += ssid_len;
76 *buf++ = ':';
77 *buf++ = ' ';
78 buf = int8_to_str(buf, rssi);
79 *buf++ = 'd';
80 *buf++ = 'B';
81 *buf++ = '\n';
82 return buf;
83}
84
86 char buf[MAX_STATE_LEN + 1];
87 char *ptr = buf;
88 const char *end = buf + MAX_STATE_LEN;
89
90 for (const auto &scan : results) {
91 if (scan.get_is_hidden())
92 continue;
93 const auto &ssid = scan.get_ssid();
94 // Max space: ssid + ": " (2) + "-128" (4) + "dB\n" (3) = ssid + 9
95 if (ptr + ssid.size() + 9 > end)
96 break;
97 ptr = format_scan_entry(ptr, ssid.c_str(), ssid.size(), scan.get_rssi());
98 }
99
100 *ptr = '\0';
101 this->publish_state(buf);
102}
103
104#endif // USE_WIFI_SCAN_RESULTS_LISTENERS
105
106#ifdef USE_WIFI_CONNECT_STATE_LISTENERS
107
108/***************
109 * SSIDWiFiInfo
110 **************/
111
113
114void SSIDWiFiInfo::dump_config() { LOG_TEXT_SENSOR("", "SSID", this); }
115
116void SSIDWiFiInfo::on_wifi_connect_state(StringRef ssid, std::span<const uint8_t, 6> bssid) {
117 this->publish_state(ssid.c_str(), ssid.size());
118}
119
120/****************
121 * BSSIDWiFiInfo
122 ***************/
123
125
126void BSSIDWiFiInfo::dump_config() { LOG_TEXT_SENSOR("", "BSSID", this); }
127
128void BSSIDWiFiInfo::on_wifi_connect_state(StringRef ssid, std::span<const uint8_t, 6> bssid) {
129 char buf[MAC_ADDRESS_PRETTY_BUFFER_SIZE] = "unknown";
130 if (mac_address_is_valid(bssid.data())) {
131 format_mac_addr_upper(bssid.data(), buf);
132 }
133 this->publish_state(buf);
134}
135
136#endif // USE_WIFI_CONNECT_STATE_LISTENERS
137
138#ifdef USE_WIFI_POWER_SAVE_LISTENERS
139
140/************************
141 * PowerSaveModeWiFiInfo
142 ***********************/
143
145
146void PowerSaveModeWiFiInfo::dump_config() { LOG_TEXT_SENSOR("", "WiFi Power Save Mode", this); }
147
149#ifdef USE_ESP8266
150#define MODE_STR(s) static const char MODE_##s[] PROGMEM = #s
151 MODE_STR(NONE);
152 MODE_STR(LIGHT);
153 MODE_STR(HIGH);
154 MODE_STR(UNKNOWN);
155
156 const char *mode_str_p;
157 switch (mode) {
159 mode_str_p = MODE_NONE;
160 break;
162 mode_str_p = MODE_LIGHT;
163 break;
165 mode_str_p = MODE_HIGH;
166 break;
167 default:
168 mode_str_p = MODE_UNKNOWN;
169 break;
170 }
171
172 char mode_str[8];
173 strncpy_P(mode_str, mode_str_p, sizeof(mode_str));
174 mode_str[sizeof(mode_str) - 1] = '\0';
175#undef MODE_STR
176#else
177 const char *mode_str;
178 switch (mode) {
180 mode_str = "NONE";
181 break;
183 mode_str = "LIGHT";
184 break;
186 mode_str = "HIGH";
187 break;
188 default:
189 mode_str = "UNKNOWN";
190 break;
191 }
192#endif
193 this->publish_state(mode_str);
194}
195
196#endif // USE_WIFI_POWER_SAVE_LISTENERS
197
198/*********************
199 * MacAddressWifiInfo
200 ********************/
201
202void MacAddressWifiInfo::dump_config() { LOG_TEXT_SENSOR("", "MAC Address", this); }
203
204} // namespace esphome::wifi_info
205#endif
BedjetMode mode
BedJet operating mode.
StringRef is a reference to a string owned by something else.
Definition string_ref.h:26
constexpr const char * c_str() const
Definition string_ref.h:73
constexpr size_type size() const
Definition string_ref.h:74
void publish_state(const std::string &state)
void add_connect_state_listener(WiFiConnectStateListener *listener)
Add a listener for WiFi connection state changes.
void add_power_save_listener(WiFiPowerSaveListener *listener)
Add a listener for WiFi power save mode changes.
void add_ip_state_listener(WiFiIPStateListener *listener)
Add a listener for IP state changes.
void add_scan_results_listener(WiFiScanResultsListener *listener)
Add a listener for WiFi scan results.
void on_wifi_connect_state(StringRef ssid, std::span< const uint8_t, 6 > bssid) override
void on_ip_state(const network::IPAddresses &ips, const network::IPAddress &dns1, const network::IPAddress &dns2) override
void on_ip_state(const network::IPAddresses &ips, const network::IPAddress &dns1, const network::IPAddress &dns2) override
std::array< text_sensor::TextSensor *, 5 > ip_sensors_
void on_wifi_power_save(wifi::WiFiPowerSaveMode mode) override
void on_wifi_connect_state(StringRef ssid, std::span< const uint8_t, 6 > bssid) override
void on_wifi_scan_results(const wifi::wifi_scan_vector_t< wifi::WiFiScanResult > &results) override
std::array< IPAddress, 5 > IPAddresses
Definition ip_address.h:299
std::vector< T > wifi_scan_vector_t
WiFiComponent * global_wifi_component
bool mac_address_is_valid(const uint8_t *mac)
Check if the MAC address is not all zeros or all ones.
Definition helpers.cpp:827
char * int8_to_str(char *buf, int8_t val)
Write int8 value to buffer without modulo operations.
Definition helpers.h:1299
char * format_mac_addr_upper(const uint8_t *mac, char *output)
Format MAC address as XX:XX:XX:XX:XX:XX (uppercase, colon separators)
Definition helpers.h:1493
char * str_to(char *buf) const
Definition ip_address.h:101
uint8_t end[39]
Definition sun_gtil2.cpp:17