mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-31 07:03:55 +00:00 
			
		
		
		
	| @@ -64,46 +64,46 @@ uint16_t shelly_dimmer_checksum(const uint8_t *buf, int len) { | ||||
|   return std::accumulate<decltype(buf), uint16_t>(buf, buf + len, 0); | ||||
| } | ||||
|  | ||||
| bool ShellyDimmer::is_running_configured_version() const { | ||||
|   return this->version_major_ == USE_SHD_FIRMWARE_MAJOR_VERSION && | ||||
|          this->version_minor_ == USE_SHD_FIRMWARE_MINOR_VERSION; | ||||
| } | ||||
|  | ||||
| void ShellyDimmer::handle_firmware() { | ||||
|   // Reset the STM32 and check the firmware version. | ||||
|   this->reset_normal_boot_(); | ||||
|   this->send_command_(SHELLY_DIMMER_PROTO_CMD_VERSION, nullptr, 0); | ||||
|   ESP_LOGI(TAG, "STM32 current firmware version: %d.%d, desired version: %d.%d", this->version_major_, | ||||
|            this->version_minor_, USE_SHD_FIRMWARE_MAJOR_VERSION, USE_SHD_FIRMWARE_MINOR_VERSION); | ||||
|  | ||||
|   if (!is_running_configured_version()) { | ||||
| #ifdef USE_SHD_FIRMWARE_DATA | ||||
|     if (!this->upgrade_firmware_()) { | ||||
|       ESP_LOGW(TAG, "Failed to upgrade firmware"); | ||||
|       this->mark_failed(); | ||||
|       return; | ||||
|     } | ||||
|  | ||||
|     this->reset_normal_boot_(); | ||||
|     this->send_command_(SHELLY_DIMMER_PROTO_CMD_VERSION, nullptr, 0); | ||||
|     if (!is_running_configured_version()) { | ||||
|       ESP_LOGE(TAG, "STM32 firmware upgrade already performed, but version is still incorrect"); | ||||
|       this->mark_failed(); | ||||
|       return; | ||||
|     } | ||||
| #else | ||||
|     ESP_LOGW(TAG, "Firmware version mismatch, put 'update: true' in the yaml to flash an update."); | ||||
| #endif | ||||
|   } | ||||
| } | ||||
|  | ||||
| void ShellyDimmer::setup() { | ||||
|   this->pin_nrst_->setup(); | ||||
|   this->pin_boot0_->setup(); | ||||
|  | ||||
|   ESP_LOGI(TAG, "Initializing Shelly Dimmer..."); | ||||
|  | ||||
|   // Reset the STM32 and check the firmware version. | ||||
|   for (int i = 0; i < 2; i++) { | ||||
|     this->reset_normal_boot_(); | ||||
|     this->send_command_(SHELLY_DIMMER_PROTO_CMD_VERSION, nullptr, 0); | ||||
|     ESP_LOGI(TAG, "STM32 current firmware version: %d.%d, desired version: %d.%d", this->version_major_, | ||||
|              this->version_minor_, USE_SHD_FIRMWARE_MAJOR_VERSION, USE_SHD_FIRMWARE_MINOR_VERSION); | ||||
|     if (this->version_major_ != USE_SHD_FIRMWARE_MAJOR_VERSION || | ||||
|         this->version_minor_ != USE_SHD_FIRMWARE_MINOR_VERSION) { | ||||
| #ifdef USE_SHD_FIRMWARE_DATA | ||||
|       // Update firmware if needed. | ||||
|       ESP_LOGW(TAG, "Unsupported STM32 firmware version, flashing"); | ||||
|       if (i > 0) { | ||||
|         // Upgrade was already performed but the reported version is still not right. | ||||
|         ESP_LOGE(TAG, "STM32 firmware upgrade already performed, but version is still incorrect"); | ||||
|         this->mark_failed(); | ||||
|         return; | ||||
|       } | ||||
|  | ||||
|       if (!this->upgrade_firmware_()) { | ||||
|         ESP_LOGW(TAG, "Failed to upgrade firmware"); | ||||
|         this->mark_failed(); | ||||
|         return; | ||||
|       } | ||||
|  | ||||
|       // Firmware upgrade completed, do the checks again. | ||||
|       continue; | ||||
| #else | ||||
|       ESP_LOGW(TAG, "Firmware version mismatch, put 'update: true' in the yaml to flash an update."); | ||||
|       this->mark_failed(); | ||||
|       return; | ||||
| #endif | ||||
|     } | ||||
|     break; | ||||
|   } | ||||
|   this->handle_firmware(); | ||||
|  | ||||
|   this->send_settings_(); | ||||
|   // Do an immediate poll to refresh current state. | ||||
|   | ||||
| @@ -20,6 +20,8 @@ class ShellyDimmer : public PollingComponent, public light::LightOutput, public | ||||
|  public: | ||||
|   float get_setup_priority() const override { return setup_priority::LATE; } | ||||
|  | ||||
|   bool is_running_configured_version() const; | ||||
|   void handle_firmware(); | ||||
|   void setup() override; | ||||
|   void update() override; | ||||
|   void dump_config() override; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user