esphome 2025.8.3__py3-none-any.whl → 2025.9.0b1__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 (345) hide show
  1. esphome/__main__.py +36 -42
  2. esphome/components/absolute_humidity/absolute_humidity.cpp +3 -5
  3. esphome/components/adc/adc_sensor_esp32.cpp +29 -6
  4. esphome/components/ags10/ags10.cpp +3 -18
  5. esphome/components/ags10/ags10.h +2 -12
  6. esphome/components/aht10/aht10.cpp +3 -3
  7. esphome/components/airthings_ble/__init__.py +2 -2
  8. esphome/components/alarm_control_panel/__init__.py +2 -2
  9. esphome/components/am2315c/am2315c.cpp +1 -17
  10. esphome/components/am2315c/am2315c.h +2 -3
  11. esphome/components/api/__init__.py +2 -2
  12. esphome/components/api/api_connection.cpp +34 -23
  13. esphome/components/api/api_connection.h +20 -39
  14. esphome/components/api/api_frame_helper.cpp +25 -25
  15. esphome/components/api/api_frame_helper.h +3 -3
  16. esphome/components/api/api_frame_helper_noise.cpp +75 -40
  17. esphome/components/api/api_frame_helper_noise.h +3 -7
  18. esphome/components/api/api_frame_helper_plaintext.cpp +17 -4
  19. esphome/components/api/api_frame_helper_plaintext.h +1 -4
  20. esphome/components/api/api_pb2.cpp +20 -2
  21. esphome/components/api/api_pb2.h +146 -141
  22. esphome/components/api/api_pb2_dump.cpp +12 -1
  23. esphome/components/api/proto.cpp +33 -37
  24. esphome/components/async_tcp/__init__.py +2 -2
  25. esphome/components/atm90e26/sensor.py +2 -0
  26. esphome/components/atm90e32/sensor.py +4 -2
  27. esphome/components/audio_adc/__init__.py +2 -2
  28. esphome/components/audio_dac/__init__.py +2 -2
  29. esphome/components/axs15231/touchscreen/axs15231_touchscreen.cpp +1 -1
  30. esphome/components/bedjet/bedjet_hub.cpp +1 -1
  31. esphome/components/binary_sensor/__init__.py +2 -2
  32. esphome/components/binary_sensor/binary_sensor.cpp +13 -0
  33. esphome/components/binary_sensor/binary_sensor.h +4 -7
  34. esphome/components/bl0940/__init__.py +6 -1
  35. esphome/components/bl0940/bl0940.cpp +178 -41
  36. esphome/components/bl0940/bl0940.h +121 -76
  37. esphome/components/bl0940/button/__init__.py +27 -0
  38. esphome/components/bl0940/button/calibration_reset_button.cpp +20 -0
  39. esphome/components/bl0940/button/calibration_reset_button.h +19 -0
  40. esphome/components/bl0940/number/__init__.py +94 -0
  41. esphome/components/bl0940/number/calibration_number.cpp +29 -0
  42. esphome/components/bl0940/number/calibration_number.h +26 -0
  43. esphome/components/bl0940/sensor.py +151 -2
  44. esphome/components/bl0942/bl0942.cpp +1 -1
  45. esphome/components/ble_client/output/__init__.py +4 -4
  46. esphome/components/bluetooth_proxy/__init__.py +1 -1
  47. esphome/components/bluetooth_proxy/bluetooth_connection.h +1 -1
  48. esphome/components/bluetooth_proxy/bluetooth_proxy.cpp +15 -7
  49. esphome/components/bluetooth_proxy/bluetooth_proxy.h +3 -2
  50. esphome/components/button/__init__.py +2 -2
  51. esphome/components/button/button.cpp +13 -0
  52. esphome/components/button/button.h +4 -7
  53. esphome/components/camera/buffer.h +18 -0
  54. esphome/components/camera/buffer_impl.cpp +20 -0
  55. esphome/components/camera/buffer_impl.h +26 -0
  56. esphome/components/camera/camera.h +43 -0
  57. esphome/components/camera/encoder.h +69 -0
  58. esphome/components/camera_encoder/__init__.py +62 -0
  59. esphome/components/camera_encoder/encoder_buffer_impl.cpp +23 -0
  60. esphome/components/camera_encoder/encoder_buffer_impl.h +25 -0
  61. esphome/components/camera_encoder/esp32_camera_jpeg_encoder.cpp +82 -0
  62. esphome/components/camera_encoder/esp32_camera_jpeg_encoder.h +39 -0
  63. esphome/components/captive_portal/__init__.py +2 -2
  64. esphome/components/captive_portal/captive_portal.cpp +35 -12
  65. esphome/components/captive_portal/captive_portal.h +3 -3
  66. esphome/components/ccs811/ccs811.cpp +3 -3
  67. esphome/components/climate/__init__.py +2 -2
  68. esphome/components/climate/climate.cpp +1 -1
  69. esphome/components/cover/__init__.py +5 -5
  70. esphome/components/cover/cover.cpp +1 -1
  71. esphome/components/cover/cover.h +2 -2
  72. esphome/components/dallas_temp/dallas_temp.cpp +2 -2
  73. esphome/components/datetime/__init__.py +2 -2
  74. esphome/components/datetime/date_entity.h +2 -2
  75. esphome/components/datetime/datetime_entity.h +2 -2
  76. esphome/components/datetime/time_entity.h +2 -2
  77. esphome/components/debug/debug_esp32.cpp +1 -1
  78. esphome/components/display/__init__.py +4 -4
  79. esphome/components/duty_time/duty_time_sensor.cpp +1 -1
  80. esphome/components/esp32/__init__.py +0 -5
  81. esphome/components/esp32/gpio.cpp +27 -23
  82. esphome/components/esp32/gpio.h +26 -11
  83. esphome/components/esp32/preferences.cpp +8 -4
  84. esphome/components/esp32_ble/__init__.py +7 -2
  85. esphome/components/esp32_ble_client/ble_client_base.cpp +7 -3
  86. esphome/components/esp32_ble_tracker/__init__.py +2 -2
  87. esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +9 -44
  88. esphome/components/esp32_ble_tracker/esp32_ble_tracker.h +2 -14
  89. esphome/components/esp8266/__init__.py +2 -2
  90. esphome/components/esp8266/core.cpp +2 -2
  91. esphome/components/esp8266/gpio.py +4 -4
  92. esphome/components/esp8266/preferences.cpp +30 -28
  93. esphome/components/esphome/ota/__init__.py +2 -2
  94. esphome/components/esphome/ota/ota_esphome.cpp +21 -19
  95. esphome/components/esphome/ota/ota_esphome.h +6 -5
  96. esphome/components/ethernet/__init__.py +7 -2
  97. esphome/components/ethernet/ethernet_component.cpp +1 -1
  98. esphome/components/event/__init__.py +2 -2
  99. esphome/components/event/event.h +4 -4
  100. esphome/components/fan/__init__.py +2 -2
  101. esphome/components/fan/fan.cpp +2 -1
  102. esphome/components/gdk101/gdk101.cpp +4 -4
  103. esphome/components/globals/__init__.py +2 -2
  104. esphome/components/gpio/binary_sensor/gpio_binary_sensor.cpp +19 -18
  105. esphome/components/gpio_expander/cached_gpio.h +36 -16
  106. esphome/components/grove_gas_mc_v2/grove_gas_mc_v2.cpp +5 -5
  107. esphome/components/gt911/touchscreen/gt911_touchscreen.cpp +1 -1
  108. esphome/components/haier/haier_base.cpp +1 -1
  109. esphome/components/haier/hon_climate.cpp +1 -1
  110. esphome/components/hlw8012/hlw8012.cpp +5 -5
  111. esphome/components/honeywellabp2_i2c/honeywellabp2.cpp +4 -4
  112. esphome/components/host/preferences.h +3 -2
  113. esphome/components/hte501/hte501.cpp +3 -21
  114. esphome/components/hte501/hte501.h +2 -3
  115. esphome/components/http_request/ota/__init__.py +2 -2
  116. esphome/components/i2c/__init__.py +2 -2
  117. esphome/components/i2c/i2c.cpp +13 -9
  118. esphome/components/i2c/i2c_bus.h +36 -6
  119. esphome/components/i2s_audio/__init__.py +8 -2
  120. esphome/components/i2s_audio/media_player/__init__.py +1 -1
  121. esphome/components/i2s_audio/microphone/__init__.py +1 -1
  122. esphome/components/i2s_audio/speaker/__init__.py +1 -1
  123. esphome/components/inkplate/__init__.py +1 -0
  124. esphome/components/inkplate/const.py +105 -0
  125. esphome/components/inkplate/display.py +238 -0
  126. esphome/components/{inkplate6 → inkplate}/inkplate.cpp +156 -74
  127. esphome/components/{inkplate6 → inkplate}/inkplate.h +28 -68
  128. esphome/components/inkplate6/__init__.py +0 -1
  129. esphome/components/inkplate6/display.py +2 -211
  130. esphome/components/integration/integration_sensor.cpp +1 -1
  131. esphome/components/json/__init__.py +2 -2
  132. esphome/components/kmeteriso/kmeteriso.cpp +1 -1
  133. esphome/components/lc709203f/lc709203f.cpp +4 -17
  134. esphome/components/lc709203f/lc709203f.h +2 -3
  135. esphome/components/ld2420/text_sensor/{text_sensor.cpp → ld2420_text_sensor.cpp} +1 -1
  136. esphome/components/ld2450/ld2450.cpp +1 -1
  137. esphome/components/libretiny/preferences.cpp +13 -5
  138. esphome/components/light/__init__.py +2 -2
  139. esphome/components/light/addressable_light_effect.h +7 -0
  140. esphome/components/light/base_light_effects.h +8 -0
  141. esphome/components/light/light_call.cpp +22 -20
  142. esphome/components/light/light_effect.cpp +36 -0
  143. esphome/components/light/light_effect.h +14 -0
  144. esphome/components/light/light_json_schema.cpp +9 -1
  145. esphome/components/light/light_state.cpp +2 -2
  146. esphome/components/light/light_state.h +39 -0
  147. esphome/components/lock/__init__.py +2 -2
  148. esphome/components/lock/lock.h +2 -2
  149. esphome/components/logger/__init__.py +2 -2
  150. esphome/components/logger/logger.cpp +25 -4
  151. esphome/components/logger/logger.h +1 -1
  152. esphome/components/logger/logger_esp32.cpp +16 -8
  153. esphome/components/logger/logger_esp8266.cpp +11 -3
  154. esphome/components/logger/logger_libretiny.cpp +13 -3
  155. esphome/components/logger/logger_rp2040.cpp +14 -3
  156. esphome/components/logger/logger_zephyr.cpp +15 -4
  157. esphome/components/lvgl/defines.py +1 -0
  158. esphome/components/lvgl/hello_world.py +96 -33
  159. esphome/components/lvgl/number/lvgl_number.h +1 -1
  160. esphome/components/lvgl/select/lvgl_select.h +1 -1
  161. esphome/components/lvgl/widgets/__init__.py +0 -1
  162. esphome/components/lvgl/widgets/spinbox.py +20 -11
  163. esphome/components/m5stack_8angle/binary_sensor/m5stack_8angle_binary_sensor.cpp +1 -1
  164. esphome/components/m5stack_8angle/sensor/m5stack_8angle_sensor.cpp +1 -1
  165. esphome/components/mapping/__init__.py +13 -5
  166. esphome/components/mapping/mapping.h +69 -0
  167. esphome/components/max17043/max17043.cpp +2 -2
  168. esphome/components/mcp23016/__init__.py +1 -0
  169. esphome/components/mcp23016/mcp23016.cpp +20 -5
  170. esphome/components/mcp23016/mcp23016.h +10 -4
  171. esphome/components/mcp23x08_base/mcp23x08_base.cpp +1 -1
  172. esphome/components/mcp23x17_base/mcp23x17_base.cpp +2 -2
  173. esphome/components/mdns/__init__.py +2 -2
  174. esphome/components/mdns/mdns_component.cpp +145 -54
  175. esphome/components/media_player/__init__.py +2 -2
  176. esphome/components/micro_wake_word/__init__.py +2 -2
  177. esphome/components/microphone/__init__.py +2 -2
  178. esphome/components/mipi/__init__.py +77 -33
  179. esphome/components/mipi_rgb/__init__.py +2 -0
  180. esphome/components/mipi_rgb/display.py +321 -0
  181. esphome/components/mipi_rgb/mipi_rgb.cpp +388 -0
  182. esphome/components/mipi_rgb/mipi_rgb.h +127 -0
  183. esphome/components/mipi_rgb/models/guition.py +24 -0
  184. esphome/components/mipi_rgb/models/lilygo.py +228 -0
  185. esphome/components/mipi_rgb/models/rpi.py +9 -0
  186. esphome/components/mipi_rgb/models/st7701s.py +214 -0
  187. esphome/components/mipi_rgb/models/waveshare.py +64 -0
  188. esphome/components/mipi_spi/models/jc.py +229 -0
  189. esphome/components/mlx90614/mlx90614.cpp +1 -16
  190. esphome/components/mlx90614/mlx90614.h +0 -1
  191. esphome/components/mqtt/__init__.py +2 -2
  192. esphome/components/mqtt/mqtt_sensor.cpp +7 -2
  193. esphome/components/ms5611/ms5611.cpp +7 -6
  194. esphome/components/network/__init__.py +2 -2
  195. esphome/components/nextion/nextion_upload.cpp +4 -1
  196. esphome/components/nrf52/__init__.py +49 -6
  197. esphome/components/nrf52/const.py +1 -0
  198. esphome/components/nrf52/dfu.cpp +51 -0
  199. esphome/components/nrf52/dfu.h +24 -0
  200. esphome/components/ntc/ntc.cpp +1 -1
  201. esphome/components/number/__init__.py +2 -2
  202. esphome/components/number/automation.cpp +1 -1
  203. esphome/components/number/number.cpp +21 -0
  204. esphome/components/number/number.h +4 -13
  205. esphome/components/opentherm/hub.h +6 -6
  206. esphome/components/opentherm/number/{number.cpp → opentherm_number.cpp} +2 -2
  207. esphome/components/opentherm/output/{output.cpp → opentherm_output.cpp} +1 -1
  208. esphome/components/opentherm/switch/{switch.cpp → opentherm_switch.cpp} +1 -1
  209. esphome/components/ota/__init__.py +2 -2
  210. esphome/components/pca6416a/__init__.py +1 -0
  211. esphome/components/pca6416a/pca6416a.cpp +20 -5
  212. esphome/components/pca6416a/pca6416a.h +12 -5
  213. esphome/components/pca9554/__init__.py +2 -1
  214. esphome/components/pca9554/pca9554.cpp +12 -18
  215. esphome/components/pca9554/pca9554.h +10 -9
  216. esphome/components/pcf8574/__init__.py +1 -0
  217. esphome/components/pcf8574/pcf8574.cpp +14 -5
  218. esphome/components/pcf8574/pcf8574.h +13 -6
  219. esphome/components/pi4ioe5v6408/pi4ioe5v6408.cpp +7 -7
  220. esphome/components/pipsolar/__init__.py +3 -3
  221. esphome/components/pipsolar/output/__init__.py +4 -4
  222. esphome/components/pulse_width/pulse_width.cpp +2 -2
  223. esphome/components/qmp6988/qmp6988.cpp +81 -126
  224. esphome/components/qmp6988/qmp6988.h +31 -37
  225. esphome/components/radon_eye_ble/__init__.py +2 -2
  226. esphome/components/remote_base/__init__.py +6 -8
  227. esphome/components/rotary_encoder/rotary_encoder.cpp +1 -1
  228. esphome/components/rp2040/__init__.py +2 -2
  229. esphome/components/runtime_stats/runtime_stats.cpp +10 -23
  230. esphome/components/runtime_stats/runtime_stats.h +4 -10
  231. esphome/components/safe_mode/__init__.py +2 -2
  232. esphome/components/safe_mode/safe_mode.cpp +33 -31
  233. esphome/components/script/script.cpp +6 -0
  234. esphome/components/script/script.h +19 -5
  235. esphome/components/sdm_meter/sensor.py +3 -1
  236. esphome/components/select/__init__.py +2 -2
  237. esphome/components/select/select.h +2 -2
  238. esphome/components/sen5x/sen5x.cpp +58 -55
  239. esphome/components/sen5x/sen5x.h +21 -15
  240. esphome/components/sen5x/sensor.py +67 -44
  241. esphome/components/sensirion_common/i2c_sensirion.cpp +18 -47
  242. esphome/components/sensirion_common/i2c_sensirion.h +39 -55
  243. esphome/components/sensor/__init__.py +2 -2
  244. esphome/components/sensor/automation.h +1 -1
  245. esphome/components/sensor/sensor.cpp +34 -6
  246. esphome/components/sensor/sensor.h +4 -21
  247. esphome/components/sgp30/sgp30.cpp +34 -35
  248. esphome/components/sgp30/sgp30.h +11 -10
  249. esphome/components/sgp4x/sgp4x.cpp +2 -2
  250. esphome/components/shelly_dimmer/light.py +7 -7
  251. esphome/components/sht4x/sht4x.cpp +1 -1
  252. esphome/components/sntp/sntp_component.cpp +36 -9
  253. esphome/components/sntp/sntp_component.h +7 -0
  254. esphome/components/sound_level/sound_level.cpp +1 -1
  255. esphome/components/speaker/__init__.py +2 -2
  256. esphome/components/speaker/media_player/__init__.py +2 -2
  257. esphome/components/speaker/media_player/speaker_media_player.cpp +1 -1
  258. esphome/components/spi/__init__.py +2 -2
  259. esphome/components/sprinkler/sprinkler.cpp +1 -1
  260. esphome/components/sps30/sps30.cpp +18 -23
  261. esphome/components/sps30/sps30.h +3 -3
  262. esphome/components/status_led/__init__.py +2 -2
  263. esphome/components/stepper/__init__.py +2 -2
  264. esphome/components/switch/__init__.py +2 -2
  265. esphome/components/switch/switch.cpp +5 -5
  266. esphome/components/sx1509/__init__.py +1 -1
  267. esphome/components/sx1509/sx1509.cpp +12 -7
  268. esphome/components/sx1509/sx1509.h +11 -4
  269. esphome/components/tca9555/tca9555.cpp +5 -5
  270. esphome/components/tee501/tee501.cpp +2 -21
  271. esphome/components/tee501/tee501.h +2 -4
  272. esphome/components/template/alarm_control_panel/template_alarm_control_panel.cpp +1 -1
  273. esphome/components/template/datetime/template_date.cpp +1 -1
  274. esphome/components/template/datetime/template_datetime.cpp +2 -2
  275. esphome/components/template/datetime/template_time.cpp +1 -1
  276. esphome/components/template/number/template_number.cpp +1 -1
  277. esphome/components/template/select/template_select.cpp +1 -1
  278. esphome/components/template/text/template_text.cpp +1 -1
  279. esphome/components/text/__init__.py +2 -2
  280. esphome/components/text/text.h +2 -2
  281. esphome/components/text_sensor/__init__.py +2 -2
  282. esphome/components/text_sensor/text_sensor.h +4 -4
  283. esphome/components/thermostat/climate.py +11 -7
  284. esphome/components/thermostat/thermostat_climate.cpp +237 -206
  285. esphome/components/thermostat/thermostat_climate.h +52 -41
  286. esphome/components/time/__init__.py +2 -2
  287. esphome/components/tmp1075/tmp1075.cpp +1 -1
  288. esphome/components/total_daily_energy/total_daily_energy.cpp +1 -1
  289. esphome/components/touchscreen/__init__.py +2 -2
  290. esphome/components/tuya/number/tuya_number.cpp +1 -1
  291. esphome/components/udp/udp_component.cpp +3 -3
  292. esphome/components/ufire_ec/ufire_ec.cpp +4 -4
  293. esphome/components/ufire_ise/ufire_ise.cpp +4 -4
  294. esphome/components/update/__init__.py +2 -2
  295. esphome/components/usb_uart/usb_uart.cpp +1 -1
  296. esphome/components/valve/__init__.py +5 -5
  297. esphome/components/valve/valve.cpp +1 -1
  298. esphome/components/valve/valve.h +2 -2
  299. esphome/components/wake_on_lan/wake_on_lan.cpp +2 -2
  300. esphome/components/waveshare_epaper/waveshare_213v3.cpp +1 -1
  301. esphome/components/web_server/__init__.py +2 -2
  302. esphome/components/web_server/ota/__init__.py +2 -2
  303. esphome/components/web_server/ota/ota_web_server.cpp +11 -0
  304. esphome/components/web_server/web_server.cpp +58 -12
  305. esphome/components/web_server_base/__init__.py +2 -2
  306. esphome/components/wifi/__init__.py +5 -5
  307. esphome/components/wifi/wifi_component.cpp +3 -3
  308. esphome/components/wifi/wifi_component_esp_idf.cpp +2 -0
  309. esphome/config_validation.py +2 -2
  310. esphome/const.py +2 -1
  311. esphome/core/__init__.py +1 -0
  312. esphome/core/application.cpp +89 -51
  313. esphome/core/application.h +1 -0
  314. esphome/core/component.cpp +41 -19
  315. esphome/core/component.h +17 -13
  316. esphome/core/config.py +7 -7
  317. esphome/core/defines.h +4 -0
  318. esphome/core/entity_base.cpp +22 -8
  319. esphome/core/entity_base.h +43 -0
  320. esphome/core/helpers.cpp +26 -13
  321. esphome/core/helpers.h +4 -3
  322. esphome/core/ring_buffer.cpp +6 -2
  323. esphome/core/ring_buffer.h +2 -1
  324. esphome/core/scheduler.cpp +175 -94
  325. esphome/core/scheduler.h +66 -35
  326. esphome/core/time.cpp +6 -20
  327. esphome/coroutine.py +80 -3
  328. esphome/cpp_generator.py +13 -0
  329. esphome/cpp_helpers.py +2 -2
  330. esphome/dashboard/web_server.py +67 -10
  331. esphome/espota2.py +13 -6
  332. esphome/helpers.py +68 -83
  333. esphome/resolver.py +67 -0
  334. esphome/util.py +9 -6
  335. esphome/wizard.py +39 -26
  336. {esphome-2025.8.3.dist-info → esphome-2025.9.0b1.dist-info}/METADATA +9 -9
  337. {esphome-2025.8.3.dist-info → esphome-2025.9.0b1.dist-info}/RECORD +345 -314
  338. /esphome/components/ld2420/text_sensor/{text_sensor.h → ld2420_text_sensor.h} +0 -0
  339. /esphome/components/opentherm/number/{number.h → opentherm_number.h} +0 -0
  340. /esphome/components/opentherm/output/{output.h → opentherm_output.h} +0 -0
  341. /esphome/components/opentherm/switch/{switch.h → opentherm_switch.h} +0 -0
  342. {esphome-2025.8.3.dist-info → esphome-2025.9.0b1.dist-info}/WHEEL +0 -0
  343. {esphome-2025.8.3.dist-info → esphome-2025.9.0b1.dist-info}/entry_points.txt +0 -0
  344. {esphome-2025.8.3.dist-info → esphome-2025.9.0b1.dist-info}/licenses/LICENSE +0 -0
  345. {esphome-2025.8.3.dist-info → esphome-2025.9.0b1.dist-info}/top_level.txt +0 -0
