ESPHome 2026.1.0-dev
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_LISTENERS
14
15static constexpr size_t MAX_STATE_LENGTH = 255;
16
17/********************
18 * IPAddressWiFiInfo
19 *******************/
20
22
23void IPAddressWiFiInfo::dump_config() { LOG_TEXT_SENSOR("", "IP Address", this); }
24
26 const network::IPAddress &dns2) {
27 this->publish_state(ips[0].str());
28 uint8_t sensor = 0;
29 for (const auto &ip : ips) {
30 if (ip.is_set()) {
31 if (this->ip_sensors_[sensor] != nullptr) {
32 this->ip_sensors_[sensor]->publish_state(ip.str());
33 }
34 sensor++;
35 }
36 }
37}
38
39/*********************
40 * DNSAddressWifiInfo
41 ********************/
42
44
45void DNSAddressWifiInfo::dump_config() { LOG_TEXT_SENSOR("", "DNS Address", this); }
46
48 const network::IPAddress &dns2) {
49 // IP_ADDRESS_BUFFER_SIZE (40) = max IP (39) + null; space reuses first null's slot
50 char buf[network::IP_ADDRESS_BUFFER_SIZE * 2];
51 dns1.str_to(buf);
52 size_t len1 = strlen(buf);
53 buf[len1] = ' ';
54 dns2.str_to(buf + len1 + 1);
55 this->publish_state(buf);
56}
57
58/**********************
59 * ScanResultsWiFiInfo
60 *********************/
61
63
64void ScanResultsWiFiInfo::dump_config() { LOG_TEXT_SENSOR("", "Scan Results", this); }
65
66// Format: "SSID: -XXdB\n" - caller must ensure ssid_len + 9 bytes available in buffer
67static char *format_scan_entry(char *buf, const char *ssid, size_t ssid_len, int8_t rssi) {
68 memcpy(buf, ssid, ssid_len);
69 buf += ssid_len;
70 *buf++ = ':';
71 *buf++ = ' ';
72 buf = int8_to_str(buf, rssi);
73 *buf++ = 'd';
74 *buf++ = 'B';
75 *buf++ = '\n';
76 return buf;
77}
78
80 char buf[MAX_STATE_LENGTH + 1];
81 char *ptr = buf;
82 const char *end = buf + MAX_STATE_LENGTH;
83
84 for (const auto &scan : results) {
85 if (scan.get_is_hidden())
86 continue;
87 const std::string &ssid = scan.get_ssid();
88 // Max space: ssid + ": " (2) + "-128" (4) + "dB\n" (3) = ssid + 9
89 if (ptr + ssid.size() + 9 > end)
90 break;
91 ptr = format_scan_entry(ptr, ssid.c_str(), ssid.size(), scan.get_rssi());
92 }
93
94 *ptr = '\0';
95 this->publish_state(buf);
96}
97
98/***************
99 * SSIDWiFiInfo
100 **************/
101
103
104void SSIDWiFiInfo::dump_config() { LOG_TEXT_SENSOR("", "SSID", this); }
105
106void SSIDWiFiInfo::on_wifi_connect_state(StringRef ssid, std::span<const uint8_t, 6> bssid) {
107 this->publish_state(ssid.str());
108}
109
110/****************
111 * BSSIDWiFiInfo
112 ***************/
113
115
116void BSSIDWiFiInfo::dump_config() { LOG_TEXT_SENSOR("", "BSSID", this); }
117
118void BSSIDWiFiInfo::on_wifi_connect_state(StringRef ssid, std::span<const uint8_t, 6> bssid) {
119 char buf[18] = "unknown";
120 if (mac_address_is_valid(bssid.data())) {
121 format_mac_addr_upper(bssid.data(), buf);
122 }
123 this->publish_state(buf);
124}
125
126/************************
127 * PowerSaveModeWiFiInfo
128 ***********************/
129
131
132void PowerSaveModeWiFiInfo::dump_config() { LOG_TEXT_SENSOR("", "WiFi Power Save Mode", this); }
133
135#ifdef USE_ESP8266
136#define MODE_STR(s) static const char MODE_##s[] PROGMEM = #s
137 MODE_STR(NONE);
138 MODE_STR(LIGHT);
139 MODE_STR(HIGH);
140 MODE_STR(UNKNOWN);
141
142 const char *mode_str_p;
143 switch (mode) {
145 mode_str_p = MODE_NONE;
146 break;
148 mode_str_p = MODE_LIGHT;
149 break;
151 mode_str_p = MODE_HIGH;
152 break;
153 default:
154 mode_str_p = MODE_UNKNOWN;
155 break;
156 }
157
158 char mode_str[8];
159 strncpy_P(mode_str, mode_str_p, sizeof(mode_str));
160 mode_str[sizeof(mode_str) - 1] = '\0';
161#undef MODE_STR
162#else
163 const char *mode_str;
164 switch (mode) {
166 mode_str = "NONE";
167 break;
169 mode_str = "LIGHT";
170 break;
172 mode_str = "HIGH";
173 break;
174 default:
175 mode_str = "UNKNOWN";
176 break;
177 }
178#endif
179 this->publish_state(mode_str);
180}
181
182#endif
183
184/*********************
185 * MacAddressWifiInfo
186 ********************/
187
188void MacAddressWifiInfo::dump_config() { LOG_TEXT_SENSOR("", "MAC Address", this); }
189
190} // namespace esphome::wifi_info
191#endif
BedjetMode mode
BedJet operating mode.
StringRef is a reference to a string owned by something else.
Definition string_ref.h:22
std::string str() 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:158
std::vector< T > wifi_scan_vector_t
WiFiComponent * global_wifi_component
void 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:765
bool mac_address_is_valid(const uint8_t *mac)
Check if the MAC address is not all zeros or all ones.
Definition helpers.cpp:721
char * int8_to_str(char *buf, int8_t val)
Write int8 value to buffer without modulo operations.
Definition helpers.h:691
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:57
uint8_t end[39]
Definition sun_gtil2.cpp:17