esphome 2024.11.1__py3-none-any.whl → 2024.11.3__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 (38) hide show
  1. esphome/__main__.py +1 -1
  2. esphome/components/binary_sensor/binary_sensor.h +1 -1
  3. esphome/components/datetime/datetime_entity.cpp +1 -3
  4. esphome/components/esp32/__init__.py +6 -10
  5. esphome/components/honeywellabp2_i2c/honeywellabp2.cpp +6 -5
  6. esphome/components/lvgl/__init__.py +1 -1
  7. esphome/components/lvgl/defines.py +1 -1
  8. esphome/components/lvgl/lv_validation.py +2 -1
  9. esphome/components/lvgl/lvgl_esphome.h +3 -0
  10. esphome/components/lvgl/schemas.py +1 -0
  11. esphome/components/lvgl/widgets/line.py +10 -1
  12. esphome/components/lvgl/widgets/msgbox.py +2 -1
  13. esphome/components/matrix_keypad/binary_sensor/matrix_keypad_binary_sensor.h +1 -1
  14. esphome/components/modbus/modbus.cpp +2 -1
  15. esphome/components/modbus_controller/__init__.py +1 -1
  16. esphome/components/modbus_controller/modbus_controller.cpp +54 -18
  17. esphome/components/online_image/png_image.cpp +4 -0
  18. esphome/components/opentherm/hub.cpp +6 -7
  19. esphome/components/opentherm/opentherm.cpp +15 -31
  20. esphome/components/opentherm/opentherm.h +3 -4
  21. esphome/components/qspi_dbi/models.py +2 -0
  22. esphome/components/qspi_dbi/qspi_dbi.cpp +0 -1
  23. esphome/components/st7920/st7920.cpp +2 -3
  24. esphome/components/status/binary_sensor.py +2 -0
  25. esphome/components/wifi/wifi_component_esp32_arduino.cpp +20 -4
  26. esphome/components/wifi/wifi_component_esp8266.cpp +20 -4
  27. esphome/components/wifi/wifi_component_esp_idf.cpp +20 -4
  28. esphome/const.py +1 -1
  29. esphome/core/helpers.cpp +12 -0
  30. esphome/core/helpers.h +8 -0
  31. esphome/core/time.cpp +19 -15
  32. esphome/core/time.h +1 -3
  33. {esphome-2024.11.1.dist-info → esphome-2024.11.3.dist-info}/METADATA +1 -1
  34. {esphome-2024.11.1.dist-info → esphome-2024.11.3.dist-info}/RECORD +38 -38
  35. {esphome-2024.11.1.dist-info → esphome-2024.11.3.dist-info}/LICENSE +0 -0
  36. {esphome-2024.11.1.dist-info → esphome-2024.11.3.dist-info}/WHEEL +0 -0
  37. {esphome-2024.11.1.dist-info → esphome-2024.11.3.dist-info}/entry_points.txt +0 -0
  38. {esphome-2024.11.1.dist-info → esphome-2024.11.3.dist-info}/top_level.txt +0 -0
esphome/__main__.py CHANGED
@@ -363,7 +363,7 @@ def upload_program(config, args, host):
363
363
 
364
364
  from esphome import espota2
365
365
 
366
- remote_port = ota_conf[CONF_PORT]
366
+ remote_port = int(ota_conf[CONF_PORT])
367
367
  password = ota_conf.get(CONF_PASSWORD, "")
368
368
 
369
369
  if (
@@ -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);
@@ -60,9 +60,7 @@ ESPTime DateTimeEntity::state_as_esptime() const {
60
60
  obj.hour = this->hour_;
61
61
  obj.minute = this->minute_;
62
62
  obj.second = this->second_;
63
- obj.day_of_week = 1; // Required to be valid for recalc_timestamp_local but not used.
64
- obj.day_of_year = 1; // Required to be valid for recalc_timestamp_local but not used.
65
- obj.recalc_timestamp_local(false);
63
+ obj.recalc_timestamp_local();
66
64
  return obj;
67
65
  }
68
66
 
@@ -355,24 +355,20 @@ def _detect_variant(value):
355
355
 
356
356
 
357
357
  def final_validate(config):
358
- if CONF_PLATFORMIO_OPTIONS not in fv.full_config.get()[CONF_ESPHOME]:
358
+ if not (
359
+ pio_options := fv.full_config.get()[CONF_ESPHOME].get(CONF_PLATFORMIO_OPTIONS)
360
+ ):
361
+ # Not specified or empty
359
362
  return config
360
363
 
361
364
  pio_flash_size_key = "board_upload.flash_size"
362
365
  pio_partitions_key = "board_build.partitions"
363
- if (
364
- CONF_PARTITIONS in config
365
- and pio_partitions_key
366
- in fv.full_config.get()[CONF_ESPHOME][CONF_PLATFORMIO_OPTIONS]
367
- ):
366
+ if CONF_PARTITIONS in config and pio_partitions_key in pio_options:
368
367
  raise cv.Invalid(
369
368
  f"Do not specify '{pio_partitions_key}' in '{CONF_PLATFORMIO_OPTIONS}' with '{CONF_PARTITIONS}' in esp32"
370
369
  )
371
370
 
372
- if (
373
- pio_flash_size_key
374
- in fv.full_config.get()[CONF_ESPHOME][CONF_PLATFORMIO_OPTIONS]
375
- ):
371
+ if pio_flash_size_key in pio_options:
376
372
  raise cv.Invalid(
377
373
  f"Please specify {CONF_FLASH_SIZE} within esp32 configuration only"
378
374
  )
@@ -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() {
@@ -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)
@@ -38,7 +38,7 @@ def literal(arg):
38
38
  def call_lambda(lamb: LambdaExpression):
39
39
  expr = lamb.content.strip()
40
40
  if expr.startswith("return") and expr.endswith(";"):
41
- return expr[7:][:-1]
41
+ return expr[6:][:-1].strip()
42
42
  return f"{lamb}()"
43
43
 
44
44
 
@@ -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
 
@@ -56,6 +56,9 @@ static const display::ColorBitness LV_BITNESS = display::ColorBitness::COLOR_BIT
56
56
  inline void lv_img_set_src(lv_obj_t *obj, esphome::image::Image *image) {
57
57
  lv_img_set_src(obj, image->get_lv_img_dsc());
58
58
  }
59
+ inline void lv_disp_set_bg_image(lv_disp_t *disp, esphome::image::Image *image) {
60
+ lv_disp_set_bg_image(disp, image->get_lv_img_dsc());
61
+ }
59
62
  #endif // USE_LVGL_IMAGE
60
63
 
61
64
  // Parent class for things that wrap an LVGL object
@@ -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,
@@ -35,11 +35,20 @@ LINE_SCHEMA = {
35
35
  cv.GenerateID(CONF_POINT_LIST_ID): cv.declare_id(lv_point_t),
36
36
  }
37
37
 
38
+ LINE_MODIFY_SCHEMA = {
39
+ cv.Optional(CONF_POINTS): cv_point_list,
40
+ cv.GenerateID(CONF_POINT_LIST_ID): cv.declare_id(lv_point_t),
41
+ }
42
+
38
43
 
39
44
  class LineType(WidgetType):
40
45
  def __init__(self):
41
46
  super().__init__(
42
- CONF_LINE, LvType("lv_line_t"), (CONF_MAIN,), LINE_SCHEMA, modify_schema={}
47
+ CONF_LINE,
48
+ LvType("lv_line_t"),
49
+ (CONF_MAIN,),
50
+ LINE_SCHEMA,
51
+ modify_schema=LINE_MODIFY_SCHEMA,
43
52
  )
44
53
 
45
54
  async def to_code(self, w: Widget, config):
@@ -29,7 +29,7 @@ from ..lvcode import (
29
29
  )
30
30
  from ..schemas import STYLE_SCHEMA, STYLED_TEXT_SCHEMA, container_schema, part_schema
31
31
  from ..types import LV_EVENT, char_ptr, lv_obj_t
32
- from . import Widget, set_obj_properties
32
+ from . import Widget, add_widgets, set_obj_properties
33
33
  from .button import button_spec
34
34
  from .buttonmatrix import (
35
35
  BUTTONMATRIX_BUTTON_SCHEMA,
@@ -119,6 +119,7 @@ async def msgbox_to_code(top_layer, conf):
119
119
  button_style = {CONF_ITEMS: button_style}
120
120
  await set_obj_properties(buttonmatrix_widget, button_style)
121
121
  await set_obj_properties(msgbox_widget, conf)
122
+ await add_widgets(msgbox_widget, conf)
122
123
  async with LambdaContext(EVENT_ARG, where=messagebox_id) as close_action:
123
124
  outer_widget.add_flag("LV_OBJ_FLAG_HIDDEN")
124
125
  if close_button:
@@ -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
 
@@ -49,6 +49,10 @@ void PngDecoder::prepare(uint32_t download_size) {
49
49
  }
50
50
 
51
51
  int HOT PngDecoder::decode(uint8_t *buffer, size_t size) {
52
+ if (!this->pngle_) {
53
+ ESP_LOGE(TAG, "PNG decoder engine not initialized!");
54
+ return -1;
55
+ }
52
56
  if (size < 256 && size < this->download_size_ - this->decoded_bytes_) {
53
57
  ESP_LOGD(TAG, "Waiting for data");
54
58
  return 0;
@@ -138,7 +138,7 @@ OpenthermHub::OpenthermHub() : Component(), in_pin_{}, out_pin_{} {}
138
138
  void OpenthermHub::process_response(OpenthermData &data) {
139
139
  ESP_LOGD(TAG, "Received OpenTherm response with id %d (%s)", data.id,
140
140
  this->opentherm_->message_id_to_str((MessageId) data.id));
141
- ESP_LOGD(TAG, "%s", this->opentherm_->debug_data(data).c_str());
141
+ this->opentherm_->debug_data(data);
142
142
 
143
143
  switch (data.id) {
144
144
  OPENTHERM_SENSOR_MESSAGE_HANDLERS(OPENTHERM_MESSAGE_RESPONSE_MESSAGE, OPENTHERM_MESSAGE_RESPONSE_ENTITY, ,
@@ -315,7 +315,7 @@ void OpenthermHub::start_conversation_() {
315
315
 
316
316
  ESP_LOGD(TAG, "Sending request with id %d (%s)", request.id,
317
317
  this->opentherm_->message_id_to_str((MessageId) request.id));
318
- ESP_LOGD(TAG, "%s", this->opentherm_->debug_data(request).c_str());
318
+ this->opentherm_->debug_data(request);
319
319
  // Send the request
320
320
  this->last_conversation_start_ = millis();
321
321
  this->opentherm_->send(request);
@@ -340,19 +340,18 @@ void OpenthermHub::stop_opentherm_() {
340
340
  this->opentherm_->stop();
341
341
  this->last_conversation_end_ = millis();
342
342
  }
343
-
344
343
  void OpenthermHub::handle_protocol_write_error_() {
345
344
  ESP_LOGW(TAG, "Error while sending request: %s",
346
345
  this->opentherm_->operation_mode_to_str(this->opentherm_->get_mode()));
347
- ESP_LOGW(TAG, "%s", this->opentherm_->debug_data(this->last_request_).c_str());
346
+ this->opentherm_->debug_data(this->last_request_);
348
347
  }
349
-
350
348
  void OpenthermHub::handle_protocol_read_error_() {
351
349
  OpenThermError error;
352
350
  this->opentherm_->get_protocol_error(error);
353
- ESP_LOGW(TAG, "Protocol error occured while receiving response: %s", this->opentherm_->debug_error(error).c_str());
351
+ ESP_LOGW(TAG, "Protocol error occured while receiving response: %s",
352
+ this->opentherm_->protocol_error_to_to_str(error.error_type));
353
+ this->opentherm_->debug_error(error);
354
354
  }
355
-
356
355
  void OpenthermHub::handle_timeout_error_() {
357
356
  ESP_LOGW(TAG, "Receive response timed out at a protocol level");
358
357
  this->stop_opentherm_();
@@ -15,15 +15,11 @@
15
15
  #include "Arduino.h"
16
16
  #endif
17
17
  #include <string>
18
- #include <sstream>
19
- #include <bitset>
20
18
 
21
19
  namespace esphome {
22
20
  namespace opentherm {
23
21
 
24
22
  using std::string;
25
- using std::bitset;
26
- using std::stringstream;
27
23
  using std::to_string;
28
24
 
29
25
  static const char *const TAG = "opentherm";
@@ -224,7 +220,7 @@ void IRAM_ATTR OpenTherm::bit_read_(uint8_t value) {
224
220
  this->bit_pos_++;
225
221
  }
226
222
 
227
- ProtocolErrorType OpenTherm::verify_stop_bit_(uint8_t value) {
223
+ ProtocolErrorType IRAM_ATTR OpenTherm::verify_stop_bit_(uint8_t value) {
228
224
  if (value) { // stop bit detected
229
225
  return check_parity_(this->data_) ? ProtocolErrorType::NO_ERROR : ProtocolErrorType::PARITY_ERROR;
230
226
  } else { // no stop bit detected, error
@@ -369,7 +365,7 @@ void IRAM_ATTR OpenTherm::stop_timer_() {
369
365
 
370
366
  #ifdef ESP8266
371
367
  // 5 kHz timer_
372
- void OpenTherm::start_read_timer_() {
368
+ void IRAM_ATTR OpenTherm::start_read_timer_() {
373
369
  InterruptLock const lock;
374
370
  timer1_attachInterrupt(OpenTherm::esp8266_timer_isr);
375
371
  timer1_enable(TIM_DIV16, TIM_EDGE, TIM_LOOP); // 5MHz (5 ticks/us - 1677721.4 us max)
@@ -377,14 +373,14 @@ void OpenTherm::start_read_timer_() {
377
373
  }
378
374
 
379
375
  // 2 kHz timer_
380
- void OpenTherm::start_write_timer_() {
376
+ void IRAM_ATTR OpenTherm::start_write_timer_() {
381
377
  InterruptLock const lock;
382
378
  timer1_attachInterrupt(OpenTherm::esp8266_timer_isr);
383
379
  timer1_enable(TIM_DIV16, TIM_EDGE, TIM_LOOP); // 5MHz (5 ticks/us - 1677721.4 us max)
384
380
  timer1_write(2500); // 2kHz
385
381
  }
386
382
 
387
- void OpenTherm::stop_timer_() {
383
+ void IRAM_ATTR OpenTherm::stop_timer_() {
388
384
  InterruptLock const lock;
389
385
  timer1_disable();
390
386
  timer1_detachInterrupt();
@@ -393,7 +389,7 @@ void OpenTherm::stop_timer_() {
393
389
  #endif // END ESP8266
394
390
 
395
391
  // https://stackoverflow.com/questions/21617970/how-to-check-if-value-has-even-parity-of-bits-or-odd
396
- bool OpenTherm::check_parity_(uint32_t val) {
392
+ bool IRAM_ATTR OpenTherm::check_parity_(uint32_t val) {
397
393
  val ^= val >> 16;
398
394
  val ^= val >> 8;
399
395
  val ^= val >> 4;
@@ -545,29 +541,17 @@ const char *OpenTherm::message_id_to_str(MessageId id) {
545
541
  }
546
542
  }
547
543
 
548
- string OpenTherm::debug_data(OpenthermData &data) {
549
- stringstream result;
550
- result << bitset<8>(data.type) << " " << bitset<8>(data.id) << " " << bitset<8>(data.valueHB) << " "
551
- << bitset<8>(data.valueLB) << "\n";
552
- result << "type: " << this->message_type_to_str((MessageType) data.type) << "; ";
553
- result << "id: " << to_string(data.id) << "; ";
554
- result << "HB: " << to_string(data.valueHB) << "; ";
555
- result << "LB: " << to_string(data.valueLB) << "; ";
556
- result << "uint_16: " << to_string(data.u16()) << "; ";
557
- result << "float: " << to_string(data.f88());
558
-
559
- return result.str();
544
+ void OpenTherm::debug_data(OpenthermData &data) {
545
+ ESP_LOGD(TAG, "%s %s %s %s", format_bin(data.type).c_str(), format_bin(data.id).c_str(),
546
+ format_bin(data.valueHB).c_str(), format_bin(data.valueLB).c_str());
547
+ ESP_LOGD(TAG, "type: %s; id: %s; HB: %s; LB: %s; uint_16: %s; float: %s",
548
+ this->message_type_to_str((MessageType) data.type), to_string(data.id).c_str(),
549
+ to_string(data.valueHB).c_str(), to_string(data.valueLB).c_str(), to_string(data.u16()).c_str(),
550
+ to_string(data.f88()).c_str());
560
551
  }
561
- std::string OpenTherm::debug_error(OpenThermError &error) {
562
- stringstream result;
563
- result << "type: " << this->protocol_error_to_to_str(error.error_type) << "; ";
564
- result << "data: ";
565
- result << format_hex(error.data);
566
- result << "; clock: " << to_string(clock_);
567
- result << "; capture: " << bitset<32>(error.capture);
568
- result << "; bit_pos: " << to_string(error.bit_pos);
569
-
570
- return result.str();
552
+ void OpenTherm::debug_error(OpenThermError &error) const {
553
+ ESP_LOGD(TAG, "data: %s; clock: %s; capture: %s; bit_pos: %s", format_hex(error.data).c_str(),
554
+ to_string(clock_).c_str(), format_bin(error.capture).c_str(), to_string(error.bit_pos).c_str());
571
555
  }
572
556
 
573
557
  float OpenthermData::f88() { return ((float) this->s16()) / 256.0; }
@@ -8,10 +8,9 @@
8
8
  #pragma once
9
9
 
10
10
  #include <string>
11
- #include <sstream>
12
- #include <iomanip>
13
11
  #include "esphome/core/hal.h"
14
12
  #include "esphome/core/log.h"
13
+ #include "esphome/core/helpers.h"
15
14
 
16
15
  #if defined(ESP32) || defined(USE_ESP_IDF)
17
16
  #include "driver/timer.h"
@@ -318,8 +317,8 @@ class OpenTherm {
318
317
 
319
318
  OperationMode get_mode() { return mode_; }
320
319
 
321
- std::string debug_data(OpenthermData &data);
322
- std::string debug_error(OpenThermError &error);
320
+ void debug_data(OpenthermData &data);
321
+ void debug_error(OpenThermError &error) const;
323
322
 
324
323
  const char *protocol_error_to_to_str(ProtocolErrorType error_type);
325
324
  const char *message_type_to_str(MessageType message_type);
@@ -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
@@ -56,6 +57,7 @@ chip.cmd(0xC2, 0x00)
56
57
  chip.delay(10)
57
58
  chip.cmd(TEON, 0x00)
58
59
  chip.cmd(PIXFMT, 0x55)
60
+ chip.cmd(NORON)
59
61
 
60
62
  chip = DriverChip("AXS15231")
61
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
 
@@ -1,7 +1,7 @@
1
1
  #include "st7920.h"
2
- #include "esphome/core/log.h"
3
- #include "esphome/core/application.h"
4
2
  #include "esphome/components/display/display_buffer.h"
3
+ #include "esphome/core/application.h"
4
+ #include "esphome/core/log.h"
5
5
 
6
6
  namespace esphome {
7
7
  namespace st7920 {
@@ -118,7 +118,6 @@ size_t ST7920::get_buffer_length_() {
118
118
 
119
119
  void HOT ST7920::draw_absolute_pixel_internal(int x, int y, Color color) {
120
120
  if (x >= this->get_width_internal() || x < 0 || y >= this->get_height_internal() || y < 0) {
121
- ESP_LOGW(TAG, "Position out of area: %dx%d", x, y);
122
121
  return;
123
122
  }
124
123
  int width = this->get_width_internal() / 8u;
@@ -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.1"
3
+ __version__ = "2024.11.3"
4
4
 
5
5
  ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_"
6
6
  VALID_SUBSTITUTIONS_CHARACTERS = (
esphome/core/helpers.cpp CHANGED
@@ -397,6 +397,18 @@ std::string format_hex_pretty(const uint16_t *data, size_t length) {
397
397
  }
398
398
  std::string format_hex_pretty(const std::vector<uint16_t> &data) { return format_hex_pretty(data.data(), data.size()); }
399
399
 
400
+ std::string format_bin(const uint8_t *data, size_t length) {
401
+ std::string result;
402
+ result.resize(length * 8);
403
+ for (size_t byte_idx = 0; byte_idx < length; byte_idx++) {
404
+ for (size_t bit_idx = 0; bit_idx < 8; bit_idx++) {
405
+ result[byte_idx * 8 + bit_idx] = ((data[byte_idx] >> (7 - bit_idx)) & 1) + '0';
406
+ }
407
+ }
408
+
409
+ return result;
410
+ }
411
+
400
412
  ParseOnOffState parse_on_off(const char *str, const char *on, const char *off) {
401
413
  if (on == nullptr && strcasecmp(str, "on") == 0)
402
414
  return PARSE_ON;
esphome/core/helpers.h CHANGED
@@ -420,6 +420,14 @@ template<typename T, enable_if_t<std::is_unsigned<T>::value, int> = 0> std::stri
420
420
  return format_hex_pretty(reinterpret_cast<uint8_t *>(&val), sizeof(T));
421
421
  }
422
422
 
423
+ /// Format the byte array \p data of length \p len in binary.
424
+ std::string format_bin(const uint8_t *data, size_t length);
425
+ /// Format an unsigned integer in binary, starting with the most significant byte.
426
+ template<typename T, enable_if_t<std::is_unsigned<T>::value, int> = 0> std::string format_bin(T val) {
427
+ val = convert_big_endian(val);
428
+ return format_bin(reinterpret_cast<uint8_t *>(&val), sizeof(T));
429
+ }
430
+
423
431
  /// Return values for parse_on_off().
424
432
  enum ParseOnOffState {
425
433
  PARSE_NONE = 0,
esphome/core/time.cpp CHANGED
@@ -5,20 +5,18 @@
5
5
 
6
6
  namespace esphome {
7
7
 
8
- bool is_leap_year(uint32_t year) { return (year % 4) == 0 && ((year % 100) != 0 || (year % 400) == 0); }
9
-
10
8
  uint8_t days_in_month(uint8_t month, uint16_t year) {
11
9
  static const uint8_t DAYS_IN_MONTH[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
12
- uint8_t days = DAYS_IN_MONTH[month];
13
- if (month == 2 && is_leap_year(year))
10
+ if (month == 2 && (year % 4 == 0))
14
11
  return 29;
15
- return days;
12
+ return DAYS_IN_MONTH[month];
16
13
  }
17
14
 
18
15
  size_t ESPTime::strftime(char *buffer, size_t buffer_len, const char *format) {
19
16
  struct tm c_tm = this->to_c_tm();
20
17
  return ::strftime(buffer, buffer_len, format, &c_tm);
21
18
  }
19
+
22
20
  ESPTime ESPTime::from_c_tm(struct tm *c_tm, time_t c_time) {
23
21
  ESPTime res{};
24
22
  res.second = uint8_t(c_tm->tm_sec);
@@ -33,6 +31,7 @@ ESPTime ESPTime::from_c_tm(struct tm *c_tm, time_t c_time) {
33
31
  res.timestamp = c_time;
34
32
  return res;
35
33
  }
34
+
36
35
  struct tm ESPTime::to_c_tm() {
37
36
  struct tm c_tm {};
38
37
  c_tm.tm_sec = this->second;
@@ -46,6 +45,7 @@ struct tm ESPTime::to_c_tm() {
46
45
  c_tm.tm_isdst = this->is_dst;
47
46
  return c_tm;
48
47
  }
48
+
49
49
  std::string ESPTime::strftime(const std::string &format) {
50
50
  std::string timestr;
51
51
  timestr.resize(format.size() * 4);
@@ -142,6 +142,7 @@ void ESPTime::increment_second() {
142
142
  this->year++;
143
143
  }
144
144
  }
145
+
145
146
  void ESPTime::increment_day() {
146
147
  this->timestamp += 86400;
147
148
 
@@ -159,23 +160,22 @@ void ESPTime::increment_day() {
159
160
  this->year++;
160
161
  }
161
162
  }
163
+
162
164
  void ESPTime::recalc_timestamp_utc(bool use_day_of_year) {
163
165
  time_t res = 0;
164
-
165
166
  if (!this->fields_in_range()) {
166
167
  this->timestamp = -1;
167
168
  return;
168
169
  }
169
170
 
170
171
  for (int i = 1970; i < this->year; i++)
171
- res += is_leap_year(i) ? 366 : 365;
172
+ res += (i % 4 == 0) ? 366 : 365;
172
173
 
173
174
  if (use_day_of_year) {
174
175
  res += this->day_of_year - 1;
175
176
  } else {
176
177
  for (int i = 1; i < this->month; i++)
177
178
  res += days_in_month(i, this->year);
178
-
179
179
  res += this->day_of_month - 1;
180
180
  }
181
181
 
@@ -188,13 +188,17 @@ void ESPTime::recalc_timestamp_utc(bool use_day_of_year) {
188
188
  this->timestamp = res;
189
189
  }
190
190
 
191
- void ESPTime::recalc_timestamp_local(bool use_day_of_year) {
192
- this->recalc_timestamp_utc(use_day_of_year);
193
- this->timestamp -= ESPTime::timezone_offset();
194
- ESPTime temp = ESPTime::from_epoch_local(this->timestamp);
195
- if (temp.is_dst) {
196
- this->timestamp -= 3600;
197
- }
191
+ void ESPTime::recalc_timestamp_local() {
192
+ struct tm tm;
193
+
194
+ tm.tm_year = this->year - 1900;
195
+ tm.tm_mon = this->month - 1;
196
+ tm.tm_mday = this->day_of_month;
197
+ tm.tm_hour = this->hour;
198
+ tm.tm_min = this->minute;
199
+ tm.tm_sec = this->second;
200
+
201
+ this->timestamp = mktime(&tm);
198
202
  }
199
203
 
200
204
  int32_t ESPTime::timezone_offset() {
esphome/core/time.h CHANGED
@@ -9,8 +9,6 @@ namespace esphome {
9
9
 
10
10
  template<typename T> bool increment_time_value(T &current, uint16_t begin, uint16_t end);
11
11
 
12
- bool is_leap_year(uint32_t year);
13
-
14
12
  uint8_t days_in_month(uint8_t month, uint16_t year);
15
13
 
16
14
  /// A more user-friendly version of struct tm from time.h
@@ -100,7 +98,7 @@ struct ESPTime {
100
98
  void recalc_timestamp_utc(bool use_day_of_year = true);
101
99
 
102
100
  /// Recalculate the timestamp field from the other fields of this ESPTime instance assuming local fields.
103
- void recalc_timestamp_local(bool use_day_of_year = true);
101
+ void recalc_timestamp_local();
104
102
 
105
103
  /// Convert this ESPTime instance back to a tm struct.
106
104
  struct tm to_c_tm();
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: esphome
3
- Version: 2024.11.1
3
+ Version: 2024.11.3
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
@@ -1,11 +1,11 @@
1
1
  esphome/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- esphome/__main__.py,sha256=E1u7qlHE26zOlKCuZEiAHwhoy9Tw0rLLFR8wUsBQibQ,31128
2
+ esphome/__main__.py,sha256=3Z8bUb-vZ-UD2mr88yLxMD4PSboeqMPtGcxq58xTCUw,31133
3
3
  esphome/automation.py,sha256=9xmW3AmWDd2oKB7zF-UITYIiSci8ys8qiylK-rcU7Rg,15689
4
4
  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=oDvb9zE2wQ8gEmq6yEdcTJpEoUljU6Kp1S8pwZTbOJs,40259
8
+ esphome/const.py,sha256=6lL20ACCfaDhvLkJ5Pd2nLGL_x7xh5s2pLlf631e5go,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
@@ -625,7 +625,7 @@ esphome/components/datetime/__init__.py,sha256=H0BIMfaUhbNlh6HglQf9w5noYQBBX_ZAv
625
625
  esphome/components/datetime/date_entity.cpp,sha256=UieYXahuBlffSwaMz2n1ce_bZvrXi14dIjhmsxkRcrY,3690
626
626
  esphome/components/datetime/date_entity.h,sha256=72vM34Ap7iUPoOtGMpudEQ_4489zY13UHhX3tzZopiY,2584
627
627
  esphome/components/datetime/datetime_base.h,sha256=TnyfE4Av_Tz0O_H2MHc_TCIqlRJ1YYyleBJbeTIkrxg,1197
628
- esphome/components/datetime/datetime_entity.cpp,sha256=Gcl-GTn7ocfLAKGgUu6wiH1oNC8IMn5TES0DWAe_mZs,7925
628
+ esphome/components/datetime/datetime_entity.cpp,sha256=LBwEFGBgnxaHcr87sBuW0Edt6ABvEE3SKtN5eGHGzXU,7742
629
629
  esphome/components/datetime/datetime_entity.h,sha256=qN4CuohdTVq5g0VKrl8whUE1FjFFvIqlxTCOzzDNfws,3742
630
630
  esphome/components/datetime/time_entity.cpp,sha256=k9ZEtOs4SIO3GCwc-SmKExwYiiyDDqra5Lxw6b7fW2M,4403
631
631
  esphome/components/datetime/time_entity.h,sha256=rNN9V8UH4ervs03lsuvR233dD13LYceAy597vXbURcY,2915
@@ -767,7 +767,7 @@ esphome/components/es8311/audio_dac.py,sha256=aGpvvL4ftBaYMACjvL9RbGXi9iwEvuv97e
767
767
  esphome/components/es8311/es8311.cpp,sha256=ueFDZsNbpY9w9us6MBa7nldqRFXc969wzGpjFIk7NyY,7029
768
768
  esphome/components/es8311/es8311.h,sha256=XM3joN7HWuFu7Q1EGl7abfknRCyjpIs_KffM_oRM6eY,4680
769
769
  esphome/components/es8311/es8311_const.h,sha256=bUBF4DJ28DcLPHznvh30Guewi65mSqQbqNPK0NiM8fI,12566
770
- esphome/components/esp32/__init__.py,sha256=bheRUD4iScNy9zjnujlA1baiSvP1E8x0t15U8AeAxH4,27655
770
+ esphome/components/esp32/__init__.py,sha256=qe85wyWtu0Ho0GXUkZ3_kOk3QpeHTmMRsukdWl3dC8s,27569
771
771
  esphome/components/esp32/boards.py,sha256=hfVvFE8LwjrzJlQX9b0yZ53xv9XaF24wctAOE6SYDXY,46903
772
772
  esphome/components/esp32/const.py,sha256=2yxLQg3p2-S3nRL6-zsF_dICrP_6waUfY5k8EFsoyVM,966
773
773
  esphome/components/esp32/core.cpp,sha256=GfidaExP8kU7ODM1S_VI9c3tQtmG2TaKwLJ-zzeSqd4,2413
@@ -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
@@ -1457,22 +1457,22 @@ 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
- esphome/components/lvgl/defines.py,sha256=UtXGBexJNUgFuOrAtGEyDcRp0qLioLG0VLr8f-UQbMo,13414
1462
+ esphome/components/lvgl/defines.py,sha256=lZd-GHPf3-BPm0CIAXqsgbQXplVzdRP588unlshk-I8,13422
1463
1463
  esphome/components/lvgl/encoders.py,sha256=l296tfKdDzhRNPmU1chvAosNRrmBhITlB43OtNVBrRw,3189
1464
1464
  esphome/components/lvgl/font.cpp,sha256=l9dPIw7LdOdtg_3QZErTLLevMc6A66Wfm-1s-6qcBmM,2712
1465
1465
  esphome/components/lvgl/gradient.py,sha256=K60e7b52N8i7aQjkLIsij7OOXmVhBnJnxj4J3zPme4w,1989
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
- esphome/components/lvgl/lvgl_esphome.h,sha256=DbwbGatY62fONYXhObsUGjAxpSOq7Abrt1I91IMeBEA,11916
1472
+ esphome/components/lvgl/lvgl_esphome.h,sha256=wl_4lghlBPbbCm8IMC-ujn9gBEMjKrq49XQoWx1gg8s,12055
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,10 +1501,10 @@ 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=DmW8IL7PRC_aXqFgHigQ_w-7vZ2eNemP4d1z-TmnTsA,1594
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
- esphome/components/lvgl/widgets/msgbox.py,sha256=xiB_-lOhsIDoeYpmf_66fdiq-2yd1wloBb_6beg5ZwI,5273
1507
+ esphome/components/lvgl/widgets/msgbox.py,sha256=sTU5RreSucFoow1hMojuf2qAWL_IAlAl57I4FfDbAds,5329
1508
1508
  esphome/components/lvgl/widgets/obj.py,sha256=1axn8eUzZFHlDrwmgZyeE5tBChHI9JymfNjBAiFmig0,818
1509
1509
  esphome/components/lvgl/widgets/page.py,sha256=nV9LaXtHPdno2nfOvI6i2yPR5COsJdh7azqg8U5tElA,4957
1510
1510
  esphome/components/lvgl/widgets/qrcode.py,sha256=ZA81FZFRAHu2PZ7MrL-QepQoEmEHL6v2ZjBv-m7PWws,1697
@@ -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
@@ -1952,17 +1952,17 @@ esphome/components/online_image/image_decoder.cpp,sha256=dStR78DZj-Hq8qwB1iQj1Qn
1952
1952
  esphome/components/online_image/image_decoder.h,sha256=lMuliobeyV4svC-1i97WR8x1nyjPWZxqIdIxDXW1DcA,3601
1953
1953
  esphome/components/online_image/online_image.cpp,sha256=CXoVZaVPI0cH7vIeA_LU5GVHfldM41tcjuQOQDdpRrA,8246
1954
1954
  esphome/components/online_image/online_image.h,sha256=R4zz_LDYSDvPv8nyli0tv4kdKzPjsz2UfDO57cf8oPI,6146
1955
- esphome/components/online_image/png_image.cpp,sha256=kJusEAAe8qOVehR0w39Occ8JP53KZWfvl94l9niwPwQ,2213
1955
+ esphome/components/online_image/png_image.cpp,sha256=1UbsB3NSmTBCSQW1isA6GvY-o-ZSJovDoQgmqeiXwS4,2313
1956
1956
  esphome/components/online_image/png_image.h,sha256=7xHJ3y0oPr9Vn9lswq1HDf1ymZhNGUXFRWSph1evN4w,752
1957
1957
  esphome/components/opentherm/__init__.py,sha256=Y-yowfGAC-GTqThaO6w-LlEcUap8xKGoOuNSSadGJWc,2942
1958
1958
  esphome/components/opentherm/const.py,sha256=Ycg4vJVqUBwSrd0xl9rsl7eDHhNsYzMiuC9b2YO9Yn0,224
1959
1959
  esphome/components/opentherm/generate.py,sha256=6qFmOHNbqhWjefP5gS3osZZ2Ms1QmMqCpicqqONMuHk,5185
1960
- esphome/components/opentherm/hub.cpp,sha256=Y-lX5B55GWNr964bwoNSHLunVwIzY_3VfPzv_7YiVf8,16596
1960
+ esphome/components/opentherm/hub.cpp,sha256=pvPTOzE4ha3JcpJwSerDupaXd2IAbqOKsfvetnheGB4,16573
1961
1961
  esphome/components/opentherm/hub.h,sha256=AO0ibAIvh9f1AzFkPfgLqng7lH6QeQDLAyg2LQAkDbc,5642
1962
1962
  esphome/components/opentherm/input.h,sha256=Ln8Sx1mMonhk64RrYTzAeLEJxEgIYtBTRpHgK7pNm1U,482
1963
1963
  esphome/components/opentherm/input.py,sha256=VhzCj5IX2UBpLmmCXxNIRmB6tXdA10tjHfqInydTZ_o,1758
1964
- esphome/components/opentherm/opentherm.cpp,sha256=PcMGAbACz-BFS2AHKkF60iHFsfUznDG9F1QWQES_Mc4,18654
1965
- esphome/components/opentherm/opentherm.h,sha256=D5HIEnu9XxuKK_V9AxyVmoZ45yLYI3qWv8fYLxK2fRg,11027
1964
+ esphome/components/opentherm/opentherm.cpp,sha256=ha6EGKelFMrz4RGHwn9n1b66oi7Kh9eNdFf5wBBf1zk,18425
1965
+ esphome/components/opentherm/opentherm.h,sha256=NNYwkSuV_FQLmtQC8zBt1a-d42JEqR1uhtAvwu-VwhI,11015
1966
1966
  esphome/components/opentherm/opentherm_macros.h,sha256=krT4qqOKnPeuELRadTjxiKrOaIpXFBG0e2ifNukSbP4,5914
1967
1967
  esphome/components/opentherm/schema.py,sha256=Wb_kvZPcLNSeT2FGU3ntA8skdOLJV-NRSZnS_4qXYNY,26580
1968
1968
  esphome/components/opentherm/validate.py,sha256=UWXgoEzGVTt0dHIOiwSWFsM92ZeEtRLWAsnAwIjLzhk,908
@@ -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=d0SVPgOyuHgDzdXAPomACtUibZjS2vaO10K4Ka-pGy4,1349
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
@@ -2688,13 +2688,13 @@ esphome/components/st7789v/st7789v.cpp,sha256=fr_ZnpTHbj_Dje78kKCQ4e3WZax3hUB1JV
2688
2688
  esphome/components/st7789v/st7789v.h,sha256=cYoLFeohRe-PoISfffZyXS7IcZ7JhAzjlx4QHEQbVXo,9059
2689
2689
  esphome/components/st7920/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2690
2690
  esphome/components/st7920/display.py,sha256=3rFVK-Oyx-XJ4G4t4LP9qKIFZwE6Skpl6Skbg_-3qj0,1222
2691
- esphome/components/st7920/st7920.cpp,sha256=kgbNxEP2we-3RKEmDiU36gho3Qi3iKzIVhTmeB1VLDs,4343
2691
+ esphome/components/st7920/st7920.cpp,sha256=cgY6hA6NePx-5MrtUmkO36kp2ICKA9XpUArfj8N34zI,4287
2692
2692
  esphome/components/st7920/st7920.h,sha256=kB1JFbO1zhBazPF-pGKfD3FeKeiwl_OaOw1oEM6ffyw,1630
2693
2693
  esphome/components/statsd/__init__.py,sha256=l8GtFsbqmF4uWjc8bQ6JugaP4XomCB1SqCXQmdG-Zww,1936
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
@@ -3318,8 +3318,8 @@ esphome/core/entity_base.h,sha256=y9pPjHUxtiadpSzUroBp8-YomztwZnzPVS6GF33YI3U,28
3318
3318
  esphome/core/entity_helpers.py,sha256=s5lYCG5hu_1SROtSWgzI0T6802l5-I8udGy1_6HNSdc,2337
3319
3319
  esphome/core/gpio.h,sha256=hy9jEWuCG6Q_AU74viToIab-p5ZnGik4pM4E3AieK8k,2407
3320
3320
  esphome/core/hal.h,sha256=e3qFkax3jfncEusf3kwXCts0Ai7D4XspJgh-VqVDcK4,844
3321
- esphome/core/helpers.cpp,sha256=SpXOMnhMEF3SK756CgT1GF-PV4bNDXXcjJI7DZ5ueuI,24314
3322
- esphome/core/helpers.h,sha256=-toQeaN6qgT9C1vnq31-wptuRwMzIkz_jjKyQTeGfCk,27598
3321
+ esphome/core/helpers.cpp,sha256=2bE18LUT1oXnYvVqYcM21KmboK03Rulg1IiOjVOfhXE,24659
3322
+ esphome/core/helpers.h,sha256=Mfjc0D5Qkx7D0H2YoOZKTb1JSjJdXYqiD102NcuQCJY,28009
3323
3323
  esphome/core/log.cpp,sha256=MDCx87ytW6Fz6basxYUpagkubFzUKO1ysvU5RXbXoII,1581
3324
3324
  esphome/core/log.h,sha256=sMwmrs64vOG0G9jIibKJWv_C-COl175T8JymmBVRHWI,6369
3325
3325
  esphome/core/macros.h,sha256=YRip3XYzXw2pg3AFpBFA0Js-Y5GMtPkuCp2km2g5uhc,196
@@ -3331,8 +3331,8 @@ esphome/core/scheduler.cpp,sha256=fH2E-e0jQ0nd90lojK5voee1lBY7rYzLWWjWZj6rbHA,12
3331
3331
  esphome/core/scheduler.h,sha256=OZaBsLlo2R2nJvYcq7LyUGPXLzLAJdMEmtBewWF_9Ps,2455
3332
3332
  esphome/core/string_ref.cpp,sha256=of1TYMY6t3t4HjjPLSiItuPSa62AMG0lK_CU2HS1RvM,242
3333
3333
  esphome/core/string_ref.h,sha256=uPLS1v13VMOltkXO3bL3owdX9P3s9CMnhVtkaphTdDQ,5208
3334
- esphome/core/time.cpp,sha256=vtZr6pMxRT4rPuSO9m9A6-20-n8nd6QWX5BIti7xd_s,7711
3335
- esphome/core/time.h,sha256=r_9TIL6q9t4poF5FQsoCWdY8mgk6EjvOmJKBUVfbO7g,4409
3334
+ esphome/core/time.cpp,sha256=dlJ1rXxBESGehrcxlHLA_il9hWdPBD-sTga_PS1eBOQ,7582
3335
+ esphome/core/time.h,sha256=aQd7M_tO2X5ErvjTxpB6LmvdwJQjGlEfaqYe8rMkYWY,4347
3336
3336
  esphome/core/util.cpp,sha256=gbTBqOdLxWIxv9h8HFrLPZ96HZI6PBY-WBB_gdiqEts,774
3337
3337
  esphome/core/util.h,sha256=UeGZvUEvEaOMxLqJOA7GE178z5U37681RtFk6Ho1KCw,407
3338
3338
  esphome/core/version.h,sha256=HkOTdiyOMRgIuYAAXpsN_8_IKye3rMK0LbtpcjZVXqY,431
@@ -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.1.dist-info/LICENSE,sha256=HzEjkBInJe44L4WvAOPfhPJJDNj6YbnqFyvGWRzArGM,36664
3359
- esphome-2024.11.1.dist-info/METADATA,sha256=OkKwQUu72jOkGlFwAb3s8fV8bhV5cKcuqKLNmvpltgM,3453
3360
- esphome-2024.11.1.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
3361
- esphome-2024.11.1.dist-info/entry_points.txt,sha256=mIxVNuWtbYzeEcaWCl-AQ-97aBOWbnYBAK8nbF6P4M0,50
3362
- esphome-2024.11.1.dist-info/top_level.txt,sha256=0GSXEW3cnITpgG3qnsSMz0qoqJHAFyfw7Y8MVtEf1Yk,8
3363
- esphome-2024.11.1.dist-info/RECORD,,
3358
+ esphome-2024.11.3.dist-info/LICENSE,sha256=HzEjkBInJe44L4WvAOPfhPJJDNj6YbnqFyvGWRzArGM,36664
3359
+ esphome-2024.11.3.dist-info/METADATA,sha256=tbyLM_ZenDrRkub95xIGYX_JfL1vMTCv1Oy-kH1g__0,3453
3360
+ esphome-2024.11.3.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
3361
+ esphome-2024.11.3.dist-info/entry_points.txt,sha256=mIxVNuWtbYzeEcaWCl-AQ-97aBOWbnYBAK8nbF6P4M0,50
3362
+ esphome-2024.11.3.dist-info/top_level.txt,sha256=0GSXEW3cnITpgG3qnsSMz0qoqJHAFyfw7Y8MVtEf1Yk,8
3363
+ esphome-2024.11.3.dist-info/RECORD,,