mirror of
https://github.com/esphome/esphome.git
synced 2024-12-22 13:34:54 +01:00
WiFi networks priority (#658)
* WiFi networks priority Fixes https://github.com/esphome/feature-requests/issues/136 * Print priority
This commit is contained in:
parent
6516a6ff7e
commit
1876c21e3e
3 changed files with 60 additions and 1 deletions
|
@ -5,7 +5,7 @@ from esphome.automation import Condition
|
||||||
from esphome.const import CONF_AP, CONF_BSSID, CONF_CHANNEL, CONF_DNS1, CONF_DNS2, CONF_DOMAIN, \
|
from esphome.const import CONF_AP, CONF_BSSID, CONF_CHANNEL, CONF_DNS1, CONF_DNS2, CONF_DOMAIN, \
|
||||||
CONF_FAST_CONNECT, CONF_GATEWAY, CONF_HIDDEN, CONF_ID, CONF_MANUAL_IP, CONF_NETWORKS, \
|
CONF_FAST_CONNECT, CONF_GATEWAY, CONF_HIDDEN, CONF_ID, CONF_MANUAL_IP, CONF_NETWORKS, \
|
||||||
CONF_PASSWORD, CONF_POWER_SAVE_MODE, CONF_REBOOT_TIMEOUT, CONF_SSID, CONF_STATIC_IP, \
|
CONF_PASSWORD, CONF_POWER_SAVE_MODE, CONF_REBOOT_TIMEOUT, CONF_SSID, CONF_STATIC_IP, \
|
||||||
CONF_SUBNET, CONF_USE_ADDRESS
|
CONF_SUBNET, CONF_USE_ADDRESS, CONF_PRIORITY
|
||||||
from esphome.core import CORE, HexInt, coroutine_with_priority
|
from esphome.core import CORE, HexInt, coroutine_with_priority
|
||||||
|
|
||||||
AUTO_LOAD = ['network']
|
AUTO_LOAD = ['network']
|
||||||
|
@ -72,6 +72,7 @@ WIFI_NETWORK_AP = WIFI_NETWORK_BASE.extend({
|
||||||
WIFI_NETWORK_STA = WIFI_NETWORK_BASE.extend({
|
WIFI_NETWORK_STA = WIFI_NETWORK_BASE.extend({
|
||||||
cv.Optional(CONF_BSSID): cv.mac_address,
|
cv.Optional(CONF_BSSID): cv.mac_address,
|
||||||
cv.Optional(CONF_HIDDEN): cv.boolean,
|
cv.Optional(CONF_HIDDEN): cv.boolean,
|
||||||
|
cv.Optional(CONF_PRIORITY, default=0.0): cv.float_,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
@ -161,6 +162,8 @@ def wifi_network(config, static_ip):
|
||||||
cg.add(ap.set_channel(config[CONF_CHANNEL]))
|
cg.add(ap.set_channel(config[CONF_CHANNEL]))
|
||||||
if static_ip is not None:
|
if static_ip is not None:
|
||||||
cg.add(ap.set_manual_ip(manual_ip(static_ip)))
|
cg.add(ap.set_manual_ip(manual_ip(static_ip)))
|
||||||
|
if CONF_PRIORITY in config:
|
||||||
|
cg.add(ap.set_priority(config[CONF_PRIORITY]))
|
||||||
|
|
||||||
return ap
|
return ap
|
||||||
|
|
||||||
|
|
|
@ -273,6 +273,9 @@ void WiFiComponent::print_connect_params_() {
|
||||||
int8_t rssi = WiFi.RSSI();
|
int8_t rssi = WiFi.RSSI();
|
||||||
print_signal_bars(rssi, signal_bars);
|
print_signal_bars(rssi, signal_bars);
|
||||||
ESP_LOGCONFIG(TAG, " Signal strength: %d dB %s", rssi, signal_bars);
|
ESP_LOGCONFIG(TAG, " Signal strength: %d dB %s", rssi, signal_bars);
|
||||||
|
if (this->selected_ap_.get_bssid().has_value()) {
|
||||||
|
ESP_LOGV(TAG, " Priority: %.1f", this->get_sta_priority(*this->selected_ap_.get_bssid()));
|
||||||
|
}
|
||||||
ESP_LOGCONFIG(TAG, " Channel: %d", WiFi.channel());
|
ESP_LOGCONFIG(TAG, " Channel: %d", WiFi.channel());
|
||||||
ESP_LOGCONFIG(TAG, " Subnet: %s", WiFi.subnetMask().toString().c_str());
|
ESP_LOGCONFIG(TAG, " Subnet: %s", WiFi.subnetMask().toString().c_str());
|
||||||
ESP_LOGCONFIG(TAG, " Gateway: %s", WiFi.gatewayIP().toString().c_str());
|
ESP_LOGCONFIG(TAG, " Gateway: %s", WiFi.gatewayIP().toString().c_str());
|
||||||
|
@ -308,6 +311,10 @@ void WiFiComponent::check_scanning_finished() {
|
||||||
for (auto &ap : this->sta_) {
|
for (auto &ap : this->sta_) {
|
||||||
if (res.matches(ap)) {
|
if (res.matches(ap)) {
|
||||||
res.set_matches(true);
|
res.set_matches(true);
|
||||||
|
if (!this->has_sta_priority(res.get_bssid())) {
|
||||||
|
this->set_sta_priority(res.get_bssid(), ap.get_priority());
|
||||||
|
}
|
||||||
|
res.set_priority(this->get_sta_priority(res.get_bssid()));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -315,11 +322,18 @@ void WiFiComponent::check_scanning_finished() {
|
||||||
|
|
||||||
std::stable_sort(this->scan_result_.begin(), this->scan_result_.end(),
|
std::stable_sort(this->scan_result_.begin(), this->scan_result_.end(),
|
||||||
[](const WiFiScanResult &a, const WiFiScanResult &b) {
|
[](const WiFiScanResult &a, const WiFiScanResult &b) {
|
||||||
|
// return true if a is better than b
|
||||||
if (a.get_matches() && !b.get_matches())
|
if (a.get_matches() && !b.get_matches())
|
||||||
return true;
|
return true;
|
||||||
if (!a.get_matches() && b.get_matches())
|
if (!a.get_matches() && b.get_matches())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
if (a.get_matches() && b.get_matches()) {
|
||||||
|
// if both match, check priority
|
||||||
|
if (a.get_priority() != b.get_priority())
|
||||||
|
return a.get_priority() > b.get_priority();
|
||||||
|
}
|
||||||
|
|
||||||
return a.get_rssi() > b.get_rssi();
|
return a.get_rssi() > b.get_rssi();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -443,6 +457,12 @@ void WiFiComponent::check_connecting_finished() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void WiFiComponent::retry_connect() {
|
void WiFiComponent::retry_connect() {
|
||||||
|
if (this->selected_ap_.get_bssid()) {
|
||||||
|
auto bssid = *this->selected_ap_.get_bssid();
|
||||||
|
float priority = this->get_sta_priority(bssid);
|
||||||
|
this->set_sta_priority(bssid, priority - 1.0f);
|
||||||
|
}
|
||||||
|
|
||||||
delay(10);
|
delay(10);
|
||||||
if (!this->is_captive_portal_active_() && (this->num_retried_ > 5 || this->error_from_callback_)) {
|
if (!this->is_captive_portal_active_() && (this->num_retried_ > 5 || this->error_from_callback_)) {
|
||||||
// If retry failed for more than 5 times, let's restart STA
|
// If retry failed for more than 5 times, let's restart STA
|
||||||
|
|
|
@ -66,12 +66,14 @@ class WiFiAP {
|
||||||
void set_bssid(optional<bssid_t> bssid);
|
void set_bssid(optional<bssid_t> bssid);
|
||||||
void set_password(const std::string &password);
|
void set_password(const std::string &password);
|
||||||
void set_channel(optional<uint8_t> channel);
|
void set_channel(optional<uint8_t> channel);
|
||||||
|
void set_priority(float priority) { priority_ = priority; }
|
||||||
void set_manual_ip(optional<ManualIP> manual_ip);
|
void set_manual_ip(optional<ManualIP> manual_ip);
|
||||||
void set_hidden(bool hidden);
|
void set_hidden(bool hidden);
|
||||||
const std::string &get_ssid() const;
|
const std::string &get_ssid() const;
|
||||||
const optional<bssid_t> &get_bssid() const;
|
const optional<bssid_t> &get_bssid() const;
|
||||||
const std::string &get_password() const;
|
const std::string &get_password() const;
|
||||||
const optional<uint8_t> &get_channel() const;
|
const optional<uint8_t> &get_channel() const;
|
||||||
|
float get_priority() const { return priority_; }
|
||||||
const optional<ManualIP> &get_manual_ip() const;
|
const optional<ManualIP> &get_manual_ip() const;
|
||||||
bool get_hidden() const;
|
bool get_hidden() const;
|
||||||
|
|
||||||
|
@ -80,6 +82,7 @@ class WiFiAP {
|
||||||
optional<bssid_t> bssid_;
|
optional<bssid_t> bssid_;
|
||||||
std::string password_;
|
std::string password_;
|
||||||
optional<uint8_t> channel_;
|
optional<uint8_t> channel_;
|
||||||
|
float priority_{0};
|
||||||
optional<ManualIP> manual_ip_;
|
optional<ManualIP> manual_ip_;
|
||||||
bool hidden_{false};
|
bool hidden_{false};
|
||||||
};
|
};
|
||||||
|
@ -99,6 +102,8 @@ class WiFiScanResult {
|
||||||
int8_t get_rssi() const;
|
int8_t get_rssi() const;
|
||||||
bool get_with_auth() const;
|
bool get_with_auth() const;
|
||||||
bool get_is_hidden() const;
|
bool get_is_hidden() const;
|
||||||
|
float get_priority() const { return priority_; }
|
||||||
|
void set_priority(float priority) { priority_ = priority; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool matches_{false};
|
bool matches_{false};
|
||||||
|
@ -108,6 +113,12 @@ class WiFiScanResult {
|
||||||
int8_t rssi_;
|
int8_t rssi_;
|
||||||
bool with_auth_;
|
bool with_auth_;
|
||||||
bool is_hidden_;
|
bool is_hidden_;
|
||||||
|
float priority_{0.0f};
|
||||||
|
};
|
||||||
|
|
||||||
|
struct WiFiSTAPriority {
|
||||||
|
bssid_t bssid;
|
||||||
|
float priority;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum WiFiPowerSaveMode {
|
enum WiFiPowerSaveMode {
|
||||||
|
@ -175,6 +186,30 @@ class WiFiComponent : public Component {
|
||||||
|
|
||||||
IPAddress wifi_soft_ap_ip();
|
IPAddress wifi_soft_ap_ip();
|
||||||
|
|
||||||
|
bool has_sta_priority(const bssid_t &bssid) {
|
||||||
|
for (auto &it : this->sta_priorities_)
|
||||||
|
if (it.bssid == bssid)
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
float get_sta_priority(const bssid_t bssid) {
|
||||||
|
for (auto &it : this->sta_priorities_)
|
||||||
|
if (it.bssid == bssid)
|
||||||
|
return it.priority;
|
||||||
|
return 0.0f;
|
||||||
|
}
|
||||||
|
void set_sta_priority(const bssid_t bssid, float priority) {
|
||||||
|
for (auto &it : this->sta_priorities_)
|
||||||
|
if (it.bssid == bssid) {
|
||||||
|
it.priority = priority;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this->sta_priorities_.push_back(WiFiSTAPriority{
|
||||||
|
.bssid = bssid,
|
||||||
|
.priority = priority,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
static std::string format_mac_addr(const uint8_t mac[6]);
|
static std::string format_mac_addr(const uint8_t mac[6]);
|
||||||
void setup_ap_config_();
|
void setup_ap_config_();
|
||||||
|
@ -209,6 +244,7 @@ class WiFiComponent : public Component {
|
||||||
|
|
||||||
std::string use_address_;
|
std::string use_address_;
|
||||||
std::vector<WiFiAP> sta_;
|
std::vector<WiFiAP> sta_;
|
||||||
|
std::vector<WiFiSTAPriority> sta_priorities_;
|
||||||
WiFiAP selected_ap_;
|
WiFiAP selected_ap_;
|
||||||
bool fast_connect_{false};
|
bool fast_connect_{false};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue