esphome 2025.7.4__py3-none-any.whl → 2025.8.0__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 (758) hide show
  1. esphome/__main__.py +190 -83
  2. esphome/automation.py +2 -4
  3. esphome/build_gen/__init__.py +0 -0
  4. esphome/build_gen/platformio.py +102 -0
  5. esphome/components/a4988/a4988.cpp +0 -1
  6. esphome/components/absolute_humidity/absolute_humidity.cpp +0 -2
  7. esphome/components/absolute_humidity/sensor.py +2 -2
  8. esphome/components/adc/__init__.py +123 -85
  9. esphome/components/adc/adc_sensor.h +98 -35
  10. esphome/components/adc/adc_sensor_common.cpp +10 -4
  11. esphome/components/adc/adc_sensor_esp32.cpp +291 -123
  12. esphome/components/adc/adc_sensor_esp8266.cpp +1 -4
  13. esphome/components/adc/adc_sensor_libretiny.cpp +1 -2
  14. esphome/components/adc/adc_sensor_rp2040.cpp +1 -2
  15. esphome/components/adc/adc_sensor_zephyr.cpp +207 -0
  16. esphome/components/adc/sensor.py +61 -27
  17. esphome/components/adc128s102/adc128s102.cpp +1 -4
  18. esphome/components/ade7880/sensor.py +75 -49
  19. esphome/components/ads1115/ads1115.cpp +0 -1
  20. esphome/components/ads1118/ads1118.cpp +0 -1
  21. esphome/components/ags10/ags10.cpp +0 -4
  22. esphome/components/aht10/aht10.cpp +0 -4
  23. esphome/components/aic3204/aic3204.cpp +0 -2
  24. esphome/components/airthings_wave_plus/__init__.py +1 -1
  25. esphome/components/airthings_wave_plus/airthings_wave_plus.cpp +22 -4
  26. esphome/components/airthings_wave_plus/airthings_wave_plus.h +10 -1
  27. esphome/components/airthings_wave_plus/sensor.py +55 -28
  28. esphome/components/alarm_control_panel/__init__.py +4 -9
  29. esphome/components/am2315c/am2315c.cpp +0 -2
  30. esphome/components/am2320/am2320.cpp +0 -1
  31. esphome/components/animation/__init__.py +14 -11
  32. esphome/components/apds9306/apds9306.cpp +0 -4
  33. esphome/components/apds9960/apds9960.cpp +0 -1
  34. esphome/components/api/__init__.py +29 -4
  35. esphome/components/api/api_connection.cpp +378 -401
  36. esphome/components/api/api_connection.h +112 -56
  37. esphome/components/api/api_frame_helper.cpp +69 -896
  38. esphome/components/api/api_frame_helper.h +31 -126
  39. esphome/components/api/api_frame_helper_noise.cpp +583 -0
  40. esphome/components/api/api_frame_helper_noise.h +68 -0
  41. esphome/components/api/api_frame_helper_plaintext.cpp +290 -0
  42. esphome/components/api/api_frame_helper_plaintext.h +53 -0
  43. esphome/components/api/api_noise_context.h +2 -4
  44. esphome/components/api/api_pb2.cpp +1601 -1808
  45. esphome/components/api/api_pb2.h +367 -323
  46. esphome/components/api/api_pb2_dump.cpp +1137 -3466
  47. esphome/components/api/api_pb2_includes.h +34 -0
  48. esphome/components/api/api_pb2_service.cpp +94 -105
  49. esphome/components/api/api_pb2_service.h +27 -16
  50. esphome/components/api/api_server.cpp +18 -17
  51. esphome/components/api/api_server.h +8 -5
  52. esphome/components/api/client.py +16 -8
  53. esphome/components/api/custom_api_device.h +68 -14
  54. esphome/components/api/homeassistant_service.h +24 -19
  55. esphome/components/api/list_entities.cpp +3 -5
  56. esphome/components/api/list_entities.h +2 -4
  57. esphome/components/api/proto.cpp +3 -5
  58. esphome/components/api/proto.h +239 -274
  59. esphome/components/api/subscribe_state.cpp +2 -4
  60. esphome/components/api/subscribe_state.h +2 -4
  61. esphome/components/api/user_services.cpp +2 -4
  62. esphome/components/api/user_services.h +8 -8
  63. esphome/components/as3935/as3935.cpp +0 -2
  64. esphome/components/as3935_spi/as3935_spi.cpp +0 -2
  65. esphome/components/as5600/__init__.py +1 -1
  66. esphome/components/as5600/as5600.cpp +0 -2
  67. esphome/components/as5600/sensor/__init__.py +0 -1
  68. esphome/components/as7341/as7341.cpp +0 -1
  69. esphome/components/async_tcp/__init__.py +1 -1
  70. esphome/components/at581x/at581x.cpp +1 -1
  71. esphome/components/atm90e26/atm90e26.cpp +0 -1
  72. esphome/components/atm90e32/atm90e32.cpp +475 -116
  73. esphome/components/atm90e32/atm90e32.h +43 -5
  74. esphome/components/audio/audio.h +2 -2
  75. esphome/components/axs15231/touchscreen/axs15231_touchscreen.cpp +0 -2
  76. esphome/components/beken_spi_led_strip/led_strip.cpp +0 -2
  77. esphome/components/bh1750/bh1750.cpp +0 -1
  78. esphome/components/binary_sensor/__init__.py +14 -12
  79. esphome/components/ble_client/__init__.py +4 -7
  80. esphome/components/bluetooth_proxy/__init__.py +40 -3
  81. esphome/components/bluetooth_proxy/bluetooth_connection.cpp +392 -81
  82. esphome/components/bluetooth_proxy/bluetooth_connection.h +16 -5
  83. esphome/components/bluetooth_proxy/bluetooth_proxy.cpp +102 -311
  84. esphome/components/bluetooth_proxy/bluetooth_proxy.h +30 -14
  85. esphome/components/bme280_base/bme280_base.cpp +15 -16
  86. esphome/components/bme680/bme680.cpp +2 -3
  87. esphome/components/bme680_bsec/bme680_bsec.cpp +0 -2
  88. esphome/components/bme68x_bsec2/bme68x_bsec2.cpp +0 -2
  89. esphome/components/bmi160/bmi160.cpp +0 -1
  90. esphome/components/bmp085/bmp085.cpp +0 -1
  91. esphome/components/bmp280_base/bmp280_base.cpp +13 -14
  92. esphome/components/bmp3xx_base/bmp3xx_base.cpp +0 -1
  93. esphome/components/bmp581/bmp581.cpp +0 -2
  94. esphome/components/bp1658cj/bp1658cj.cpp +0 -1
  95. esphome/components/bp5758d/bp5758d.cpp +0 -1
  96. esphome/components/button/__init__.py +0 -1
  97. esphome/components/canbus/__init__.py +2 -3
  98. esphome/components/canbus/canbus.cpp +0 -1
  99. esphome/components/cap1188/cap1188.cpp +0 -2
  100. esphome/components/captive_portal/__init__.py +1 -1
  101. esphome/components/cd74hc4067/cd74hc4067.cpp +0 -2
  102. esphome/components/ch422g/ch422g.cpp +0 -1
  103. esphome/components/chsc6x/chsc6x_touchscreen.cpp +0 -3
  104. esphome/components/climate/__init__.py +0 -1
  105. esphome/components/climate/climate_traits.h +24 -0
  106. esphome/components/cm1106/cm1106.cpp +0 -1
  107. esphome/components/const/__init__.py +6 -0
  108. esphome/components/cover/__init__.py +0 -1
  109. esphome/components/cover/cover.cpp +9 -13
  110. esphome/components/cs5460a/cs5460a.cpp +0 -2
  111. esphome/components/cse7761/cse7761.cpp +0 -1
  112. esphome/components/cst226/touchscreen/cst226_touchscreen.cpp +0 -2
  113. esphome/components/cst816/touchscreen/cst816_touchscreen.cpp +0 -2
  114. esphome/components/dac7678/dac7678_output.cpp +0 -2
  115. esphome/components/dallas_temp/dallas_temp.cpp +0 -1
  116. esphome/components/datetime/__init__.py +0 -2
  117. esphome/components/debug/__init__.py +15 -1
  118. esphome/components/debug/debug_zephyr.cpp +281 -0
  119. esphome/components/debug/sensor.py +2 -1
  120. esphome/components/deep_sleep/deep_sleep_component.cpp +0 -1
  121. esphome/components/deep_sleep/deep_sleep_esp32.cpp +20 -1
  122. esphome/components/dfrobot_sen0395/__init__.py +1 -2
  123. esphome/components/dht/dht.cpp +0 -1
  124. esphome/components/dht12/dht12.cpp +0 -1
  125. esphome/components/display/__init__.py +16 -3
  126. esphome/components/display_menu_base/__init__.py +1 -1
  127. esphome/components/dps310/dps310.cpp +0 -2
  128. esphome/components/ds1307/ds1307.cpp +0 -1
  129. esphome/components/ds2484/ds2484.cpp +0 -1
  130. esphome/components/duty_cycle/duty_cycle_sensor.cpp +0 -1
  131. esphome/components/ee895/ee895.cpp +0 -1
  132. esphome/components/ektf2232/touchscreen/ektf2232.cpp +0 -1
  133. esphome/components/emc2101/emc2101.cpp +0 -2
  134. esphome/components/ens160_base/ens160_base.cpp +0 -2
  135. esphome/components/ens210/ens210.cpp +0 -1
  136. esphome/components/es7210/es7210.cpp +0 -2
  137. esphome/components/es7243e/es7243e.cpp +0 -2
  138. esphome/components/es8156/es8156.cpp +0 -2
  139. esphome/components/es8311/es8311.cpp +0 -2
  140. esphome/components/es8388/es8388.cpp +0 -2
  141. esphome/components/esp32/__init__.py +203 -60
  142. esphome/components/esp32/boards.py +17 -0
  143. esphome/components/esp32/gpio.cpp +0 -1
  144. esphome/components/esp32/gpio.py +1 -2
  145. esphome/components/esp32/gpio_esp32_h2.py +2 -7
  146. esphome/components/esp32/gpio_esp32_p4.py +2 -7
  147. esphome/components/esp32/post_build.py.script +112 -61
  148. esphome/components/esp32_ble/__init__.py +41 -2
  149. esphome/components/esp32_ble/ble.cpp +14 -10
  150. esphome/components/esp32_ble/ble.h +18 -18
  151. esphome/components/esp32_ble/ble_advertising.cpp +5 -5
  152. esphome/components/esp32_ble/ble_advertising.h +7 -5
  153. esphome/components/esp32_ble/ble_event.h +139 -73
  154. esphome/components/esp32_ble/ble_scan_result.h +2 -4
  155. esphome/components/esp32_ble/ble_uuid.cpp +5 -5
  156. esphome/components/esp32_ble/ble_uuid.h +6 -5
  157. esphome/components/esp32_ble_beacon/__init__.py +4 -0
  158. esphome/components/esp32_ble_client/__init__.py +1 -1
  159. esphome/components/esp32_ble_client/ble_characteristic.cpp +4 -4
  160. esphome/components/esp32_ble_client/ble_characteristic.h +6 -4
  161. esphome/components/esp32_ble_client/ble_client_base.cpp +155 -104
  162. esphome/components/esp32_ble_client/ble_client_base.h +17 -6
  163. esphome/components/esp32_ble_client/ble_descriptor.h +6 -4
  164. esphome/components/esp32_ble_client/ble_service.cpp +4 -4
  165. esphome/components/esp32_ble_client/ble_service.h +6 -4
  166. esphome/components/esp32_ble_server/__init__.py +15 -12
  167. esphome/components/esp32_ble_tracker/__init__.py +79 -11
  168. esphome/components/esp32_ble_tracker/automation.h +4 -4
  169. esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +264 -261
  170. esphome/components/esp32_ble_tracker/esp32_ble_tracker.h +103 -37
  171. esphome/components/esp32_camera/__init__.py +13 -1
  172. esphome/components/esp32_camera/esp32_camera.cpp +7 -2
  173. esphome/components/esp32_camera/esp32_camera.h +1 -0
  174. esphome/components/esp32_dac/esp32_dac.cpp +3 -19
  175. esphome/components/esp32_dac/esp32_dac.h +4 -8
  176. esphome/components/esp32_rmt_led_strip/led_strip.cpp +1 -6
  177. esphome/components/esp32_rmt_led_strip/light.py +1 -1
  178. esphome/components/esp32_touch/__init__.py +2 -3
  179. esphome/components/esp32_touch/esp32_touch.h +9 -6
  180. esphome/components/esp32_touch/esp32_touch_common.cpp +2 -0
  181. esphome/components/esp32_touch/esp32_touch_v1.cpp +7 -9
  182. esphome/components/esp32_touch/esp32_touch_v2.cpp +10 -6
  183. esphome/components/esp8266/__init__.py +3 -1
  184. esphome/components/esp8266_pwm/esp8266_pwm.cpp +0 -1
  185. esphome/components/esphome/ota/__init__.py +1 -2
  186. esphome/components/esphome/ota/ota_esphome.cpp +150 -77
  187. esphome/components/esphome/ota/ota_esphome.h +8 -1
  188. esphome/components/espnow/__init__.py +309 -0
  189. esphome/components/espnow/automation.h +175 -0
  190. esphome/components/espnow/espnow_component.cpp +468 -0
  191. esphome/components/espnow/espnow_component.h +183 -0
  192. esphome/components/espnow/espnow_err.h +19 -0
  193. esphome/components/espnow/espnow_packet.h +166 -0
  194. esphome/components/ethernet/__init__.py +7 -1
  195. esphome/components/ethernet/esp_eth_phy_jl1101.c +5 -0
  196. esphome/components/ethernet/ethernet_component.cpp +0 -1
  197. esphome/components/ethernet/ethernet_component.h +4 -0
  198. esphome/components/ethernet_info/ethernet_info_text_sensor.h +0 -3
  199. esphome/components/event/__init__.py +0 -1
  200. esphome/components/factory_reset/__init__.py +92 -0
  201. esphome/components/factory_reset/factory_reset.cpp +76 -0
  202. esphome/components/factory_reset/factory_reset.h +43 -0
  203. esphome/components/fan/__init__.py +0 -1
  204. esphome/components/fan/fan_traits.h +16 -0
  205. esphome/components/fastled_base/fastled_light.cpp +0 -1
  206. esphome/components/fastled_spi/light.py +1 -3
  207. esphome/components/fingerprint_grow/fingerprint_grow.cpp +0 -2
  208. esphome/components/font/__init__.py +9 -1
  209. esphome/components/fs3000/fs3000.cpp +0 -2
  210. esphome/components/ft5x06/touchscreen/ft5x06_touchscreen.cpp +0 -2
  211. esphome/components/ft63x6/ft63x6.cpp +0 -1
  212. esphome/components/gdk101/gdk101.cpp +0 -1
  213. esphome/components/gl_r01_i2c/gl_r01_i2c.cpp +0 -1
  214. esphome/components/gl_r01_i2c/sensor.py +1 -1
  215. esphome/components/gpio/one_wire/gpio_one_wire.cpp +0 -1
  216. esphome/components/gpio/switch/gpio_switch.cpp +0 -2
  217. esphome/components/gpio_expander/cached_gpio.h +24 -15
  218. esphome/components/gps/__init__.py +6 -2
  219. esphome/components/gps/gps.cpp +50 -49
  220. esphome/components/gps/gps.h +4 -8
  221. esphome/components/gps/time/gps_time.cpp +3 -9
  222. esphome/components/gps/time/gps_time.h +4 -7
  223. esphome/components/graph/__init__.py +1 -1
  224. esphome/components/grove_gas_mc_v2/grove_gas_mc_v2.cpp +0 -1
  225. esphome/components/grove_tb6612fng/grove_tb6612fng.cpp +0 -1
  226. esphome/components/gt911/touchscreen/gt911_touchscreen.cpp +21 -12
  227. esphome/components/gt911/touchscreen/gt911_touchscreen.h +26 -2
  228. esphome/components/haier/climate.py +5 -10
  229. esphome/components/haier/haier_base.cpp +0 -1
  230. esphome/components/hbridge/switch/hbridge_switch.cpp +0 -2
  231. esphome/components/hdc1080/hdc1080.cpp +0 -2
  232. esphome/components/heatpumpir/climate.py +2 -2
  233. esphome/components/hlw8012/hlw8012.cpp +0 -1
  234. esphome/components/hm3301/hm3301.cpp +0 -1
  235. esphome/components/hmc5883l/hmc5883l.cpp +0 -1
  236. esphome/components/homeassistant/__init__.py +1 -0
  237. esphome/components/homeassistant/number/__init__.py +1 -0
  238. esphome/components/homeassistant/number/homeassistant_number.cpp +11 -7
  239. esphome/components/homeassistant/switch/__init__.py +1 -0
  240. esphome/components/homeassistant/switch/homeassistant_switch.cpp +9 -5
  241. esphome/components/honeywellabp/honeywellabp.cpp +1 -4
  242. esphome/components/host/__init__.py +2 -0
  243. esphome/components/hte501/hte501.cpp +0 -1
  244. esphome/components/http_request/__init__.py +2 -3
  245. esphome/components/http_request/http_request_idf.cpp +2 -2
  246. esphome/components/htu21d/htu21d.cpp +0 -2
  247. esphome/components/htu31d/htu31d.cpp +0 -2
  248. esphome/components/hx711/hx711.cpp +0 -1
  249. esphome/components/hydreon_rgxx/hydreon_rgxx.cpp +0 -1
  250. esphome/components/hydreon_rgxx/sensor.py +4 -5
  251. esphome/components/i2c/i2c_bus.h +1 -1
  252. esphome/components/i2c/i2c_bus_arduino.cpp +1 -2
  253. esphome/components/i2c/i2c_bus_esp_idf.cpp +192 -17
  254. esphome/components/i2c/i2c_bus_esp_idf.h +11 -1
  255. esphome/components/i2s_audio/__init__.py +6 -5
  256. esphome/components/i2s_audio/i2s_audio.cpp +0 -2
  257. esphome/components/i2s_audio/media_player/i2s_audio_media_player.cpp +1 -4
  258. esphome/components/i2s_audio/microphone/__init__.py +4 -6
  259. esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp +46 -19
  260. esphome/components/i2s_audio/microphone/i2s_audio_microphone.h +4 -3
  261. esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +273 -269
  262. esphome/components/i2s_audio/speaker/i2s_audio_speaker.h +19 -34
  263. esphome/components/ili9xxx/display.py +4 -3
  264. esphome/components/ili9xxx/ili9xxx_display.cpp +0 -2
  265. esphome/components/image/__init__.py +123 -92
  266. esphome/components/improv_serial/__init__.py +7 -8
  267. esphome/components/ina219/ina219.cpp +0 -1
  268. esphome/components/ina226/ina226.cpp +0 -2
  269. esphome/components/ina260/ina260.cpp +0 -2
  270. esphome/components/ina2xx_base/__init__.py +2 -5
  271. esphome/components/ina2xx_base/ina2xx_base.cpp +0 -2
  272. esphome/components/ina3221/ina3221.cpp +0 -1
  273. esphome/components/internal_temperature/internal_temperature.cpp +0 -2
  274. esphome/components/interval/interval.h +5 -9
  275. esphome/components/json/__init__.py +1 -1
  276. esphome/components/kmeteriso/kmeteriso.cpp +0 -2
  277. esphome/components/lc709203f/lc709203f.cpp +0 -2
  278. esphome/components/lcd_gpio/display.py +1 -3
  279. esphome/components/lcd_gpio/gpio_lcd_display.cpp +0 -1
  280. esphome/components/lcd_pcf8574/pcf8574_display.cpp +0 -1
  281. esphome/components/ld2410/__init__.py +4 -6
  282. esphome/components/ld2410/binary_sensor.py +4 -0
  283. esphome/components/ld2410/ld2410.cpp +56 -100
  284. esphome/components/ld2410/ld2410.h +17 -15
  285. esphome/components/ld2410/sensor.py +24 -10
  286. esphome/components/ld2412/__init__.py +46 -0
  287. esphome/components/ld2412/binary_sensor.py +70 -0
  288. esphome/components/ld2412/button/__init__.py +74 -0
  289. esphome/components/ld2412/button/factory_reset_button.cpp +9 -0
  290. esphome/components/ld2412/button/factory_reset_button.h +18 -0
  291. esphome/components/ld2412/button/query_button.cpp +9 -0
  292. esphome/components/ld2412/button/query_button.h +18 -0
  293. esphome/components/ld2412/button/restart_button.cpp +9 -0
  294. esphome/components/ld2412/button/restart_button.h +18 -0
  295. esphome/components/ld2412/button/start_dynamic_background_correction_button.cpp +11 -0
  296. esphome/components/ld2412/button/start_dynamic_background_correction_button.h +18 -0
  297. esphome/components/ld2412/ld2412.cpp +861 -0
  298. esphome/components/ld2412/ld2412.h +141 -0
  299. esphome/components/ld2412/number/__init__.py +126 -0
  300. esphome/components/ld2412/number/gate_threshold_number.cpp +14 -0
  301. esphome/components/ld2412/number/gate_threshold_number.h +19 -0
  302. esphome/components/ld2412/number/light_threshold_number.cpp +12 -0
  303. esphome/components/ld2412/number/light_threshold_number.h +18 -0
  304. esphome/components/ld2412/number/max_distance_timeout_number.cpp +12 -0
  305. esphome/components/ld2412/number/max_distance_timeout_number.h +18 -0
  306. esphome/components/ld2412/select/__init__.py +82 -0
  307. esphome/components/ld2412/select/baud_rate_select.cpp +12 -0
  308. esphome/components/ld2412/select/baud_rate_select.h +18 -0
  309. esphome/components/ld2412/select/distance_resolution_select.cpp +12 -0
  310. esphome/components/ld2412/select/distance_resolution_select.h +18 -0
  311. esphome/components/ld2412/select/light_out_control_select.cpp +12 -0
  312. esphome/components/ld2412/select/light_out_control_select.h +18 -0
  313. esphome/components/ld2412/sensor.py +124 -0
  314. esphome/components/ld2412/switch/__init__.py +45 -0
  315. esphome/components/ld2412/switch/bluetooth_switch.cpp +12 -0
  316. esphome/components/ld2412/switch/bluetooth_switch.h +18 -0
  317. esphome/components/ld2412/switch/engineering_mode_switch.cpp +12 -0
  318. esphome/components/ld2412/switch/engineering_mode_switch.h +18 -0
  319. esphome/components/ld2412/text_sensor.py +34 -0
  320. esphome/components/ld2420/ld2420.cpp +0 -1
  321. esphome/components/ld2450/__init__.py +3 -4
  322. esphome/components/ld2450/binary_sensor.py +3 -0
  323. esphome/components/ld2450/ld2450.cpp +77 -165
  324. esphome/components/ld2450/ld2450.h +26 -54
  325. esphome/components/ld2450/sensor.py +120 -6
  326. esphome/components/ld2450/text_sensor.py +5 -4
  327. esphome/components/ld24xx/__init__.py +1 -0
  328. esphome/components/ld24xx/ld24xx.h +65 -0
  329. esphome/components/ledc/ledc_output.cpp +0 -1
  330. esphome/components/libretiny/__init__.py +2 -0
  331. esphome/components/light/__init__.py +0 -1
  332. esphome/components/light/effects.py +70 -45
  333. esphome/components/light/light_call.cpp +101 -66
  334. esphome/components/light/light_color_values.h +16 -11
  335. esphome/components/light/light_json_schema.cpp +46 -44
  336. esphome/components/light/light_state.cpp +8 -11
  337. esphome/components/light/light_traits.h +17 -0
  338. esphome/components/lightwaverf/lightwaverf.cpp +0 -2
  339. esphome/components/lilygo_t5_47/touchscreen/lilygo_t5_47_touchscreen.cpp +0 -1
  340. esphome/components/lock/__init__.py +0 -1
  341. esphome/components/logger/__init__.py +31 -9
  342. esphome/components/logger/logger.cpp +12 -7
  343. esphome/components/logger/logger.h +25 -14
  344. esphome/components/logger/logger_esp32.cpp +2 -7
  345. esphome/components/logger/logger_esp8266.cpp +2 -4
  346. esphome/components/logger/logger_host.cpp +2 -4
  347. esphome/components/logger/logger_libretiny.cpp +2 -4
  348. esphome/components/logger/logger_rp2040.cpp +2 -4
  349. esphome/components/logger/logger_zephyr.cpp +86 -0
  350. esphome/components/logger/select/logger_level_select.cpp +2 -4
  351. esphome/components/logger/select/logger_level_select.h +2 -4
  352. esphome/components/logger/task_log_buffer.cpp +2 -4
  353. esphome/components/logger/task_log_buffer.h +2 -4
  354. esphome/components/lps22/sensor.py +5 -5
  355. esphome/components/ltr390/ltr390.cpp +0 -2
  356. esphome/components/ltr501/ltr501.cpp +0 -1
  357. esphome/components/ltr_als_ps/ltr_als_ps.cpp +0 -1
  358. esphome/components/lvgl/__init__.py +14 -13
  359. esphome/components/lvgl/automation.py +2 -4
  360. esphome/components/lvgl/defines.py +0 -2
  361. esphome/components/lvgl/helpers.py +1 -1
  362. esphome/components/lvgl/lv_validation.py +7 -4
  363. esphome/components/lvgl/lvgl_esphome.cpp +2 -3
  364. esphome/components/lvgl/styles.py +2 -2
  365. esphome/components/lvgl/types.py +1 -1
  366. esphome/components/lvgl/widgets/__init__.py +2 -2
  367. esphome/components/lvgl/widgets/arc.py +14 -11
  368. esphome/components/lvgl/widgets/buttonmatrix.py +1 -1
  369. esphome/components/lvgl/widgets/qrcode.py +7 -7
  370. esphome/components/lvgl/widgets/spinner.py +6 -6
  371. esphome/components/lvgl/widgets/switch.py +2 -2
  372. esphome/components/lvgl/widgets/tabview.py +3 -3
  373. esphome/components/lvgl/widgets/tileview.py +15 -7
  374. esphome/components/m5stack_8angle/m5stack_8angle.cpp +0 -1
  375. esphome/components/matrix_keypad/__init__.py +4 -3
  376. esphome/components/max17043/max17043.cpp +0 -2
  377. esphome/components/max31855/max31855.cpp +1 -4
  378. esphome/components/max31856/max31856.cpp +0 -4
  379. esphome/components/max31865/max31865.cpp +0 -1
  380. esphome/components/max44009/max44009.cpp +0 -1
  381. esphome/components/max6675/max6675.cpp +1 -4
  382. esphome/components/max6956/max6956.cpp +0 -1
  383. esphome/components/max7219/max7219.cpp +0 -1
  384. esphome/components/max7219digit/display.py +1 -1
  385. esphome/components/max7219digit/max7219digit.cpp +0 -1
  386. esphome/components/max9611/max9611.cpp +0 -1
  387. esphome/components/mcp23008/__init__.py +1 -1
  388. esphome/components/mcp23008/mcp23008.cpp +0 -1
  389. esphome/components/mcp23016/mcp23016.cpp +0 -1
  390. esphome/components/mcp23017/__init__.py +1 -1
  391. esphome/components/mcp23017/mcp23017.cpp +0 -1
  392. esphome/components/mcp23s08/__init__.py +1 -1
  393. esphome/components/mcp23s08/mcp23s08.cpp +0 -1
  394. esphome/components/mcp23s17/__init__.py +1 -1
  395. esphome/components/mcp23s17/mcp23s17.cpp +0 -1
  396. esphome/components/mcp23x08_base/__init__.py +2 -0
  397. esphome/components/mcp23x08_base/mcp23x08_base.cpp +9 -7
  398. esphome/components/mcp23x08_base/mcp23x08_base.h +9 -4
  399. esphome/components/mcp23x17_base/__init__.py +2 -0
  400. esphome/components/mcp23x17_base/mcp23x17_base.cpp +20 -7
  401. esphome/components/mcp23x17_base/mcp23x17_base.h +9 -4
  402. esphome/components/mcp23xxx_base/__init__.py +11 -5
  403. esphome/components/mcp23xxx_base/mcp23xxx_base.cpp +15 -12
  404. esphome/components/mcp23xxx_base/mcp23xxx_base.h +8 -7
  405. esphome/components/mcp3008/mcp3008.cpp +1 -4
  406. esphome/components/mcp3204/mcp3204.cpp +1 -4
  407. esphome/components/mcp4461/mcp4461.cpp +0 -1
  408. esphome/components/mcp4725/mcp4725.cpp +0 -1
  409. esphome/components/mcp4728/mcp4728.cpp +0 -1
  410. esphome/components/mcp9600/mcp9600.cpp +0 -2
  411. esphome/components/mcp9808/mcp9808.cpp +0 -2
  412. esphome/components/mdns/__init__.py +3 -0
  413. esphome/components/mdns/mdns_component.cpp +2 -0
  414. esphome/components/mdns/mdns_component.h +4 -0
  415. esphome/components/media_player/__init__.py +40 -0
  416. esphome/components/media_player/automation.h +16 -0
  417. esphome/components/media_player/media_player.cpp +13 -0
  418. esphome/components/media_player/media_player.h +50 -3
  419. esphome/components/micro_wake_word/micro_wake_word.cpp +0 -3
  420. esphome/components/mics_4514/mics_4514.cpp +1 -6
  421. esphome/components/midea/ir_transmitter.h +4 -4
  422. esphome/components/mipi/__init__.py +416 -0
  423. esphome/components/mipi_dsi/__init__.py +5 -0
  424. esphome/components/mipi_dsi/display.py +233 -0
  425. esphome/components/mipi_dsi/mipi_dsi.cpp +379 -0
  426. esphome/components/mipi_dsi/mipi_dsi.h +123 -0
  427. esphome/components/mipi_dsi/models/__init__.py +0 -0
  428. esphome/components/mipi_dsi/models/guition.py +38 -0
  429. esphome/components/mipi_dsi/models/m5stack.py +57 -0
  430. esphome/components/mipi_dsi/models/waveshare.py +105 -0
  431. esphome/components/mipi_rgb/models/lilygo.py +0 -0
  432. esphome/components/mipi_spi/__init__.py +0 -9
  433. esphome/components/mipi_spi/display.py +220 -256
  434. esphome/components/mipi_spi/mipi_spi.cpp +1 -485
  435. esphome/components/mipi_spi/mipi_spi.h +556 -108
  436. esphome/components/mipi_spi/models/__init__.py +0 -65
  437. esphome/components/mipi_spi/models/adafruit.py +30 -0
  438. esphome/components/mipi_spi/models/amoled.py +41 -5
  439. esphome/components/mipi_spi/models/ili.py +5 -5
  440. esphome/components/mipi_spi/models/jc.py +1 -3
  441. esphome/components/mipi_spi/models/lilygo.py +1 -1
  442. esphome/components/mipi_spi/models/waveshare.py +16 -1
  443. esphome/components/mixer/speaker/__init__.py +4 -5
  444. esphome/components/mlx90393/sensor.py +7 -5
  445. esphome/components/mlx90393/sensor_mlx90393.cpp +0 -1
  446. esphome/components/mlx90614/mlx90614.cpp +0 -1
  447. esphome/components/mmc5603/mmc5603.cpp +0 -1
  448. esphome/components/mmc5983/mmc5983.cpp +0 -2
  449. esphome/components/mpl3115a2/mpl3115a2.cpp +0 -2
  450. esphome/components/mpr121/__init__.py +7 -6
  451. esphome/components/mpr121/mpr121.cpp +0 -1
  452. esphome/components/mpu6050/mpu6050.cpp +0 -1
  453. esphome/components/mpu6886/mpu6886.cpp +0 -1
  454. esphome/components/mqtt/__init__.py +1 -2
  455. esphome/components/mqtt/mqtt_button.cpp +1 -1
  456. esphome/components/mqtt/mqtt_client.cpp +0 -1
  457. esphome/components/mqtt/mqtt_component.cpp +8 -14
  458. esphome/components/mqtt/mqtt_component.h +0 -7
  459. esphome/components/mqtt/mqtt_sensor.cpp +0 -1
  460. esphome/components/mqtt/mqtt_sensor.h +0 -1
  461. esphome/components/mqtt/mqtt_text_sensor.cpp +0 -1
  462. esphome/components/mqtt/mqtt_text_sensor.h +0 -1
  463. esphome/components/ms5611/ms5611.cpp +0 -1
  464. esphome/components/ms8607/ms8607.cpp +0 -1
  465. esphome/components/msa3xx/msa3xx.cpp +0 -2
  466. esphome/components/my9231/my9231.cpp +0 -2
  467. esphome/components/nau7802/nau7802.cpp +0 -1
  468. esphome/components/neopixelbus/light.py +3 -0
  469. esphome/components/network/util.cpp +29 -0
  470. esphome/components/nextion/nextion.cpp +2 -2
  471. esphome/components/nfc/binary_sensor/{binary_sensor.cpp → nfc_binary_sensor.cpp} +1 -1
  472. esphome/components/npi19/npi19.cpp +0 -2
  473. esphome/components/nrf52/__init__.py +223 -0
  474. esphome/components/nrf52/boards.py +34 -0
  475. esphome/components/nrf52/const.py +18 -0
  476. esphome/components/nrf52/gpio.py +79 -0
  477. esphome/components/number/__init__.py +2 -1
  478. esphome/components/one_wire/__init__.py +1 -2
  479. esphome/components/one_wire/one_wire.cpp +0 -2
  480. esphome/components/one_wire/one_wire.h +0 -2
  481. esphome/components/opentherm/hub.cpp +0 -1
  482. esphome/components/opentherm/number/__init__.py +2 -2
  483. esphome/components/openthread/__init__.py +2 -3
  484. esphome/components/openthread/openthread.cpp +30 -13
  485. esphome/components/openthread/openthread.h +3 -0
  486. esphome/components/openthread/openthread_esp.cpp +3 -1
  487. esphome/components/opt3001/sensor.py +2 -6
  488. esphome/components/output/__init__.py +38 -0
  489. esphome/components/output/automation.h +24 -0
  490. esphome/components/output/switch/output_switch.cpp +0 -2
  491. esphome/components/packages/__init__.py +1 -2
  492. esphome/components/packet_transport/__init__.py +4 -3
  493. esphome/components/pca6416a/pca6416a.cpp +0 -1
  494. esphome/components/pca9554/pca9554.cpp +0 -1
  495. esphome/components/pca9685/pca9685_output.cpp +0 -2
  496. esphome/components/pcf85063/pcf85063.cpp +0 -1
  497. esphome/components/pcf8563/pcf8563.cpp +0 -1
  498. esphome/components/pcf8574/pcf8574.cpp +0 -1
  499. esphome/components/pi4ioe5v6408/pi4ioe5v6408.cpp +0 -1
  500. esphome/components/pipsolar/pipsolar.cpp +54 -42
  501. esphome/components/pipsolar/pipsolar.h +5 -4
  502. esphome/components/pipsolar/sensor/__init__.py +1 -1
  503. esphome/components/pm2005/pm2005.cpp +0 -1
  504. esphome/components/pmsa003i/pmsa003i.cpp +0 -2
  505. esphome/components/pmwcs3/sensor.py +1 -2
  506. esphome/components/pn532/pn532.cpp +0 -2
  507. esphome/components/pn532_spi/pn532_spi.cpp +0 -2
  508. esphome/components/power_supply/power_supply.cpp +7 -10
  509. esphome/components/power_supply/power_supply.h +1 -1
  510. esphome/components/psram/__init__.py +6 -1
  511. esphome/components/pulse_counter/pulse_counter_sensor.cpp +0 -1
  512. esphome/components/pulse_counter/sensor.py +9 -6
  513. esphome/components/pylontech/pylontech.cpp +0 -1
  514. esphome/components/qmc5883l/qmc5883l.cpp +0 -1
  515. esphome/components/qmp6988/qmp6988.cpp +0 -2
  516. esphome/components/qspi_dbi/display.py +2 -3
  517. esphome/components/qspi_dbi/qspi_dbi.cpp +0 -2
  518. esphome/components/qwiic_pir/binary_sensor.py +2 -3
  519. esphome/components/qwiic_pir/qwiic_pir.cpp +0 -2
  520. esphome/components/rc522/rc522.cpp +9 -31
  521. esphome/components/rc522_spi/rc522_spi.cpp +0 -1
  522. esphome/components/remote_base/__init__.py +5 -6
  523. esphome/components/remote_receiver/remote_receiver_esp32.cpp +0 -1
  524. esphome/components/remote_receiver/remote_receiver_esp8266.cpp +0 -1
  525. esphome/components/remote_receiver/remote_receiver_libretiny.cpp +0 -1
  526. esphome/components/remote_transmitter/__init__.py +26 -0
  527. esphome/components/remote_transmitter/automation.h +18 -0
  528. esphome/components/remote_transmitter/remote_transmitter.h +2 -1
  529. esphome/components/remote_transmitter/remote_transmitter_esp32.cpp +0 -1
  530. esphome/components/remote_transmitter/remote_transmitter_esp8266.cpp +2 -0
  531. esphome/components/remote_transmitter/remote_transmitter_libretiny.cpp +2 -0
  532. esphome/components/resampler/speaker/__init__.py +4 -5
  533. esphome/components/rf_bridge/__init__.py +4 -8
  534. esphome/components/rotary_encoder/rotary_encoder.cpp +0 -2
  535. esphome/components/rp2040/__init__.py +3 -1
  536. esphome/components/rp2040_pio_led_strip/led_strip.cpp +0 -2
  537. esphome/components/rp2040_pio_led_strip/light.py +1 -2
  538. esphome/components/rp2040_pwm/rp2040_pwm.cpp +1 -5
  539. esphome/components/rpi_dpi_rgb/display.py +13 -15
  540. esphome/components/rpi_dpi_rgb/rpi_dpi_rgb.cpp +0 -3
  541. esphome/components/runtime_stats/__init__.py +34 -0
  542. esphome/components/runtime_stats/runtime_stats.cpp +102 -0
  543. esphome/components/runtime_stats/runtime_stats.h +132 -0
  544. esphome/components/scd30/scd30.cpp +0 -2
  545. esphome/components/scd30/sensor.py +1 -2
  546. esphome/components/scd4x/scd4x.cpp +0 -1
  547. esphome/components/scd4x/sensor.py +1 -3
  548. esphome/components/sdl/display.py +3 -1
  549. esphome/components/sdl/sdl_esphome.cpp +0 -2
  550. esphome/components/sdp3x/sdp3x.cpp +0 -2
  551. esphome/components/seeed_mr24hpc1/seeed_mr24hpc1.cpp +0 -2
  552. esphome/components/seeed_mr60fda2/seeed_mr60fda2.cpp +0 -3
  553. esphome/components/select/__init__.py +2 -3
  554. esphome/components/select/select_traits.cpp +1 -1
  555. esphome/components/select/select_traits.h +1 -1
  556. esphome/components/sen0321/sen0321.cpp +0 -1
  557. esphome/components/sen5x/sen5x.cpp +0 -2
  558. esphome/components/senseair/senseair.cpp +7 -3
  559. esphome/components/senseair/senseair.h +11 -0
  560. esphome/components/sensor/__init__.py +36 -4
  561. esphome/components/sensor/filter.cpp +49 -10
  562. esphome/components/sensor/filter.h +22 -7
  563. esphome/components/sensor/sensor.cpp +0 -1
  564. esphome/components/sensor/sensor.h +0 -9
  565. esphome/components/sfa30/sfa30.cpp +0 -4
  566. esphome/components/sgp30/sgp30.cpp +0 -2
  567. esphome/components/sgp4x/sensor.py +1 -1
  568. esphome/components/sgp4x/sgp4x.cpp +0 -2
  569. esphome/components/shelly_dimmer/shelly_dimmer.cpp +0 -2
  570. esphome/components/sht3xd/sht3xd.cpp +0 -2
  571. esphome/components/sht4x/sht4x.cpp +0 -2
  572. esphome/components/shtcx/shtcx.cpp +0 -1
  573. esphome/components/sim800l/__init__.py +2 -4
  574. esphome/components/sm16716/sm16716.cpp +0 -1
  575. esphome/components/sm2135/sm2135.cpp +0 -1
  576. esphome/components/sm2235/sm2235.cpp +0 -1
  577. esphome/components/sm2335/sm2335.cpp +0 -1
  578. esphome/components/sn74hc165/sn74hc165.cpp +0 -1
  579. esphome/components/sn74hc595/sn74hc595.cpp +0 -1
  580. esphome/components/sntp/sntp_component.cpp +0 -1
  581. esphome/components/sound_level/sensor.py +1 -1
  582. esphome/components/speaker/media_player/__init__.py +21 -33
  583. esphome/components/speaker/media_player/audio_pipeline.cpp +4 -7
  584. esphome/components/spi/__init__.py +29 -13
  585. esphome/components/spi/spi.cpp +0 -2
  586. esphome/components/spi_device/spi_device.cpp +1 -4
  587. esphome/components/sprinkler/__init__.py +4 -4
  588. esphome/components/sps30/sps30.cpp +0 -1
  589. esphome/components/ssd1306_base/__init__.py +11 -11
  590. esphome/components/ssd1306_base/ssd1306_base.cpp +1 -1
  591. esphome/components/ssd1306_i2c/ssd1306_i2c.cpp +0 -1
  592. esphome/components/ssd1306_spi/ssd1306_spi.cpp +0 -1
  593. esphome/components/ssd1322_spi/ssd1322_spi.cpp +0 -1
  594. esphome/components/ssd1325_spi/ssd1325_spi.cpp +0 -1
  595. esphome/components/ssd1327_i2c/ssd1327_i2c.cpp +0 -1
  596. esphome/components/ssd1327_spi/ssd1327_spi.cpp +0 -1
  597. esphome/components/ssd1331_spi/ssd1331_spi.cpp +0 -1
  598. esphome/components/ssd1351_spi/ssd1351_spi.cpp +0 -1
  599. esphome/components/st7567_i2c/st7567_i2c.cpp +0 -1
  600. esphome/components/st7567_spi/st7567_spi.cpp +0 -1
  601. esphome/components/st7701s/display.py +10 -14
  602. esphome/components/st7701s/st7701s.cpp +0 -3
  603. esphome/components/st7735/st7735.cpp +0 -1
  604. esphome/components/st7789v/st7789v.cpp +0 -1
  605. esphome/components/st7920/st7920.cpp +0 -1
  606. esphome/components/status_led/light/status_led_light.cpp +0 -2
  607. esphome/components/status_led/status_led.cpp +0 -1
  608. esphome/components/stepper/__init__.py +2 -4
  609. esphome/components/sts3x/sts3x.cpp +0 -1
  610. esphome/components/substitutions/__init__.py +10 -16
  611. esphome/components/substitutions/jinja.py +24 -1
  612. esphome/components/sun/__init__.py +2 -3
  613. esphome/components/switch/__init__.py +31 -1
  614. esphome/components/switch/automation.h +24 -0
  615. esphome/components/switch/switch.cpp +8 -0
  616. esphome/components/switch/switch.h +8 -0
  617. esphome/components/sx126x/sx126x.cpp +0 -2
  618. esphome/components/sx127x/sx127x.cpp +0 -2
  619. esphome/components/sx1509/__init__.py +7 -5
  620. esphome/components/sx1509/output/sx1509_float_output.cpp +1 -1
  621. esphome/components/sx1509/sx1509.cpp +0 -2
  622. esphome/components/syslog/esphome_syslog.cpp +1 -1
  623. esphome/components/tc74/tc74.cpp +0 -1
  624. esphome/components/tca9548a/tca9548a.cpp +0 -1
  625. esphome/components/tca9555/tca9555.cpp +0 -1
  626. esphome/components/tcs34725/tcs34725.cpp +0 -1
  627. esphome/components/tee501/tee501.cpp +0 -1
  628. esphome/components/tem3200/tem3200.cpp +0 -2
  629. esphome/components/template/alarm_control_panel/template_alarm_control_panel.cpp +0 -1
  630. esphome/components/template/cover/template_cover.cpp +0 -1
  631. esphome/components/template/select/template_select.cpp +0 -1
  632. esphome/components/template/text/template_text.cpp +0 -2
  633. esphome/components/template/valve/template_valve.cpp +0 -1
  634. esphome/components/text/__init__.py +0 -1
  635. esphome/components/text/text_traits.h +2 -0
  636. esphome/components/text_sensor/__init__.py +2 -1
  637. esphome/components/text_sensor/text_sensor.cpp +0 -2
  638. esphome/components/text_sensor/text_sensor.h +0 -8
  639. esphome/components/thermostat/climate.py +4 -4
  640. esphome/components/time/__init__.py +7 -4
  641. esphome/components/time/real_time_clock.cpp +16 -3
  642. esphome/components/tlc59208f/tlc59208f_output.cpp +0 -2
  643. esphome/components/tlc5947/tlc5947.cpp +0 -2
  644. esphome/components/tlc5971/tlc5971.cpp +0 -2
  645. esphome/components/tm1621/tm1621.cpp +0 -2
  646. esphome/components/tm1637/tm1637.cpp +0 -2
  647. esphome/components/tm1638/tm1638.cpp +0 -2
  648. esphome/components/tm1651/__init__.py +45 -48
  649. esphome/components/tm1651/tm1651.cpp +213 -47
  650. esphome/components/tm1651/tm1651.h +37 -32
  651. esphome/components/tmp117/tmp117.cpp +0 -2
  652. esphome/components/tsl2561/tsl2561.cpp +0 -1
  653. esphome/components/tsl2591/tsl2591.cpp +0 -1
  654. esphome/components/tt21100/touchscreen/tt21100.cpp +0 -2
  655. esphome/components/ttp229_bsf/ttp229_bsf.cpp +0 -1
  656. esphome/components/ttp229_lsf/ttp229_lsf.cpp +0 -1
  657. esphome/components/tuya/climate/__init__.py +9 -10
  658. esphome/components/tuya/number/__init__.py +8 -6
  659. esphome/components/tx20/tx20.cpp +0 -1
  660. esphome/components/uart/uart_component_esp32_arduino.cpp +0 -1
  661. esphome/components/uart/uart_component_esp8266.cpp +0 -1
  662. esphome/components/uart/uart_component_esp_idf.cpp +0 -2
  663. esphome/components/uart/uart_component_libretiny.cpp +0 -2
  664. esphome/components/uart/uart_component_rp2040.cpp +0 -2
  665. esphome/components/udp/__init__.py +1 -1
  666. esphome/components/ufire_ec/sensor.py +1 -2
  667. esphome/components/ufire_ec/ufire_ec.cpp +0 -2
  668. esphome/components/ufire_ise/sensor.py +1 -2
  669. esphome/components/ufire_ise/ufire_ise.cpp +0 -2
  670. esphome/components/ultrasonic/ultrasonic_sensor.cpp +0 -1
  671. esphome/components/update/__init__.py +0 -1
  672. esphome/components/uptime/sensor/uptime_seconds_sensor.cpp +0 -1
  673. esphome/components/uptime/sensor/uptime_seconds_sensor.h +0 -2
  674. esphome/components/usb_host/usb_host_client.cpp +0 -1
  675. esphome/components/usb_host/usb_host_component.cpp +0 -1
  676. esphome/components/valve/__init__.py +0 -1
  677. esphome/components/veml3235/veml3235.cpp +0 -3
  678. esphome/components/veml7700/veml7700.cpp +0 -2
  679. esphome/components/version/version_text_sensor.cpp +0 -1
  680. esphome/components/version/version_text_sensor.h +0 -1
  681. esphome/components/vl53l0x/vl53l0x_sensor.cpp +0 -4
  682. esphome/components/voice_assistant/voice_assistant.cpp +9 -8
  683. esphome/components/web_server/__init__.py +13 -0
  684. esphome/components/web_server/web_server.cpp +188 -353
  685. esphome/components/web_server/web_server.h +61 -1
  686. esphome/components/web_server_base/__init__.py +1 -1
  687. esphome/components/web_server_base/web_server_base.cpp +2 -0
  688. esphome/components/web_server_base/web_server_base.h +6 -0
  689. esphome/components/web_server_idf/web_server_idf.cpp +10 -8
  690. esphome/components/web_server_idf/web_server_idf.h +2 -0
  691. esphome/components/weikai_i2c/weikai_i2c.cpp +1 -2
  692. esphome/components/weikai_spi/weikai_spi.cpp +1 -1
  693. esphome/components/wifi/__init__.py +17 -43
  694. esphome/components/wifi/wifi_component.cpp +100 -36
  695. esphome/components/wifi/wifi_component.h +5 -1
  696. esphome/components/wifi/wifi_component_esp32_arduino.cpp +30 -0
  697. esphome/components/wifi/wifi_component_esp_idf.cpp +30 -0
  698. esphome/components/wifi_info/wifi_info_text_sensor.h +0 -6
  699. esphome/components/wifi_signal/wifi_signal_sensor.h +0 -1
  700. esphome/components/wireguard/wireguard.cpp +0 -2
  701. esphome/components/x9c/x9c.cpp +0 -2
  702. esphome/components/xgzp68xx/xgzp68xx.cpp +0 -1
  703. esphome/components/xl9535/xl9535.cpp +0 -2
  704. esphome/components/zephyr/__init__.py +252 -0
  705. esphome/components/zephyr/const.py +16 -0
  706. esphome/components/zephyr/core.cpp +90 -0
  707. esphome/components/zephyr/gpio.cpp +120 -0
  708. esphome/components/zephyr/gpio.h +38 -0
  709. esphome/components/zephyr/pre_build.py.script +4 -0
  710. esphome/components/zephyr/preferences.cpp +156 -0
  711. esphome/components/zephyr/preferences.h +13 -0
  712. esphome/config.py +38 -16
  713. esphome/config_helpers.py +1 -2
  714. esphome/config_validation.py +12 -16
  715. esphome/const.py +26 -1
  716. esphome/core/__init__.py +92 -51
  717. esphome/core/application.cpp +75 -21
  718. esphome/core/application.h +106 -171
  719. esphome/core/color.h +10 -0
  720. esphome/core/component.cpp +41 -25
  721. esphome/core/component.h +9 -6
  722. esphome/core/component_iterator.cpp +61 -261
  723. esphome/core/component_iterator.h +15 -0
  724. esphome/core/config.py +26 -11
  725. esphome/core/defines.h +40 -2
  726. esphome/core/entity_base.h +18 -0
  727. esphome/core/entity_helpers.py +45 -10
  728. esphome/core/helpers.cpp +8 -15
  729. esphome/core/helpers.h +60 -6
  730. esphome/core/lock_free_queue.h +1 -1
  731. esphome/core/scheduler.cpp +311 -77
  732. esphome/core/scheduler.h +141 -28
  733. esphome/cpp_generator.py +2 -6
  734. esphome/cpp_helpers.py +1 -1
  735. esphome/dashboard/dashboard.py +2 -3
  736. esphome/dashboard/dns.py +2 -8
  737. esphome/dashboard/web_server.py +34 -19
  738. esphome/espota2.py +1 -4
  739. esphome/git.py +3 -1
  740. esphome/helpers.py +23 -4
  741. esphome/log.py +3 -1
  742. esphome/mqtt.py +3 -5
  743. esphome/platformio_api.py +7 -4
  744. esphome/types.py +12 -0
  745. esphome/util.py +20 -8
  746. esphome/voluptuous_schema.py +4 -3
  747. esphome/vscode.py +1 -2
  748. esphome/wizard.py +1 -4
  749. esphome/writer.py +16 -108
  750. esphome/yaml_util.py +7 -5
  751. {esphome-2025.7.4.dist-info → esphome-2025.8.0.dist-info}/METADATA +13 -14
  752. {esphome-2025.7.4.dist-info → esphome-2025.8.0.dist-info}/RECORD +757 -677
  753. esphome/components/mipi_spi/models/commands.py +0 -82
  754. /esphome/components/nfc/binary_sensor/{binary_sensor.h → nfc_binary_sensor.h} +0 -0
  755. {esphome-2025.7.4.dist-info → esphome-2025.8.0.dist-info}/WHEEL +0 -0
  756. {esphome-2025.7.4.dist-info → esphome-2025.8.0.dist-info}/entry_points.txt +0 -0
  757. {esphome-2025.7.4.dist-info → esphome-2025.8.0.dist-info}/licenses/LICENSE +0 -0
  758. {esphome-2025.7.4.dist-info → esphome-2025.8.0.dist-info}/top_level.txt +0 -0
