mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-31 07:03:55 +00:00 
			
		
		
		
	Improv_serial scan and send wifi networks list (#3116)
This commit is contained in:
		| @@ -56,7 +56,7 @@ async def to_code(config): | ||||
|     cg.add(ble_server.register_service_component(var)) | ||||
|  | ||||
|     cg.add_define("USE_IMPROV") | ||||
|     cg.add_library("esphome/Improv", "1.1.0") | ||||
|     cg.add_library("esphome/Improv", "1.2.0") | ||||
|  | ||||
|     cg.add(var.set_identify_duration(config[CONF_IDENTIFY_DURATION])) | ||||
|     cg.add(var.set_authorized_duration(config[CONF_AUTHORIZED_DURATION])) | ||||
|   | ||||
| @@ -30,4 +30,4 @@ FINAL_VALIDATE_SCHEMA = validate_logger_baud_rate | ||||
| async def to_code(config): | ||||
|     var = cg.new_Pvariable(config[CONF_ID]) | ||||
|     await cg.register_component(var, config) | ||||
|     cg.add_library("esphome/Improv", "1.1.0") | ||||
|     cg.add_library("esphome/Improv", "1.2.0") | ||||
|   | ||||
| @@ -24,6 +24,8 @@ void ImprovSerialComponent::setup() { | ||||
|  | ||||
|   if (wifi::global_wifi_component->has_sta()) { | ||||
|     this->state_ = improv::STATE_PROVISIONED; | ||||
|   } else { | ||||
|     wifi::global_wifi_component->start_scanning(); | ||||
|   } | ||||
| } | ||||
|  | ||||
| @@ -152,6 +154,27 @@ bool ImprovSerialComponent::parse_improv_payload_(improv::ImprovCommand &command | ||||
|       this->send_response_(info); | ||||
|       return true; | ||||
|     } | ||||
|     case improv::GET_WIFI_NETWORKS: { | ||||
|       std::vector<std::string> networks; | ||||
|       auto results = wifi::global_wifi_component->get_scan_result(); | ||||
|       for (auto &scan : results) { | ||||
|         if (scan.get_is_hidden()) | ||||
|           continue; | ||||
|         const std::string &ssid = scan.get_ssid(); | ||||
|         if (std::find(networks.begin(), networks.end(), ssid) != networks.end()) | ||||
|           continue; | ||||
|         // Send each ssid separately to avoid overflowing the buffer | ||||
|         std::vector<uint8_t> data = improv::build_rpc_response( | ||||
|             improv::GET_WIFI_NETWORKS, {ssid, str_sprintf("%d", scan.get_rssi()), YESNO(scan.get_with_auth())}, false); | ||||
|         this->send_response_(data); | ||||
|         networks.push_back(ssid); | ||||
|       } | ||||
|       // Send empty response to signify the end of the list. | ||||
|       std::vector<uint8_t> data = | ||||
|           improv::build_rpc_response(improv::GET_WIFI_NETWORKS, std::vector<std::string>{}, false); | ||||
|       this->send_response_(data); | ||||
|       return true; | ||||
|     } | ||||
|     default: { | ||||
|       ESP_LOGW(TAG, "Unknown Improv payload"); | ||||
|       this->set_error_(improv::ERROR_UNKNOWN_RPC); | ||||
|   | ||||
| @@ -32,7 +32,7 @@ class ImprovSerialComponent : public Component { | ||||
|   void loop() override; | ||||
|   void dump_config() override; | ||||
|  | ||||
|   float get_setup_priority() const override { return setup_priority::HARDWARE; } | ||||
|   float get_setup_priority() const override { return setup_priority::AFTER_WIFI; } | ||||
|  | ||||
|  protected: | ||||
|   bool parse_improv_serial_byte_(uint8_t byte); | ||||
|   | ||||
| @@ -35,7 +35,7 @@ build_flags = | ||||
| lib_deps = | ||||
|     esphome/noise-c@0.1.4                  ; api | ||||
|     makuna/NeoPixelBus@2.6.9               ; neopixelbus | ||||
|     esphome/Improv@1.1.0                   ; improv_serial / esp32_improv | ||||
|     esphome/Improv@1.2.0                   ; improv_serial / esp32_improv | ||||
|     bblanchon/ArduinoJson@6.18.5           ; json | ||||
|     wjtje/qr-code-generator-library@1.7.0  ; qr_code | ||||
| build_flags = | ||||
|   | ||||
		Reference in New Issue
	
	Block a user