mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-31 15:12:06 +00:00 
			
		
		
		
	Merge branch 'sha256_ota' into memory_api
This commit is contained in:
		
							
								
								
									
										4
									
								
								.github/workflows/codeql.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.github/workflows/codeql.yml
									
									
									
									
										vendored
									
									
								
							| @@ -58,7 +58,7 @@ jobs: | |||||||
|  |  | ||||||
|       # Initializes the CodeQL tools for scanning. |       # Initializes the CodeQL tools for scanning. | ||||||
|       - name: Initialize CodeQL |       - name: Initialize CodeQL | ||||||
|         uses: github/codeql-action/init@192325c86100d080feab897ff886c34abd4c83a3 # v3.30.3 |         uses: github/codeql-action/init@303c0aef88fc2fe5ff6d63d3b1596bfd83dfa1f9 # v3.30.4 | ||||||
|         with: |         with: | ||||||
|           languages: ${{ matrix.language }} |           languages: ${{ matrix.language }} | ||||||
|           build-mode: ${{ matrix.build-mode }} |           build-mode: ${{ matrix.build-mode }} | ||||||
| @@ -86,6 +86,6 @@ jobs: | |||||||
|           exit 1 |           exit 1 | ||||||
|  |  | ||||||
|       - name: Perform CodeQL Analysis |       - name: Perform CodeQL Analysis | ||||||
|         uses: github/codeql-action/analyze@192325c86100d080feab897ff886c34abd4c83a3 # v3.30.3 |         uses: github/codeql-action/analyze@303c0aef88fc2fe5ff6d63d3b1596bfd83dfa1f9 # v3.30.4 | ||||||
|         with: |         with: | ||||||
|           category: "/language:${{matrix.language}}" |           category: "/language:${{matrix.language}}" | ||||||
|   | |||||||
| @@ -15,6 +15,7 @@ | |||||||
| #include "esphome/components/ota/ota_backend_esp_idf.h" | #include "esphome/components/ota/ota_backend_esp_idf.h" | ||||||
| #include "esphome/core/application.h" | #include "esphome/core/application.h" | ||||||
| #include "esphome/core/hal.h" | #include "esphome/core/hal.h" | ||||||
|  | #include "esphome/core/helpers.h" | ||||||
| #include "esphome/core/log.h" | #include "esphome/core/log.h" | ||||||
| #include "esphome/core/util.h" | #include "esphome/core/util.h" | ||||||
|  |  | ||||||
| @@ -528,14 +529,6 @@ void ESPHomeOTAComponent::log_auth_warning_(const LogString *action, const LogSt | |||||||
|   ESP_LOGW(TAG, "Auth: %s %s failed", LOG_STR_ARG(action), LOG_STR_ARG(hash_name)); |   ESP_LOGW(TAG, "Auth: %s %s failed", LOG_STR_ARG(action), LOG_STR_ARG(hash_name)); | ||||||
| } | } | ||||||
|  |  | ||||||
| // Helper to convert uint32 to big-endian bytes |  | ||||||
| static inline void uint32_to_bytes(uint32_t value, uint8_t *bytes) { |  | ||||||
|   bytes[0] = (value >> 24) & 0xFF; |  | ||||||
|   bytes[1] = (value >> 16) & 0xFF; |  | ||||||
|   bytes[2] = (value >> 8) & 0xFF; |  | ||||||
|   bytes[3] = value & 0xFF; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Non-template function definition to reduce binary size | // Non-template function definition to reduce binary size | ||||||
| bool ESPHomeOTAComponent::perform_hash_auth_(HashBase *hasher, const std::string &password, uint8_t auth_request, | bool ESPHomeOTAComponent::perform_hash_auth_(HashBase *hasher, const std::string &password, uint8_t auth_request, | ||||||
|                                              const LogString *name, char *buf) { |                                              const LogString *name, char *buf) { | ||||||
| @@ -553,10 +546,10 @@ bool ESPHomeOTAComponent::perform_hash_auth_(HashBase *hasher, const std::string | |||||||
|  |  | ||||||
|   hasher->init(); |   hasher->init(); | ||||||
|  |  | ||||||
|   // Generate nonce seed bytes |   // Generate nonce seed bytes using random_bytes | ||||||
|   uint32_to_bytes(random_uint32(), nonce_bytes); |   if (!random_bytes(nonce_bytes, nonce_len)) { | ||||||
|   if (nonce_len > 4) { |     this->log_auth_warning_(LOG_STR("Random bytes generation failed"), name); | ||||||
|     uint32_to_bytes(random_uint32(), nonce_bytes + 4); |     return false; | ||||||
|   } |   } | ||||||
|   hasher->add(nonce_bytes, nonce_len); |   hasher->add(nonce_bytes, nonce_len); | ||||||
|   hasher->calculate(); |   hasher->calculate(); | ||||||
|   | |||||||
| @@ -9,8 +9,8 @@ static const char *const TAG = "htu21d"; | |||||||
|  |  | ||||||
| static const uint8_t HTU21D_ADDRESS = 0x40; | static const uint8_t HTU21D_ADDRESS = 0x40; | ||||||
| static const uint8_t HTU21D_REGISTER_RESET = 0xFE; | static const uint8_t HTU21D_REGISTER_RESET = 0xFE; | ||||||
| static const uint8_t HTU21D_REGISTER_TEMPERATURE = 0xF3; | static const uint8_t HTU21D_REGISTER_TEMPERATURE = 0xE3; | ||||||
| static const uint8_t HTU21D_REGISTER_HUMIDITY = 0xF5; | static const uint8_t HTU21D_REGISTER_HUMIDITY = 0xE5; | ||||||
| static const uint8_t HTU21D_WRITERHT_REG_CMD = 0xE6; /**< Write RH/T User Register 1 */ | static const uint8_t HTU21D_WRITERHT_REG_CMD = 0xE6; /**< Write RH/T User Register 1 */ | ||||||
| static const uint8_t HTU21D_REGISTER_STATUS = 0xE7; | static const uint8_t HTU21D_REGISTER_STATUS = 0xE7; | ||||||
| static const uint8_t HTU21D_WRITEHEATER_REG_CMD = 0x51; /**< Write Heater Control Register */ | static const uint8_t HTU21D_WRITEHEATER_REG_CMD = 0x51; /**< Write Heater Control Register */ | ||||||
| @@ -57,7 +57,6 @@ void HTU21DComponent::update() { | |||||||
|  |  | ||||||
|     if (this->temperature_ != nullptr) |     if (this->temperature_ != nullptr) | ||||||
|       this->temperature_->publish_state(temperature); |       this->temperature_->publish_state(temperature); | ||||||
|     this->status_clear_warning(); |  | ||||||
|  |  | ||||||
|     if (this->write(&HTU21D_REGISTER_HUMIDITY, 1) != i2c::ERROR_OK) { |     if (this->write(&HTU21D_REGISTER_HUMIDITY, 1) != i2c::ERROR_OK) { | ||||||
|       this->status_set_warning(); |       this->status_set_warning(); | ||||||
| @@ -79,10 +78,11 @@ void HTU21DComponent::update() { | |||||||
|       if (this->humidity_ != nullptr) |       if (this->humidity_ != nullptr) | ||||||
|         this->humidity_->publish_state(humidity); |         this->humidity_->publish_state(humidity); | ||||||
|  |  | ||||||
|       int8_t heater_level; |       this->status_clear_warning(); | ||||||
|  |  | ||||||
|       // HTU21D does have a heater module but does not have heater level |       // HTU21D does have a heater module but does not have heater level | ||||||
|       // Setting heater level to 1 in case the heater is ON |       // Setting heater level to 1 in case the heater is ON | ||||||
|  |       uint8_t heater_level = 0; | ||||||
|       if (this->sensor_model_ == HTU21D_SENSOR_MODEL_HTU21D) { |       if (this->sensor_model_ == HTU21D_SENSOR_MODEL_HTU21D) { | ||||||
|         if (this->is_heater_enabled()) { |         if (this->is_heater_enabled()) { | ||||||
|           heater_level = 1; |           heater_level = 1; | ||||||
| @@ -97,34 +97,30 @@ void HTU21DComponent::update() { | |||||||
|  |  | ||||||
|       if (this->heater_ != nullptr) |       if (this->heater_ != nullptr) | ||||||
|         this->heater_->publish_state(heater_level); |         this->heater_->publish_state(heater_level); | ||||||
|       this->status_clear_warning(); |  | ||||||
|     }); |     }); | ||||||
|   }); |   }); | ||||||
| } | } | ||||||
|  |  | ||||||
| bool HTU21DComponent::is_heater_enabled() { | bool HTU21DComponent::is_heater_enabled() { | ||||||
|   uint8_t raw_heater; |   uint8_t raw_heater; | ||||||
|   if (this->read_register(HTU21D_REGISTER_STATUS, reinterpret_cast<uint8_t *>(&raw_heater), 2) != i2c::ERROR_OK) { |   if (this->read_register(HTU21D_REGISTER_STATUS, &raw_heater, 1) != i2c::ERROR_OK) { | ||||||
|     this->status_set_warning(); |     this->status_set_warning(); | ||||||
|     return false; |     return false; | ||||||
|   } |   } | ||||||
|   raw_heater = i2c::i2ctohs(raw_heater); |   return (bool) ((raw_heater >> HTU21D_REG_HTRE_BIT) & 0x01); | ||||||
|   return (bool) (((raw_heater) >> (HTU21D_REG_HTRE_BIT)) & 0x01); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| void HTU21DComponent::set_heater(bool status) { | void HTU21DComponent::set_heater(bool status) { | ||||||
|   uint8_t raw_heater; |   uint8_t raw_heater; | ||||||
|   if (this->read_register(HTU21D_REGISTER_STATUS, reinterpret_cast<uint8_t *>(&raw_heater), 2) != i2c::ERROR_OK) { |   if (this->read_register(HTU21D_REGISTER_STATUS, &raw_heater, 1) != i2c::ERROR_OK) { | ||||||
|     this->status_set_warning(); |     this->status_set_warning(); | ||||||
|     return; |     return; | ||||||
|   } |   } | ||||||
|   raw_heater = i2c::i2ctohs(raw_heater); |  | ||||||
|   if (status) { |   if (status) { | ||||||
|     raw_heater |= (1 << (HTU21D_REG_HTRE_BIT)); |     raw_heater |= (1 << HTU21D_REG_HTRE_BIT); | ||||||
|   } else { |   } else { | ||||||
|     raw_heater &= ~(1 << (HTU21D_REG_HTRE_BIT)); |     raw_heater &= ~(1 << HTU21D_REG_HTRE_BIT); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   if (this->write_register(HTU21D_WRITERHT_REG_CMD, &raw_heater, 1) != i2c::ERROR_OK) { |   if (this->write_register(HTU21D_WRITERHT_REG_CMD, &raw_heater, 1) != i2c::ERROR_OK) { | ||||||
|     this->status_set_warning(); |     this->status_set_warning(); | ||||||
|     return; |     return; | ||||||
| @@ -138,14 +134,13 @@ void HTU21DComponent::set_heater_level(uint8_t level) { | |||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
| int8_t HTU21DComponent::get_heater_level() { | uint8_t HTU21DComponent::get_heater_level() { | ||||||
|   int8_t raw_heater; |   uint8_t raw_heater; | ||||||
|   if (this->read_register(HTU21D_READHEATER_REG_CMD, reinterpret_cast<uint8_t *>(&raw_heater), 2) != i2c::ERROR_OK) { |   if (this->read_register(HTU21D_READHEATER_REG_CMD, &raw_heater, 1) != i2c::ERROR_OK) { | ||||||
|     this->status_set_warning(); |     this->status_set_warning(); | ||||||
|     return 0; |     return 0; | ||||||
|   } |   } | ||||||
|   raw_heater = i2c::i2ctohs(raw_heater); |   return raw_heater & 0xF; | ||||||
|   return raw_heater; |  | ||||||
| } | } | ||||||
|  |  | ||||||
| float HTU21DComponent::get_setup_priority() const { return setup_priority::DATA; } | float HTU21DComponent::get_setup_priority() const { return setup_priority::DATA; } | ||||||
|   | |||||||
| @@ -26,7 +26,7 @@ class HTU21DComponent : public PollingComponent, public i2c::I2CDevice { | |||||||
|   bool is_heater_enabled(); |   bool is_heater_enabled(); | ||||||
|   void set_heater(bool status); |   void set_heater(bool status); | ||||||
|   void set_heater_level(uint8_t level); |   void set_heater_level(uint8_t level); | ||||||
|   int8_t get_heater_level(); |   uint8_t get_heater_level(); | ||||||
|  |  | ||||||
|   float get_setup_priority() const override; |   float get_setup_priority() const override; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -123,7 +123,9 @@ | |||||||
| #define USE_ONLINE_IMAGE_PNG_SUPPORT | #define USE_ONLINE_IMAGE_PNG_SUPPORT | ||||||
| #define USE_ONLINE_IMAGE_JPEG_SUPPORT | #define USE_ONLINE_IMAGE_JPEG_SUPPORT | ||||||
| #define USE_OTA | #define USE_OTA | ||||||
|  | #define USE_OTA_MD5 | ||||||
| #define USE_OTA_PASSWORD | #define USE_OTA_PASSWORD | ||||||
|  | #define USE_OTA_SHA256 | ||||||
| #define USE_OTA_STATE_CALLBACK | #define USE_OTA_STATE_CALLBACK | ||||||
| #define USE_OTA_VERSION 2 | #define USE_OTA_VERSION 2 | ||||||
| #define USE_TIME_TIMEZONE | #define USE_TIME_TIMEZONE | ||||||
|   | |||||||
| @@ -283,11 +283,23 @@ class EsphomeCommandWebSocket(tornado.websocket.WebSocketHandler): | |||||||
|     def _stdout_thread(self) -> None: |     def _stdout_thread(self) -> None: | ||||||
|         if not self._use_popen: |         if not self._use_popen: | ||||||
|             return |             return | ||||||
|  |         line = b"" | ||||||
|  |         cr = False | ||||||
|         while True: |         while True: | ||||||
|             data = self._proc.stdout.readline() |             data = self._proc.stdout.read(1) | ||||||
|             if data: |             if data: | ||||||
|                 data = data.replace(b"\r", b"") |                 if data == b"\r": | ||||||
|                 self._queue.put_nowait(data) |                     cr = True | ||||||
|  |                 elif data == b"\n": | ||||||
|  |                     self._queue.put_nowait(line + b"\n") | ||||||
|  |                     line = b"" | ||||||
|  |                     cr = False | ||||||
|  |                 elif cr: | ||||||
|  |                     self._queue.put_nowait(line + b"\r") | ||||||
|  |                     line = data | ||||||
|  |                     cr = False | ||||||
|  |                 else: | ||||||
|  |                     line += data | ||||||
|             if self._proc.poll() is not None: |             if self._proc.poll() is not None: | ||||||
|                 break |                 break | ||||||
|         self._proc.wait(1.0) |         self._proc.wait(1.0) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user