esphome 2025.8.4__py3-none-any.whl → 2025.9.0b2__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 (364) hide show
  1. esphome/__main__.py +177 -105
  2. esphome/components/absolute_humidity/absolute_humidity.cpp +3 -5
  3. esphome/components/adc/__init__.py +1 -26
  4. esphome/components/adc/adc_sensor_esp32.cpp +29 -6
  5. esphome/components/adc/sensor.py +20 -0
  6. esphome/components/ags10/ags10.cpp +3 -18
  7. esphome/components/ags10/ags10.h +2 -12
  8. esphome/components/aht10/aht10.cpp +3 -3
  9. esphome/components/airthings_ble/__init__.py +2 -2
  10. esphome/components/alarm_control_panel/__init__.py +2 -2
  11. esphome/components/am2315c/am2315c.cpp +1 -17
  12. esphome/components/am2315c/am2315c.h +2 -3
  13. esphome/components/api/__init__.py +2 -2
  14. esphome/components/api/api_connection.cpp +38 -34
  15. esphome/components/api/api_connection.h +20 -40
  16. esphome/components/api/api_frame_helper.cpp +25 -25
  17. esphome/components/api/api_frame_helper.h +3 -3
  18. esphome/components/api/api_frame_helper_noise.cpp +75 -40
  19. esphome/components/api/api_frame_helper_noise.h +3 -7
  20. esphome/components/api/api_frame_helper_plaintext.cpp +17 -4
  21. esphome/components/api/api_frame_helper_plaintext.h +1 -4
  22. esphome/components/api/api_pb2.cpp +12 -2
  23. esphome/components/api/api_pb2.h +144 -143
  24. esphome/components/api/api_pb2_dump.cpp +6 -1
  25. esphome/components/api/api_pb2_service.cpp +0 -14
  26. esphome/components/api/api_pb2_service.h +1 -3
  27. esphome/components/api/client.py +5 -3
  28. esphome/components/api/proto.cpp +33 -37
  29. esphome/components/async_tcp/__init__.py +2 -2
  30. esphome/components/atm90e26/sensor.py +2 -0
  31. esphome/components/atm90e32/sensor.py +4 -2
  32. esphome/components/audio_adc/__init__.py +2 -2
  33. esphome/components/audio_dac/__init__.py +2 -2
  34. esphome/components/axs15231/touchscreen/axs15231_touchscreen.cpp +1 -1
  35. esphome/components/bedjet/bedjet_hub.cpp +1 -1
  36. esphome/components/binary_sensor/__init__.py +2 -2
  37. esphome/components/binary_sensor/binary_sensor.cpp +13 -0
  38. esphome/components/binary_sensor/binary_sensor.h +4 -7
  39. esphome/components/bl0940/__init__.py +6 -1
  40. esphome/components/bl0940/bl0940.cpp +178 -41
  41. esphome/components/bl0940/bl0940.h +121 -76
  42. esphome/components/bl0940/button/__init__.py +27 -0
  43. esphome/components/bl0940/button/calibration_reset_button.cpp +20 -0
  44. esphome/components/bl0940/button/calibration_reset_button.h +19 -0
  45. esphome/components/bl0940/number/__init__.py +94 -0
  46. esphome/components/bl0940/number/calibration_number.cpp +29 -0
  47. esphome/components/bl0940/number/calibration_number.h +26 -0
  48. esphome/components/bl0940/sensor.py +151 -2
  49. esphome/components/bl0942/bl0942.cpp +1 -1
  50. esphome/components/ble_client/output/__init__.py +4 -4
  51. esphome/components/bluetooth_proxy/__init__.py +1 -1
  52. esphome/components/bluetooth_proxy/bluetooth_connection.h +1 -1
  53. esphome/components/bluetooth_proxy/bluetooth_proxy.cpp +15 -7
  54. esphome/components/bluetooth_proxy/bluetooth_proxy.h +6 -3
  55. esphome/components/button/__init__.py +2 -2
  56. esphome/components/button/button.cpp +13 -0
  57. esphome/components/button/button.h +4 -7
  58. esphome/components/camera/buffer.h +18 -0
  59. esphome/components/camera/buffer_impl.cpp +20 -0
  60. esphome/components/camera/buffer_impl.h +26 -0
  61. esphome/components/camera/camera.h +43 -0
  62. esphome/components/camera/encoder.h +69 -0
  63. esphome/components/camera_encoder/__init__.py +62 -0
  64. esphome/components/camera_encoder/encoder_buffer_impl.cpp +23 -0
  65. esphome/components/camera_encoder/encoder_buffer_impl.h +25 -0
  66. esphome/components/camera_encoder/esp32_camera_jpeg_encoder.cpp +82 -0
  67. esphome/components/camera_encoder/esp32_camera_jpeg_encoder.h +39 -0
  68. esphome/components/captive_portal/__init__.py +2 -2
  69. esphome/components/captive_portal/captive_index.h +77 -97
  70. esphome/components/captive_portal/captive_portal.cpp +35 -12
  71. esphome/components/captive_portal/captive_portal.h +3 -3
  72. esphome/components/ccs811/ccs811.cpp +3 -3
  73. esphome/components/climate/__init__.py +2 -2
  74. esphome/components/climate/climate.cpp +1 -1
  75. esphome/components/cover/__init__.py +5 -5
  76. esphome/components/cover/cover.cpp +1 -1
  77. esphome/components/cover/cover.h +2 -2
  78. esphome/components/dallas_temp/dallas_temp.cpp +2 -2
  79. esphome/components/datetime/__init__.py +2 -2
  80. esphome/components/datetime/date_entity.h +2 -2
  81. esphome/components/datetime/datetime_entity.h +2 -2
  82. esphome/components/datetime/time_entity.h +2 -2
  83. esphome/components/debug/debug_esp32.cpp +1 -1
  84. esphome/components/display/__init__.py +4 -4
  85. esphome/components/duty_time/duty_time_sensor.cpp +1 -1
  86. esphome/components/esp32/__init__.py +0 -5
  87. esphome/components/esp32/gpio.cpp +27 -23
  88. esphome/components/esp32/gpio.h +26 -11
  89. esphome/components/esp32/preferences.cpp +8 -4
  90. esphome/components/esp32_ble/__init__.py +7 -2
  91. esphome/components/esp32_ble/ble_uuid.cpp +30 -9
  92. esphome/components/esp32_ble_beacon/esp32_ble_beacon.cpp +4 -3
  93. esphome/components/esp32_ble_client/ble_client_base.cpp +7 -3
  94. esphome/components/esp32_ble_client/ble_client_base.h +8 -5
  95. esphome/components/esp32_ble_tracker/__init__.py +2 -2
  96. esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +11 -47
  97. esphome/components/esp32_ble_tracker/esp32_ble_tracker.h +2 -14
  98. esphome/components/esp8266/__init__.py +2 -2
  99. esphome/components/esp8266/core.cpp +2 -2
  100. esphome/components/esp8266/gpio.py +4 -4
  101. esphome/components/esp8266/preferences.cpp +30 -28
  102. esphome/components/esphome/ota/__init__.py +2 -2
  103. esphome/components/esphome/ota/ota_esphome.cpp +21 -19
  104. esphome/components/esphome/ota/ota_esphome.h +6 -5
  105. esphome/components/ethernet/__init__.py +7 -2
  106. esphome/components/ethernet/ethernet_component.cpp +49 -3
  107. esphome/components/ethernet/ethernet_component.h +2 -0
  108. esphome/components/event/__init__.py +2 -2
  109. esphome/components/event/event.h +4 -4
  110. esphome/components/factory_reset/button/factory_reset_button.cpp +18 -1
  111. esphome/components/factory_reset/button/factory_reset_button.h +6 -1
  112. esphome/components/factory_reset/switch/factory_reset_switch.cpp +18 -1
  113. esphome/components/factory_reset/switch/factory_reset_switch.h +5 -1
  114. esphome/components/fan/__init__.py +2 -2
  115. esphome/components/fan/fan.cpp +2 -1
  116. esphome/components/gdk101/gdk101.cpp +4 -4
  117. esphome/components/globals/__init__.py +2 -2
  118. esphome/components/gpio/binary_sensor/gpio_binary_sensor.cpp +19 -18
  119. esphome/components/gpio_expander/cached_gpio.h +36 -16
  120. esphome/components/grove_gas_mc_v2/grove_gas_mc_v2.cpp +5 -5
  121. esphome/components/gt911/touchscreen/gt911_touchscreen.cpp +1 -1
  122. esphome/components/haier/haier_base.cpp +1 -1
  123. esphome/components/haier/hon_climate.cpp +1 -1
  124. esphome/components/hlw8012/hlw8012.cpp +5 -5
  125. esphome/components/honeywellabp2_i2c/honeywellabp2.cpp +4 -4
  126. esphome/components/host/preferences.h +3 -2
  127. esphome/components/hte501/hte501.cpp +3 -21
  128. esphome/components/hte501/hte501.h +2 -3
  129. esphome/components/http_request/ota/__init__.py +2 -2
  130. esphome/components/i2c/__init__.py +2 -2
  131. esphome/components/i2c/i2c.cpp +13 -9
  132. esphome/components/i2c/i2c_bus.h +36 -6
  133. esphome/components/i2s_audio/__init__.py +8 -2
  134. esphome/components/i2s_audio/media_player/__init__.py +1 -1
  135. esphome/components/i2s_audio/microphone/__init__.py +1 -1
  136. esphome/components/i2s_audio/speaker/__init__.py +1 -1
  137. esphome/components/ina2xx_base/__init__.py +4 -2
  138. esphome/components/inkplate/__init__.py +1 -0
  139. esphome/components/inkplate/const.py +105 -0
  140. esphome/components/inkplate/display.py +238 -0
  141. esphome/components/{inkplate6 → inkplate}/inkplate.cpp +156 -74
  142. esphome/components/{inkplate6 → inkplate}/inkplate.h +28 -68
  143. esphome/components/inkplate6/__init__.py +0 -1
  144. esphome/components/inkplate6/display.py +2 -211
  145. esphome/components/integration/integration_sensor.cpp +1 -1
  146. esphome/components/json/__init__.py +2 -2
  147. esphome/components/lc709203f/lc709203f.cpp +4 -17
  148. esphome/components/lc709203f/lc709203f.h +2 -3
  149. esphome/components/ld2420/text_sensor/{text_sensor.cpp → ld2420_text_sensor.cpp} +1 -1
  150. esphome/components/ld2450/ld2450.cpp +1 -1
  151. esphome/components/libretiny/preferences.cpp +13 -5
  152. esphome/components/light/__init__.py +2 -2
  153. esphome/components/light/addressable_light_effect.h +7 -0
  154. esphome/components/light/base_light_effects.h +8 -0
  155. esphome/components/light/light_call.cpp +22 -20
  156. esphome/components/light/light_effect.cpp +36 -0
  157. esphome/components/light/light_effect.h +14 -0
  158. esphome/components/light/light_json_schema.cpp +9 -1
  159. esphome/components/light/light_state.cpp +2 -2
  160. esphome/components/light/light_state.h +38 -0
  161. esphome/components/lock/__init__.py +2 -2
  162. esphome/components/lock/lock.h +2 -2
  163. esphome/components/logger/__init__.py +2 -2
  164. esphome/components/logger/logger.cpp +25 -4
  165. esphome/components/logger/logger.h +1 -1
  166. esphome/components/logger/logger_esp32.cpp +16 -8
  167. esphome/components/logger/logger_esp8266.cpp +11 -3
  168. esphome/components/logger/logger_libretiny.cpp +13 -3
  169. esphome/components/logger/logger_rp2040.cpp +14 -3
  170. esphome/components/logger/logger_zephyr.cpp +15 -4
  171. esphome/components/lvgl/defines.py +1 -0
  172. esphome/components/lvgl/hello_world.py +96 -33
  173. esphome/components/lvgl/number/lvgl_number.h +1 -1
  174. esphome/components/lvgl/select/lvgl_select.h +1 -1
  175. esphome/components/lvgl/widgets/__init__.py +0 -1
  176. esphome/components/lvgl/widgets/spinbox.py +20 -11
  177. esphome/components/m5stack_8angle/binary_sensor/m5stack_8angle_binary_sensor.cpp +1 -1
  178. esphome/components/m5stack_8angle/sensor/m5stack_8angle_sensor.cpp +1 -1
  179. esphome/components/mapping/__init__.py +13 -5
  180. esphome/components/mapping/mapping.h +69 -0
  181. esphome/components/max17043/max17043.cpp +2 -2
  182. esphome/components/mcp23016/__init__.py +1 -0
  183. esphome/components/mcp23016/mcp23016.cpp +20 -5
  184. esphome/components/mcp23016/mcp23016.h +10 -4
  185. esphome/components/mcp23x08_base/mcp23x08_base.cpp +1 -1
  186. esphome/components/mcp23x17_base/mcp23x17_base.cpp +2 -2
  187. esphome/components/md5/md5.cpp +3 -2
  188. esphome/components/mdns/__init__.py +2 -2
  189. esphome/components/mdns/mdns_component.cpp +145 -54
  190. esphome/components/media_player/__init__.py +2 -2
  191. esphome/components/micro_wake_word/__init__.py +2 -2
  192. esphome/components/microphone/__init__.py +2 -2
  193. esphome/components/mipi/__init__.py +77 -33
  194. esphome/components/mipi_rgb/__init__.py +2 -0
  195. esphome/components/mipi_rgb/display.py +321 -0
  196. esphome/components/mipi_rgb/mipi_rgb.cpp +388 -0
  197. esphome/components/mipi_rgb/mipi_rgb.h +127 -0
  198. esphome/components/mipi_rgb/models/guition.py +24 -0
  199. esphome/components/mipi_rgb/models/lilygo.py +228 -0
  200. esphome/components/mipi_rgb/models/rpi.py +9 -0
  201. esphome/components/mipi_rgb/models/st7701s.py +214 -0
  202. esphome/components/mipi_rgb/models/waveshare.py +64 -0
  203. esphome/components/mipi_spi/models/jc.py +229 -0
  204. esphome/components/mlx90614/mlx90614.cpp +1 -16
  205. esphome/components/mlx90614/mlx90614.h +0 -1
  206. esphome/components/mqtt/__init__.py +2 -2
  207. esphome/components/mqtt/mqtt_sensor.cpp +7 -2
  208. esphome/components/ms5611/ms5611.cpp +7 -6
  209. esphome/components/network/__init__.py +2 -2
  210. esphome/components/nextion/nextion_upload.cpp +4 -1
  211. esphome/components/nrf52/__init__.py +49 -6
  212. esphome/components/nrf52/const.py +1 -0
  213. esphome/components/nrf52/dfu.cpp +51 -0
  214. esphome/components/nrf52/dfu.h +24 -0
  215. esphome/components/ntc/ntc.cpp +1 -1
  216. esphome/components/number/__init__.py +2 -2
  217. esphome/components/number/automation.cpp +1 -1
  218. esphome/components/number/number.cpp +21 -0
  219. esphome/components/number/number.h +4 -13
  220. esphome/components/opentherm/hub.h +6 -6
  221. esphome/components/opentherm/number/{number.cpp → opentherm_number.cpp} +2 -2
  222. esphome/components/opentherm/output/{output.cpp → opentherm_output.cpp} +1 -1
  223. esphome/components/opentherm/switch/{switch.cpp → opentherm_switch.cpp} +1 -1
  224. esphome/components/openthread/openthread.cpp +41 -7
  225. esphome/components/openthread/openthread.h +11 -0
  226. esphome/components/ota/__init__.py +2 -2
  227. esphome/components/pca6416a/__init__.py +1 -0
  228. esphome/components/pca6416a/pca6416a.cpp +20 -5
  229. esphome/components/pca6416a/pca6416a.h +12 -5
  230. esphome/components/pca9554/__init__.py +2 -1
  231. esphome/components/pca9554/pca9554.cpp +12 -18
  232. esphome/components/pca9554/pca9554.h +10 -9
  233. esphome/components/pcf8574/__init__.py +1 -0
  234. esphome/components/pcf8574/pcf8574.cpp +14 -5
  235. esphome/components/pcf8574/pcf8574.h +13 -6
  236. esphome/components/pi4ioe5v6408/pi4ioe5v6408.cpp +7 -7
  237. esphome/components/pipsolar/__init__.py +3 -3
  238. esphome/components/pipsolar/output/__init__.py +4 -4
  239. esphome/components/pulse_width/pulse_width.cpp +2 -2
  240. esphome/components/qmp6988/qmp6988.cpp +81 -126
  241. esphome/components/qmp6988/qmp6988.h +31 -37
  242. esphome/components/radon_eye_ble/__init__.py +2 -2
  243. esphome/components/remote_base/__init__.py +6 -8
  244. esphome/components/rotary_encoder/rotary_encoder.cpp +1 -1
  245. esphome/components/rp2040/__init__.py +2 -2
  246. esphome/components/runtime_stats/runtime_stats.cpp +10 -23
  247. esphome/components/runtime_stats/runtime_stats.h +4 -10
  248. esphome/components/safe_mode/__init__.py +2 -2
  249. esphome/components/safe_mode/safe_mode.cpp +33 -31
  250. esphome/components/script/script.cpp +6 -0
  251. esphome/components/script/script.h +19 -5
  252. esphome/components/sdm_meter/sensor.py +3 -1
  253. esphome/components/select/__init__.py +2 -2
  254. esphome/components/select/select.h +2 -2
  255. esphome/components/sen5x/sen5x.cpp +57 -55
  256. esphome/components/sen5x/sen5x.h +21 -15
  257. esphome/components/sen5x/sensor.py +67 -44
  258. esphome/components/sensirion_common/i2c_sensirion.cpp +18 -47
  259. esphome/components/sensirion_common/i2c_sensirion.h +39 -55
  260. esphome/components/sensor/__init__.py +2 -2
  261. esphome/components/sensor/automation.h +1 -1
  262. esphome/components/sensor/sensor.cpp +34 -6
  263. esphome/components/sensor/sensor.h +4 -21
  264. esphome/components/sgp30/sgp30.cpp +34 -35
  265. esphome/components/sgp30/sgp30.h +11 -10
  266. esphome/components/sgp4x/sgp4x.cpp +2 -2
  267. esphome/components/shelly_dimmer/light.py +7 -7
  268. esphome/components/sht4x/sht4x.cpp +1 -1
  269. esphome/components/sntp/sntp_component.cpp +36 -9
  270. esphome/components/sntp/sntp_component.h +7 -0
  271. esphome/components/sound_level/sound_level.cpp +1 -1
  272. esphome/components/speaker/__init__.py +2 -2
  273. esphome/components/speaker/media_player/__init__.py +2 -2
  274. esphome/components/speaker/media_player/speaker_media_player.cpp +1 -1
  275. esphome/components/spi/__init__.py +2 -2
  276. esphome/components/sprinkler/sprinkler.cpp +1 -1
  277. esphome/components/sps30/sps30.cpp +18 -23
  278. esphome/components/sps30/sps30.h +3 -3
  279. esphome/components/status_led/__init__.py +2 -2
  280. esphome/components/stepper/__init__.py +2 -2
  281. esphome/components/switch/__init__.py +2 -2
  282. esphome/components/switch/switch.cpp +5 -5
  283. esphome/components/sx1509/__init__.py +1 -1
  284. esphome/components/sx1509/sx1509.cpp +12 -7
  285. esphome/components/sx1509/sx1509.h +11 -4
  286. esphome/components/tca9555/tca9555.cpp +5 -5
  287. esphome/components/tee501/tee501.cpp +2 -21
  288. esphome/components/tee501/tee501.h +2 -4
  289. esphome/components/template/alarm_control_panel/template_alarm_control_panel.cpp +1 -1
  290. esphome/components/template/datetime/template_date.cpp +1 -1
  291. esphome/components/template/datetime/template_datetime.cpp +2 -2
  292. esphome/components/template/datetime/template_time.cpp +1 -1
  293. esphome/components/template/number/template_number.cpp +1 -1
  294. esphome/components/template/select/template_select.cpp +1 -1
  295. esphome/components/template/text/template_text.cpp +1 -1
  296. esphome/components/text/__init__.py +2 -2
  297. esphome/components/text/text.h +2 -2
  298. esphome/components/text_sensor/__init__.py +2 -2
  299. esphome/components/text_sensor/text_sensor.h +4 -4
  300. esphome/components/thermostat/climate.py +11 -7
  301. esphome/components/thermostat/thermostat_climate.cpp +237 -206
  302. esphome/components/thermostat/thermostat_climate.h +52 -41
  303. esphome/components/time/__init__.py +2 -2
  304. esphome/components/tmp1075/tmp1075.cpp +1 -1
  305. esphome/components/total_daily_energy/total_daily_energy.cpp +1 -1
  306. esphome/components/touchscreen/__init__.py +2 -2
  307. esphome/components/tuya/number/tuya_number.cpp +1 -1
  308. esphome/components/udp/udp_component.cpp +3 -3
  309. esphome/components/ufire_ec/ufire_ec.cpp +4 -4
  310. esphome/components/ufire_ise/ufire_ise.cpp +4 -4
  311. esphome/components/update/__init__.py +2 -2
  312. esphome/components/usb_uart/usb_uart.cpp +1 -1
  313. esphome/components/valve/__init__.py +5 -5
  314. esphome/components/valve/valve.cpp +1 -1
  315. esphome/components/valve/valve.h +2 -2
  316. esphome/components/wake_on_lan/wake_on_lan.cpp +2 -2
  317. esphome/components/waveshare_epaper/waveshare_213v3.cpp +1 -1
  318. esphome/components/web_server/__init__.py +2 -2
  319. esphome/components/web_server/ota/__init__.py +2 -2
  320. esphome/components/web_server/ota/ota_web_server.cpp +11 -0
  321. esphome/components/web_server/server_index_v2.h +149 -149
  322. esphome/components/web_server/web_server.cpp +58 -12
  323. esphome/components/web_server_base/__init__.py +2 -2
  324. esphome/components/wifi/__init__.py +5 -5
  325. esphome/components/wifi/wifi_component.cpp +4 -4
  326. esphome/components/wifi/wifi_component_esp_idf.cpp +2 -0
  327. esphome/components/wifi_info/wifi_info_text_sensor.h +3 -2
  328. esphome/config_validation.py +2 -2
  329. esphome/const.py +3 -1
  330. esphome/core/__init__.py +1 -0
  331. esphome/core/application.cpp +89 -51
  332. esphome/core/application.h +1 -0
  333. esphome/core/component.cpp +41 -19
  334. esphome/core/component.h +17 -13
  335. esphome/core/config.py +7 -7
  336. esphome/core/defines.h +4 -0
  337. esphome/core/entity_base.cpp +22 -8
  338. esphome/core/entity_base.h +43 -0
  339. esphome/core/helpers.cpp +34 -20
  340. esphome/core/helpers.h +33 -3
  341. esphome/core/ring_buffer.cpp +6 -2
  342. esphome/core/ring_buffer.h +2 -1
  343. esphome/core/scheduler.cpp +178 -97
  344. esphome/core/scheduler.h +67 -36
  345. esphome/core/time.cpp +6 -20
  346. esphome/coroutine.py +80 -3
  347. esphome/cpp_generator.py +13 -0
  348. esphome/cpp_helpers.py +2 -2
  349. esphome/dashboard/web_server.py +67 -10
  350. esphome/espota2.py +13 -6
  351. esphome/helpers.py +68 -83
  352. esphome/resolver.py +67 -0
  353. esphome/util.py +9 -6
  354. esphome/wizard.py +39 -26
  355. {esphome-2025.8.4.dist-info → esphome-2025.9.0b2.dist-info}/METADATA +9 -9
  356. {esphome-2025.8.4.dist-info → esphome-2025.9.0b2.dist-info}/RECORD +364 -333
  357. /esphome/components/ld2420/text_sensor/{text_sensor.h → ld2420_text_sensor.h} +0 -0
  358. /esphome/components/opentherm/number/{number.h → opentherm_number.h} +0 -0
  359. /esphome/components/opentherm/output/{output.h → opentherm_output.h} +0 -0
  360. /esphome/components/opentherm/switch/{switch.h → opentherm_switch.h} +0 -0
  361. {esphome-2025.8.4.dist-info → esphome-2025.9.0b2.dist-info}/WHEEL +0 -0
  362. {esphome-2025.8.4.dist-info → esphome-2025.9.0b2.dist-info}/entry_points.txt +0 -0
  363. {esphome-2025.8.4.dist-info → esphome-2025.9.0b2.dist-info}/licenses/LICENSE +0 -0
  364. {esphome-2025.8.4.dist-info → esphome-2025.9.0b2.dist-info}/top_level.txt +0 -0
