esphome 2024.11.0b4__py3-none-any.whl → 2024.11.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. esphome/components/binary_sensor/binary_sensor.h +1 -1
  2. esphome/components/esphome/ota/__init__.py +4 -4
  3. esphome/components/honeywellabp2_i2c/honeywellabp2.cpp +6 -5
  4. esphome/components/http_request/http_request.h +1 -1
  5. esphome/components/lvgl/__init__.py +1 -1
  6. esphome/components/lvgl/lv_validation.py +2 -1
  7. esphome/components/lvgl/schemas.py +1 -0
  8. esphome/components/lvgl/widgets/line.py +4 -1
  9. esphome/components/matrix_keypad/binary_sensor/matrix_keypad_binary_sensor.h +1 -1
  10. esphome/components/modbus/modbus.cpp +2 -1
  11. esphome/components/modbus_controller/__init__.py +1 -1
  12. esphome/components/modbus_controller/modbus_controller.cpp +54 -18
  13. esphome/components/ota/__init__.py +1 -0
  14. esphome/components/qspi_dbi/models.py +3 -0
  15. esphome/components/qspi_dbi/qspi_dbi.cpp +0 -1
  16. esphome/components/rtttl/rtttl.h +1 -7
  17. esphome/components/speaker/__init__.py +1 -0
  18. esphome/components/status/binary_sensor.py +2 -0
  19. esphome/components/wifi/wifi_component_esp32_arduino.cpp +20 -4
  20. esphome/components/wifi/wifi_component_esp8266.cpp +20 -4
  21. esphome/components/wifi/wifi_component_esp_idf.cpp +20 -4
  22. esphome/const.py +1 -1
  23. esphome/core/config.py +3 -0
  24. esphome/dashboard/core.py +1 -1
  25. esphome/dashboard/web_server.py +3 -2
  26. {esphome-2024.11.0b4.dist-info → esphome-2024.11.2.dist-info}/METADATA +1 -1
  27. {esphome-2024.11.0b4.dist-info → esphome-2024.11.2.dist-info}/RECORD +31 -31
  28. {esphome-2024.11.0b4.dist-info → esphome-2024.11.2.dist-info}/LICENSE +0 -0
  29. {esphome-2024.11.0b4.dist-info → esphome-2024.11.2.dist-info}/WHEEL +0 -0
  30. {esphome-2024.11.0b4.dist-info → esphome-2024.11.2.dist-info}/entry_points.txt +0 -0
  31. {esphome-2024.11.0b4.dist-info → esphome-2024.11.2.dist-info}/top_level.txt +0 -0
