Wifi scan results (#1605)

* adding a scan results wifi text sensor

* Code comment

* Adding scan results to test

* Removing redundant call

* linting

* Better method to update wifi info

Co-authored-by: Otto Winter <otto@otto-winter.com>

* Getting loop back

At least for now.

* Trying out suggestion again

* Applying cr suggestions

Co-authored-by: Otto Winter <otto@otto-winter.com>
This commit is contained in:
Gustavo Ambrozio 2021-09-22 01:44:09 -10:00 committed by GitHub
parent fd836e982e
commit 8bebf138ee
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 43 additions and 0 deletions

View File

@ -5,6 +5,7 @@ from esphome.const import (
CONF_BSSID, CONF_BSSID,
CONF_ID, CONF_ID,
CONF_IP_ADDRESS, CONF_IP_ADDRESS,
CONF_SCAN_RESULTS,
CONF_SSID, CONF_SSID,
CONF_MAC_ADDRESS, CONF_MAC_ADDRESS,
) )
@ -15,6 +16,9 @@ wifi_info_ns = cg.esphome_ns.namespace("wifi_info")
IPAddressWiFiInfo = wifi_info_ns.class_( IPAddressWiFiInfo = wifi_info_ns.class_(
"IPAddressWiFiInfo", text_sensor.TextSensor, cg.Component "IPAddressWiFiInfo", text_sensor.TextSensor, cg.Component
) )
ScanResultsWiFiInfo = wifi_info_ns.class_(
"ScanResultsWiFiInfo", text_sensor.TextSensor, cg.PollingComponent
)
SSIDWiFiInfo = wifi_info_ns.class_("SSIDWiFiInfo", text_sensor.TextSensor, cg.Component) SSIDWiFiInfo = wifi_info_ns.class_("SSIDWiFiInfo", text_sensor.TextSensor, cg.Component)
BSSIDWiFiInfo = wifi_info_ns.class_( BSSIDWiFiInfo = wifi_info_ns.class_(
"BSSIDWiFiInfo", text_sensor.TextSensor, cg.Component "BSSIDWiFiInfo", text_sensor.TextSensor, cg.Component
@ -30,6 +34,11 @@ CONFIG_SCHEMA = cv.Schema(
cv.GenerateID(): cv.declare_id(IPAddressWiFiInfo), cv.GenerateID(): cv.declare_id(IPAddressWiFiInfo),
} }
), ),
cv.Optional(CONF_SCAN_RESULTS): text_sensor.TEXT_SENSOR_SCHEMA.extend(
{
cv.GenerateID(): cv.declare_id(ScanResultsWiFiInfo),
}
).extend(cv.polling_component_schema("60s")),
cv.Optional(CONF_SSID): text_sensor.TEXT_SENSOR_SCHEMA.extend( cv.Optional(CONF_SSID): text_sensor.TEXT_SENSOR_SCHEMA.extend(
{ {
cv.GenerateID(): cv.declare_id(SSIDWiFiInfo), cv.GenerateID(): cv.declare_id(SSIDWiFiInfo),
@ -62,3 +71,4 @@ async def to_code(config):
await setup_conf(config, CONF_SSID) await setup_conf(config, CONF_SSID)
await setup_conf(config, CONF_BSSID) await setup_conf(config, CONF_BSSID)
await setup_conf(config, CONF_MAC_ADDRESS) await setup_conf(config, CONF_MAC_ADDRESS)
await setup_conf(config, CONF_SCAN_RESULTS)

View File

@ -7,6 +7,7 @@ namespace wifi_info {
static const char *const TAG = "wifi_info"; static const char *const TAG = "wifi_info";
void IPAddressWiFiInfo::dump_config() { LOG_TEXT_SENSOR("", "WifiInfo IPAddress", this); } void IPAddressWiFiInfo::dump_config() { LOG_TEXT_SENSOR("", "WifiInfo IPAddress", this); }
void ScanResultsWiFiInfo::dump_config() { LOG_TEXT_SENSOR("", "WifiInfo Scan Results", this); }
void SSIDWiFiInfo::dump_config() { LOG_TEXT_SENSOR("", "WifiInfo SSID", this); } void SSIDWiFiInfo::dump_config() { LOG_TEXT_SENSOR("", "WifiInfo SSID", this); }
void BSSIDWiFiInfo::dump_config() { LOG_TEXT_SENSOR("", "WifiInfo BSSID", this); } void BSSIDWiFiInfo::dump_config() { LOG_TEXT_SENSOR("", "WifiInfo BSSID", this); }
void MacAddressWifiInfo::dump_config() { LOG_TEXT_SENSOR("", "WifiInfo Mac Address", this); } void MacAddressWifiInfo::dump_config() { LOG_TEXT_SENSOR("", "WifiInfo Mac Address", this); }

View File

@ -24,6 +24,35 @@ class IPAddressWiFiInfo : public Component, public text_sensor::TextSensor {
network::IPAddress last_ip_; network::IPAddress last_ip_;
}; };
class ScanResultsWiFiInfo : public PollingComponent, public text_sensor::TextSensor {
public:
void update() override {
std::string scan_results;
for (auto &scan : wifi::global_wifi_component->get_scan_result()) {
if (scan.get_is_hidden())
continue;
scan_results += scan.get_ssid();
scan_results += ": ";
scan_results += esphome::to_string(scan.get_rssi());
scan_results += "dB\n";
}
if (this->last_scan_results_ != scan_results) {
this->last_scan_results_ = scan_results;
// There's a limit of 255 characters per state.
// Longer states just don't get sent so we truncate it.
this->publish_state(scan_results.substr(0, 255));
}
}
float get_setup_priority() const override { return setup_priority::AFTER_WIFI; }
std::string unique_id() override { return get_mac_address() + "-wifiinfo-scanresults"; }
void dump_config() override;
protected:
std::string last_scan_results_;
};
class SSIDWiFiInfo : public Component, public text_sensor::TextSensor { class SSIDWiFiInfo : public Component, public text_sensor::TextSensor {
public: public:
void loop() override { void loop() override {

View File

@ -558,6 +558,7 @@ CONF_SAFE_MODE = "safe_mode"
CONF_SAMSUNG = "samsung" CONF_SAMSUNG = "samsung"
CONF_SATELLITES = "satellites" CONF_SATELLITES = "satellites"
CONF_SCAN = "scan" CONF_SCAN = "scan"
CONF_SCAN_RESULTS = "scan_results"
CONF_SCL = "scl" CONF_SCL = "scl"
CONF_SCL_PIN = "scl_pin" CONF_SCL_PIN = "scl_pin"
CONF_SDA = "sda" CONF_SDA = "sda"

View File

@ -2359,6 +2359,8 @@ text_sensor:
name: Template Text Sensor name: Template Text Sensor
id: ${textname}_text id: ${textname}_text
- platform: wifi_info - platform: wifi_info
scan_results:
name: 'Scan Results'
ip_address: ip_address:
name: 'IP Address' name: 'IP Address'
ssid: ssid: