ESPHome 2026.1.4
Loading...
Searching...
No Matches
wifi_info_text_sensor.cpp
Go to the documentation of this file.
2#ifdef USE_WIFI
3#include "esphome/core/log.h"
4
5#ifdef USE_ESP8266
6#include <pgmspace.h>
7#endif
8
10
11static const char *const TAG = "wifi_info";
12
13#ifdef USE_WIFI_IP_STATE_LISTENERS
14
15/********************
16 * IPAddressWiFiInfo
17 *******************/
18
20
21void IPAddressWiFiInfo::dump_config() { LOG_TEXT_SENSOR("", "IP Address", this); }
22
24 const network::IPAddress &dns2) {
25 char buf[network::IP_ADDRESS_BUFFER_SIZE];
26 ips[0].str_to(buf);
27 this->publish_state(buf);
28 uint8_t sensor = 0;
29 for (const auto &ip : ips) {
30 if (ip.is_set()) {
31 if (this->ip_sensors_[sensor] != nullptr) {
32 ip.str_to(buf);
33 this->ip_sensors_[sensor]->publish_state(buf);
34 }
35 sensor++;
36 }
37 }
38}
39
40/*********************
41 * DNSAddressWifiInfo
42 ********************/
43
45
46void DNSAddressWifiInfo::dump_config() { LOG_TEXT_SENSOR("", "DNS Address", this); }
47
49 const network::IPAddress &dns2) {
50 // IP_ADDRESS_BUFFER_SIZE (40) = max IP (39) + null; space reuses first null's slot
51 char buf[network::IP_ADDRESS_BUFFER_SIZE * 2];
52 dns1.str_to(buf);
53 size_t len1 = strlen(buf);
54 buf[len1] = ' ';
55 dns2.str_to(buf + len1 + 1);
56 this->publish_state(buf);
57}
58
59#endif // USE_WIFI_IP_STATE_LISTENERS
60
61#ifdef USE_WIFI_SCAN_RESULTS_LISTENERS
62
63/**********************
64 * ScanResultsWiFiInfo
65 *********************/
66
68
69void ScanResultsWiFiInfo::dump_config() { LOG_TEXT_SENSOR("", "Scan Results", this); }
70
71// Format: "SSID: -XXdB\n" - caller must ensure ssid_len + 9 bytes available in buffer
72static char *format_scan_entry(char *buf, const char *ssid, size_t ssid_len, int8_t rssi) {
73 memcpy(buf, ssid, ssid_len);
74 buf += ssid_len;
75 *buf++ = ':';
76 *buf++ = ' ';
77 buf = int8_to_str(buf, rssi);
78 *buf++ = 'd';
79 *buf++ = 'B';
80 *buf++ = '\n';
81 return buf;
82}
83
85 char buf[MAX_STATE_LEN + 1];
86 char *ptr = buf;
87 const char *end = buf + MAX_STATE_LEN;
88
89 for (const auto &scan : results) {
90 if (scan.get_is_hidden())
91 continue;
92 const std::string &ssid = scan.get_ssid();
93 // Max space: ssid + ": " (2) + "-128" (4) + "dB\n" (3) = ssid + 9
94 if (ptr + ssid.size() + 9 > end)
95 break;
96 ptr = format_scan_entry(ptr, ssid.c_str(), ssid.size(), scan.get_rssi());
97 }
98
99 *ptr = '\0';
100 this->publish_state(buf);
101}
102
103#endif // USE_WIFI_SCAN_RESULTS_LISTENERS
104
105#ifdef USE_WIFI_CONNECT_STATE_LISTENERS
106
107/***************
108 * SSIDWiFiInfo
109 **************/
110
112
113void SSIDWiFiInfo::dump_config() { LOG_TEXT_SENSOR("", "SSID", this); }
114
115void SSIDWiFiInfo::on_wifi_connect_state(StringRef ssid, std::span<const uint8_t, 6> bssid) {
116 this->publish_state(ssid.c_str(), ssid.size());
117}
118
119/****************
120 * BSSIDWiFiInfo
121 ***************/
122
124
125void BSSIDWiFiInfo::dump_config() { LOG_TEXT_SENSOR("", "BSSID", this); }
126
127void BSSIDWiFiInfo::on_wifi_connect_state(StringRef ssid, std::span<const uint8_t, 6> bssid) {
128 char buf[18] = "unknown";
129 if (mac_address_is_valid(bssid.data())) {
130 format_mac_addr_upper(bssid.data(), buf);
131 }
132 this->publish_state(buf);
133}
134
135#endif // USE_WIFI_CONNECT_STATE_LISTENERS
136
137#ifdef USE_WIFI_POWER_SAVE_LISTENERS
138
139/************************
140 * PowerSaveModeWiFiInfo
141 ***********************/
142
144
145void PowerSaveModeWiFiInfo::dump_config() { LOG_TEXT_SENSOR("", "WiFi Power Save Mode", this); }
146
148#ifdef USE_ESP8266
149#define MODE_STR(s) static const char MODE_##s[] PROGMEM = #s
150 MODE_STR(NONE);
151 MODE_STR(LIGHT);
152 MODE_STR(HIGH);
153 MODE_STR(UNKNOWN);
154
155 const char *mode_str_p;
156 switch (mode) {
158 mode_str_p = MODE_NONE;
159 break;
161 mode_str_p = MODE_LIGHT;
162 break;
164 mode_str_p = MODE_HIGH;
165 break;
166 default:
167 mode_str_p = MODE_UNKNOWN;
168 break;
169 }
170
171 char mode_str[8];
172 strncpy_P(mode_str, mode_str_p, sizeof(mode_str));
173 mode_str[sizeof(mode_str) - 1] = '\0';
174#undef MODE_STR
175#else
176 const char *mode_str;
177 switch (mode) {
179 mode_str = "NONE";
180 break;
182 mode_str = "LIGHT";
183 break;
185 mode_str = "HIGH";
186 break;
187 default:
188 mode_str = "UNKNOWN";
189 break;
190 }
191#endif
192 this->publish_state(mode_str);
193}
194
195#endif // USE_WIFI_POWER_SAVE_LISTENERS
196
197/*********************
198 * MacAddressWifiInfo
199 ********************/
200
201void MacAddressWifiInfo::dump_config() { LOG_TEXT_SENSOR("", "MAC Address", this); }
202
203} // namespace esphome::wifi_info
204#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:180
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:748
char * int8_to_str(char *buf, int8_t val)
Write int8 value to buffer without modulo operations.
Definition helpers.h:753
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:897
char * str_to(char *buf) const
Write IP address to buffer. Buffer must be at least IP_ADDRESS_BUFFER_SIZE bytes.
Definition ip_address.h:69
uint8_t end[39]
Definition sun_gtil2.cpp:17