@@ -6,24 +6,25 @@
6
6
  #include "esphome/components/climate/climate.h"
7
7
  #include "esphome/components/sensor/sensor.h"
8
8
 
9
+ #include <array>
9
10
  #include <cinttypes>
10
11
  #include <map>
11
- #include <vector>
12
12
 
13
13
  namespace esphome {
14
14
  namespace thermostat {
15
15
 
16
16
  enum ThermostatClimateTimerIndex : uint8_t {
17
- TIMER_COOLING_MAX_RUN_TIME = 0,
18
- TIMER_COOLING_OFF = 1,
19
- TIMER_COOLING_ON = 2,
20
- TIMER_FAN_MODE = 3,
21
- TIMER_FANNING_OFF = 4,
22
- TIMER_FANNING_ON = 5,
23
- TIMER_HEATING_MAX_RUN_TIME = 6,
24
- TIMER_HEATING_OFF = 7,
25
- TIMER_HEATING_ON = 8,
26
- TIMER_IDLE_ON = 9,
17
+ THERMOSTAT_TIMER_COOLING_MAX_RUN_TIME = 0,
18
+ THERMOSTAT_TIMER_COOLING_OFF = 1,
19
+ THERMOSTAT_TIMER_COOLING_ON = 2,
20
+ THERMOSTAT_TIMER_FAN_MODE = 3,
21
+ THERMOSTAT_TIMER_FANNING_OFF = 4,
22
+ THERMOSTAT_TIMER_FANNING_ON = 5,
23
+ THERMOSTAT_TIMER_HEATING_MAX_RUN_TIME = 6,
24
+ THERMOSTAT_TIMER_HEATING_OFF = 7,
25
+ THERMOSTAT_TIMER_HEATING_ON = 8,
26
+ THERMOSTAT_TIMER_IDLE_ON = 9,
27
+ THERMOSTAT_TIMER_COUNT = 10,
27
28
  };
28
29
 
29
30
  enum OnBootRestoreFrom : uint8_t {
@@ -131,6 +132,7 @@ class ThermostatClimate : public climate::Climate, public Component {
131
132
  Trigger<> *get_dry_mode_trigger() const;
132
133
  Trigger<> *get_fan_only_mode_trigger() const;
133
134
  Trigger<> *get_heat_mode_trigger() const;
135
+ Trigger<> *get_heat_cool_mode_trigger() const;
134
136
  Trigger<> *get_off_mode_trigger() const;
135
137
  Trigger<> *get_fan_mode_on_trigger() const;
136
138
  Trigger<> *get_fan_mode_off_trigger() const;
@@ -163,9 +165,10 @@ class ThermostatClimate : public climate::Climate, public Component {
163
165
  /// Returns the fan mode that is locked in (check fan_mode_change_delayed(), first!)
164
166
  climate::ClimateFanMode locked_fan_mode();
165
167
  /// Set point and hysteresis validation
166
- bool hysteresis_valid(); // returns true if valid
168
+ bool hysteresis_valid(); // returns true if valid
169
+ bool limit_setpoints_for_heat_cool(); // returns true if set points should be further limited within visual range
167
170
  void validate_target_temperature();
168
- void validate_target_temperatures();
171
+ void validate_target_temperatures(bool pin_target_temperature_high);
169
172
  void validate_target_temperature_low();
170
173
  void validate_target_temperature_high();
171
174
 
@@ -241,12 +244,28 @@ class ThermostatClimate : public climate::Climate, public Component {
241
244
  bool supplemental_cooling_required_();
242
245
  bool supplemental_heating_required_();
243
246
 
244
- void dump_preset_config_(const char *preset_name, const ThermostatClimateTargetTempConfig &config,
245
- bool is_default_preset);
247
+ void dump_preset_config_(const char *preset_name, const ThermostatClimateTargetTempConfig &config);
246
248
 
247
249
  /// Minimum allowable duration in seconds for action timers
248
250
  const uint8_t min_timer_duration_{1};
249
251
 
252
+ /// Store previously-known states
253
+ ///
254
+ /// These are used to determine when a trigger/action needs to be called
255
+ climate::ClimateFanMode prev_fan_mode_{climate::CLIMATE_FAN_ON};
256
+ climate::ClimateMode prev_mode_{climate::CLIMATE_MODE_OFF};
257
+ climate::ClimateSwingMode prev_swing_mode_{climate::CLIMATE_SWING_OFF};
258
+
259
+ /// The current supplemental action
260
+ climate::ClimateAction supplemental_action_{climate::CLIMATE_ACTION_OFF};
261
+
262
+ /// Default standard preset to use on start up
263
+ climate::ClimatePreset default_preset_{};
264
+
265
+ /// If set to DEFAULT_PRESET then the default preset is always used. When MEMORY prior
266
+ /// state will attempt to be restored if possible
267
+ OnBootRestoreFrom on_boot_restore_from_{OnBootRestoreFrom::MEMORY};
268
+
250
269
  /// Whether the controller supports auto/cooling/drying/fanning/heating.
251
270
  ///
252
271
  /// A false value for any given attribute means that the controller has no such action
@@ -362,9 +381,15 @@ class ThermostatClimate : public climate::Climate, public Component {
362
381
  Trigger<> *supplemental_heat_action_trigger_{nullptr};
363
382
  Trigger<> *heat_mode_trigger_{nullptr};
364
383
 
384
+ /// The trigger to call when the controller should switch to heat/cool mode.
385
+ ///
386
+ /// In heat/cool mode, the controller will enable heating/cooling as necessary and switch
387
+ /// to idle when the temperature is within the thresholds/set points.
388
+ Trigger<> *heat_cool_mode_trigger_{nullptr};
389
+
365
390
  /// The trigger to call when the controller should switch to auto mode.
366
391
  ///
367
- /// In auto mode, the controller will enable heating/cooling as necessary and switch
392
+ /// In auto mode, the controller will enable heating/cooling as supported/necessary and switch
368
393
  /// to idle when the temperature is within the thresholds/set points.
369
394
  Trigger<> *auto_mode_trigger_{nullptr};
370
395
 
@@ -438,35 +463,21 @@ class ThermostatClimate : public climate::Climate, public Component {
438
463
  Trigger<> *prev_mode_trigger_{nullptr};
439
464
  Trigger<> *prev_swing_mode_trigger_{nullptr};
440
465
 
441
- /// If set to DEFAULT_PRESET then the default preset is always used. When MEMORY prior
442
- /// state will attempt to be restored if possible
443
- OnBootRestoreFrom on_boot_restore_from_{OnBootRestoreFrom::MEMORY};
444
-
445
- /// Store previously-known states
446
- ///
447
- /// These are used to determine when a trigger/action needs to be called
448
- climate::ClimateAction supplemental_action_{climate::CLIMATE_ACTION_OFF};
449
- climate::ClimateFanMode prev_fan_mode_{climate::CLIMATE_FAN_ON};
450
- climate::ClimateMode prev_mode_{climate::CLIMATE_MODE_OFF};
451
- climate::ClimateSwingMode prev_swing_mode_{climate::CLIMATE_SWING_OFF};
452
-
453
- /// Default standard preset to use on start up
454
- climate::ClimatePreset default_preset_{};
455
466
  /// Default custom preset to use on start up
456
467
  std::string default_custom_preset_{};
457
468
 
458
469
  /// Climate action timers
459
- std::vector<ThermostatClimateTimer> timer_{
460
- {false, 0, 0, std::bind(&ThermostatClimate::cooling_max_run_time_timer_callback_, this)},
461
- {false, 0, 0, std::bind(&ThermostatClimate::cooling_off_timer_callback_, this)},
462
- {false, 0, 0, std::bind(&ThermostatClimate::cooling_on_timer_callback_, this)},
463
- {false, 0, 0, std::bind(&ThermostatClimate::fan_mode_timer_callback_, this)},
464
- {false, 0, 0, std::bind(&ThermostatClimate::fanning_off_timer_callback_, this)},
465
- {false, 0, 0, std::bind(&ThermostatClimate::fanning_on_timer_callback_, this)},
466
- {false, 0, 0, std::bind(&ThermostatClimate::heating_max_run_time_timer_callback_, this)},
467
- {false, 0, 0, std::bind(&ThermostatClimate::heating_off_timer_callback_, this)},
468
- {false, 0, 0, std::bind(&ThermostatClimate::heating_on_timer_callback_, this)},
469
- {false, 0, 0, std::bind(&ThermostatClimate::idle_on_timer_callback_, this)},
470
+ std::array<ThermostatClimateTimer, THERMOSTAT_TIMER_COUNT> timer_{
471
+ ThermostatClimateTimer(false, 0, 0, std::bind(&ThermostatClimate::cooling_max_run_time_timer_callback_, this)),
472
+ ThermostatClimateTimer(false, 0, 0, std::bind(&ThermostatClimate::cooling_off_timer_callback_, this)),
473
+ ThermostatClimateTimer(false, 0, 0, std::bind(&ThermostatClimate::cooling_on_timer_callback_, this)),
474
+ ThermostatClimateTimer(false, 0, 0, std::bind(&ThermostatClimate::fan_mode_timer_callback_, this)),
475
+ ThermostatClimateTimer(false, 0, 0, std::bind(&ThermostatClimate::fanning_off_timer_callback_, this)),
476
+ ThermostatClimateTimer(false, 0, 0, std::bind(&ThermostatClimate::fanning_on_timer_callback_, this)),
477
+ ThermostatClimateTimer(false, 0, 0, std::bind(&ThermostatClimate::heating_max_run_time_timer_callback_, this)),
478
+ ThermostatClimateTimer(false, 0, 0, std::bind(&ThermostatClimate::heating_off_timer_callback_, this)),
479
+ ThermostatClimateTimer(false, 0, 0, std::bind(&ThermostatClimate::heating_on_timer_callback_, this)),
480
+ ThermostatClimateTimer(false, 0, 0, std::bind(&ThermostatClimate::idle_on_timer_callback_, this)),
470
481
  };
471
482
 
472
483
  /// The set of standard preset configurations this thermostat supports (Eg. AWAY, ECO, etc)
@@ -26,7 +26,7 @@ from esphome.const import (
26
26
  CONF_TIMEZONE,
27
27
  CONF_TRIGGER_ID,
28
28
  )
29
- from esphome.core import CORE, coroutine_with_priority
29
+ from esphome.core import CORE, CoroPriority, coroutine_with_priority
30
30
 
31
31
  _LOGGER = logging.getLogger(__name__)
32
32
 
@@ -340,7 +340,7 @@ async def register_time(time_var, config):
340
340
  await setup_time_core_(time_var, config)
341
341
 
342
342
 
343
- @coroutine_with_priority(100.0)
343
+ @coroutine_with_priority(CoroPriority.CORE)
344
344
  async def to_code(config):
345
345
  if CORE.using_zephyr:
346
346
  zephyr_add_prj_conf("POSIX_CLOCK", True)
@@ -32,7 +32,7 @@ void TMP1075Sensor::update() {
32
32
  uint16_t regvalue;
33
33
  if (!read_byte_16(REG_TEMP, &regvalue)) {
34
34
  ESP_LOGW(TAG, "'%s' - unable to read temperature register", this->name_.c_str());
35
- this->status_set_warning("can't read");
35
+ this->status_set_warning(LOG_STR("can't read"));
36
36
  return;
37
37
  }
38
38
  this->status_clear_warning();
@@ -10,7 +10,7 @@ void TotalDailyEnergy::setup() {
10
10
  float initial_value = 0;
11
11
 
12
12
  if (this->restore_) {
13
- this->pref_ = global_preferences->make_preference<float>(this->get_object_id_hash());
13
+ this->pref_ = global_preferences->make_preference<float>(this->get_preference_hash());
14
14
  this->pref_.load(&initial_value);
15
15
  }
16
16
  this->publish_state_and_save(initial_value);
@@ -13,7 +13,7 @@ from esphome.const import (
13
13
  CONF_SWAP_XY,
14
14
  CONF_TRANSFORM,
15
15
  )
16
- from esphome.core import coroutine_with_priority
16
+ from esphome.core import CoroPriority, coroutine_with_priority
17
17
 
18
18
  CODEOWNERS = ["@jesserockz", "@nielsnl68"]
19
19
  DEPENDENCIES = ["display"]
@@ -152,7 +152,7 @@ async def register_touchscreen(var, config):
152
152
  )
153
153
 
154
154
 
155
- @coroutine_with_priority(100.0)
155
+ @coroutine_with_priority(CoroPriority.CORE)
156
156
  async def to_code(config):
157
157
  cg.add_global(touchscreen_ns.using)
158
158
  cg.add_define("USE_TOUCHSCREEN")
@@ -8,7 +8,7 @@ static const char *const TAG = "tuya.number";
8
8
 
9
9
  void TuyaNumber::setup() {
10
10
  if (this->restore_value_) {
11
- this->pref_ = global_preferences->make_preference<float>(this->get_object_id_hash());
11
+ this->pref_ = global_preferences->make_preference<float>(this->get_preference_hash());
12
12
  }
13
13
 
14
14
  this->parent_->register_listener(this->number_id_, [this](const TuyaDatapoint &datapoint) {
@@ -28,12 +28,12 @@ void UDPComponent::setup() {
28
28
  int enable = 1;
29
29
  auto err = this->broadcast_socket_->setsockopt(SOL_SOCKET, SO_REUSEADDR, &enable, sizeof(int));
30
30
  if (err != 0) {
31
- this->status_set_warning("Socket unable to set reuseaddr");
31
+ this->status_set_warning(LOG_STR("Socket unable to set reuseaddr"));
32
32
  // we can still continue
33
33
  }
34
34
  err = this->broadcast_socket_->setsockopt(SOL_SOCKET, SO_BROADCAST, &enable, sizeof(int));
35
35
  if (err != 0) {
36
- this->status_set_warning("Socket unable to set broadcast");
36
+ this->status_set_warning(LOG_STR("Socket unable to set broadcast"));
37
37
  }
38
38
  }
39
39
  // create listening socket if we either want to subscribe to providers, or need to listen
@@ -55,7 +55,7 @@ void UDPComponent::setup() {
55
55
  int enable = 1;
56
56
  err = this->listen_socket_->setsockopt(SOL_SOCKET, SO_REUSEADDR, &enable, sizeof(enable));
57
57
  if (err != 0) {
58
- this->status_set_warning("Socket unable to set reuseaddr");
58
+ this->status_set_warning(LOG_STR("Socket unable to set reuseaddr"));
59
59
  // we can still continue
60
60
  }
61
61
  struct sockaddr_in server {};
@@ -104,10 +104,10 @@ void UFireECComponent::write_data_(uint8_t reg, float data) {
104
104
  void UFireECComponent::dump_config() {
105
105
  ESP_LOGCONFIG(TAG, "uFire-EC");
106
106
  LOG_I2C_DEVICE(this)
107
- LOG_UPDATE_INTERVAL(this)
108
- LOG_SENSOR(" ", "EC Sensor", this->ec_sensor_)
109
- LOG_SENSOR(" ", "Temperature Sensor", this->temperature_sensor_)
110
- LOG_SENSOR(" ", "Temperature Sensor external", this->temperature_sensor_external_)
107
+ LOG_UPDATE_INTERVAL(this);
108
+ LOG_SENSOR(" ", "EC Sensor", this->ec_sensor_);
109
+ LOG_SENSOR(" ", "Temperature Sensor", this->temperature_sensor_);
110
+ LOG_SENSOR(" ", "Temperature Sensor external", this->temperature_sensor_external_);
111
111
  ESP_LOGCONFIG(TAG,
112
112
  " Temperature Compensation: %f\n"
113
113
  " Temperature Coefficient: %f",
@@ -141,10 +141,10 @@ void UFireISEComponent::write_data_(uint8_t reg, float data) {
141
141
  void UFireISEComponent::dump_config() {
142
142
  ESP_LOGCONFIG(TAG, "uFire-ISE");
143
143
  LOG_I2C_DEVICE(this)
144
- LOG_UPDATE_INTERVAL(this)
145
- LOG_SENSOR(" ", "PH Sensor", this->ph_sensor_)
146
- LOG_SENSOR(" ", "Temperature Sensor", this->temperature_sensor_)
147
- LOG_SENSOR(" ", "Temperature Sensor external", this->temperature_sensor_external_)
144
+ LOG_UPDATE_INTERVAL(this);
145
+ LOG_SENSOR(" ", "PH Sensor", this->ph_sensor_);
146
+ LOG_SENSOR(" ", "Temperature Sensor", this->temperature_sensor_);
147
+ LOG_SENSOR(" ", "Temperature Sensor external", this->temperature_sensor_external_);
148
148
  }
149
149
 
150
150
  } // namespace ufire_ise
@@ -14,7 +14,7 @@ from esphome.const import (
14
14
  DEVICE_CLASS_FIRMWARE,
15
15
  ENTITY_CATEGORY_CONFIG,
16
16
  )
17
- from esphome.core import CORE, coroutine_with_priority
17
+ from esphome.core import CORE, CoroPriority, coroutine_with_priority
18
18
  from esphome.core.entity_helpers import entity_duplicate_validator, setup_entity
19
19
  from esphome.cpp_generator import MockObjClass
20
20
 
@@ -124,7 +124,7 @@ async def new_update(config):
124
124
  return var
125
125
 
126
126
 
127
- @coroutine_with_priority(100.0)
127
+ @coroutine_with_priority(CoroPriority.CORE)
128
128
  async def to_code(config):
129
129
  cg.add_global(update_ns.using)
130
130
 
@@ -266,7 +266,7 @@ void USBUartTypeCdcAcm::on_connected() {
266
266
  for (auto *channel : this->channels_) {
267
267
  if (i == cdc_devs.size()) {
268
268
  ESP_LOGE(TAG, "No configuration found for channel %d", channel->index_);
269
- this->status_set_warning("No configuration found for channel");
269
+ this->status_set_warning(LOG_STR("No configuration found for channel"));
270
270
  break;
271
271
  }
272
272
  channel->cdc_dev_ = cdc_devs[i++];
@@ -21,7 +21,7 @@ from esphome.const import (
21
21
  DEVICE_CLASS_GAS,
22
22
  DEVICE_CLASS_WATER,
23
23
  )
24
- from esphome.core import CORE, coroutine_with_priority
24
+ from esphome.core import CORE, CoroPriority, coroutine_with_priority
25
25
  from esphome.core.entity_helpers import entity_duplicate_validator, setup_entity
26
26
  from esphome.cpp_generator import MockObjClass
27
27
 
@@ -202,9 +202,9 @@ async def valve_stop_to_code(config, action_id, template_arg, args):
202
202
 
203
203
 
204
204
  @automation.register_action("valve.toggle", ToggleAction, VALVE_ACTION_SCHEMA)
205
- def valve_toggle_to_code(config, action_id, template_arg, args):
206
- paren = yield cg.get_variable(config[CONF_ID])
207
- yield cg.new_Pvariable(action_id, template_arg, paren)
205
+ async def valve_toggle_to_code(config, action_id, template_arg, args):
206
+ paren = await cg.get_variable(config[CONF_ID])
207
+ return cg.new_Pvariable(action_id, template_arg, paren)
208
208
 
209
209
 
210
210
  VALVE_CONTROL_ACTION_SCHEMA = cv.Schema(
@@ -233,6 +233,6 @@ async def valve_control_to_code(config, action_id, template_arg, args):
233
233
  return var
234
234
 
235
235
 
236
- @coroutine_with_priority(100.0)
236
+ @coroutine_with_priority(CoroPriority.CORE)
237
237
  async def to_code(config):
238
238
  cg.add_global(valve_ns.using)
@@ -155,7 +155,7 @@ void Valve::publish_state(bool save) {
155
155
  }
156
156
  }
157
157
  optional<ValveRestoreState> Valve::restore_state_() {
158
- this->rtc_ = global_preferences->make_preference<ValveRestoreState>(this->get_object_id_hash());
158
+ this->rtc_ = global_preferences->make_preference<ValveRestoreState>(this->get_preference_hash());
159
159
  ValveRestoreState recovered{};
160
160
  if (!this->rtc_.load(&recovered))
161
161
  return {};
@@ -19,8 +19,8 @@ const extern float VALVE_CLOSED;
19
19
  if (traits_.get_is_assumed_state()) { \
20
20
  ESP_LOGCONFIG(TAG, "%s Assumed State: YES", prefix); \
21
21
  } \
22
- if (!(obj)->get_device_class().empty()) { \
23
- ESP_LOGCONFIG(TAG, "%s Device Class: '%s'", prefix, (obj)->get_device_class().c_str()); \
22
+ if (!(obj)->get_device_class_ref().empty()) { \
23
+ ESP_LOGCONFIG(TAG, "%s Device Class: '%s'", prefix, (obj)->get_device_class_ref().c_str()); \
24
24
  } \
25
25
  }
26
26
 
@@ -74,12 +74,12 @@ void WakeOnLanButton::setup() {
74
74
  int enable = 1;
75
75
  auto err = this->broadcast_socket_->setsockopt(SOL_SOCKET, SO_REUSEADDR, &enable, sizeof(int));
76
76
  if (err != 0) {
77
- this->status_set_warning("Socket unable to set reuseaddr");
77
+ this->status_set_warning(LOG_STR("Socket unable to set reuseaddr"));
78
78
  // we can still continue
79
79
  }
80
80
  err = this->broadcast_socket_->setsockopt(SOL_SOCKET, SO_BROADCAST, &enable, sizeof(int));
81
81
  if (err != 0) {
82
- this->status_set_warning("Socket unable to set broadcast");
82
+ this->status_set_warning(LOG_STR("Socket unable to set broadcast"));
83
83
  }
84
84
  #endif
85
85
  }
@@ -181,7 +181,7 @@ void WaveshareEPaper2P13InV3::dump_config() {
181
181
  LOG_PIN(" Reset Pin: ", this->reset_pin_)
182
182
  LOG_PIN(" DC Pin: ", this->dc_pin_)
183
183
  LOG_PIN(" Busy Pin: ", this->busy_pin_)
184
- LOG_UPDATE_INTERVAL(this)
184
+ LOG_UPDATE_INTERVAL(this);
185
185
  }
186
186
 
187
187
  void WaveshareEPaper2P13InV3::set_full_update_every(uint32_t full_update_every) {
@@ -31,7 +31,7 @@ from esphome.const import (
31
31
  PLATFORM_LN882X,
32
32
  PLATFORM_RTL87XX,
33
33
  )
34
- from esphome.core import CORE, coroutine_with_priority
34
+ from esphome.core import CORE, CoroPriority, coroutine_with_priority
35
35
  import esphome.final_validate as fv
36
36
  from esphome.types import ConfigType
37
37
 
@@ -269,7 +269,7 @@ def add_resource_as_progmem(
269
269
  cg.add_global(cg.RawExpression(size_t))
270
270
 
271
271
 
272
- @coroutine_with_priority(40.0)
272
+ @coroutine_with_priority(CoroPriority.WEB)
273
273
  async def to_code(config):
274
274
  paren = await cg.get_variable(config[CONF_WEB_SERVER_BASE_ID])
275
275
 
@@ -3,7 +3,7 @@ from esphome.components.esp32 import add_idf_component
3
3
  from esphome.components.ota import BASE_OTA_SCHEMA, OTAComponent, ota_to_code
4
4
  import esphome.config_validation as cv
5
5
  from esphome.const import CONF_ID
6
- from esphome.core import CORE, coroutine_with_priority
6
+ from esphome.core import CORE, CoroPriority, coroutine_with_priority
7
7
 
8
8
  CODEOWNERS = ["@esphome/core"]
9
9
  DEPENDENCIES = ["network", "web_server_base"]
@@ -22,7 +22,7 @@ CONFIG_SCHEMA = (
22
22
  )
23
23
 
24
24
 
25
- @coroutine_with_priority(52.0)
25
+ @coroutine_with_priority(CoroPriority.COMMUNICATION)
26
26
  async def to_code(config):
27
27
  var = cg.new_Pvariable(config[CONF_ID])
28
28
  await ota_to_code(var, config)
@@ -198,9 +198,20 @@ void OTARequestHandler::handleUpload(AsyncWebServerRequest *request, const Strin
198
198
  void OTARequestHandler::handleRequest(AsyncWebServerRequest *request) {
199
199
  AsyncWebServerResponse *response;
200
200
  // Use the ota_success_ flag to determine the actual result
201
+ #ifdef USE_ESP8266
202
+ static const char UPDATE_SUCCESS[] PROGMEM = "Update Successful!";
203
+ static const char UPDATE_FAILED[] PROGMEM = "Update Failed!";
204
+ static const char TEXT_PLAIN[] PROGMEM = "text/plain";
205
+ static const char CONNECTION_STR[] PROGMEM = "Connection";
206
+ static const char CLOSE_STR[] PROGMEM = "close";
207
+ const char *msg = this->ota_success_ ? UPDATE_SUCCESS : UPDATE_FAILED;
208
+ response = request->beginResponse_P(200, TEXT_PLAIN, msg);
209
+ response->addHeader(CONNECTION_STR, CLOSE_STR);
210
+ #else
201
211
  const char *msg = this->ota_success_ ? "Update Successful!" : "Update Failed!";
202
212
  response = request->beginResponse(200, "text/plain", msg);
203
213
  response->addHeader("Connection", "close");
214
+ #endif
204
215
  request->send(response);
205
216
  }
206
217