@@ -10,26 +10,28 @@ from esphome.const import (
10
10
  CONF_LEVEL,
11
11
  )
12
12
 
13
- CODEOWNERS = ["@freekode"]
13
+ CODEOWNERS = ["@mrtoy-me"]
14
+
15
+ CONF_LEVEL_PERCENT = "level_percent"
14
16
 
15
17
  tm1651_ns = cg.esphome_ns.namespace("tm1651")
16
18
  TM1651Brightness = tm1651_ns.enum("TM1651Brightness")
17
19
  TM1651Display = tm1651_ns.class_("TM1651Display", cg.Component)
18
20
 
19
- SetLevelPercentAction = tm1651_ns.class_("SetLevelPercentAction", automation.Action)
20
- SetLevelAction = tm1651_ns.class_("SetLevelAction", automation.Action)
21
21
  SetBrightnessAction = tm1651_ns.class_("SetBrightnessAction", automation.Action)
22
- TurnOnAction = tm1651_ns.class_("SetLevelPercentAction", automation.Action)
23
- TurnOffAction = tm1651_ns.class_("SetLevelPercentAction", automation.Action)
24
-
25
- CONF_LEVEL_PERCENT = "level_percent"
22
+ SetLevelAction = tm1651_ns.class_("SetLevelAction", automation.Action)
23
+ SetLevelPercentAction = tm1651_ns.class_("SetLevelPercentAction", automation.Action)
24
+ TurnOnAction = tm1651_ns.class_("TurnOnAction", automation.Action)
25
+ TurnOffAction = tm1651_ns.class_("TurnOffAction", automation.Action)
26
26
 