@@ -58,7 +58,7 @@ class BinarySensor : public EntityBase, public EntityBase_DeviceClass {
58
58
  void publish_initial_state(bool state);
59
59
 
60
60
  /// The current reported state of the binary sensor.
61
- bool state;
61
+ bool state{false};
62
62
 
63
63
  void add_filter(Filter *filter);
64
64
  void add_filters(const std::vector<Filter *> &filters);
@@ -1,10 +1,9 @@
1
1
  import logging
2
2
 
3
3
  import esphome.codegen as cg
4
- import esphome.config_validation as cv
5
- import esphome.final_validate as fv
6
- from esphome.components.ota import BASE_OTA_SCHEMA, ota_to_code, OTAComponent
4
+ from esphome.components.ota import BASE_OTA_SCHEMA, OTAComponent, ota_to_code
7
5
  from esphome.config_helpers import merge_config
6
+ import esphome.config_validation as cv
8
7
  from esphome.const import (
9
8
  CONF_ESPHOME,
10
9
  CONF_ID,
@@ -18,6 +17,7 @@ from esphome.const import (
18
17
  CONF_VERSION,
19
18
  )
20
19
  from esphome.core import coroutine_with_priority
20
+ import esphome.final_validate as fv
21
21
 
22
22
  _LOGGER = logging.getLogger(__name__)
23
23
 
@@ -124,7 +124,6 @@ FINAL_VALIDATE_SCHEMA = ota_esphome_final_validate
124
124
  @coroutine_with_priority(52.0)
125
125
  async def to_code(config):
126
126
  var = cg.new_Pvariable(config[CONF_ID])
127
- await ota_to_code(var, config)
128
127
  cg.add(var.set_port(config[CONF_PORT]))
129
128
  if CONF_PASSWORD in config:
130
129
  cg.add(var.set_auth_password(config[CONF_PASSWORD]))
@@ -132,3 +131,4 @@ async def to_code(config):
132
131
  cg.add_define("USE_OTA_VERSION", config[CONF_VERSION])
133
132
 
134
133
  await cg.register_component(var, config)
134
+ await ota_to_code(var, config)
@@ -15,7 +15,7 @@ static const char *const TAG = "honeywellabp2";
15
15
  void HONEYWELLABP2Sensor::read_sensor_data() {
16
16
  if (this->read(raw_data_, 7) != i2c::ERROR_OK) {
17
17
  ESP_LOGE(TAG, "Communication with ABP2 failed!");
18
- this->mark_failed();
18
+ this->status_set_warning("couldn't read sensor data");
19
19
  return;
20
20
  }
21
21
  float press_counts = encode_uint24(raw_data_[1], raw_data_[2], raw_data_[3]); // calculate digital pressure counts
@@ -25,12 +25,13 @@ void HONEYWELLABP2Sensor::read_sensor_data() {
25
25
  (this->max_pressure_ - this->min_pressure_)) +
26
26
  this->min_pressure_;
27
27
  this->last_temperature_ = (temp_counts * 200 / 16777215) - 50;
28
+ this->status_clear_warning();
28
29
  }
29
30
 
30
31
  void HONEYWELLABP2Sensor::start_measurement() {
31
32
  if (this->write(i2c_cmd_, 3) != i2c::ERROR_OK) {
32
33
  ESP_LOGE(TAG, "Communication with ABP2 failed!");
33
- this->mark_failed();
34
+ this->status_set_warning("couldn't start measurement");
34
35
  return;
35
36
  }
36
37
  this->measurement_running_ = true;
@@ -39,7 +40,7 @@ void HONEYWELLABP2Sensor::start_measurement() {
39
40
  bool HONEYWELLABP2Sensor::is_measurement_ready() {
40
41
  if (this->read(raw_data_, 1) != i2c::ERROR_OK) {
41
42
  ESP_LOGE(TAG, "Communication with ABP2 failed!");
42
- this->mark_failed();
43
+ this->status_set_warning("couldn't check measurement");
43
44
  return false;
44
45
  }
45
46
  if ((raw_data_[0] & (0x1 << STATUS_BIT_BUSY)) > 0) {
@@ -52,7 +53,7 @@ bool HONEYWELLABP2Sensor::is_measurement_ready() {
52
53
  void HONEYWELLABP2Sensor::measurement_timeout() {
53
54
  ESP_LOGE(TAG, "Timeout!");
54
55
  this->measurement_running_ = false;
55
- this->mark_failed();
56
+ this->status_set_warning("measurement timed out");
56
57
  }
57
58
 
58
59
  float HONEYWELLABP2Sensor::get_pressure() { return this->last_pressure_; }
@@ -79,7 +80,7 @@ void HONEYWELLABP2Sensor::update() {
79
80
  ESP_LOGV(TAG, "Update Honeywell ABP2 Sensor");
80
81
 
81
82
  this->start_measurement();
82
- this->set_timeout("meas_timeout", 50, [this] { this->measurement_timeout(); });
83
+ this->set_timeout("meas_timeout", 100, [this] { this->measurement_timeout(); });
83
84
  }
84
85
 
85
86
  void HONEYWELLABP2Sensor::dump_config() {
@@ -189,7 +189,7 @@ template<typename... Ts> class HttpRequestSendAction : public Action<Ts...> {
189
189
 
190
190
  if (container == nullptr) {
191
191
  for (auto *trigger : this->error_triggers_)
192
- trigger->trigger(x...);
192
+ trigger->trigger();
193
193
  return;
194
194
  }
195
195
 
@@ -322,8 +322,8 @@ async def to_code(configs):
322
322
  await encoders_to_code(lv_component, config, default_group)
323
323
  await keypads_to_code(lv_component, config, default_group)
324
324
  await theme_to_code(config)
325
- await styles_to_code(config)
326
325
  await gradients_to_code(config)
326
+ await styles_to_code(config)
327
327
  await set_obj_properties(lv_scr_act, config)
328
328
  await add_widgets(lv_scr_act, config)
329
329
  await add_pages(lv_component, config)
@@ -30,7 +30,7 @@ from .defines import (
30
30
  call_lambda,
31
31
  literal,
32
32
  )
33
- from .helpers import esphome_fonts_used, lv_fonts_used, requires_component
33
+ from .helpers import add_lv_use, esphome_fonts_used, lv_fonts_used, requires_component
34
34
  from .types import lv_font_t, lv_gradient_t, lv_img_t
35
35
 
36
36
  opacity_consts = LvConstant("LV_OPA_", "TRANSP", "COVER")
@@ -326,6 +326,7 @@ def image_validator(value):
326
326
  value = requires_component("image")(value)
327
327
  value = cv.use_id(Image_)(value)
328
328
  lv_images_used.add(value)
329
+ add_lv_use("img", "label")
329
330
  return value
330
331
 
331
332
 
@@ -341,6 +341,7 @@ FLEX_OBJ_SCHEMA = {
341
341
  cv.Optional(df.CONF_FLEX_GROW): cv.int_,
342
342
  }
343
343
 
344
+
344
345
  DISP_BG_SCHEMA = cv.Schema(
345
346
  {
346
347
  cv.Optional(df.CONF_DISP_BG_IMAGE): lv_image,
@@ -39,7 +39,10 @@ LINE_SCHEMA = {
39
39
  class LineType(WidgetType):
40
40
  def __init__(self):
41
41
  super().__init__(
42
- CONF_LINE, LvType("lv_line_t"), (CONF_MAIN,), LINE_SCHEMA, modify_schema={}
42
+ CONF_LINE,
43
+ LvType("lv_line_t"),
44
+ (CONF_MAIN,),
45
+ LINE_SCHEMA,
43
46
  )
44
47
 
45
48
  async def to_code(self, w: Widget, config):
@@ -6,7 +6,7 @@
6
6
  namespace esphome {
7
7
  namespace matrix_keypad {
8
8
 
9
- class MatrixKeypadBinarySensor : public MatrixKeypadListener, public binary_sensor::BinarySensor {
9
+ class MatrixKeypadBinarySensor : public MatrixKeypadListener, public binary_sensor::BinarySensorInitiallyOff {
10
10
  public:
11
11
  MatrixKeypadBinarySensor(uint8_t key) : has_key_(true), key_(key){};
12
12
  MatrixKeypadBinarySensor(const char *key) : has_key_(true), key_((uint8_t) key[0]){};
@@ -38,8 +38,9 @@ void Modbus::loop() {
38
38
 
39
39
  // stop blocking new send commands after sent_wait_time_ ms after response received
40
40
  if (now - this->last_send_ > send_wait_time_) {
41
- if (waiting_for_response > 0)
41
+ if (waiting_for_response > 0) {
42
42
  ESP_LOGV(TAG, "Stop waiting for response from %d", waiting_for_response);
43
+ }
43
44
  waiting_for_response = 0;
44
45
  }
45
46
  }
@@ -163,7 +163,7 @@ CONFIG_SCHEMA = cv.All(
163
163
  ),
164
164
  cv.Optional(CONF_ON_OFFLINE): automation.validate_automation(
165
165
  {
166
- cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(ModbusOnlineTrigger),
166
+ cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(ModbusOfflineTrigger),
167
167
  }
168
168
  ),
169
169
  }
@@ -622,51 +622,87 @@ int64_t payload_to_number(const std::vector<uint8_t> &data, SensorValueType sens
622
622
  uint32_t bitmask) {
623
623
  int64_t value = 0; // int64_t because it can hold signed and unsigned 32 bits
624
624
 
625
+ size_t size = data.size() - offset;
626
+ bool error = false;
625
627
  switch (sensor_value_type) {
626
628
  case SensorValueType::U_WORD:
627
- value = mask_and_shift_by_rightbit(get_data<uint16_t>(data, offset), bitmask); // default is 0xFFFF ;
629
+ if (size >= 2) {
630
+ value = mask_and_shift_by_rightbit(get_data<uint16_t>(data, offset), bitmask); // default is 0xFFFF ;
631
+ } else {
632
+ error = true;
633
+ }
628
634
  break;
629
635
  case SensorValueType::U_DWORD:
630
636
  case SensorValueType::FP32:
631
- value = get_data<uint32_t>(data, offset);
632
- value = mask_and_shift_by_rightbit((uint32_t) value, bitmask);
637
+ if (size >= 4) {
638
+ value = get_data<uint32_t>(data, offset);
639
+ value = mask_and_shift_by_rightbit((uint32_t) value, bitmask);
640
+ } else {
641
+ error = true;
642
+ }
633
643
  break;
634
644
  case SensorValueType::U_DWORD_R:
635
645
  case SensorValueType::FP32_R:
636
- value = get_data<uint32_t>(data, offset);
637
- value = static_cast<uint32_t>(value & 0xFFFF) << 16 | (value & 0xFFFF0000) >> 16;
638
- value = mask_and_shift_by_rightbit((uint32_t) value, bitmask);
646
+ if (size >= 4) {
647
+ value = get_data<uint32_t>(data, offset);
648
+ value = static_cast<uint32_t>(value & 0xFFFF) << 16 | (value & 0xFFFF0000) >> 16;
649
+ value = mask_and_shift_by_rightbit((uint32_t) value, bitmask);
650
+ } else {
651
+ error = true;
652
+ }
639
653
  break;
640
654
  case SensorValueType::S_WORD:
641
- value = mask_and_shift_by_rightbit(get_data<int16_t>(data, offset),
642
- bitmask); // default is 0xFFFF ;
655
+ if (size >= 2) {
656
+ value = mask_and_shift_by_rightbit(get_data<int16_t>(data, offset),
657
+ bitmask); // default is 0xFFFF ;
658
+ } else {
659
+ error = true;
660
+ }
643
661
  break;
644
662
  case SensorValueType::S_DWORD:
645
- value = mask_and_shift_by_rightbit(get_data<int32_t>(data, offset), bitmask);
663
+ if (size >= 4) {
664
+ value = mask_and_shift_by_rightbit(get_data<int32_t>(data, offset), bitmask);
665
+ } else {
666
+ error = true;
667
+ }
646
668
  break;
647
669
  case SensorValueType::S_DWORD_R: {
648
- value = get_data<uint32_t>(data, offset);
649
- // Currently the high word is at the low position
650
- // the sign bit is therefore at low before the switch
651
- uint32_t sign_bit = (value & 0x8000) << 16;
652
- value = mask_and_shift_by_rightbit(
653
- static_cast<int32_t>(((value & 0x7FFF) << 16 | (value & 0xFFFF0000) >> 16) | sign_bit), bitmask);
670
+ if (size >= 4) {
671
+ value = get_data<uint32_t>(data, offset);
672
+ // Currently the high word is at the low position
673
+ // the sign bit is therefore at low before the switch
674
+ uint32_t sign_bit = (value & 0x8000) << 16;
675
+ value = mask_and_shift_by_rightbit(
676
+ static_cast<int32_t>(((value & 0x7FFF) << 16 | (value & 0xFFFF0000) >> 16) | sign_bit), bitmask);
677
+ } else {
678
+ error = true;
679
+ }
654
680
  } break;
655
681
  case SensorValueType::U_QWORD:
656
682
  case SensorValueType::S_QWORD:
657
683
  // Ignore bitmask for QWORD
658
- value = get_data<uint64_t>(data, offset);
684
+ if (size >= 8) {
685
+ value = get_data<uint64_t>(data, offset);
686
+ } else {
687
+ error = true;
688
+ }
659
689
  break;
660
690
  case SensorValueType::U_QWORD_R:
661
691
  case SensorValueType::S_QWORD_R: {
662
692
  // Ignore bitmask for QWORD
663
- uint64_t tmp = get_data<uint64_t>(data, offset);
664
- value = (tmp << 48) | (tmp >> 48) | ((tmp & 0xFFFF0000) << 16) | ((tmp >> 16) & 0xFFFF0000);
693
+ if (size >= 8) {
694
+ uint64_t tmp = get_data<uint64_t>(data, offset);
695
+ value = (tmp << 48) | (tmp >> 48) | ((tmp & 0xFFFF0000) << 16) | ((tmp >> 16) & 0xFFFF0000);
696
+ } else {
697
+ error = true;
698
+ }
665
699
  } break;
666
700
  case SensorValueType::RAW:
667
701
  default:
668
702
  break;
669
703
  }
704
+ if (error)
705
+ ESP_LOGE(TAG, "not enough data for value");
670
706
  return value;
671
707
  }
672
708
 
@@ -92,6 +92,7 @@ async def to_code(config):
92
92
 
93
93
 
94
94
  async def ota_to_code(var, config):
95
+ await cg.past_safe_mode()
95
96
  use_state_callback = False
96
97
  for conf in config.get(CONF_ON_STATE_CHANGE, []):
97
98
  trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], var)
@@ -1,6 +1,7 @@
1
1
  # Commands
2
2
  SW_RESET_CMD = 0x01
3
3
  SLEEP_OUT = 0x11
4
+ NORON = 0x13
4
5
  INVERT_OFF = 0x20
5
6
  INVERT_ON = 0x21
6
7
  ALL_ON = 0x23
@@ -55,6 +56,8 @@ chip.cmd(PAGESEL, 0x00)
55
56
  chip.cmd(0xC2, 0x00)
56
57
  chip.delay(10)
57
58
  chip.cmd(TEON, 0x00)
59
+ chip.cmd(PIXFMT, 0x55)
60
+ chip.cmd(NORON)
58
61
 
59
62
  chip = DriverChip("AXS15231")
60
63
  chip.cmd(0xBB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xA5)
@@ -111,7 +111,6 @@ void QspiDbi::reset_params_(bool ready) {
111
111
  mad |= MADCTL_MY;
112
112
  this->write_command_(MADCTL_CMD, mad);
113
113
  this->write_command_(BRIGHTNESS, this->brightness_);
114
- this->write_command_(NORON);
115
114
  this->write_command_(DISPLAY_ON);
116
115
  }
117
116
 
@@ -40,13 +40,7 @@ class Rtttl : public Component {
40
40
  void set_speaker(speaker::Speaker *speaker) { this->speaker_ = speaker; }
41
41
  #endif
42
42
  float get_gain() { return gain_; }
43
- void set_gain(float gain) {
44
- if (gain < 0.1f)
45
- gain = 0.1f;
46
- if (gain > 1.0f)
47
- gain = 1.0f;
48
- this->gain_ = gain;
49
- }
43
+ void set_gain(float gain) { this->gain_ = clamp(gain, 0.0f, 1.0f); }
50
44
  void play(std::string rtttl);
51
45
  void stop();
52
46
  void dump_config() override;
@@ -7,6 +7,7 @@ from esphome.const import CONF_DATA, CONF_ID, CONF_VOLUME
7
7
  from esphome.core import CORE
8
8
  from esphome.coroutine import coroutine_with_priority
9
9
 
10
+ AUTO_LOAD = ["audio"]
10
11
  CODEOWNERS = ["@jesserockz", "@kahrendt"]
11
12
 
12
13
  IS_PLATFORM_COMPONENT = True
@@ -6,6 +6,8 @@ from esphome.const import (
6
6
  ENTITY_CATEGORY_DIAGNOSTIC,
7
7
  )
8
8
 
9
+ DEPENDENCIES = ["network"]
10
+
9
11
  status_ns = cg.esphome_ns.namespace("status")
10
12
  StatusBinarySensor = status_ns.class_(
11
13
  "StatusBinarySensor", binary_sensor.BinarySensor, cg.Component
@@ -137,8 +137,16 @@ bool WiFiComponent::wifi_sta_connect_(const WiFiAP &ap) {
137
137
  // https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/network/esp_wifi.html#_CPPv417wifi_sta_config_t
138
138
  wifi_config_t conf;
139
139
  memset(&conf, 0, sizeof(conf));
140
- snprintf(reinterpret_cast<char *>(conf.sta.ssid), sizeof(conf.sta.ssid), "%s", ap.get_ssid().c_str());
141
- snprintf(reinterpret_cast<char *>(conf.sta.password), sizeof(conf.sta.password), "%s", ap.get_password().c_str());
140
+ if (ap.get_ssid().size() > sizeof(conf.sta.ssid)) {
141
+ ESP_LOGE(TAG, "SSID is too long");
142
+ return false;
143
+ }
144
+ if (ap.get_password().size() > sizeof(conf.sta.password)) {
145
+ ESP_LOGE(TAG, "password is too long");
146
+ return false;
147
+ }
148
+ memcpy(reinterpret_cast<char *>(conf.sta.ssid), ap.get_ssid().c_str(), ap.get_ssid().size());
149
+ memcpy(reinterpret_cast<char *>(conf.sta.password), ap.get_password().c_str(), ap.get_password().size());
142
150
 
143
151
  // The weakest authmode to accept in the fast scan mode
144
152
  if (ap.get_password().empty()) {
@@ -746,7 +754,11 @@ bool WiFiComponent::wifi_start_ap_(const WiFiAP &ap) {
746
754
 
747
755
  wifi_config_t conf;
748
756
  memset(&conf, 0, sizeof(conf));
749
- snprintf(reinterpret_cast<char *>(conf.ap.ssid), sizeof(conf.ap.ssid), "%s", ap.get_ssid().c_str());
757
+ if (ap.get_ssid().size() > sizeof(conf.ap.ssid)) {
758
+ ESP_LOGE(TAG, "AP SSID is too long");
759
+ return false;
760
+ }
761
+ memcpy(reinterpret_cast<char *>(conf.ap.ssid), ap.get_ssid().c_str(), ap.get_ssid().size());
750
762
  conf.ap.channel = ap.get_channel().value_or(1);
751
763
  conf.ap.ssid_hidden = ap.get_ssid().size();
752
764
  conf.ap.max_connection = 5;
@@ -757,7 +769,11 @@ bool WiFiComponent::wifi_start_ap_(const WiFiAP &ap) {
757
769
  *conf.ap.password = 0;
758
770
  } else {
759
771
  conf.ap.authmode = WIFI_AUTH_WPA2_PSK;
760
- snprintf(reinterpret_cast<char *>(conf.ap.password), sizeof(conf.ap.password), "%s", ap.get_password().c_str());
772
+ if (ap.get_password().size() > sizeof(conf.ap.password)) {
773
+ ESP_LOGE(TAG, "AP password is too long");
774
+ return false;
775
+ }
776
+ memcpy(reinterpret_cast<char *>(conf.ap.password), ap.get_password().c_str(), ap.get_password().size());
761
777
  }
762
778
 
763
779
  // pairwise cipher of SoftAP, group cipher will be derived using this.
@@ -236,8 +236,16 @@ bool WiFiComponent::wifi_sta_connect_(const WiFiAP &ap) {
236
236
 
237
237
  struct station_config conf {};
238
238
  memset(&conf, 0, sizeof(conf));
239
- snprintf(reinterpret_cast<char *>(conf.ssid), sizeof(conf.ssid), "%s", ap.get_ssid().c_str());
240
- snprintf(reinterpret_cast<char *>(conf.password), sizeof(conf.password), "%s", ap.get_password().c_str());
239
+ if (ap.get_ssid().size() > sizeof(conf.ssid)) {
240
+ ESP_LOGE(TAG, "SSID is too long");
241
+ return false;
242
+ }
243
+ if (ap.get_password().size() > sizeof(conf.password)) {
244
+ ESP_LOGE(TAG, "password is too long");
245
+ return false;
246
+ }
247
+ memcpy(reinterpret_cast<char *>(conf.ssid), ap.get_ssid().c_str(), ap.get_ssid().size());
248
+ memcpy(reinterpret_cast<char *>(conf.password), ap.get_password().c_str(), ap.get_password().size());
241
249
 
242
250
  if (ap.get_bssid().has_value()) {
243
251
  conf.bssid_set = 1;
@@ -775,7 +783,11 @@ bool WiFiComponent::wifi_start_ap_(const WiFiAP &ap) {
775
783
  return false;
776
784
 
777
785
  struct softap_config conf {};
778
- snprintf(reinterpret_cast<char *>(conf.ssid), sizeof(conf.ssid), "%s", ap.get_ssid().c_str());
786
+ if (ap.get_ssid().size() > sizeof(conf.ssid)) {
787
+ ESP_LOGE(TAG, "AP SSID is too long");
788
+ return false;
789
+ }
790
+ memcpy(reinterpret_cast<char *>(conf.ssid), ap.get_ssid().c_str(), ap.get_ssid().size());
779
791
  conf.ssid_len = static_cast<uint8>(ap.get_ssid().size());
780
792
  conf.channel = ap.get_channel().value_or(1);
781
793
  conf.ssid_hidden = ap.get_hidden();
@@ -787,7 +799,11 @@ bool WiFiComponent::wifi_start_ap_(const WiFiAP &ap) {
787
799
  *conf.password = 0;
788
800
  } else {
789
801
  conf.authmode = AUTH_WPA2_PSK;
790
- snprintf(reinterpret_cast<char *>(conf.password), sizeof(conf.password), "%s", ap.get_password().c_str());
802
+ if (ap.get_password().size() > sizeof(conf.password)) {
803
+ ESP_LOGE(TAG, "AP password is too long");
804
+ return false;
805
+ }
806
+ memcpy(reinterpret_cast<char *>(conf.password), ap.get_password().c_str(), ap.get_password().size());
791
807
  }
792
808
 
793
809
  ETS_UART_INTR_DISABLE();
@@ -289,8 +289,16 @@ bool WiFiComponent::wifi_sta_connect_(const WiFiAP &ap) {
289
289
  // https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/network/esp_wifi.html#_CPPv417wifi_sta_config_t
290
290
  wifi_config_t conf;
291
291
  memset(&conf, 0, sizeof(conf));
292
- snprintf(reinterpret_cast<char *>(conf.sta.ssid), sizeof(conf.sta.ssid), "%s", ap.get_ssid().c_str());
293
- snprintf(reinterpret_cast<char *>(conf.sta.password), sizeof(conf.sta.password), "%s", ap.get_password().c_str());
292
+ if (ap.get_ssid().size() > sizeof(conf.sta.ssid)) {
293
+ ESP_LOGE(TAG, "SSID is too long");
294
+ return false;
295
+ }
296
+ if (ap.get_password().size() > sizeof(conf.sta.password)) {
297
+ ESP_LOGE(TAG, "password is too long");
298
+ return false;
299
+ }
300
+ memcpy(reinterpret_cast<char *>(conf.sta.ssid), ap.get_ssid().c_str(), ap.get_ssid().size());
301
+ memcpy(reinterpret_cast<char *>(conf.sta.password), ap.get_password().c_str(), ap.get_password().size());
294
302
 
295
303
  // The weakest authmode to accept in the fast scan mode
296
304
  if (ap.get_password().empty()) {
@@ -902,7 +910,11 @@ bool WiFiComponent::wifi_start_ap_(const WiFiAP &ap) {
902
910
 
903
911
  wifi_config_t conf;
904
912
  memset(&conf, 0, sizeof(conf));
905
- strncpy(reinterpret_cast<char *>(conf.ap.ssid), ap.get_ssid().c_str(), sizeof(conf.ap.ssid));
913
+ if (ap.get_ssid().size() > sizeof(conf.ap.ssid)) {
914
+ ESP_LOGE(TAG, "AP SSID is too long");
915
+ return false;
916
+ }
917
+ memcpy(reinterpret_cast<char *>(conf.ap.ssid), ap.get_ssid().c_str(), ap.get_ssid().size());
906
918
  conf.ap.channel = ap.get_channel().value_or(1);
907
919
  conf.ap.ssid_hidden = ap.get_ssid().size();
908
920
  conf.ap.max_connection = 5;
@@ -913,7 +925,11 @@ bool WiFiComponent::wifi_start_ap_(const WiFiAP &ap) {
913
925
  *conf.ap.password = 0;
914
926
  } else {
915
927
  conf.ap.authmode = WIFI_AUTH_WPA2_PSK;
916
- strncpy(reinterpret_cast<char *>(conf.ap.password), ap.get_password().c_str(), sizeof(conf.ap.password));
928
+ if (ap.get_password().size() > sizeof(conf.ap.password)) {
929
+ ESP_LOGE(TAG, "AP password is too long");
930
+ return false;
931
+ }
932
+ memcpy(reinterpret_cast<char *>(conf.ap.password), ap.get_password().c_str(), ap.get_password().size());
917
933
  }
918
934
 
919
935
  // pairwise cipher of SoftAP, group cipher will be derived using this.
esphome/const.py CHANGED
@@ -1,6 +1,6 @@
1
1
  """Constants used by esphome."""
2
2
 
3
- __version__ = "2024.11.0b4"
3
+ __version__ = "2024.11.2"
4
4
 
5
5
  ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_"
6
6
  VALID_SUBSTITUTIONS_CHARACTERS = (
esphome/core/config.py CHANGED
@@ -184,6 +184,9 @@ PRELOAD_CONFIG_SCHEMA = cv.Schema(
184
184
  cv.Optional(CONF_ESP8266_RESTORE_FROM_FLASH): cv.valid,
185
185
  cv.Optional(CONF_BOARD_FLASH_MODE): cv.valid,
186
186
  cv.Optional(CONF_ARDUINO_VERSION): cv.valid,
187
+ cv.Optional(CONF_MIN_VERSION, default=ESPHOME_VERSION): cv.All(
188
+ cv.version_number, cv.validate_esphome_version
189
+ ),
187
190
  },
188
191
  extra=cv.ALLOW_EXTRA,
189
192
  )
esphome/dashboard/core.py CHANGED
@@ -103,7 +103,7 @@ class ESPHomeDashboard:
103
103
  self.loop = asyncio.get_running_loop()
104
104
  self.ping_request = asyncio.Event()
105
105
  self.entries = DashboardEntries(self)
106
- self.load_ignored_devices()
106
+ await self.loop.run_in_executor(None, self.load_ignored_devices)
107
107
 
108
108
  def load_ignored_devices(self) -> None:
109
109
  storage_path = Path(ignored_devices_storage_path())
@@ -544,7 +544,7 @@ class ImportRequestHandler(BaseHandler):
544
544
 
545
545
  class IgnoreDeviceRequestHandler(BaseHandler):
546
546
  @authenticated
547
- def post(self) -> None:
547
+ async def post(self) -> None:
548
548
  dashboard = DASHBOARD
549
549
  try:
550
550
  args = json.loads(self.request.body.decode())
@@ -576,7 +576,8 @@ class IgnoreDeviceRequestHandler(BaseHandler):
576
576
  else:
577
577
  dashboard.ignored_devices.discard(ignored_device.device_name)
578
578
 
579
- dashboard.save_ignored_devices()
579
+ loop = asyncio.get_running_loop()
580
+ await loop.run_in_executor(None, dashboard.save_ignored_devices)
580
581
 
581
582
  self.set_status(204)
582
583
  self.finish()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: esphome
3
- Version: 2024.11.0b4
3
+ Version: 2024.11.2
4
4
  Summary: Make creating custom firmwares for ESP32/ESP8266 super easy.
5
5
  Author-email: The ESPHome Authors <esphome@nabucasa.com>
6
6
  License: MIT
@@ -5,7 +5,7 @@ esphome/codegen.py,sha256=GePHUM7xdXb_Pil59SHVsXg2F4VBPgkH-Fz2PDX8Z54,1873
5
5
  esphome/config.py,sha256=nOiXPZv8wHtmytkNlGcewp0uuJd9G5rRjkqevYXtjzo,39618
6
6
  esphome/config_helpers.py,sha256=MKf_wzO35nn41FvigXE0iYKDslPgL2ruf8R-EPtTT2I,3256
7
7
  esphome/config_validation.py,sha256=RaF7hC9-VwtWA8C6vYaKVzyz4XqeoOOajr3EJDnaBaI,66311
8
- esphome/const.py,sha256=zh6nnMR_XJryP1JkcK3jC4el8RDKzg-E_2k3Sr79UWA,40261
8
+ esphome/const.py,sha256=oHBWQlbPybxl4kgkm3InPSx9FK0v8rqQfL6FxBBBX_Y,40259
9
9
  esphome/coroutine.py,sha256=j_14z8dIIzIBeuNO30D4c1RJvMMt1xZFZ58Evd-EvJA,9344
10
10
  esphome/cpp_generator.py,sha256=lXPXHYUsFIvBSAoZ93mXYlGcXYg5L18nTtYGHE4_rr8,31203
11
11
  esphome/cpp_helpers.py,sha256=6C2vNbOIhZKi43xRVlk5hp9GfshfBn-rc5D_ZFUEYaE,4801
@@ -301,7 +301,7 @@ esphome/components/binary_sensor/__init__.py,sha256=B9P32IzsFQIAKZrsWJi4hd28PVNV
301
301
  esphome/components/binary_sensor/automation.cpp,sha256=oTQ2zjqYwNhJiY6IQ7qBQgJ3XUz2TNZqfn6TqEZ-_l0,4201
302
302
  esphome/components/binary_sensor/automation.h,sha256=5W8ExbRo-zbiwrjPXmYJdDmpi39x76XP8ae_Vjmxprg,4611
303
303
  esphome/components/binary_sensor/binary_sensor.cpp,sha256=6H8ycTYJO8Wpr_T8-3a5LUK4FuFFtmR_1awMAkp9lWY,1924
304
- esphome/components/binary_sensor/binary_sensor.h,sha256=f0hweLyEKWgLO-eVKDeUl2ajZElORfjouZprOEImv0k,2720
304
+ esphome/components/binary_sensor/binary_sensor.h,sha256=u9tZYhlp-27ZT480Uq2yJBoNC6gTLepFmMfD0JLTM-0,2727
305
305
  esphome/components/binary_sensor/filter.cpp,sha256=Gc45eMmI-TS7gzCF_PhtPwJJjb7NBckWSfY_H1DK-xI,4240
306
306
  esphome/components/binary_sensor/filter.h,sha256=ko00IiyMD5g2lRpPNZb36czAHRy_iK5YcBW6UQPZHz0,2968
307
307
  esphome/components/binary_sensor_map/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -868,7 +868,7 @@ esphome/components/esp8266_pwm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5
868
868
  esphome/components/esp8266_pwm/esp8266_pwm.cpp,sha256=c4_NPBOfBdguJghAdx7d9cwtyJscVEhWD4_Xkavbmfw,1703
869
869
  esphome/components/esp8266_pwm/esp8266_pwm.h,sha256=YLObIixl3YFDx3biu1TVfH6qyOFFts-VGT4pxgN0PHw,1386
870
870
  esphome/components/esp8266_pwm/output.py,sha256=7qgJT-O8nr0HjFajwbw2k_DlXwG_SLfP4ma82-GF-ew,2062
871
- esphome/components/esphome/ota/__init__.py,sha256=9QLHdgokrTMdyiLj6o7skLjyNpJ7riR6e1IWCa0eirc,4851
871
+ esphome/components/esphome/ota/__init__.py,sha256=8TRsZ2HUPIGzaWZ2iHCRq9Ey_h-gWgheoROTQydkxfo,4851
872
872
  esphome/components/esphome/ota/ota_esphome.cpp,sha256=znmin_DY2kH_D0ijlfDI7unzjGHl6vkxvk7Ksv6u--U,12355
873
873
  esphome/components/esphome/ota/ota_esphome.h,sha256=MHd6DPavp08gfb-bcttjCiv3U60XMSTMDi2nPcN8Y7s,1140
874
874
  esphome/components/ethernet/__init__.py,sha256=OTxnBMnP_mjB3SUJsVcTDvxQqTNmOaF4LXamQx9EAyI,11646
@@ -1127,7 +1127,7 @@ esphome/components/honeywellabp/honeywellabp.cpp,sha256=ZL8OUA2VyjcuFga9Rxw1c0ko
1127
1127
  esphome/components/honeywellabp/honeywellabp.h,sha256=yy0ATFdIV4YI_EaCSXKgeRaOPjyzxzch35RrCLthM2Q,1809
1128
1128
  esphome/components/honeywellabp/sensor.py,sha256=FXe0LjBwUElNKSrsob1Jfx1LJEXtfniqztA34tpZ62Q,2233
1129
1129
  esphome/components/honeywellabp2_i2c/__init__.py,sha256=q4EX44dXWVPn_6bcR0pbzsGWt3AGvtFshH-O_T8YfOs,59
1130
- esphome/components/honeywellabp2_i2c/honeywellabp2.cpp,sha256=BNId9_2ey5W97Z8C7iyf8UynCczC4NvrmNy57eXVb8I,3435
1130
+ esphome/components/honeywellabp2_i2c/honeywellabp2.cpp,sha256=Dn8vtVDQxJ4RI0sd6e3xBKZlf7pa0ZqTdM2sDAWJwnA,3602
1131
1131
  esphome/components/honeywellabp2_i2c/honeywellabp2.h,sha256=oKx_nWi07fYioDxWPcNKtzDVKiyqBTvDIdREJoaHfMY,2140
1132
1132
  esphome/components/honeywellabp2_i2c/sensor.py,sha256=RepjqSYlTrq-IgTMhB-y1oBkjAPdEm2uRiCH_zWDMeU,2574
1133
1133
  esphome/components/host/__init__.py,sha256=GXt0D2oYrLC10UJKXle3oZtoEc4HRYDKHVO-pmWXFZA,1190
@@ -1150,7 +1150,7 @@ esphome/components/hte501/hte501.h,sha256=EY-aX8KwudhZPQ3tyRzSU2hPFUzFkmAhrGdhAX
1150
1150
  esphome/components/hte501/sensor.py,sha256=H7cfhfjQ0lyUgHABpoyiKOaj_f2qhN7nDW-tTj2sttQ,1723
1151
1151
  esphome/components/http_request/__init__.py,sha256=4_uFrwkt-A5zGn3yg_9OmTeqG_B-0-qLdVB7OpDdkT8,10324
1152
1152
  esphome/components/http_request/http_request.cpp,sha256=UFpMPffAuE2enh8iBvZzV3EDr7lS-MoLaquDoi5FGEw,705
1153
- esphome/components/http_request/http_request.h,sha256=xKfYOmgFbHJd1aDNIrvgl7LuDoz7QaifT26f-pz44HQ,8657
1153
+ esphome/components/http_request/http_request.h,sha256=_2_0II69bDV-vlgr53p102VpekXijU_KQekjZOBmRF0,8653
1154
1154
  esphome/components/http_request/http_request_arduino.cpp,sha256=btiSWqmr45miC9yIjjiTKrMhvtJ45JieiO0V9h1EjBo,5452
1155
1155
  esphome/components/http_request/http_request_arduino.h,sha256=iaOY5aKpQJREygOoyBB8Nsozp4cfETDt-G6Hgu_pkm0,871
1156
1156
  esphome/components/http_request/http_request_idf.cpp,sha256=qVH3oaYuqfwRrDmviMOxwiof7PrIAqvg7Nc75UD2xmo,6200
@@ -1457,7 +1457,7 @@ esphome/components/ltr_als_ps/ltr_als_ps.cpp,sha256=a5NBwe7wtJHwLgIDFoollhz1VSDI
1457
1457
  esphome/components/ltr_als_ps/ltr_als_ps.h,sha256=TxgTmv7apRGsxHAxDow6-CpkQsdWID2KLk-lSDi7KtQ,6466
1458
1458
  esphome/components/ltr_als_ps/ltr_definitions.h,sha256=yaIvnLQBIBnPuQBvHDD9Q_16Uoq1vnABwsTm8j77a3w,7255
1459
1459
  esphome/components/ltr_als_ps/sensor.py,sha256=0HSnG34wHnaj9s-qRO7tYn5p0rSBlGmVXaVDSG520sg,9980
1460
- esphome/components/lvgl/__init__.py,sha256=CzOK7zq-s_TbVcYKTKkD3BjU40eElF1_ymvI9UDNmAE,17415
1460
+ esphome/components/lvgl/__init__.py,sha256=6MAh-NMXgsoYxKaURc3KMrk0WQxwa14njGY1Ni24yZM,17415
1461
1461
  esphome/components/lvgl/automation.py,sha256=xFlt6T-qL1WYEFMQ5loHqCjtm2wC_Ml4VPDa1GAxikg,10204
1462
1462
  esphome/components/lvgl/defines.py,sha256=UtXGBexJNUgFuOrAtGEyDcRp0qLioLG0VLr8f-UQbMo,13414
1463
1463
  esphome/components/lvgl/encoders.py,sha256=l296tfKdDzhRNPmU1chvAosNRrmBhITlB43OtNVBrRw,3189
@@ -1466,13 +1466,13 @@ esphome/components/lvgl/gradient.py,sha256=K60e7b52N8i7aQjkLIsij7OOXmVhBnJnxj4J3
1466
1466
  esphome/components/lvgl/hello_world.py,sha256=iwfSWO0TT0CEGN5M_QBY_oKqmYshT69jOBDFTTUyBII,1417
1467
1467
  esphome/components/lvgl/helpers.py,sha256=XI3C5IHwoSVlgR32kMxeXTZWK6iW112nmWv5wByrKLY,1253
1468
1468
  esphome/components/lvgl/keypads.py,sha256=jtQjAG4vbTzI5Pr1IBfrEEPzV_0k4wkKfCMfsef6VT4,2124
1469
- esphome/components/lvgl/lv_validation.py,sha256=oou753_mUXsaX1s3q2Ei5qtCZIkBIGDc852lhBXv9ns,13538
1469
+ esphome/components/lvgl/lv_validation.py,sha256=fss9CHNO4JsWf3VYk9bxPYz0Z2ulx8kzilF4XjNv0bk,13581
1470
1470
  esphome/components/lvgl/lvcode.py,sha256=IkvCq59dR0RYJ-wKeO95zJEX-vNBWUkHEX5tJJfvv-Q,10018
1471
1471
  esphome/components/lvgl/lvgl_esphome.cpp,sha256=6-qhT-eqKkJt1R_xfZUWaVN2Ko5h5zuxB7ewcb3r9_0,19102
1472
1472
  esphome/components/lvgl/lvgl_esphome.h,sha256=DbwbGatY62fONYXhObsUGjAxpSOq7Abrt1I91IMeBEA,11916
1473
1473
  esphome/components/lvgl/lvgl_hal.h,sha256=aZqWpSmKKAB-ZfNxxgxjgASTtLpAZjXJKuoTiPB0qqU,431
1474
1474
  esphome/components/lvgl/lvgl_proxy.h,sha256=JPmVBVh5zD5nraJCN7PqXVmQQlc4CPJe_X9tA6IAtXQ,547
1475
- esphome/components/lvgl/schemas.py,sha256=CMWq6TLb4AlDRLj85xfExyH6q_USP0Buqx9Ecmkl-dM,14270
1475
+ esphome/components/lvgl/schemas.py,sha256=t_tWtSSPwJWnPS8xNVDupo3HOLfkL8PihDatdJWIQOE,14271
1476
1476
  esphome/components/lvgl/styles.py,sha256=oTrJp-Y8lr0fUuVRvYMAFLNJzlW8Y4f9VT3pUq7NYX0,2254
1477
1477
  esphome/components/lvgl/touchscreens.py,sha256=CntwVa1EUu6iBnxfvuv0rCYd_Njmf451CYdRqQyb9N4,1607
1478
1478
  esphome/components/lvgl/trigger.py,sha256=igqFoYZqjgF-XQbGyuEQhFqYsXGq1BadS8CK_M2XTLs,2221
@@ -1501,7 +1501,7 @@ esphome/components/lvgl/widgets/img.py,sha256=UE8X_RQhirIgJploL1VNHNuzdhlnhpZz41
1501
1501
  esphome/components/lvgl/widgets/keyboard.py,sha256=1WBm_nfeFpWvzYts68FN_arqovOwMFs47TQAPCKour8,1543
1502
1502
  esphome/components/lvgl/widgets/label.py,sha256=5xl1a6apdJgGKmkpL8m7RDASjaeKzjKTllhY26Gbfag,1139
1503
1503
  esphome/components/lvgl/widgets/led.py,sha256=qoe_kvZpoRkwbxz25Z66KQ__KLC2tfhAukChp1jdlDc,888
1504
- esphome/components/lvgl/widgets/line.py,sha256=bIlKIEnVYPENG5cqupakoqCMj-Oddgun-X5nmTpOMig,1392
1504
+ esphome/components/lvgl/widgets/line.py,sha256=b0lb8RAJwvLNknRhMsqD1iOOX0sE-vFZLnCC-rMOLzA,1411
1505
1505
  esphome/components/lvgl/widgets/lv_bar.py,sha256=DbiUvhKdh9bsRMTU-rJYYA5KCjBUxDsW-7tvx8-CIRM,1670
1506
1506
  esphome/components/lvgl/widgets/meter.py,sha256=pqSwtQWoyluLKmTSUR1gnsueUDi3lPm4lat8jV3Pi8Q,10985
1507
1507
  esphome/components/lvgl/widgets/msgbox.py,sha256=xiB_-lOhsIDoeYpmf_66fdiq-2yd1wloBb_6beg5ZwI,5273
@@ -1532,7 +1532,7 @@ esphome/components/matrix_keypad/__init__.py,sha256=CRTWzuhJdPMb-xY5wj26OaQf0RLD
1532
1532
  esphome/components/matrix_keypad/matrix_keypad.cpp,sha256=BenTjvW_skypNg6VIS2ysUdvYJNEQ1iUS23sm36EkNA,2984
1533
1533
  esphome/components/matrix_keypad/matrix_keypad.h,sha256=RktGC4bHUNkBS_5svvfJCOVPHn1B8e_mU9RcONMrVdk,1483
1534
1534
  esphome/components/matrix_keypad/binary_sensor/__init__.py,sha256=GyuSn0SbvIjeWAY8VL2h1ZBu_F_6IieB8kHzi3lA96c,1638
1535
- esphome/components/matrix_keypad/binary_sensor/matrix_keypad_binary_sensor.h,sha256=nQ2YDdOetTpAgGWbDf3tbLLou3DX5Mq_i4ATj0X3sOw,1321
1535
+ esphome/components/matrix_keypad/binary_sensor/matrix_keypad_binary_sensor.h,sha256=3fxEP2Oz7a7VT3AT6Y60IfOWKbN4p2byrwZGCuHob2Y,1333
1536
1536
  esphome/components/max17043/__init__.py,sha256=b0G6mAuSTWpAdOVf7rn3zBVRHoJZeZ8i6mkNLqOQfDI,28
1537
1537
  esphome/components/max17043/automation.h,sha256=rw2HnS8IuniX5673CzvfbIpjyO-Jtay2Q_S1MSEOoi4,434
1538
1538
  esphome/components/max17043/max17043.cpp,sha256=rl6WPIT4dzrCQSWe21zvMt7f-lp6DFnxH6-mL3HpcXM,3189
@@ -1728,12 +1728,12 @@ esphome/components/mmc5983/mmc5983.cpp,sha256=6tH7TsB2jSTYDR3-SQ90JgKNMQtFvG1OJH
1728
1728
  esphome/components/mmc5983/mmc5983.h,sha256=djHDHSC4UAimrWpqnKB-g1wycM5ym7vOLHU7BDRfwA8,784
1729
1729
  esphome/components/mmc5983/sensor.py,sha256=_eAPEfWzxYWsp5kPji_Rb99X6j9RxlReC4boxYWUtWY,1670
1730
1730
  esphome/components/modbus/__init__.py,sha256=pe9aU_PBNR9h9TqqezEE8zyvp7PLOtsa01Zaf08DMfk,3111
1731
- esphome/components/modbus/modbus.cpp,sha256=c0Q4E44zXtPQq3eMlqyNUlXnHcCW8rwdCIv3-_i5eLo,8516
1731
+ esphome/components/modbus/modbus.cpp,sha256=aNZF9Qc2AhrV9hGvfMVkRMqjxQllHdi5D_5MPE1ReuI,8526
1732
1732
  esphome/components/modbus/modbus.h,sha256=lDXklIqGZsyXnvf4oFslaGtD7yd9YwRkUYSpYsQRcAg,2477
1733
- esphome/components/modbus_controller/__init__.py,sha256=EW8ih7wV_8DXG7HKuKzOa2GLe-GF3ndhEbImcq7_b8g,11986
1733
+ esphome/components/modbus_controller/__init__.py,sha256=2qkvQDczAkOFHGBOszDRhCtR9kl3XeddSa8PCHspKW0,11987
1734
1734
  esphome/components/modbus_controller/automation.h,sha256=YzVMgVu37jvwsvCz3tSheYDJeZwi3IMx6NuMo1xgw7g,1106
1735
1735
  esphome/components/modbus_controller/const.py,sha256=dw_zuK27lFuR5aDtlOs_nVaFB9Snx3l48dgwc9_OAMg,825
1736
- esphome/components/modbus_controller/modbus_controller.cpp,sha256=FMl8Ym83pMxzx3PKRHmNrsppdm-g7ho2Ql_NxbeVReM,27819
1736
+ esphome/components/modbus_controller/modbus_controller.cpp,sha256=X02K_sdHi13Y_31HbKkv7k1Qpm7qwkqEGiKO6kU6CMI,28520
1737
1737
  esphome/components/modbus_controller/modbus_controller.h,sha256=R80yn8_lFDQo6pQ-8tQxl0V9IuKKqAQnkhh4IuymYJw,23454
1738
1738
  esphome/components/modbus_controller/binary_sensor/__init__.py,sha256=sFeTUMZlQwtIHKtX8kUDT5wvIk25SCiZG0Wdl6EYdFU,1634
1739
1739
  esphome/components/modbus_controller/binary_sensor/modbus_binarysensor.cpp,sha256=wsRl8P37mxr24CQJ4gCrFsUTlgVVKOVsY8HJTN1sUA8,1197
@@ -1977,7 +1977,7 @@ esphome/components/opentherm/sensor/__init__.py,sha256=pGVYAMSxHkEArf7jEY3YjWhIa
1977
1977
  esphome/components/opentherm/switch/__init__.py,sha256=bbPSrKbqGnipfPdoaPWvdNPbs7CheZT51KUMkFc7Of4,1216
1978
1978
  esphome/components/opentherm/switch/switch.cpp,sha256=UurvOy-U1IEmNxWMCCpkPCueR-POh-FBI8fBjWWc64o,820
1979
1979
  esphome/components/opentherm/switch/switch.h,sha256=JhJFaXrJi3orbavFDc4llzmmHwU0yN2v_VuwJx3r7FU,410
1980
- esphome/components/ota/__init__.py,sha256=14ukeS1DTEyuORWeu5Mm6bNYSzWvSpEd-ERZQDlTguc,4323
1980
+ esphome/components/ota/__init__.py,sha256=uHRMl_VVt5RBPmi3u7GQ8ezglq_H39qsg3cpv0tbFkQ,4353
1981
1981
  esphome/components/ota/automation.h,sha256=UaasWG6gZG59MtC5DHHfMhRb7BXYmLlkOyYujZReEV0,2044
1982
1982
  esphome/components/ota/ota_backend.cpp,sha256=IfpR0mvzSs9ugJa2LRi4AtYHT4Ht6PoS9BY5Ydjs_eE,587
1983
1983
  esphome/components/ota/ota_backend.h,sha256=ILfnmlVzp0qhHFv13jZ6GQ7MLgKf5ICtL6xI4ojg4K8,2806
@@ -2176,8 +2176,8 @@ esphome/components/qr_code/qr_code.h,sha256=av3KfyeLMVzuXarboSTGBIeWsZww5k1aQXcX
2176
2176
  esphome/components/qspi_amoled/display.py,sha256=RKxYuiRRDxMz2JkpCZuc0Mc4KEsfFXG1lnAdE96j-6o,125
2177
2177
  esphome/components/qspi_dbi/__init__.py,sha256=4Nn7UhpMJ9oSbuLdyVEW7G9PlIey2v33SWRNVizt9Oc,30
2178
2178
  esphome/components/qspi_dbi/display.py,sha256=FSAqnA_rpdhYDX1wKzYvKQekPKVZms5r5xkxLbID29A,6470
2179
- esphome/components/qspi_dbi/models.py,sha256=FXkIQ77LyjupqDV5gkeggB0O3_Ov1DXNQ-0N9Hd7aFY,1326
2180
- esphome/components/qspi_dbi/qspi_dbi.cpp,sha256=iu0fjvpj4bgGVUr-0moxKs5dtSAUd10Cv_iwd5pAlT8,7453
2179
+ esphome/components/qspi_dbi/models.py,sha256=SteqD6BaCNLuuPpZWR6qfH7V-EDQ4La53Yv2PV9o9Cg,1378
2180
+ esphome/components/qspi_dbi/qspi_dbi.cpp,sha256=8aihsspfl44eXLkdXj6TppBoO46K7bnTi8lpqwRG2YE,7422
2181
2181
  esphome/components/qspi_dbi/qspi_dbi.h,sha256=Vnsliv6CNN_h-ZCvLraQYb9461qdvIh8jhFwhx1-ffk,6150
2182
2182
  esphome/components/qwiic_pir/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2183
2183
  esphome/components/qwiic_pir/binary_sensor.py,sha256=JnaxTc_TLDq77ju6bnbR2KP8QOzasX0_3QoQwvmgVXE,2001
@@ -2339,7 +2339,7 @@ esphome/components/rtl87xx/__init__.py,sha256=HIcczzFYGdNtOj635-gH0VVmBOZjmvcS4m
2339
2339
  esphome/components/rtl87xx/boards.py,sha256=JItSPj4n2UAvUXISoL2PTyTAqIi2Wp3sjGjs1fgS-3M,29269
2340
2340
  esphome/components/rtttl/__init__.py,sha256=m8vjSNfwcgbJm6NhDe_ErddMMwUpe2StubWcMY8sd28,4383
2341
2341
  esphome/components/rtttl/rtttl.cpp,sha256=cuoIUm1xDUlrTW1lOSb5w9iMu94lUfUESTgtXbXSwPQ,10911
2342
- esphome/components/rtttl/rtttl.h,sha256=lGS7O9uRHO_FvJMCXZZGP4F7ymcQR6-k8LeABRsP2k0,2983
2342
+ esphome/components/rtttl/rtttl.h,sha256=djIjq7Cq1aZ4uQz_VHboPIdRYcYJ0j0E7uIOXr86cP0,2916
2343
2343
  esphome/components/ruuvi_ble/__init__.py,sha256=9LmcfStqBeEzcuWdON_iGuI6Xh0BUssV1Aebv98Krks,619
2344
2344
  esphome/components/ruuvi_ble/ruuvi_ble.cpp,sha256=XXeYIgr1OB20MxtdcTDAWowFeK8qRQmQKTMeSEuhAec,5724
2345
2345
  esphome/components/ruuvi_ble/ruuvi_ble.h,sha256=F5lb-4gHnOMArTrh0jTPUjRcScDFEX2V9JHwd_Q_-t4,997
@@ -2585,7 +2585,7 @@ esphome/components/sonoff_d1/__init__.py,sha256=ZmxkvMwdesGJglhRfdWU41Fb_ib3xOhx
2585
2585
  esphome/components/sonoff_d1/light.py,sha256=YLxoJWC9w_TBPyGX_2_rDCuMfc4AZtuNG0PaLlFWig0,1443
2586
2586
  esphome/components/sonoff_d1/sonoff_d1.cpp,sha256=9xT42oxeLJ5CGrZ7wqIH5KVTkwW3XYNSXSXEc5_vzq0,12746
2587
2587
  esphome/components/sonoff_d1/sonoff_d1.h,sha256=FNHcaqGktpV3S19A1LD2wtpRpEqA0h6g9GFb36pMy_E,3457
2588
- esphome/components/speaker/__init__.py,sha256=bVQdlDEXJBBZOanr3CQg-FXSRRVJjgD3Rje64uuIR0Q,4330
2588
+ esphome/components/speaker/__init__.py,sha256=TO94-8JNv5kTQVzvKGd5UotPrmFmzmq4jSRACkJX_kU,4352
2589
2589
  esphome/components/speaker/automation.h,sha256=tVSTV49GvHk0bCEgLz3rNYFe8B1F0kXLgE-WihuRaV8,2320
2590
2590
  esphome/components/speaker/speaker.h,sha256=wTyEdWsBR8tJM_VvvZFx1orEd_ZDNE9rnHOqBY46jCU,3559
2591
2591
  esphome/components/speed/__init__.py,sha256=Bfyz1MHHvLHj93TfN53E2uhKXKLYtp0k4st6Xb3760o,74
@@ -2694,7 +2694,7 @@ esphome/components/statsd/__init__.py,sha256=l8GtFsbqmF4uWjc8bQ6JugaP4XomCB1SqCX
2694
2694
  esphome/components/statsd/statsd.cpp,sha256=L4BgLvEvU_esYz6M1lLUr012D2E-QXsNV9wRJLepZZU,4016
2695
2695
  esphome/components/statsd/statsd.h,sha256=5IJl84anEly8as3ONh4s9KjIYmfhuAez-mHkdzWqIDY,1805
2696
2696
  esphome/components/status/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2697
- esphome/components/status/binary_sensor.py,sha256=qEHhIOHK0Lh-U-mZNjqutjFTMe5Sw3TMJy8IT7PRgNY,690
2697
+ esphome/components/status/binary_sensor.py,sha256=NPwpCVJ6KBoKVkF1zcQwMVoqtYHJVTCMnWEQImdpyjA,718
2698
2698
  esphome/components/status/status_binary_sensor.cpp,sha256=VaLg8eURQHNXOB-JC-SpR5wzVclpIYGS2lXdpTAwDfg,963
2699
2699
  esphome/components/status/status_binary_sensor.h,sha256=z84fHtyQuDzrdvadDUXlnBZhSopkVIDx3L1spOkfrjg,518
2700
2700
  esphome/components/status_led/__init__.py,sha256=ch8SQ_0fAHxPqWydVtfl0XUDVy7v0D-hc2-gN4nVvrM,782
@@ -3144,9 +3144,9 @@ esphome/components/wiegand/wiegand.h,sha256=gyg5szEK0okoeLBQR284k84xy-ln19kNIkeO
3144
3144
  esphome/components/wifi/__init__.py,sha256=6FJ70aZwjp6tqMecz3bfesxvHn8QLcWZKZqGrzhUTxc,16419
3145
3145
  esphome/components/wifi/wifi_component.cpp,sha256=55x9pFgJm12ZcLsGoRzT6-2I3UXGblVIpxJYMZZQgfo,28991
3146
3146
  esphome/components/wifi/wifi_component.h,sha256=VQWxTtMOL2Xc_9fZLklYT0cenyFlIzUuWZ3xzlhvoEY,12394
3147
- esphome/components/wifi/wifi_component_esp32_arduino.cpp,sha256=kwydBMeyVhT5GbzXAnoBZ_Du_xsUETaIY2WyUef_K7M,27121
3148
- esphome/components/wifi/wifi_component_esp8266.cpp,sha256=qtZzGum8-ZOr8MFLM2G3Z2br7SB6a-rDVU60gvyS7dc,27159
3149
- esphome/components/wifi/wifi_component_esp_idf.cpp,sha256=OCpmQudJRYVBrtL04Uhz7QMSWsu6gjLn-1pjVL3_9Y8,35518
3147
+ esphome/components/wifi/wifi_component_esp32_arduino.cpp,sha256=RnqQCAqEGGE3bmIboozw0leO7fgIsXkT8APfmMy6AHw,27583
3148
+ esphome/components/wifi/wifi_component_esp8266.cpp,sha256=NZhivdJTTWfamh_WLgRjpdrEBwNSbrBJifceNi4OX94,27621
3149
+ esphome/components/wifi/wifi_component_esp_idf.cpp,sha256=ZaL8sNHeifl6eSw3Fz_KC23kNhgAhuA-ORwA4mYpzPE,35994
3150
3150
  esphome/components/wifi/wifi_component_libretiny.cpp,sha256=ASeaZMVG2WJi321sfp1OuELAvvEh8W2Ooy2aG1MVUYE,16275
3151
3151
  esphome/components/wifi/wifi_component_pico_w.cpp,sha256=eDRB45mojDBWAFYMxuVPLb0mhFVCjRi5nrhpcxDusGQ,6392
3152
3152
  esphome/components/wifi/wpa2_eap.py,sha256=484kRwbjD-KGb1VqtER7V-3_3Bt7QDS4CCmpdZNOFNk,4859
@@ -3308,7 +3308,7 @@ esphome/core/component.cpp,sha256=Uea5Hkm0E9yJMJYnrbLFFVpdcBZgaWSxfAiwcyGKByA,93
3308
3308
  esphome/core/component.h,sha256=U4m8_g9gSBBIjRNw4k36entP2JcA6F3SsWbwty_hKdo,11744
3309
3309
  esphome/core/component_iterator.cpp,sha256=TUu2K34ATYa1Qyf2s-sZJBksAiFIGj3egzbDKPuFtTQ,11117
3310
3310
  esphome/core/component_iterator.h,sha256=cjacKgRrlxl-VwPOysfBJZNK0NMzcc-w9xXn82m5dYc,3599
3311
- esphome/core/config.py,sha256=ASCzpRc8Kp8kkcBV4p7sx8k_7BeQY5LOP7gi2cWsCN0,14598
3311
+ esphome/core/config.py,sha256=PbySZ7vj6t2t3mNbWpKR732frQD3Eqp1eLMDflW_3rI,14740
3312
3312
  esphome/core/controller.cpp,sha256=feO4yH0GETNCqi9MTZEtsOaoo-CPV2rM9S7UfQXY6Ew,4553
3313
3313
  esphome/core/controller.h,sha256=PXCcMqYpq0xjFCdlOKv6WuYlcETnB4sq3UQWdOTt9PU,3720
3314
3314
  esphome/core/datatypes.h,sha256=wN8xro8vqXT13w9KvVOXeQfBwlI_WQZ6uFaIGyub67E,2114
@@ -3338,13 +3338,13 @@ esphome/core/util.h,sha256=UeGZvUEvEaOMxLqJOA7GE178z5U37681RtFk6Ho1KCw,407
3338
3338
  esphome/core/version.h,sha256=HkOTdiyOMRgIuYAAXpsN_8_IKye3rMK0LbtpcjZVXqY,431
3339
3339
  esphome/dashboard/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3340
3340
  esphome/dashboard/const.py,sha256=y4myJErHI7AUrfCum9IxnEM9bzOLL8DZQQffE_NgifA,292
3341
- esphome/dashboard/core.py,sha256=wZJTqW2WOb74ROjarBhUl4L8cgdrrOotMXdcn-haDTM,5641
3341
+ esphome/dashboard/core.py,sha256=3sxsSeD1R1rK9qBZGvh7D5C8IQPeeADwvwZ49idyfgM,5678
3342
3342
  esphome/dashboard/dashboard.py,sha256=EspMigIPXAci4MJXNcAG_BlxP86kUB49ddwne8iJs5A,4747
3343
3343
  esphome/dashboard/dns.py,sha256=zJjzjjuJsnHXW59V-H1QqjwwqJFgtJUIsB2QUcALZns,1369
3344
3344
  esphome/dashboard/entries.py,sha256=jbmvXQ5-zeUBVrd80tupYmStRsTwGp0hbfG7ZIRQF94,13130
3345
3345
  esphome/dashboard/enum.py,sha256=rlQFVVxyBt5Iw7OL0o9F8D5LGgw23tbvi-KYjzP0QUQ,597
3346
3346
  esphome/dashboard/settings.py,sha256=xoN2eLh-t0hmVYLmZm9beVOqonPNqWkzpRsoPbEomoA,2962
3347
- esphome/dashboard/web_server.py,sha256=6Y6O73o_UvTs039tdO1frLZ98beRvsJ79PPgiv47G5A,41757
3347
+ esphome/dashboard/web_server.py,sha256=SnAB_8ndfY91SPmY1cwCYkKxtWF9ppDgbD7soSzs3YQ,41837
3348
3348
  esphome/dashboard/status/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3349
3349
  esphome/dashboard/status/mdns.py,sha256=FuASYxcQ-LQVK5vqX9ZLs9wIXlmXZh4tjXhg-Zmpq14,3741
3350
3350
  esphome/dashboard/status/mqtt.py,sha256=ZRb18LOvl4975Pzc4Fdr5ErML3WKwV8Pv1sD2qdSJ1s,1965
@@ -3355,9 +3355,9 @@ esphome/dashboard/util/itertools.py,sha256=8eLrWEWmICLtXNxkKdYPQV0c_N4GEz8m9Npnb
3355
3355
  esphome/dashboard/util/password.py,sha256=cQz3b9B-ijTe7zS6BeCW0hc3pWv6JjC78jmnycYYAh8,321
3356
3356
  esphome/dashboard/util/subprocess.py,sha256=T8EW6dbU4LPd2DG1dRrdh8li71tt6J1isn411poMhkk,1022
3357
3357
  esphome/dashboard/util/text.py,sha256=ENDnfN4O0NdA3CKVJjQYabFbwbrsIhVKrAMQe53qYu4,534
3358
- esphome-2024.11.0b4.dist-info/LICENSE,sha256=HzEjkBInJe44L4WvAOPfhPJJDNj6YbnqFyvGWRzArGM,36664
3359
- esphome-2024.11.0b4.dist-info/METADATA,sha256=UCxbT5rVwrvp-MqYxsd3K6R2s6ehlGosombgw94UAtM,3455
3360
- esphome-2024.11.0b4.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
3361
- esphome-2024.11.0b4.dist-info/entry_points.txt,sha256=mIxVNuWtbYzeEcaWCl-AQ-97aBOWbnYBAK8nbF6P4M0,50
3362
- esphome-2024.11.0b4.dist-info/top_level.txt,sha256=0GSXEW3cnITpgG3qnsSMz0qoqJHAFyfw7Y8MVtEf1Yk,8
3363
- esphome-2024.11.0b4.dist-info/RECORD,,
3358
+ esphome-2024.11.2.dist-info/LICENSE,sha256=HzEjkBInJe44L4WvAOPfhPJJDNj6YbnqFyvGWRzArGM,36664
3359
+ esphome-2024.11.2.dist-info/METADATA,sha256=CzCGTqK8SxTLlFSVTWRFFmmsxaMHl1EXpL0Xdfh3MY8,3453
3360
+ esphome-2024.11.2.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
3361
+ esphome-2024.11.2.dist-info/entry_points.txt,sha256=mIxVNuWtbYzeEcaWCl-AQ-97aBOWbnYBAK8nbF6P4M0,50
3362
+ esphome-2024.11.2.dist-info/top_level.txt,sha256=0GSXEW3cnITpgG3qnsSMz0qoqJHAFyfw7Y8MVtEf1Yk,8
3363
+ esphome-2024.11.2.dist-info/RECORD,,