@@ -15,11 +15,11 @@ namespace safe_mode {
15
15
  static const char *const TAG = "safe_mode";
16
16
 
17
17
  void SafeModeComponent::dump_config() {
18
- ESP_LOGCONFIG(TAG, "Safe Mode:");
19
18
  ESP_LOGCONFIG(TAG,
20
- " Boot considered successful after %" PRIu32 " seconds\n"
21
- " Invoke after %u boot attempts\n"
22
- " Remain for %" PRIu32 " seconds",
19
+ "Safe Mode:\n"
20
+ " Successful after: %" PRIu32 "s\n"
21
+ " Invoke after: %u attempts\n"
22
+ " Duration: %" PRIu32 "s",
23
23
  this->safe_mode_boot_is_good_after_ / 1000, // because milliseconds
24
24
  this->safe_mode_num_attempts_,
25
25
  this->safe_mode_enable_time_ / 1000); // because milliseconds
@@ -27,7 +27,7 @@ void SafeModeComponent::dump_config() {
27
27
  if (this->safe_mode_rtc_value_ > 1 && this->safe_mode_rtc_value_ != SafeModeComponent::ENTER_SAFE_MODE_MAGIC) {
28
28
  auto remaining_restarts = this->safe_mode_num_attempts_ - this->safe_mode_rtc_value_;
29
29
  if (remaining_restarts) {
30
- ESP_LOGW(TAG, "Last reset occurred too quickly; will be invoked in %" PRIu32 " restarts", remaining_restarts);
30
+ ESP_LOGW(TAG, "Last reset too quick; invoke in %" PRIu32 " restarts", remaining_restarts);
31
31
  } else {
32
32
  ESP_LOGW(TAG, "SAFE MODE IS ACTIVE");
33
33
  }
@@ -72,43 +72,45 @@ bool SafeModeComponent::should_enter_safe_mode(uint8_t num_attempts, uint32_t en
72
72
  this->safe_mode_boot_is_good_after_ = boot_is_good_after;
73
73
  this->safe_mode_num_attempts_ = num_attempts;
74
74
  this->rtc_ = global_preferences->make_preference<uint32_t>(233825507UL, false);
75
- this->safe_mode_rtc_value_ = this->read_rtc_();
76
75
 
77
- bool is_manual_safe_mode = this->safe_mode_rtc_value_ == SafeModeComponent::ENTER_SAFE_MODE_MAGIC;
76
+ uint32_t rtc_val = this->read_rtc_();
77
+ this->safe_mode_rtc_value_ = rtc_val;
78
78
 
79
- if (is_manual_safe_mode) {
80
- ESP_LOGI(TAG, "Safe mode invoked manually");
79
+ bool is_manual = rtc_val == SafeModeComponent::ENTER_SAFE_MODE_MAGIC;
80
+
81
+ if (is_manual) {
82
+ ESP_LOGI(TAG, "Manual mode");
81
83
  } else {
82
- ESP_LOGCONFIG(TAG, "There have been %" PRIu32 " suspected unsuccessful boot attempts", this->safe_mode_rtc_value_);
84
+ ESP_LOGCONFIG(TAG, "Unsuccessful boot attempts: %" PRIu32, rtc_val);
83
85
  }
84
86
 
85
- if (this->safe_mode_rtc_value_ >= num_attempts || is_manual_safe_mode) {
86
- this->clean_rtc();
87
+ if (rtc_val < num_attempts && !is_manual) {
88
+ // increment counter
89
+ this->write_rtc_(rtc_val + 1);
90
+ return false;
91
+ }
87
92
 
88
- if (!is_manual_safe_mode) {
89
- ESP_LOGE(TAG, "Boot loop detected. Proceeding");
90
- }
93
+ this->clean_rtc();
91
94
 
92
- this->status_set_error();
93
- this->set_timeout(enable_time, []() {
94
- ESP_LOGW(TAG, "Safe mode enable time has elapsed -- restarting");
95
- App.reboot();
96
- });
95
+ if (!is_manual) {
96
+ ESP_LOGE(TAG, "Boot loop detected");
97
+ }
97
98
 
98
- // Delay here to allow power to stabilize before Wi-Fi/Ethernet is initialised
99
- delay(300); // NOLINT
100
- App.setup();
99
+ this->status_set_error();
100
+ this->set_timeout(enable_time, []() {
101
+ ESP_LOGW(TAG, "Timeout, restarting");
102
+ App.reboot();
103
+ });
101
104
 
102
- ESP_LOGW(TAG, "SAFE MODE IS ACTIVE");
105
+ // Delay here to allow power to stabilize before Wi-Fi/Ethernet is initialised
106
+ delay(300); // NOLINT
107
+ App.setup();
103
108
 
104
- this->safe_mode_callback_.call();
109
+ ESP_LOGW(TAG, "SAFE MODE IS ACTIVE");
105
110
 
106
- return true;
107
- } else {
108
- // increment counter
109
- this->write_rtc_(this->safe_mode_rtc_value_ + 1);
110
- return false;
111
- }
111
+ this->safe_mode_callback_.call();
112
+
113
+ return true;
112
114
  }
113
115
 
114
116
  void SafeModeComponent::write_rtc_(uint32_t val) {
@@ -6,9 +6,15 @@ namespace script {
6
6
 
7
7
  static const char *const TAG = "script";
8
8
 
9
+ #ifdef USE_STORE_LOG_STR_IN_FLASH
10
+ void ScriptLogger::esp_log_(int level, int line, const __FlashStringHelper *format, const char *param) {
11
+ esp_log_printf_(level, TAG, line, format, param);
12
+ }
13
+ #else
9
14
  void ScriptLogger::esp_log_(int level, int line, const char *format, const char *param) {
10
15
  esp_log_printf_(level, TAG, line, format, param);
11
16
  }
17
+ #endif
12
18
 
13
19
  } // namespace script
14
20
  } // namespace esphome
@@ -10,6 +10,15 @@ namespace script {
10
10
 
11
11
  class ScriptLogger {
12
12
  protected:
13
+ #ifdef USE_STORE_LOG_STR_IN_FLASH
14
+ void esp_logw_(int line, const __FlashStringHelper *format, const char *param) {
15
+ esp_log_(ESPHOME_LOG_LEVEL_WARN, line, format, param);
16
+ }
17
+ void esp_logd_(int line, const __FlashStringHelper *format, const char *param) {
18
+ esp_log_(ESPHOME_LOG_LEVEL_DEBUG, line, format, param);
19
+ }
20
+ void esp_log_(int level, int line, const __FlashStringHelper *format, const char *param);
21
+ #else
13
22
  void esp_logw_(int line, const char *format, const char *param) {
14
23
  esp_log_(ESPHOME_LOG_LEVEL_WARN, line, format, param);
15
24
  }
@@ -17,6 +26,7 @@ class ScriptLogger {
17
26
  esp_log_(ESPHOME_LOG_LEVEL_DEBUG, line, format, param);
18
27
  }
19
28
  void esp_log_(int level, int line, const char *format, const char *param);
29
+ #endif
20
30
  };
21
31
 
22
32
  /// The abstract base class for all script types.
@@ -57,7 +67,8 @@ template<typename... Ts> class SingleScript : public Script<Ts...> {
57
67
  public:
58
68
  void execute(Ts... x) override {
59
69
  if (this->is_action_running()) {
60
- this->esp_logw_(__LINE__, "Script '%s' is already running! (mode: single)", this->name_.c_str());
70
+ this->esp_logw_(__LINE__, ESPHOME_LOG_FORMAT("Script '%s' is already running! (mode: single)"),
71
+ this->name_.c_str());
61
72
  return;
62
73
  }
63
74
 
@@ -74,7 +85,7 @@ template<typename... Ts> class RestartScript : public Script<Ts...> {
74
85
  public:
75
86
  void execute(Ts... x) override {
76
87
  if (this->is_action_running()) {
77
- this->esp_logd_(__LINE__, "Script '%s' restarting (mode: restart)", this->name_.c_str());
88
+ this->esp_logd_(__LINE__, ESPHOME_LOG_FORMAT("Script '%s' restarting (mode: restart)"), this->name_.c_str());
78
89
  this->stop_action();
79
90
  }
80
91
 
@@ -93,11 +104,13 @@ template<typename... Ts> class QueueingScript : public Script<Ts...>, public Com
93
104
  // num_runs_ is the number of *queued* instances, so total number of instances is
94
105
  // num_runs_ + 1
95
106
  if (this->max_runs_ != 0 && this->num_runs_ + 1 >= this->max_runs_) {
96
- this->esp_logw_(__LINE__, "Script '%s' maximum number of queued runs exceeded!", this->name_.c_str());
107
+ this->esp_logw_(__LINE__, ESPHOME_LOG_FORMAT("Script '%s' maximum number of queued runs exceeded!"),
108
+ this->name_.c_str());
97
109
  return;
98
110
  }
99
111
 
100
- this->esp_logd_(__LINE__, "Script '%s' queueing new instance (mode: queued)", this->name_.c_str());
112
+ this->esp_logd_(__LINE__, ESPHOME_LOG_FORMAT("Script '%s' queueing new instance (mode: queued)"),
113
+ this->name_.c_str());
101
114
  this->num_runs_++;
102
115
  this->var_queue_.push(std::make_tuple(x...));
103
116
  return;
@@ -143,7 +156,8 @@ template<typename... Ts> class ParallelScript : public Script<Ts...> {
143
156
  public:
144
157
  void execute(Ts... x) override {
145
158
  if (this->max_runs_ != 0 && this->automation_parent_->num_running() >= this->max_runs_) {
146
- this->esp_logw_(__LINE__, "Script '%s' maximum number of parallel runs exceeded!", this->name_.c_str());
159
+ this->esp_logw_(__LINE__, ESPHOME_LOG_FORMAT("Script '%s' maximum number of parallel runs exceeded!"),
160
+ this->name_.c_str());
147
161
  return;
148
162
  }
149
163
  this->trigger(x...);
@@ -1,6 +1,5 @@
1
1
  import esphome.codegen as cg
2
2
  from esphome.components import modbus, sensor
3
- from esphome.components.atm90e32.sensor import CONF_PHASE_A, CONF_PHASE_B, CONF_PHASE_C
4
3
  import esphome.config_validation as cv
5
4
  from esphome.const import (
6
5
  CONF_ACTIVE_POWER,
@@ -12,7 +11,10 @@ from esphome.const import (
12
11
  CONF_ID,
13
12
  CONF_IMPORT_ACTIVE_ENERGY,
14
13
  CONF_IMPORT_REACTIVE_ENERGY,
14
+ CONF_PHASE_A,
15
15
  CONF_PHASE_ANGLE,
16
+ CONF_PHASE_B,
17
+ CONF_PHASE_C,
16
18
  CONF_POWER_FACTOR,
17
19
  CONF_REACTIVE_POWER,
18
20
  CONF_TOTAL_POWER,
@@ -16,7 +16,7 @@ from esphome.const import (
16
16
  CONF_TRIGGER_ID,
17
17
  CONF_WEB_SERVER,
18
18
  )
19
- from esphome.core import CORE, coroutine_with_priority
19
+ from esphome.core import CORE, CoroPriority, coroutine_with_priority
20
20
  from esphome.core.entity_helpers import entity_duplicate_validator, setup_entity
21
21
  from esphome.cpp_generator import MockObjClass
22
22
 
@@ -124,7 +124,7 @@ async def new_select(config, *args, options: list[str]):
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(select_ns.using)
130
130
 
@@ -12,8 +12,8 @@ namespace select {
12
12
  #define LOG_SELECT(prefix, type, obj) \
13
13
  if ((obj) != nullptr) { \
14
14
  ESP_LOGCONFIG(TAG, "%s%s '%s'", prefix, LOG_STR_LITERAL(type), (obj)->get_name().c_str()); \
15
- if (!(obj)->get_icon().empty()) { \
16
- ESP_LOGCONFIG(TAG, "%s Icon: '%s'", prefix, (obj)->get_icon().c_str()); \
15
+ if (!(obj)->get_icon_ref().empty()) { \
16
+ ESP_LOGCONFIG(TAG, "%s Icon: '%s'", prefix, (obj)->get_icon_ref().c_str()); \
17
17
  } \
18
18
  }
19
19
 
@@ -29,6 +29,19 @@ static const int8_t SEN5X_INDEX_SCALE_FACTOR = 10; //
29
29
  static const int8_t SEN5X_MIN_INDEX_VALUE = 1 * SEN5X_INDEX_SCALE_FACTOR; // must be adjusted by the scale factor
30
30
  static const int16_t SEN5X_MAX_INDEX_VALUE = 500 * SEN5X_INDEX_SCALE_FACTOR; // must be adjusted by the scale factor
31
31
 
32
+ static const LogString *rht_accel_mode_to_string(RhtAccelerationMode mode) {
33
+ switch (mode) {
34
+ case LOW_ACCELERATION:
35
+ return LOG_STR("LOW");
36
+ case MEDIUM_ACCELERATION:
37
+ return LOG_STR("MEDIUM");
38
+ case HIGH_ACCELERATION:
39
+ return LOG_STR("HIGH");
40
+ default:
41
+ return LOG_STR("UNKNOWN");
42
+ }
43
+ }
44
+
32
45
  void SEN5XComponent::setup() {
33
46
  // the sensor needs 1000 ms to enter the idle state
34
47
  this->set_timeout(1000, [this]() {
@@ -38,6 +51,7 @@ void SEN5XComponent::setup() {
38
51
  this->mark_failed();
39
52
  return;
40
53
  }
54
+ delay(20); // per datasheet
41
55
 
42
56
  uint16_t raw_read_status;
43
57
  if (!this->read_data(raw_read_status)) {
@@ -49,7 +63,7 @@ void SEN5XComponent::setup() {
49
63
  uint32_t stop_measurement_delay = 0;
50
64
  // In order to query the device periodic measurement must be ceased
51
65
  if (raw_read_status) {
52
- ESP_LOGD(TAG, "Sensor has data available, stopping periodic measurement");
66
+ ESP_LOGD(TAG, "Data is available; stopping periodic measurement");
53
67
  if (!this->write_command(SEN5X_CMD_STOP_MEASUREMENTS)) {
54
68
  ESP_LOGE(TAG, "Failed to stop measurements");
55
69
  this->mark_failed();
@@ -70,7 +84,8 @@ void SEN5XComponent::setup() {
70
84
  this->serial_number_[0] = static_cast<bool>(uint16_t(raw_serial_number[0]) & 0xFF);
71
85
  this->serial_number_[1] = static_cast<uint16_t>(raw_serial_number[0] & 0xFF);
72
86
  this->serial_number_[2] = static_cast<uint16_t>(raw_serial_number[1] >> 8);
73
- ESP_LOGD(TAG, "Serial number %02d.%02d.%02d", serial_number_[0], serial_number_[1], serial_number_[2]);
87
+ ESP_LOGV(TAG, "Serial number %02d.%02d.%02d", this->serial_number_[0], this->serial_number_[1],
88
+ this->serial_number_[2]);
74
89
 
75
90
  uint16_t raw_product_name[16];
76
91
  if (!this->get_register(SEN5X_CMD_GET_PRODUCT_NAME, raw_product_name, 16, 20)) {
@@ -87,45 +102,43 @@ void SEN5XComponent::setup() {
87
102
  // first char
88
103
  current_char = *current_int >> 8;
89
104
  if (current_char) {
90
- product_name_.push_back(current_char);
105
+ this->product_name_.push_back(current_char);
91
106
  // second char
92
107
  current_char = *current_int & 0xFF;
93
108
  if (current_char) {
94
- product_name_.push_back(current_char);
109
+ this->product_name_.push_back(current_char);
95
110
  }
96
111
  }
97
112
  current_int++;
98
113
  } while (current_char && --max);
99
114
 
100
115
  Sen5xType sen5x_type = UNKNOWN;
101
- if (product_name_ == "SEN50") {
116
+ if (this->product_name_ == "SEN50") {
102
117
  sen5x_type = SEN50;
103
118
  } else {
104
- if (product_name_ == "SEN54") {
119
+ if (this->product_name_ == "SEN54") {
105
120
  sen5x_type = SEN54;
106
121
  } else {
107
- if (product_name_ == "SEN55") {
122
+ if (this->product_name_ == "SEN55") {
108
123
  sen5x_type = SEN55;
109
124
  }
110
125
  }
111
- ESP_LOGD(TAG, "Productname %s", product_name_.c_str());
126
+ ESP_LOGD(TAG, "Product name: %s", this->product_name_.c_str());
112
127
  }
113
128
  if (this->humidity_sensor_ && sen5x_type == SEN50) {
114
- ESP_LOGE(TAG, "For Relative humidity a SEN54 OR SEN55 is required. You are using a <%s> sensor",
115
- this->product_name_.c_str());
129
+ ESP_LOGE(TAG, "Relative humidity requires a SEN54 or SEN55");
116
130
  this->humidity_sensor_ = nullptr; // mark as not used
117
131
  }
118
132
  if (this->temperature_sensor_ && sen5x_type == SEN50) {
119
- ESP_LOGE(TAG, "For Temperature a SEN54 OR SEN55 is required. You are using a <%s> sensor",
120
- this->product_name_.c_str());
133
+ ESP_LOGE(TAG, "Temperature requires a SEN54 or SEN55");
121
134
  this->temperature_sensor_ = nullptr; // mark as not used
122
135
  }
123
136
  if (this->voc_sensor_ && sen5x_type == SEN50) {
124
- ESP_LOGE(TAG, "For VOC a SEN54 OR SEN55 is required. You are using a <%s> sensor", this->product_name_.c_str());
137
+ ESP_LOGE(TAG, "VOC requires a SEN54 or SEN55");
125
138
  this->voc_sensor_ = nullptr; // mark as not used
126
139
  }
127
140
  if (this->nox_sensor_ && sen5x_type != SEN55) {
128
- ESP_LOGE(TAG, "For NOx a SEN55 is required. You are using a <%s> sensor", this->product_name_.c_str());
141
+ ESP_LOGE(TAG, "NOx requires a SEN55");
129
142
  this->nox_sensor_ = nullptr; // mark as not used
130
143
  }
131
144
 
@@ -136,7 +149,7 @@ void SEN5XComponent::setup() {
136
149
  return;
137
150
  }
138
151
  this->firmware_version_ >>= 8;
139
- ESP_LOGD(TAG, "Firmware version %d", this->firmware_version_);
152
+ ESP_LOGV(TAG, "Firmware version %d", this->firmware_version_);
140
153
 
141
154
  if (this->voc_sensor_ && this->store_baseline_) {
142
155
  uint32_t combined_serial =
@@ -149,7 +162,7 @@ void SEN5XComponent::setup() {
149
162
 
150
163
  if (this->pref_.load(&this->voc_baselines_storage_)) {
151
164
  ESP_LOGI(TAG, "Loaded VOC baseline state0: 0x%04" PRIX32 ", state1: 0x%04" PRIX32,
152
- this->voc_baselines_storage_.state0, voc_baselines_storage_.state1);
165
+ this->voc_baselines_storage_.state0, this->voc_baselines_storage_.state1);
153
166
  }
154
167
 
155
168
  // Initialize storage timestamp
@@ -157,13 +170,13 @@ void SEN5XComponent::setup() {
157
170
 
158
171
  if (this->voc_baselines_storage_.state0 > 0 && this->voc_baselines_storage_.state1 > 0) {
159
172
  ESP_LOGI(TAG, "Setting VOC baseline from save state0: 0x%04" PRIX32 ", state1: 0x%04" PRIX32,
160
- this->voc_baselines_storage_.state0, voc_baselines_storage_.state1);
173
+ this->voc_baselines_storage_.state0, this->voc_baselines_storage_.state1);
161
174
  uint16_t states[4];
162
175
 
163
- states[0] = voc_baselines_storage_.state0 >> 16;
164
- states[1] = voc_baselines_storage_.state0 & 0xFFFF;
165
- states[2] = voc_baselines_storage_.state1 >> 16;
166
- states[3] = voc_baselines_storage_.state1 & 0xFFFF;
176
+ states[0] = this->voc_baselines_storage_.state0 >> 16;
177
+ states[1] = this->voc_baselines_storage_.state0 & 0xFFFF;
178
+ states[2] = this->voc_baselines_storage_.state1 >> 16;
179
+ states[3] = this->voc_baselines_storage_.state1 & 0xFFFF;
167
180
 
168
181
  if (!this->write_command(SEN5X_CMD_VOC_ALGORITHM_STATE, states, 4)) {
169
182
  ESP_LOGE(TAG, "Failed to set VOC baseline from saved state");
@@ -181,11 +194,11 @@ void SEN5XComponent::setup() {
181
194
  delay(20);
182
195
  uint16_t secs[2];
183
196
  if (this->read_data(secs, 2)) {
184
- auto_cleaning_interval_ = secs[0] << 16 | secs[1];
197
+ this->auto_cleaning_interval_ = secs[0] << 16 | secs[1];
185
198
  }
186
199
  }
187
- if (acceleration_mode_.has_value()) {
188
- result = this->write_command(SEN5X_CMD_RHT_ACCELERATION_MODE, acceleration_mode_.value());
200
+ if (this->acceleration_mode_.has_value()) {
201
+ result = this->write_command(SEN5X_CMD_RHT_ACCELERATION_MODE, this->acceleration_mode_.value());
189
202
  } else {
190
203
  result = this->write_command(SEN5X_CMD_RHT_ACCELERATION_MODE);
191
204
  }
@@ -196,7 +209,7 @@ void SEN5XComponent::setup() {
196
209
  return;
197
210
  }
198
211
  delay(20);
199
- if (!acceleration_mode_.has_value()) {
212
+ if (!this->acceleration_mode_.has_value()) {
200
213
  uint16_t mode;
201
214
  if (this->read_data(mode)) {
202
215
  this->acceleration_mode_ = RhtAccelerationMode(mode);
@@ -226,19 +239,18 @@ void SEN5XComponent::setup() {
226
239
  }
227
240
 
228
241
  if (!this->write_command(cmd)) {
229
- ESP_LOGE(TAG, "Error starting continuous measurements.");
242
+ ESP_LOGE(TAG, "Error starting continuous measurements");
230
243
  this->error_code_ = MEASUREMENT_INIT_FAILED;
231
244
  this->mark_failed();
232
245
  return;
233
246
  }
234
- initialized_ = true;
235
- ESP_LOGD(TAG, "Sensor initialized");
247
+ this->initialized_ = true;
236
248
  });
237
249
  });
238
250
  }
239
251
 
240
252
  void SEN5XComponent::dump_config() {
241
- ESP_LOGCONFIG(TAG, "sen5x:");
253
+ ESP_LOGCONFIG(TAG, "SEN5X:");
242
254
  LOG_I2C_DEVICE(this);
243
255
  if (this->is_failed()) {
244
256
  switch (this->error_code_) {
@@ -246,16 +258,16 @@ void SEN5XComponent::dump_config() {
246
258
  ESP_LOGW(TAG, ESP_LOG_MSG_COMM_FAIL);
247
259
  break;
248
260
  case MEASUREMENT_INIT_FAILED:
249
- ESP_LOGW(TAG, "Measurement Initialization failed");
261
+ ESP_LOGW(TAG, "Measurement initialization failed");
250
262
  break;
251
263
  case SERIAL_NUMBER_IDENTIFICATION_FAILED:
252
- ESP_LOGW(TAG, "Unable to read sensor serial id");
264
+ ESP_LOGW(TAG, "Unable to read serial ID");
253
265
  break;
254
266
  case PRODUCT_NAME_FAILED:
255
267
  ESP_LOGW(TAG, "Unable to read product name");
256
268
  break;
257
269
  case FIRMWARE_FAILED:
258
- ESP_LOGW(TAG, "Unable to read sensor firmware version");
270
+ ESP_LOGW(TAG, "Unable to read firmware version");
259
271
  break;
260
272
  default:
261
273
  ESP_LOGW(TAG, "Unknown setup error");
@@ -263,26 +275,17 @@ void SEN5XComponent::dump_config() {
263
275
  }
264
276
  }
265
277
  ESP_LOGCONFIG(TAG,
266
- " Productname: %s\n"
278
+ " Product name: %s\n"
267
279
  " Firmware version: %d\n"
268
280
  " Serial number %02d.%02d.%02d",
269
- this->product_name_.c_str(), this->firmware_version_, serial_number_[0], serial_number_[1],
270
- serial_number_[2]);
281
+ this->product_name_.c_str(), this->firmware_version_, this->serial_number_[0], this->serial_number_[1],
282
+ this->serial_number_[2]);
271
283
  if (this->auto_cleaning_interval_.has_value()) {
272
- ESP_LOGCONFIG(TAG, " Auto cleaning interval %" PRId32 " seconds", auto_cleaning_interval_.value());
284
+ ESP_LOGCONFIG(TAG, " Auto cleaning interval: %" PRId32 "s", this->auto_cleaning_interval_.value());
273
285
  }
274
286
  if (this->acceleration_mode_.has_value()) {
275
- switch (this->acceleration_mode_.value()) {
276
- case LOW_ACCELERATION:
277
- ESP_LOGCONFIG(TAG, " Low RH/T acceleration mode");
278
- break;
279
- case MEDIUM_ACCELERATION:
280
- ESP_LOGCONFIG(TAG, " Medium RH/T acceleration mode");
281
- break;
282
- case HIGH_ACCELERATION:
283
- ESP_LOGCONFIG(TAG, " High RH/T acceleration mode");
284
- break;
285
- }
287
+ ESP_LOGCONFIG(TAG, " RH/T acceleration mode: %s",
288
+ LOG_STR_ARG(rht_accel_mode_to_string(this->acceleration_mode_.value())));
286
289
  }
287
290
  LOG_UPDATE_INTERVAL(this);
288
291
  LOG_SENSOR(" ", "PM 1.0", this->pm_1_0_sensor_);
@@ -296,7 +299,7 @@ void SEN5XComponent::dump_config() {
296
299
  }
297
300
 
298
301
  void SEN5XComponent::update() {
299
- if (!initialized_) {
302
+ if (!this->initialized_) {
300
303
  return;
301
304
  }
302
305
 
@@ -319,8 +322,8 @@ void SEN5XComponent::update() {
319
322
  this->voc_baselines_storage_.state1 = state1;
320
323
 
321
324
  if (this->pref_.save(&this->voc_baselines_storage_)) {
322
- ESP_LOGI(TAG, "Stored VOC baseline state0: 0x%04" PRIX32 " ,state1: 0x%04" PRIX32,
323
- this->voc_baselines_storage_.state0, voc_baselines_storage_.state1);
325
+ ESP_LOGI(TAG, "Stored VOC baseline state0: 0x%04" PRIX32 ", state1: 0x%04" PRIX32,
326
+ this->voc_baselines_storage_.state0, this->voc_baselines_storage_.state1);
324
327
  } else {
325
328
  ESP_LOGW(TAG, "Could not store VOC baselines");
326
329
  }
@@ -332,7 +335,7 @@ void SEN5XComponent::update() {
332
335
 
333
336
  if (!this->write_command(SEN5X_CMD_READ_MEASUREMENT)) {
334
337
  this->status_set_warning();
335
- ESP_LOGD(TAG, "write error read measurement (%d)", this->last_error_);
338
+ ESP_LOGD(TAG, "Write error: read measurement (%d)", this->last_error_);
336
339
  return;
337
340
  }
338
341
  this->set_timeout(20, [this]() {
@@ -340,7 +343,7 @@ void SEN5XComponent::update() {
340
343
 
341
344
  if (!this->read_data(measurements, 8)) {
342
345
  this->status_set_warning();
343
- ESP_LOGD(TAG, "read data error (%d)", this->last_error_);
346
+ ESP_LOGD(TAG, "Read data error (%d)", this->last_error_);
344
347
  return;
345
348
  }
346
349
 
@@ -412,7 +415,7 @@ bool SEN5XComponent::write_tuning_parameters_(uint16_t i2c_command, const GasTun
412
415
  params[5] = tuning.gain_factor;
413
416
  auto result = write_command(i2c_command, params, 6);
414
417
  if (!result) {
415
- ESP_LOGE(TAG, "set tuning parameters failed. i2c command=%0xX, err=%d", i2c_command, this->last_error_);
418
+ ESP_LOGE(TAG, "Set tuning parameters failed (command=%0xX, err=%d)", i2c_command, this->last_error_);
416
419
  }
417
420
  return result;
418
421
  }
@@ -423,7 +426,7 @@ bool SEN5XComponent::write_temperature_compensation_(const TemperatureCompensati
423
426
  params[1] = compensation.normalized_offset_slope;
424
427
  params[2] = compensation.time_constant;
425
428
  if (!write_command(SEN5X_CMD_TEMPERATURE_COMPENSATION, params, 3)) {
426
- ESP_LOGE(TAG, "set temperature_compensation failed. Err=%d", this->last_error_);
429
+ ESP_LOGE(TAG, "Set temperature_compensation failed (%d)", this->last_error_);
427
430
  return false;
428
431
  }
429
432
  return true;
@@ -432,7 +435,7 @@ bool SEN5XComponent::write_temperature_compensation_(const TemperatureCompensati
432
435
  bool SEN5XComponent::start_fan_cleaning() {
433
436
  if (!write_command(SEN5X_CMD_START_CLEANING_FAN)) {
434
437
  this->status_set_warning();
435
- ESP_LOGE(TAG, "write error start fan (%d)", this->last_error_);
438
+ ESP_LOGE(TAG, "Start fan cleaning failed (%d)", this->last_error_);
436
439
  return false;
437
440
  } else {
438
441
  ESP_LOGD(TAG, "Fan auto clean started");
@@ -9,7 +9,7 @@
9
9
  namespace esphome {
10
10
  namespace sen5x {
11
11
 
12
- enum ERRORCODE {
12
+ enum ERRORCODE : uint8_t {
13
13
  COMMUNICATION_FAILED,
14
14
  SERIAL_NUMBER_IDENTIFICATION_FAILED,
15
15
  MEASUREMENT_INIT_FAILED,
@@ -18,19 +18,17 @@ enum ERRORCODE {
18
18
  UNKNOWN
19
19
  };
20
20
 
21
- // Shortest time interval of 3H for storing baseline values.
22
- // Prevents wear of the flash because of too many write operations
23
- const uint32_t SHORTEST_BASELINE_STORE_INTERVAL = 10800;
24
- // Store anyway if the baseline difference exceeds the max storage diff value
25
- const uint32_t MAXIMUM_STORAGE_DIFF = 50;
21
+ enum RhtAccelerationMode : uint16_t {
22
+ LOW_ACCELERATION = 0,
23
+ MEDIUM_ACCELERATION = 1,
24
+ HIGH_ACCELERATION = 2,
25
+ };
26
26
 
27
27
  struct Sen5xBaselines {
28
28
  int32_t state0;
29
29
  int32_t state1;
30
30
  } PACKED; // NOLINT
31
31
 
32
- enum RhtAccelerationMode : uint16_t { LOW_ACCELERATION = 0, MEDIUM_ACCELERATION = 1, HIGH_ACCELERATION = 2 };
33
-
34
32
  struct GasTuning {
35
33
  uint16_t index_offset;
36
34
  uint16_t learning_time_offset_hours;
@@ -46,6 +44,12 @@ struct TemperatureCompensation {
46
44
  uint16_t time_constant;
47
45
  };
48
46
 
47
+ // Shortest time interval of 3H for storing baseline values.
48
+ // Prevents wear of the flash because of too many write operations
49
+ static const uint32_t SHORTEST_BASELINE_STORE_INTERVAL = 10800;
50
+ // Store anyway if the baseline difference exceeds the max storage diff value
51
+ static const uint32_t MAXIMUM_STORAGE_DIFF = 50;
52
+
49
53
  class SEN5XComponent : public PollingComponent, public sensirion_common::SensirionI2CDevice {
50
54
  public:
51
55
  void setup() override;
@@ -102,8 +106,14 @@ class SEN5XComponent : public PollingComponent, public sensirion_common::Sensiri
102
106
  protected:
103
107
  bool write_tuning_parameters_(uint16_t i2c_command, const GasTuning &tuning);
104
108
  bool write_temperature_compensation_(const TemperatureCompensation &compensation);
109
+
110
+ uint32_t seconds_since_last_store_;
111
+ uint16_t firmware_version_;
105
112
  ERRORCODE error_code_;
113
+ uint8_t serial_number_[4];
106
114
  bool initialized_{false};
115
+ bool store_baseline_;
116
+
107
117
  sensor::Sensor *pm_1_0_sensor_{nullptr};
108
118
  sensor::Sensor *pm_2_5_sensor_{nullptr};
109
119
  sensor::Sensor *pm_4_0_sensor_{nullptr};
@@ -115,18 +125,14 @@ class SEN5XComponent : public PollingComponent, public sensirion_common::Sensiri
115
125
  // SEN55 only
116
126
  sensor::Sensor *nox_sensor_{nullptr};
117
127
 
118
- std::string product_name_;
119
- uint8_t serial_number_[4];
120
- uint16_t firmware_version_;
121
- Sen5xBaselines voc_baselines_storage_;
122
- bool store_baseline_;
123
- uint32_t seconds_since_last_store_;
124
- ESPPreferenceObject pref_;
125
128
  optional<RhtAccelerationMode> acceleration_mode_;
126
129
  optional<uint32_t> auto_cleaning_interval_;
127
130
  optional<GasTuning> voc_tuning_params_;
128
131
  optional<GasTuning> nox_tuning_params_;
129
132
  optional<TemperatureCompensation> temperature_compensation_;
133
+ ESPPreferenceObject pref_;
134
+ std::string product_name_;
135
+ Sen5xBaselines voc_baselines_storage_;
130
136
  };
131
137
 
132
138
  } // namespace sen5x