27
27
  TM1651_BRIGHTNESS_OPTIONS = {
28
- 1: TM1651Brightness.TM1651_BRIGHTNESS_LOW,
29
- 2: TM1651Brightness.TM1651_BRIGHTNESS_MEDIUM,
30
- 3: TM1651Brightness.TM1651_BRIGHTNESS_HIGH,
28
+ 1: TM1651Brightness.TM1651_DARKEST,
29
+ 2: TM1651Brightness.TM1651_TYPICAL,
30
+ 3: TM1651Brightness.TM1651_BRIGHTEST,
31
31
  }
32
32
 
33
+ MULTI_CONF = True
34
+
33
35
  CONFIG_SCHEMA = cv.All(
34
36
  cv.Schema(
35
37
  {
@@ -38,26 +40,21 @@ CONFIG_SCHEMA = cv.All(
38
40
  cv.Required(CONF_DIO_PIN): pins.internal_gpio_output_pin_schema,
39
41
  }
40
42
  ),
41
- cv.only_with_arduino,
42
43
  )
43
44
 
44
- validate_level_percent = cv.All(cv.int_range(min=0, max=100))
45
- validate_level = cv.All(cv.int_range(min=0, max=7))
46
- validate_brightness = cv.enum(TM1651_BRIGHTNESS_OPTIONS, int=True)
47
-
48
45
 
49
46
  async def to_code(config):
50
47
  var = cg.new_Pvariable(config[CONF_ID])
51
48
  await cg.register_component(var, config)
52
-
53
49
  clk_pin = await cg.gpio_pin_expression(config[CONF_CLK_PIN])
54
50
  cg.add(var.set_clk_pin(clk_pin))
55
51
  dio_pin = await cg.gpio_pin_expression(config[CONF_DIO_PIN])
56
52
  cg.add(var.set_dio_pin(dio_pin))
57
53
 
58
- # https://platformio.org/lib/show/6865/TM1651
59
- cg.add_library("freekode/TM1651", "1.0.1")
60
54
 
55
+ validate_brightness = cv.enum(TM1651_BRIGHTNESS_OPTIONS, int=True)
56
+ validate_level = cv.All(cv.int_range(min=0, max=7))
57
+ validate_level_percent = cv.All(cv.int_range(min=0, max=100))
61
58
 
62
59
  BINARY_OUTPUT_ACTION_SCHEMA = maybe_simple_id(
63
60
  {
@@ -66,38 +63,22 @@ BINARY_OUTPUT_ACTION_SCHEMA = maybe_simple_id(
66
63
  )
67
64
 
68
65
 
69
- @automation.register_action("tm1651.turn_on", TurnOnAction, BINARY_OUTPUT_ACTION_SCHEMA)
70
- async def output_turn_on_to_code(config, action_id, template_arg, args):
71
- var = cg.new_Pvariable(action_id, template_arg)
72
- await cg.register_parented(var, config[CONF_ID])
73
- return var
74
-
75
-
76
66
  @automation.register_action(
77
- "tm1651.turn_off", TurnOffAction, BINARY_OUTPUT_ACTION_SCHEMA
78
- )
79
- async def output_turn_off_to_code(config, action_id, template_arg, args):
80
- var = cg.new_Pvariable(action_id, template_arg)
81
- await cg.register_parented(var, config[CONF_ID])
82
- return var
83
-
84
-
85
- @automation.register_action(
86
- "tm1651.set_level_percent",
87
- SetLevelPercentAction,
67
+ "tm1651.set_brightness",
68
+ SetBrightnessAction,
88
69
  cv.maybe_simple_value(
89
70
  {
90
71
  cv.GenerateID(): cv.use_id(TM1651Display),
91
- cv.Required(CONF_LEVEL_PERCENT): cv.templatable(validate_level_percent),
72
+ cv.Required(CONF_BRIGHTNESS): cv.templatable(validate_brightness),
92
73
  },
93
- key=CONF_LEVEL_PERCENT,
74
+ key=CONF_BRIGHTNESS,
94
75
  ),
95
76
  )
96
- async def tm1651_set_level_percent_to_code(config, action_id, template_arg, args):
77
+ async def tm1651_set_brightness_to_code(config, action_id, template_arg, args):
97
78
  var = cg.new_Pvariable(action_id, template_arg)
98
79
  await cg.register_parented(var, config[CONF_ID])
99
- template_ = await cg.templatable(config[CONF_LEVEL_PERCENT], args, cg.uint8)
100
- cg.add(var.set_level_percent(template_))
80
+ template_ = await cg.templatable(config[CONF_BRIGHTNESS], args, cg.uint8)
81
+ cg.add(var.set_brightness(template_))
101
82
  return var
102
83
 
103
84
 
@@ -121,19 +102,35 @@ async def tm1651_set_level_to_code(config, action_id, template_arg, args):
121
102
 
122
103
 
123
104
  @automation.register_action(
124
- "tm1651.set_brightness",
125
- SetBrightnessAction,
105
+ "tm1651.set_level_percent",
106
+ SetLevelPercentAction,
126
107
  cv.maybe_simple_value(
127
108
  {
128
109
  cv.GenerateID(): cv.use_id(TM1651Display),
129
- cv.Required(CONF_BRIGHTNESS): cv.templatable(validate_brightness),
110
+ cv.Required(CONF_LEVEL_PERCENT): cv.templatable(validate_level_percent),
130
111
  },
131
- key=CONF_BRIGHTNESS,
112
+ key=CONF_LEVEL_PERCENT,
132
113
  ),
133
114
  )
134
- async def tm1651_set_brightness_to_code(config, action_id, template_arg, args):
115
+ async def tm1651_set_level_percent_to_code(config, action_id, template_arg, args):
116
+ var = cg.new_Pvariable(action_id, template_arg)
117
+ await cg.register_parented(var, config[CONF_ID])
118
+ template_ = await cg.templatable(config[CONF_LEVEL_PERCENT], args, cg.uint8)
119
+ cg.add(var.set_level_percent(template_))
120
+ return var
121
+
122
+
123
+ @automation.register_action(
124
+ "tm1651.turn_off", TurnOffAction, BINARY_OUTPUT_ACTION_SCHEMA
125
+ )
126
+ async def output_turn_off_to_code(config, action_id, template_arg, args):
127
+ var = cg.new_Pvariable(action_id, template_arg)
128
+ await cg.register_parented(var, config[CONF_ID])
129
+ return var
130
+
131
+
132
+ @automation.register_action("tm1651.turn_on", TurnOnAction, BINARY_OUTPUT_ACTION_SCHEMA)
133
+ async def output_turn_on_to_code(config, action_id, template_arg, args):
135
134
  var = cg.new_Pvariable(action_id, template_arg)
136
135
  await cg.register_parented(var, config[CONF_ID])
137
- template_ = await cg.templatable(config[CONF_BRIGHTNESS], args, cg.uint8)
138
- cg.add(var.set_brightness(template_))
139
136
  return var
@@ -1,7 +1,54 @@
1
- #ifdef USE_ARDUINO
1
+ // This Esphome TM1651 component for use with Mini Battery Displays (7 LED levels)
2
+ // and removes the Esphome dependency on the TM1651 Arduino library.
3
+ // It was largely based on the work of others as set out below.
4
+ // @mrtoy-me July 2025
5
+ // ==============================================================================================
6
+ // Original Arduino TM1651 library:
7
+ // Author:Fred.Chu
8
+ // Date:14 August, 2014
9
+ // Applicable Module: Battery Display v1.0
10
+ // This library is free software; you can redistribute it and/or
11
+ // modify it under the terms of the GNU Lesser General Public
12
+ // License as published by the Free Software Foundation; either
13
+ // version 2.1 of the License, or (at your option) any later version.
14
+ // This library is distributed in the hope that it will be useful,
15
+ // but WITHOUT ANY WARRANTY; without even the implied warranty of
16
+ // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the GNU
17
+ // Lesser General Public License for more details.
18
+ // Modified record:
19
+ // Author: Detlef Giessmann Germany
20
+ // Mail: mydiyp@web.de
21
+ // Demo for the new 7 LED Battery-Display 2017
22
+ // IDE: Arduino-1.6.5
23
+ // Type: OPEN-SMART CX10*4RY68 4Color
24
+ // Date: 01.05.2017
25
+ // ==============================================================================================
26
+ // Esphome component using arduino TM1651 library:
27
+ // MIT License
28
+ // Copyright (c) 2019 freekode
29
+ // ==============================================================================================
30
+ // Library and command-line (python) program to control mini battery displays on Raspberry Pi:
31
+ // MIT License
32
+ // Copyright (c) 2020 Koen Vervloese
33
+ // ==============================================================================================
34
+ // MIT License
35
+ // Permission is hereby granted, free of charge, to any person obtaining a copy
36
+ // of this software and associated documentation files (the "Software"), to deal
37
+ // in the Software without restriction, including without limitation the rights
38
+ // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
39
+ // copies of the Software, and to permit persons to whom the Software is
40
+ // furnished to do so, subject to the following conditions:
41
+ // The above copyright notice and this permission notice shall be included in all
42
+ // copies or substantial portions of the Software.
43
+ // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
44
+ // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
45
+ // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
46
+ // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
47
+ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
48
+ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
49
+ // SOFTWARE.
2
50
 
3
51
  #include "tm1651.h"
4
- #include "esphome/core/helpers.h"
5
52
  #include "esphome/core/log.h"
6
53
 
7
54
  namespace esphome {
@@ -9,86 +56,205 @@ namespace tm1651 {
9
56
 
10
57
  static const char *const TAG = "tm1651.display";
11
58
 
12
- static const uint8_t MAX_INPUT_LEVEL_PERCENT = 100;
13
- static const uint8_t TM1651_MAX_LEVEL = 7;
59
+ static const bool LINE_HIGH = true;
60
+ static const bool LINE_LOW = false;
14
61
 
15
- static const uint8_t TM1651_BRIGHTNESS_LOW_HW = 0;
16
- static const uint8_t TM1651_BRIGHTNESS_MEDIUM_HW = 2;
17
- static const uint8_t TM1651_BRIGHTNESS_HIGH_HW = 7;
62
+ // TM1651 maximum frequency is 500 kHz (duty ratio 50%) = 2 microseconds / cycle
63
+ static const uint8_t CLOCK_CYCLE = 8;
64
+
65
+ static const uint8_t HALF_CLOCK_CYCLE = CLOCK_CYCLE / 2;
66
+ static const uint8_t QUARTER_CLOCK_CYCLE = CLOCK_CYCLE / 4;
67
+
68
+ static const uint8_t ADDR_FIXED = 0x44; // fixed address mode
69
+ static const uint8_t ADDR_START = 0xC0; // address of the display register
70
+
71
+ static const uint8_t DISPLAY_OFF = 0x80;
72
+ static const uint8_t DISPLAY_ON = 0x88;
73
+
74
+ static const uint8_t MAX_DISPLAY_LEVELS = 7;
75
+
76
+ static const uint8_t PERCENT100 = 100;
77
+ static const uint8_t PERCENT50 = 50;
78
+
79
+ static const uint8_t TM1651_BRIGHTNESS_DARKEST = 0;
80
+ static const uint8_t TM1651_BRIGHTNESS_TYPICAL = 2;
81
+ static const uint8_t TM1651_BRIGHTNESS_BRIGHTEST = 7;
82
+
83
+ static const uint8_t TM1651_LEVEL_TAB[] = {0b00000000, 0b00000001, 0b00000011, 0b00000111,
84
+ 0b00001111, 0b00011111, 0b00111111, 0b01111111};
85
+
86
+ // public
18
87
 
19
88
  void TM1651Display::setup() {
20
- ESP_LOGCONFIG(TAG, "Running setup");
89
+ this->clk_pin_->setup();
90
+ this->clk_pin_->pin_mode(gpio::FLAG_OUTPUT);
91
+
92
+ this->dio_pin_->setup();
93
+ this->dio_pin_->pin_mode(gpio::FLAG_OUTPUT);
21
94
 
22
- uint8_t clk = clk_pin_->get_pin();
23
- uint8_t dio = dio_pin_->get_pin();
95
+ this->brightness_ = TM1651_BRIGHTNESS_TYPICAL;
24
96
 
25
- battery_display_ = make_unique<TM1651>(clk, dio);
26
- battery_display_->init();
27
- battery_display_->clearDisplay();
97
+ // clear display
98
+ this->display_level_();
99
+ this->update_brightness_(DISPLAY_ON);
28
100
  }
29
101
 
30
102
  void TM1651Display::dump_config() {
31
- ESP_LOGCONFIG(TAG, "TM1651 Battery Display");
103
+ ESP_LOGCONFIG(TAG, "Battery Display");
32
104
  LOG_PIN(" CLK: ", clk_pin_);
33
105
  LOG_PIN(" DIO: ", dio_pin_);
34
106
  }
35
107
 
36
- void TM1651Display::set_level_percent(uint8_t new_level) {
37
- this->level_ = calculate_level_(new_level);
38
- this->repaint_();
108
+ void TM1651Display::set_brightness(uint8_t new_brightness) {
109
+ this->brightness_ = this->remap_brightness_(new_brightness);
110
+ if (this->display_on_) {
111
+ this->update_brightness_(DISPLAY_ON);
112
+ }
39
113
  }
40
114
 
41
115
  void TM1651Display::set_level(uint8_t new_level) {
116
+ if (new_level > MAX_DISPLAY_LEVELS)
117
+ new_level = MAX_DISPLAY_LEVELS;
42
118
  this->level_ = new_level;
43
- this->repaint_();
119
+ if (this->display_on_) {
120
+ this->display_level_();
121
+ }
44
122
  }
45
123
 
46
- void TM1651Display::set_brightness(uint8_t new_brightness) {
47
- this->brightness_ = calculate_brightness_(new_brightness);
48
- this->repaint_();
124
+ void TM1651Display::set_level_percent(uint8_t percentage) {
125
+ this->level_ = this->calculate_level_(percentage);
126
+ if (this->display_on_) {
127
+ this->display_level_();
128
+ }
129
+ }
130
+
131
+ void TM1651Display::turn_off() {
132
+ this->display_on_ = false;
133
+ this->update_brightness_(DISPLAY_OFF);
49
134
  }
50
135
 
51
136
  void TM1651Display::turn_on() {
52
- this->is_on_ = true;
53
- this->repaint_();
137
+ this->display_on_ = true;
138
+ // display level as it could have been changed when display turned off
139
+ this->display_level_();
140
+ this->update_brightness_(DISPLAY_ON);
54
141
  }
55
142
 
56
- void TM1651Display::turn_off() {
57
- this->is_on_ = false;
58
- battery_display_->displayLevel(0);
143
+ // protected
144
+
145
+ uint8_t TM1651Display::calculate_level_(uint8_t percentage) {
146
+ if (percentage > PERCENT100)
147
+ percentage = PERCENT100;
148
+ // scale 0-100% to 0-7 display levels
149
+ // use integer arithmetic with rounding
150
+ uint16_t initial_scaling = (percentage * MAX_DISPLAY_LEVELS) + PERCENT50;
151
+ return (uint8_t) (initial_scaling / PERCENT100);
59
152
  }
60
153
 
61
- void TM1651Display::repaint_() {
62
- if (!this->is_on_) {
63
- return;
64
- }
154
+ void TM1651Display::display_level_() {
155
+ this->start_();
156
+ this->write_byte_(ADDR_FIXED);
157
+ this->stop_();
158
+
159
+ this->start_();
160
+ this->write_byte_(ADDR_START);
161
+ this->write_byte_(TM1651_LEVEL_TAB[this->level_]);
162
+ this->stop_();
163
+ }
164
+
165
+ uint8_t TM1651Display::remap_brightness_(uint8_t new_brightness) {
166
+ if (new_brightness <= 1)
167
+ return TM1651_BRIGHTNESS_DARKEST;
168
+ if (new_brightness == 2)
169
+ return TM1651_BRIGHTNESS_TYPICAL;
65
170
 
66
- battery_display_->set(this->brightness_);
67
- battery_display_->displayLevel(this->level_);
171
+ // new_brightness >= 3
172
+ return TM1651_BRIGHTNESS_BRIGHTEST;
68
173
  }
69
174
 
70
- uint8_t TM1651Display::calculate_level_(uint8_t new_level) {
71
- if (new_level == 0) {
72
- return 0;
175
+ void TM1651Display::update_brightness_(uint8_t on_off_control) {
176
+ this->start_();
177
+ this->write_byte_(on_off_control | this->brightness_);
178
+ this->stop_();
179
+ }
180
+
181
+ // low level functions
182
+
183
+ bool TM1651Display::write_byte_(uint8_t data) {
184
+ // data bit written to DIO when CLK is low
185
+ for (uint8_t i = 0; i < 8; i++) {
186
+ this->half_cycle_clock_low_((bool) (data & 0x01));
187
+ this->half_cycle_clock_high_();
188
+ data >>= 1;
73
189
  }
74
190
 
75
- float calculated_level = TM1651_MAX_LEVEL / (float) (MAX_INPUT_LEVEL_PERCENT / (float) new_level);
76
- return (uint8_t) roundf(calculated_level);
191
+ // start 9th cycle, setting DIO high and look for ack
192
+ this->half_cycle_clock_low_(LINE_HIGH);
193
+ return this->half_cycle_clock_high_ack_();
194
+ }
195
+
196
+ void TM1651Display::half_cycle_clock_low_(bool data_bit) {
197
+ // first half cycle, clock low and write data bit
198
+ this->clk_pin_->digital_write(LINE_LOW);
199
+ delayMicroseconds(QUARTER_CLOCK_CYCLE);
200
+
201
+ this->dio_pin_->digital_write(data_bit);
202
+ delayMicroseconds(QUARTER_CLOCK_CYCLE);
77
203
  }
78
204
 
79
- uint8_t TM1651Display::calculate_brightness_(uint8_t new_brightness) {
80
- if (new_brightness <= 1) {
81
- return TM1651_BRIGHTNESS_LOW_HW;
82
- } else if (new_brightness == 2) {
83
- return TM1651_BRIGHTNESS_MEDIUM_HW;
84
- } else if (new_brightness >= 3) {
85
- return TM1651_BRIGHTNESS_HIGH_HW;
205
+ void TM1651Display::half_cycle_clock_high_() {
206
+ // second half cycle, clock high
207
+ this->clk_pin_->digital_write(LINE_HIGH);
208
+ delayMicroseconds(HALF_CLOCK_CYCLE);
209
+ }
210
+
211
+ bool TM1651Display::half_cycle_clock_high_ack_() {
212
+ // second half cycle, clock high and check for ack
213
+ this->clk_pin_->digital_write(LINE_HIGH);
214
+ delayMicroseconds(QUARTER_CLOCK_CYCLE);
215
+
216
+ this->dio_pin_->pin_mode(gpio::FLAG_INPUT);
217
+ // valid ack on DIO is low
218
+ bool ack = (!this->dio_pin_->digital_read());
219
+
220
+ this->dio_pin_->pin_mode(gpio::FLAG_OUTPUT);
221
+
222
+ // ack should be set DIO low by now
223
+ // if its not, set DIO low before the next cycle
224
+ if (!ack) {
225
+ this->dio_pin_->digital_write(LINE_LOW);
86
226
  }
227
+ delayMicroseconds(QUARTER_CLOCK_CYCLE);
87
228
 
88
- return TM1651_BRIGHTNESS_LOW_HW;
229
+ // begin next cycle
230
+ this->clk_pin_->digital_write(LINE_LOW);
231
+
232
+ return ack;
233
+ }
234
+
235
+ void TM1651Display::start_() {
236
+ // start data transmission
237
+ this->delineate_transmission_(LINE_HIGH);
238
+ }
239
+
240
+ void TM1651Display::stop_() {
241
+ // stop data transmission
242
+ this->delineate_transmission_(LINE_LOW);
243
+ }
244
+
245
+ void TM1651Display::delineate_transmission_(bool dio_state) {
246
+ // delineate data transmission
247
+ // DIO changes its value while CLK is high
248
+
249
+ this->dio_pin_->digital_write(dio_state);
250
+ delayMicroseconds(HALF_CLOCK_CYCLE);
251
+
252
+ this->clk_pin_->digital_write(LINE_HIGH);
253
+ delayMicroseconds(QUARTER_CLOCK_CYCLE);
254
+
255
+ this->dio_pin_->digital_write(!dio_state);
256
+ delayMicroseconds(QUARTER_CLOCK_CYCLE);
89
257
  }
90
258
 
91
259
  } // namespace tm1651
92
260
  } // namespace esphome
93
-
94
- #endif // USE_ARDUINO
@@ -1,22 +1,16 @@
1
1
  #pragma once
2
2
 
3
- #ifdef USE_ARDUINO
4
-
5
- #include <memory>
6
-
3
+ #include "esphome/core/automation.h"
7
4
  #include "esphome/core/component.h"
8
5
  #include "esphome/core/hal.h"
9
- #include "esphome/core/automation.h"
10
-
11
- #include <TM1651.h>
12
6
 
13
7
  namespace esphome {
14
8
  namespace tm1651 {
15
9
 
16
10
  enum TM1651Brightness : uint8_t {
17
- TM1651_BRIGHTNESS_LOW = 1,
18
- TM1651_BRIGHTNESS_MEDIUM = 2,
19
- TM1651_BRIGHTNESS_HIGH = 3,
11
+ TM1651_DARKEST = 1,
12
+ TM1651_TYPICAL = 2,
13
+ TM1651_BRIGHTEST = 3,
20
14
  };
21
15
 
22
16
  class TM1651Display : public Component {
@@ -27,36 +21,49 @@ class TM1651Display : public Component {
27
21
  void setup() override;
28
22
  void dump_config() override;
29
23
 
30
- void set_level_percent(uint8_t new_level);
31
- void set_level(uint8_t new_level);
32
24
  void set_brightness(uint8_t new_brightness);
33
25
  void set_brightness(TM1651Brightness new_brightness) { this->set_brightness(static_cast<uint8_t>(new_brightness)); }
34
26
 
35
- void turn_on();
27
+ void set_level(uint8_t new_level);
28
+ void set_level_percent(uint8_t percentage);
29
+
36
30
  void turn_off();
31
+ void turn_on();
37
32
 
38
33
  protected:
39
- std::unique_ptr<TM1651> battery_display_;
40
- InternalGPIOPin *clk_pin_;
41
- InternalGPIOPin *dio_pin_;
42
- bool is_on_ = true;
34
+ uint8_t calculate_level_(uint8_t percentage);
35
+ void display_level_();
36
+
37
+ uint8_t remap_brightness_(uint8_t new_brightness);
38
+ void update_brightness_(uint8_t on_off_control);
39
+
40
+ // low level functions
41
+ bool write_byte_(uint8_t data);
43
42
 
44
- uint8_t brightness_;
45
- uint8_t level_;
43
+ void half_cycle_clock_low_(bool data_bit);
44
+ void half_cycle_clock_high_();
45
+ bool half_cycle_clock_high_ack_();
46
46
 
47
- void repaint_();
47
+ void start_();
48
+ void stop_();
49
+
50
+ void delineate_transmission_(bool dio_state);
51
+
52
+ InternalGPIOPin *clk_pin_;
53
+ InternalGPIOPin *dio_pin_;
48
54
 
49
- uint8_t calculate_level_(uint8_t new_level);
50
- uint8_t calculate_brightness_(uint8_t new_brightness);
55
+ bool display_on_{true};
56
+ uint8_t brightness_{};
57
+ uint8_t level_{0};
51
58
  };
52
59
 
53
- template<typename... Ts> class SetLevelPercentAction : public Action<Ts...>, public Parented<TM1651Display> {
60
+ template<typename... Ts> class SetBrightnessAction : public Action<Ts...>, public Parented<TM1651Display> {
54
61
  public:
55
- TEMPLATABLE_VALUE(uint8_t, level_percent)
62
+ TEMPLATABLE_VALUE(uint8_t, brightness)
56
63
 
57
64
  void play(Ts... x) override {
58
- auto level_percent = this->level_percent_.value(x...);
59
- this->parent_->set_level_percent(level_percent);
65
+ auto brightness = this->brightness_.value(x...);
66
+ this->parent_->set_brightness(brightness);
60
67
  }
61
68
  };
62
69
 
@@ -70,13 +77,13 @@ template<typename... Ts> class SetLevelAction : public Action<Ts...>, public Par
70
77
  }
71
78
  };
72
79
 
73
- template<typename... Ts> class SetBrightnessAction : public Action<Ts...>, public Parented<TM1651Display> {
80
+ template<typename... Ts> class SetLevelPercentAction : public Action<Ts...>, public Parented<TM1651Display> {
74
81
  public:
75
- TEMPLATABLE_VALUE(uint8_t, brightness)
82
+ TEMPLATABLE_VALUE(uint8_t, level_percent)
76
83
 
77
84
  void play(Ts... x) override {
78
- auto brightness = this->brightness_.value(x...);
79
- this->parent_->set_brightness(brightness);
85
+ auto level_percent = this->level_percent_.value(x...);
86
+ this->parent_->set_level_percent(level_percent);
80
87
  }
81
88
  };
82
89
 
@@ -92,5 +99,3 @@ template<typename... Ts> class TurnOffAction : public Action<Ts...>, public Pare
92
99
 
93
100
  } // namespace tm1651
94
101
  } // namespace esphome
95
-
96
- #endif // USE_ARDUINO
@@ -26,8 +26,6 @@ void TMP117Component::update() {
26
26
  }
27
27
  }
28
28
  void TMP117Component::setup() {
29
- ESP_LOGCONFIG(TAG, "Running setup");
30
-
31
29
  if (!this->write_config_(this->config_)) {
32
30
  this->mark_failed();
33
31
  return;
@@ -15,7 +15,6 @@ static const uint8_t TSL2561_REGISTER_DATA_0 = 0x0C;
15
15
  static const uint8_t TSL2561_REGISTER_DATA_1 = 0x0E;
16
16
 
17
17
  void TSL2561Sensor::setup() {
18
- ESP_LOGCONFIG(TAG, "Running setup");
19
18
  uint8_t id;
20
19
  if (!this->tsl2561_read_byte(TSL2561_REGISTER_ID, &id)) {
21
20
  this->mark_failed();
@@ -43,7 +43,6 @@ void TSL2591Component::disable_if_power_saving_() {
43
43
  }
44
44
 
45
45
  void TSL2591Component::setup() {
46
- ESP_LOGCONFIG(TAG, "Running setup for address 0x%02X", this->address_);
47
46
  switch (this->component_gain_) {
48
47
  case TSL2591_CGAIN_LOW:
49
48
  this->gain_ = TSL2591_GAIN_LOW;
@@ -47,8 +47,6 @@ struct TT21100TouchReport {
47
47
  float TT21100Touchscreen::get_setup_priority() const { return setup_priority::HARDWARE - 1.0f; }
48
48
 
49
49
  void TT21100Touchscreen::setup() {
50
- ESP_LOGCONFIG(TAG, "Running setup");
51
-
52
50
  // Register interrupt pin
53
51
  if (this->interrupt_pin_ != nullptr) {
54
52
  this->interrupt_pin_->pin_mode(gpio::FLAG_INPUT | gpio::FLAG_PULLUP);
@@ -7,7 +7,6 @@ namespace ttp229_bsf {
7
7
  static const char *const TAG = "ttp229_bsf";
8
8
 
9
9
  void TTP229BSFComponent::setup() {
10
- ESP_LOGCONFIG(TAG, "Running setup");
11
10
  this->sdo_pin_->setup();
12
11
  this->scl_pin_->setup();
13
12
  this->scl_pin_->digital_write(true);
@@ -7,7 +7,6 @@ namespace ttp229_lsf {
7
7
  static const char *const TAG = "ttp229_lsf";
8
8
 
9
9
  void TTP229LSFComponent::setup() {
10
- ESP_LOGCONFIG(TAG, "Running setup");
11
10
  uint8_t data[2];
12
11
  if (this->read(data, 2) != i2c::ERROR_OK) {
13
12
  this->error_code_ = COMMUNICATION_FAILED;
@@ -46,16 +46,15 @@ TuyaClimate = tuya_ns.class_("TuyaClimate", climate.Climate, cg.Component)
46
46
 
47
47
 
48
48
  def validate_temperature_multipliers(value):
49
- if CONF_TEMPERATURE_MULTIPLIER in value:
50
- if (
51
- CONF_CURRENT_TEMPERATURE_MULTIPLIER in value
52
- or CONF_TARGET_TEMPERATURE_MULTIPLIER in value
53
- ):
54
- raise cv.Invalid(
55
- f"Cannot have {CONF_TEMPERATURE_MULTIPLIER} at the same time as "
56
- f"{CONF_CURRENT_TEMPERATURE_MULTIPLIER} and "
57
- f"{CONF_TARGET_TEMPERATURE_MULTIPLIER}"
58
- )
49
+ if CONF_TEMPERATURE_MULTIPLIER in value and (
50
+ CONF_CURRENT_TEMPERATURE_MULTIPLIER in value
51
+ or CONF_TARGET_TEMPERATURE_MULTIPLIER in value
52
+ ):
53
+ raise cv.Invalid(
54
+ f"Cannot have {CONF_TEMPERATURE_MULTIPLIER} at the same time as "
55
+ f"{CONF_CURRENT_TEMPERATURE_MULTIPLIER} and "
56
+ f"{CONF_TARGET_TEMPERATURE_MULTIPLIER}"
57
+ )
59
58
  if (
60
59
  CONF_CURRENT_TEMPERATURE_MULTIPLIER in value
61
60
  and CONF_TARGET_TEMPERATURE_MULTIPLIER not in value