esphome 2025.7.5__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 (756) 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 +102 -52
  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/fs3000/fs3000.cpp +0 -2
  209. esphome/components/ft5x06/touchscreen/ft5x06_touchscreen.cpp +0 -2
  210. esphome/components/ft63x6/ft63x6.cpp +0 -1
  211. esphome/components/gdk101/gdk101.cpp +0 -1
  212. esphome/components/gl_r01_i2c/gl_r01_i2c.cpp +0 -1
  213. esphome/components/gl_r01_i2c/sensor.py +1 -1
  214. esphome/components/gpio/one_wire/gpio_one_wire.cpp +0 -1
  215. esphome/components/gpio/switch/gpio_switch.cpp +0 -2
  216. esphome/components/gpio_expander/cached_gpio.h +24 -15
  217. esphome/components/gps/__init__.py +6 -2
  218. esphome/components/gps/gps.cpp +50 -49
  219. esphome/components/gps/gps.h +4 -8
  220. esphome/components/gps/time/gps_time.cpp +3 -9
  221. esphome/components/gps/time/gps_time.h +4 -7
  222. esphome/components/graph/__init__.py +1 -1
  223. esphome/components/grove_gas_mc_v2/grove_gas_mc_v2.cpp +0 -1
  224. esphome/components/grove_tb6612fng/grove_tb6612fng.cpp +0 -1
  225. esphome/components/gt911/touchscreen/gt911_touchscreen.cpp +21 -12
  226. esphome/components/gt911/touchscreen/gt911_touchscreen.h +26 -2
  227. esphome/components/haier/climate.py +5 -10
  228. esphome/components/haier/haier_base.cpp +0 -1
  229. esphome/components/hbridge/switch/hbridge_switch.cpp +0 -2
  230. esphome/components/hdc1080/hdc1080.cpp +0 -2
  231. esphome/components/heatpumpir/climate.py +2 -2
  232. esphome/components/hlw8012/hlw8012.cpp +0 -1
  233. esphome/components/hm3301/hm3301.cpp +0 -1
  234. esphome/components/hmc5883l/hmc5883l.cpp +0 -1
  235. esphome/components/homeassistant/__init__.py +1 -0
  236. esphome/components/homeassistant/number/__init__.py +1 -0
  237. esphome/components/homeassistant/number/homeassistant_number.cpp +11 -7
  238. esphome/components/homeassistant/switch/__init__.py +1 -0
  239. esphome/components/homeassistant/switch/homeassistant_switch.cpp +9 -5
  240. esphome/components/honeywellabp/honeywellabp.cpp +1 -4
  241. esphome/components/host/__init__.py +2 -0
  242. esphome/components/hte501/hte501.cpp +0 -1
  243. esphome/components/http_request/__init__.py +2 -3
  244. esphome/components/http_request/http_request_idf.cpp +2 -2
  245. esphome/components/htu21d/htu21d.cpp +0 -2
  246. esphome/components/htu31d/htu31d.cpp +0 -2
  247. esphome/components/hx711/hx711.cpp +0 -1
  248. esphome/components/hydreon_rgxx/hydreon_rgxx.cpp +0 -1
  249. esphome/components/hydreon_rgxx/sensor.py +4 -5
  250. esphome/components/i2c/i2c_bus.h +1 -1
  251. esphome/components/i2c/i2c_bus_arduino.cpp +1 -2
  252. esphome/components/i2c/i2c_bus_esp_idf.cpp +192 -17
  253. esphome/components/i2c/i2c_bus_esp_idf.h +11 -1
  254. esphome/components/i2s_audio/__init__.py +6 -5
  255. esphome/components/i2s_audio/i2s_audio.cpp +0 -2
  256. esphome/components/i2s_audio/media_player/i2s_audio_media_player.cpp +1 -4
  257. esphome/components/i2s_audio/microphone/__init__.py +4 -6
  258. esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp +0 -1
  259. esphome/components/i2s_audio/microphone/i2s_audio_microphone.h +2 -2
  260. esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +273 -269
  261. esphome/components/i2s_audio/speaker/i2s_audio_speaker.h +19 -34
  262. esphome/components/ili9xxx/display.py +4 -3
  263. esphome/components/ili9xxx/ili9xxx_display.cpp +0 -2
  264. esphome/components/image/__init__.py +123 -92
  265. esphome/components/improv_serial/__init__.py +7 -8
  266. esphome/components/ina219/ina219.cpp +0 -1
  267. esphome/components/ina226/ina226.cpp +0 -2
  268. esphome/components/ina260/ina260.cpp +0 -2
  269. esphome/components/ina2xx_base/__init__.py +2 -5
  270. esphome/components/ina2xx_base/ina2xx_base.cpp +0 -2
  271. esphome/components/ina3221/ina3221.cpp +0 -1
  272. esphome/components/internal_temperature/internal_temperature.cpp +0 -2
  273. esphome/components/interval/interval.h +5 -9
  274. esphome/components/json/__init__.py +1 -1
  275. esphome/components/kmeteriso/kmeteriso.cpp +0 -2
  276. esphome/components/lc709203f/lc709203f.cpp +0 -2
  277. esphome/components/lcd_gpio/display.py +1 -3
  278. esphome/components/lcd_gpio/gpio_lcd_display.cpp +0 -1
  279. esphome/components/lcd_pcf8574/pcf8574_display.cpp +0 -1
  280. esphome/components/ld2410/__init__.py +4 -6
  281. esphome/components/ld2410/binary_sensor.py +4 -0
  282. esphome/components/ld2410/ld2410.cpp +56 -100
  283. esphome/components/ld2410/ld2410.h +17 -15
  284. esphome/components/ld2410/sensor.py +24 -10
  285. esphome/components/ld2412/__init__.py +46 -0
  286. esphome/components/ld2412/binary_sensor.py +70 -0
  287. esphome/components/ld2412/button/__init__.py +74 -0
  288. esphome/components/ld2412/button/factory_reset_button.cpp +9 -0
  289. esphome/components/ld2412/button/factory_reset_button.h +18 -0
  290. esphome/components/ld2412/button/query_button.cpp +9 -0
  291. esphome/components/ld2412/button/query_button.h +18 -0
  292. esphome/components/ld2412/button/restart_button.cpp +9 -0
  293. esphome/components/ld2412/button/restart_button.h +18 -0
  294. esphome/components/ld2412/button/start_dynamic_background_correction_button.cpp +11 -0
  295. esphome/components/ld2412/button/start_dynamic_background_correction_button.h +18 -0
  296. esphome/components/ld2412/ld2412.cpp +861 -0
  297. esphome/components/ld2412/ld2412.h +141 -0
  298. esphome/components/ld2412/number/__init__.py +126 -0
  299. esphome/components/ld2412/number/gate_threshold_number.cpp +14 -0
  300. esphome/components/ld2412/number/gate_threshold_number.h +19 -0
  301. esphome/components/ld2412/number/light_threshold_number.cpp +12 -0
  302. esphome/components/ld2412/number/light_threshold_number.h +18 -0
  303. esphome/components/ld2412/number/max_distance_timeout_number.cpp +12 -0
  304. esphome/components/ld2412/number/max_distance_timeout_number.h +18 -0
  305. esphome/components/ld2412/select/__init__.py +82 -0
  306. esphome/components/ld2412/select/baud_rate_select.cpp +12 -0
  307. esphome/components/ld2412/select/baud_rate_select.h +18 -0
  308. esphome/components/ld2412/select/distance_resolution_select.cpp +12 -0
  309. esphome/components/ld2412/select/distance_resolution_select.h +18 -0
  310. esphome/components/ld2412/select/light_out_control_select.cpp +12 -0
  311. esphome/components/ld2412/select/light_out_control_select.h +18 -0
  312. esphome/components/ld2412/sensor.py +124 -0
  313. esphome/components/ld2412/switch/__init__.py +45 -0
  314. esphome/components/ld2412/switch/bluetooth_switch.cpp +12 -0
  315. esphome/components/ld2412/switch/bluetooth_switch.h +18 -0
  316. esphome/components/ld2412/switch/engineering_mode_switch.cpp +12 -0
  317. esphome/components/ld2412/switch/engineering_mode_switch.h +18 -0
  318. esphome/components/ld2412/text_sensor.py +34 -0
  319. esphome/components/ld2420/ld2420.cpp +0 -1
  320. esphome/components/ld2450/__init__.py +3 -4
  321. esphome/components/ld2450/binary_sensor.py +3 -0
  322. esphome/components/ld2450/ld2450.cpp +77 -165
  323. esphome/components/ld2450/ld2450.h +26 -54
  324. esphome/components/ld2450/sensor.py +120 -6
  325. esphome/components/ld2450/text_sensor.py +5 -4
  326. esphome/components/ld24xx/__init__.py +1 -0
  327. esphome/components/ld24xx/ld24xx.h +65 -0
  328. esphome/components/ledc/ledc_output.cpp +0 -1
  329. esphome/components/libretiny/__init__.py +2 -0
  330. esphome/components/light/__init__.py +0 -1
  331. esphome/components/light/effects.py +70 -45
  332. esphome/components/light/light_call.cpp +101 -66
  333. esphome/components/light/light_color_values.h +16 -11
  334. esphome/components/light/light_json_schema.cpp +46 -44
  335. esphome/components/light/light_state.cpp +8 -11
  336. esphome/components/light/light_traits.h +17 -0
  337. esphome/components/lightwaverf/lightwaverf.cpp +0 -2
  338. esphome/components/lilygo_t5_47/touchscreen/lilygo_t5_47_touchscreen.cpp +0 -1
  339. esphome/components/lock/__init__.py +0 -1
  340. esphome/components/logger/__init__.py +31 -9
  341. esphome/components/logger/logger.cpp +12 -7
  342. esphome/components/logger/logger.h +25 -14
  343. esphome/components/logger/logger_esp32.cpp +2 -7
  344. esphome/components/logger/logger_esp8266.cpp +2 -4
  345. esphome/components/logger/logger_host.cpp +2 -4
  346. esphome/components/logger/logger_libretiny.cpp +2 -4
  347. esphome/components/logger/logger_rp2040.cpp +2 -4
  348. esphome/components/logger/logger_zephyr.cpp +86 -0
  349. esphome/components/logger/select/logger_level_select.cpp +2 -4
  350. esphome/components/logger/select/logger_level_select.h +2 -4
  351. esphome/components/logger/task_log_buffer.cpp +2 -4
  352. esphome/components/logger/task_log_buffer.h +2 -4
  353. esphome/components/lps22/sensor.py +5 -5
  354. esphome/components/ltr390/ltr390.cpp +0 -2
  355. esphome/components/ltr501/ltr501.cpp +0 -1
  356. esphome/components/ltr_als_ps/ltr_als_ps.cpp +0 -1
  357. esphome/components/lvgl/__init__.py +14 -13
  358. esphome/components/lvgl/automation.py +2 -4
  359. esphome/components/lvgl/defines.py +0 -2
  360. esphome/components/lvgl/helpers.py +1 -1
  361. esphome/components/lvgl/lv_validation.py +7 -4
  362. esphome/components/lvgl/lvgl_esphome.cpp +2 -3
  363. esphome/components/lvgl/styles.py +2 -2
  364. esphome/components/lvgl/types.py +1 -1
  365. esphome/components/lvgl/widgets/__init__.py +2 -2
  366. esphome/components/lvgl/widgets/arc.py +14 -11
  367. esphome/components/lvgl/widgets/buttonmatrix.py +1 -1
  368. esphome/components/lvgl/widgets/qrcode.py +7 -7
  369. esphome/components/lvgl/widgets/spinner.py +6 -6
  370. esphome/components/lvgl/widgets/switch.py +2 -2
  371. esphome/components/lvgl/widgets/tabview.py +3 -3
  372. esphome/components/m5stack_8angle/m5stack_8angle.cpp +0 -1
  373. esphome/components/matrix_keypad/__init__.py +4 -3
  374. esphome/components/max17043/max17043.cpp +0 -2
  375. esphome/components/max31855/max31855.cpp +1 -4
  376. esphome/components/max31856/max31856.cpp +0 -4
  377. esphome/components/max31865/max31865.cpp +0 -1
  378. esphome/components/max44009/max44009.cpp +0 -1
  379. esphome/components/max6675/max6675.cpp +1 -4
  380. esphome/components/max6956/max6956.cpp +0 -1
  381. esphome/components/max7219/max7219.cpp +0 -1
  382. esphome/components/max7219digit/display.py +1 -1
  383. esphome/components/max7219digit/max7219digit.cpp +0 -1
  384. esphome/components/max9611/max9611.cpp +0 -1
  385. esphome/components/mcp23008/__init__.py +1 -1
  386. esphome/components/mcp23008/mcp23008.cpp +0 -1
  387. esphome/components/mcp23016/mcp23016.cpp +0 -1
  388. esphome/components/mcp23017/__init__.py +1 -1
  389. esphome/components/mcp23017/mcp23017.cpp +0 -1
  390. esphome/components/mcp23s08/__init__.py +1 -1
  391. esphome/components/mcp23s08/mcp23s08.cpp +0 -1
  392. esphome/components/mcp23s17/__init__.py +1 -1
  393. esphome/components/mcp23s17/mcp23s17.cpp +0 -1
  394. esphome/components/mcp23x08_base/__init__.py +2 -0
  395. esphome/components/mcp23x08_base/mcp23x08_base.cpp +9 -7
  396. esphome/components/mcp23x08_base/mcp23x08_base.h +9 -4
  397. esphome/components/mcp23x17_base/__init__.py +2 -0
  398. esphome/components/mcp23x17_base/mcp23x17_base.cpp +20 -7
  399. esphome/components/mcp23x17_base/mcp23x17_base.h +9 -4
  400. esphome/components/mcp23xxx_base/__init__.py +11 -5
  401. esphome/components/mcp23xxx_base/mcp23xxx_base.cpp +15 -12
  402. esphome/components/mcp23xxx_base/mcp23xxx_base.h +8 -7
  403. esphome/components/mcp3008/mcp3008.cpp +1 -4
  404. esphome/components/mcp3204/mcp3204.cpp +1 -4
  405. esphome/components/mcp4461/mcp4461.cpp +0 -1
  406. esphome/components/mcp4725/mcp4725.cpp +0 -1
  407. esphome/components/mcp4728/mcp4728.cpp +0 -1
  408. esphome/components/mcp9600/mcp9600.cpp +0 -2
  409. esphome/components/mcp9808/mcp9808.cpp +0 -2
  410. esphome/components/mdns/__init__.py +3 -0
  411. esphome/components/mdns/mdns_component.cpp +2 -0
  412. esphome/components/mdns/mdns_component.h +4 -0
  413. esphome/components/media_player/__init__.py +40 -0
  414. esphome/components/media_player/automation.h +16 -0
  415. esphome/components/media_player/media_player.cpp +13 -0
  416. esphome/components/media_player/media_player.h +50 -3
  417. esphome/components/micro_wake_word/micro_wake_word.cpp +0 -3
  418. esphome/components/mics_4514/mics_4514.cpp +1 -6
  419. esphome/components/midea/ir_transmitter.h +4 -4
  420. esphome/components/mipi/__init__.py +416 -0
  421. esphome/components/mipi_dsi/__init__.py +5 -0
  422. esphome/components/mipi_dsi/display.py +233 -0
  423. esphome/components/mipi_dsi/mipi_dsi.cpp +379 -0
  424. esphome/components/mipi_dsi/mipi_dsi.h +123 -0
  425. esphome/components/mipi_dsi/models/__init__.py +0 -0
  426. esphome/components/mipi_dsi/models/guition.py +38 -0
  427. esphome/components/mipi_dsi/models/m5stack.py +57 -0
  428. esphome/components/mipi_dsi/models/waveshare.py +105 -0
  429. esphome/components/mipi_rgb/models/lilygo.py +0 -0
  430. esphome/components/mipi_spi/__init__.py +0 -9
  431. esphome/components/mipi_spi/display.py +220 -256
  432. esphome/components/mipi_spi/mipi_spi.cpp +1 -485
  433. esphome/components/mipi_spi/mipi_spi.h +556 -108
  434. esphome/components/mipi_spi/models/__init__.py +0 -65
  435. esphome/components/mipi_spi/models/adafruit.py +30 -0
  436. esphome/components/mipi_spi/models/amoled.py +41 -5
  437. esphome/components/mipi_spi/models/ili.py +5 -5
  438. esphome/components/mipi_spi/models/jc.py +1 -3
  439. esphome/components/mipi_spi/models/lilygo.py +1 -1
  440. esphome/components/mipi_spi/models/waveshare.py +16 -1
  441. esphome/components/mixer/speaker/__init__.py +4 -5
  442. esphome/components/mlx90393/sensor.py +7 -5
  443. esphome/components/mlx90393/sensor_mlx90393.cpp +0 -1
  444. esphome/components/mlx90614/mlx90614.cpp +0 -1
  445. esphome/components/mmc5603/mmc5603.cpp +0 -1
  446. esphome/components/mmc5983/mmc5983.cpp +0 -2
  447. esphome/components/mpl3115a2/mpl3115a2.cpp +0 -2
  448. esphome/components/mpr121/__init__.py +7 -6
  449. esphome/components/mpr121/mpr121.cpp +0 -1
  450. esphome/components/mpu6050/mpu6050.cpp +0 -1
  451. esphome/components/mpu6886/mpu6886.cpp +0 -1
  452. esphome/components/mqtt/__init__.py +1 -2
  453. esphome/components/mqtt/mqtt_button.cpp +1 -1
  454. esphome/components/mqtt/mqtt_client.cpp +0 -1
  455. esphome/components/mqtt/mqtt_component.cpp +8 -14
  456. esphome/components/mqtt/mqtt_component.h +0 -7
  457. esphome/components/mqtt/mqtt_sensor.cpp +0 -1
  458. esphome/components/mqtt/mqtt_sensor.h +0 -1
  459. esphome/components/mqtt/mqtt_text_sensor.cpp +0 -1
  460. esphome/components/mqtt/mqtt_text_sensor.h +0 -1
  461. esphome/components/ms5611/ms5611.cpp +0 -1
  462. esphome/components/ms8607/ms8607.cpp +0 -1
  463. esphome/components/msa3xx/msa3xx.cpp +0 -2
  464. esphome/components/my9231/my9231.cpp +0 -2
  465. esphome/components/nau7802/nau7802.cpp +0 -1
  466. esphome/components/neopixelbus/light.py +3 -0
  467. esphome/components/network/util.cpp +29 -0
  468. esphome/components/nextion/nextion.cpp +2 -2
  469. esphome/components/nfc/binary_sensor/{binary_sensor.cpp → nfc_binary_sensor.cpp} +1 -1
  470. esphome/components/npi19/npi19.cpp +0 -2
  471. esphome/components/nrf52/__init__.py +223 -0
  472. esphome/components/nrf52/boards.py +34 -0
  473. esphome/components/nrf52/const.py +18 -0
  474. esphome/components/nrf52/gpio.py +79 -0
  475. esphome/components/number/__init__.py +2 -1
  476. esphome/components/one_wire/__init__.py +1 -2
  477. esphome/components/one_wire/one_wire.cpp +0 -2
  478. esphome/components/one_wire/one_wire.h +0 -2
  479. esphome/components/opentherm/hub.cpp +0 -1
  480. esphome/components/opentherm/number/__init__.py +2 -2
  481. esphome/components/openthread/__init__.py +2 -3
  482. esphome/components/openthread/openthread.cpp +30 -13
  483. esphome/components/openthread/openthread.h +3 -0
  484. esphome/components/openthread/openthread_esp.cpp +3 -1
  485. esphome/components/opt3001/sensor.py +2 -6
  486. esphome/components/output/__init__.py +38 -0
  487. esphome/components/output/automation.h +24 -0
  488. esphome/components/output/switch/output_switch.cpp +0 -2
  489. esphome/components/packages/__init__.py +1 -2
  490. esphome/components/packet_transport/__init__.py +4 -3
  491. esphome/components/pca6416a/pca6416a.cpp +0 -1
  492. esphome/components/pca9554/pca9554.cpp +0 -1
  493. esphome/components/pca9685/pca9685_output.cpp +0 -2
  494. esphome/components/pcf85063/pcf85063.cpp +0 -1
  495. esphome/components/pcf8563/pcf8563.cpp +0 -1
  496. esphome/components/pcf8574/pcf8574.cpp +0 -1
  497. esphome/components/pi4ioe5v6408/pi4ioe5v6408.cpp +0 -1
  498. esphome/components/pipsolar/pipsolar.cpp +54 -42
  499. esphome/components/pipsolar/pipsolar.h +5 -4
  500. esphome/components/pipsolar/sensor/__init__.py +1 -1
  501. esphome/components/pm2005/pm2005.cpp +0 -1
  502. esphome/components/pmsa003i/pmsa003i.cpp +0 -2
  503. esphome/components/pmwcs3/sensor.py +1 -2
  504. esphome/components/pn532/pn532.cpp +0 -2
  505. esphome/components/pn532_spi/pn532_spi.cpp +0 -2
  506. esphome/components/power_supply/power_supply.cpp +7 -10
  507. esphome/components/power_supply/power_supply.h +1 -1
  508. esphome/components/psram/__init__.py +6 -1
  509. esphome/components/pulse_counter/pulse_counter_sensor.cpp +0 -1
  510. esphome/components/pulse_counter/sensor.py +9 -6
  511. esphome/components/pylontech/pylontech.cpp +0 -1
  512. esphome/components/qmc5883l/qmc5883l.cpp +0 -1
  513. esphome/components/qmp6988/qmp6988.cpp +0 -2
  514. esphome/components/qspi_dbi/display.py +2 -3
  515. esphome/components/qspi_dbi/qspi_dbi.cpp +0 -2
  516. esphome/components/qwiic_pir/binary_sensor.py +2 -3
  517. esphome/components/qwiic_pir/qwiic_pir.cpp +0 -2
  518. esphome/components/rc522/rc522.cpp +9 -31
  519. esphome/components/rc522_spi/rc522_spi.cpp +0 -1
  520. esphome/components/remote_base/__init__.py +5 -6
  521. esphome/components/remote_receiver/remote_receiver_esp32.cpp +0 -1
  522. esphome/components/remote_receiver/remote_receiver_esp8266.cpp +0 -1
  523. esphome/components/remote_receiver/remote_receiver_libretiny.cpp +0 -1
  524. esphome/components/remote_transmitter/__init__.py +26 -0
  525. esphome/components/remote_transmitter/automation.h +18 -0
  526. esphome/components/remote_transmitter/remote_transmitter.h +2 -1
  527. esphome/components/remote_transmitter/remote_transmitter_esp32.cpp +0 -1
  528. esphome/components/remote_transmitter/remote_transmitter_esp8266.cpp +2 -0
  529. esphome/components/remote_transmitter/remote_transmitter_libretiny.cpp +2 -0
  530. esphome/components/resampler/speaker/__init__.py +4 -5
  531. esphome/components/rf_bridge/__init__.py +4 -8
  532. esphome/components/rotary_encoder/rotary_encoder.cpp +0 -2
  533. esphome/components/rp2040/__init__.py +3 -1
  534. esphome/components/rp2040_pio_led_strip/led_strip.cpp +0 -2
  535. esphome/components/rp2040_pio_led_strip/light.py +1 -2
  536. esphome/components/rp2040_pwm/rp2040_pwm.cpp +1 -5
  537. esphome/components/rpi_dpi_rgb/display.py +13 -15
  538. esphome/components/rpi_dpi_rgb/rpi_dpi_rgb.cpp +0 -3
  539. esphome/components/runtime_stats/__init__.py +34 -0
  540. esphome/components/runtime_stats/runtime_stats.cpp +102 -0
  541. esphome/components/runtime_stats/runtime_stats.h +132 -0
  542. esphome/components/scd30/scd30.cpp +0 -2
  543. esphome/components/scd30/sensor.py +1 -2
  544. esphome/components/scd4x/scd4x.cpp +0 -1
  545. esphome/components/scd4x/sensor.py +1 -3
  546. esphome/components/sdl/display.py +3 -1
  547. esphome/components/sdl/sdl_esphome.cpp +0 -2
  548. esphome/components/sdp3x/sdp3x.cpp +0 -2
  549. esphome/components/seeed_mr24hpc1/seeed_mr24hpc1.cpp +0 -2
  550. esphome/components/seeed_mr60fda2/seeed_mr60fda2.cpp +0 -3
  551. esphome/components/select/__init__.py +2 -3
  552. esphome/components/select/select_traits.cpp +1 -1
  553. esphome/components/select/select_traits.h +1 -1
  554. esphome/components/sen0321/sen0321.cpp +0 -1
  555. esphome/components/sen5x/sen5x.cpp +0 -2
  556. esphome/components/senseair/senseair.cpp +7 -3
  557. esphome/components/senseair/senseair.h +11 -0
  558. esphome/components/sensor/__init__.py +36 -4
  559. esphome/components/sensor/filter.cpp +49 -10
  560. esphome/components/sensor/filter.h +22 -7
  561. esphome/components/sensor/sensor.cpp +0 -1
  562. esphome/components/sensor/sensor.h +0 -9
  563. esphome/components/sfa30/sfa30.cpp +0 -4
  564. esphome/components/sgp30/sgp30.cpp +0 -2
  565. esphome/components/sgp4x/sensor.py +1 -1
  566. esphome/components/sgp4x/sgp4x.cpp +0 -2
  567. esphome/components/shelly_dimmer/shelly_dimmer.cpp +0 -2
  568. esphome/components/sht3xd/sht3xd.cpp +0 -2
  569. esphome/components/sht4x/sht4x.cpp +0 -2
  570. esphome/components/shtcx/shtcx.cpp +0 -1
  571. esphome/components/sim800l/__init__.py +2 -4
  572. esphome/components/sm16716/sm16716.cpp +0 -1
  573. esphome/components/sm2135/sm2135.cpp +0 -1
  574. esphome/components/sm2235/sm2235.cpp +0 -1
  575. esphome/components/sm2335/sm2335.cpp +0 -1
  576. esphome/components/sn74hc165/sn74hc165.cpp +0 -1
  577. esphome/components/sn74hc595/sn74hc595.cpp +0 -1
  578. esphome/components/sntp/sntp_component.cpp +0 -1
  579. esphome/components/sound_level/sensor.py +1 -1
  580. esphome/components/speaker/media_player/__init__.py +21 -33
  581. esphome/components/speaker/media_player/audio_pipeline.cpp +4 -7
  582. esphome/components/spi/__init__.py +29 -13
  583. esphome/components/spi/spi.cpp +0 -2
  584. esphome/components/spi_device/spi_device.cpp +1 -4
  585. esphome/components/sprinkler/__init__.py +4 -4
  586. esphome/components/sps30/sps30.cpp +0 -1
  587. esphome/components/ssd1306_base/__init__.py +11 -11
  588. esphome/components/ssd1306_base/ssd1306_base.cpp +1 -1
  589. esphome/components/ssd1306_i2c/ssd1306_i2c.cpp +0 -1
  590. esphome/components/ssd1306_spi/ssd1306_spi.cpp +0 -1
  591. esphome/components/ssd1322_spi/ssd1322_spi.cpp +0 -1
  592. esphome/components/ssd1325_spi/ssd1325_spi.cpp +0 -1
  593. esphome/components/ssd1327_i2c/ssd1327_i2c.cpp +0 -1
  594. esphome/components/ssd1327_spi/ssd1327_spi.cpp +0 -1
  595. esphome/components/ssd1331_spi/ssd1331_spi.cpp +0 -1
  596. esphome/components/ssd1351_spi/ssd1351_spi.cpp +0 -1
  597. esphome/components/st7567_i2c/st7567_i2c.cpp +0 -1
  598. esphome/components/st7567_spi/st7567_spi.cpp +0 -1
  599. esphome/components/st7701s/display.py +10 -14
  600. esphome/components/st7701s/st7701s.cpp +0 -3
  601. esphome/components/st7735/st7735.cpp +0 -1
  602. esphome/components/st7789v/st7789v.cpp +0 -1
  603. esphome/components/st7920/st7920.cpp +0 -1
  604. esphome/components/status_led/light/status_led_light.cpp +0 -2
  605. esphome/components/status_led/status_led.cpp +0 -1
  606. esphome/components/stepper/__init__.py +2 -4
  607. esphome/components/sts3x/sts3x.cpp +0 -1
  608. esphome/components/substitutions/__init__.py +10 -16
  609. esphome/components/substitutions/jinja.py +24 -1
  610. esphome/components/sun/__init__.py +2 -3
  611. esphome/components/switch/__init__.py +31 -1
  612. esphome/components/switch/automation.h +24 -0
  613. esphome/components/switch/switch.cpp +8 -0
  614. esphome/components/switch/switch.h +8 -0
  615. esphome/components/sx126x/sx126x.cpp +0 -2
  616. esphome/components/sx127x/sx127x.cpp +0 -2
  617. esphome/components/sx1509/__init__.py +7 -5
  618. esphome/components/sx1509/output/sx1509_float_output.cpp +1 -1
  619. esphome/components/sx1509/sx1509.cpp +0 -2
  620. esphome/components/syslog/esphome_syslog.cpp +1 -1
  621. esphome/components/tc74/tc74.cpp +0 -1
  622. esphome/components/tca9548a/tca9548a.cpp +0 -1
  623. esphome/components/tca9555/tca9555.cpp +0 -1
  624. esphome/components/tcs34725/tcs34725.cpp +0 -1
  625. esphome/components/tee501/tee501.cpp +0 -1
  626. esphome/components/tem3200/tem3200.cpp +0 -2
  627. esphome/components/template/alarm_control_panel/template_alarm_control_panel.cpp +0 -1
  628. esphome/components/template/cover/template_cover.cpp +0 -1
  629. esphome/components/template/select/template_select.cpp +0 -1
  630. esphome/components/template/text/template_text.cpp +0 -2
  631. esphome/components/template/valve/template_valve.cpp +0 -1
  632. esphome/components/text/__init__.py +0 -1
  633. esphome/components/text/text_traits.h +2 -0
  634. esphome/components/text_sensor/__init__.py +2 -1
  635. esphome/components/text_sensor/text_sensor.cpp +0 -2
  636. esphome/components/text_sensor/text_sensor.h +0 -8
  637. esphome/components/thermostat/climate.py +4 -4
  638. esphome/components/time/__init__.py +7 -4
  639. esphome/components/time/real_time_clock.cpp +16 -3
  640. esphome/components/tlc59208f/tlc59208f_output.cpp +0 -2
  641. esphome/components/tlc5947/tlc5947.cpp +0 -2
  642. esphome/components/tlc5971/tlc5971.cpp +0 -2
  643. esphome/components/tm1621/tm1621.cpp +0 -2
  644. esphome/components/tm1637/tm1637.cpp +0 -2
  645. esphome/components/tm1638/tm1638.cpp +0 -2
  646. esphome/components/tm1651/__init__.py +45 -48
  647. esphome/components/tm1651/tm1651.cpp +213 -47
  648. esphome/components/tm1651/tm1651.h +37 -32
  649. esphome/components/tmp117/tmp117.cpp +0 -2
  650. esphome/components/tsl2561/tsl2561.cpp +0 -1
  651. esphome/components/tsl2591/tsl2591.cpp +0 -1
  652. esphome/components/tt21100/touchscreen/tt21100.cpp +0 -2
  653. esphome/components/ttp229_bsf/ttp229_bsf.cpp +0 -1
  654. esphome/components/ttp229_lsf/ttp229_lsf.cpp +0 -1
  655. esphome/components/tuya/climate/__init__.py +9 -10
  656. esphome/components/tuya/number/__init__.py +8 -6
  657. esphome/components/tx20/tx20.cpp +0 -1
  658. esphome/components/uart/uart_component_esp32_arduino.cpp +0 -1
  659. esphome/components/uart/uart_component_esp8266.cpp +0 -1
  660. esphome/components/uart/uart_component_esp_idf.cpp +0 -2
  661. esphome/components/uart/uart_component_libretiny.cpp +0 -2
  662. esphome/components/uart/uart_component_rp2040.cpp +0 -2
  663. esphome/components/udp/__init__.py +1 -1
  664. esphome/components/ufire_ec/sensor.py +1 -2
  665. esphome/components/ufire_ec/ufire_ec.cpp +0 -2
  666. esphome/components/ufire_ise/sensor.py +1 -2
  667. esphome/components/ufire_ise/ufire_ise.cpp +0 -2
  668. esphome/components/ultrasonic/ultrasonic_sensor.cpp +0 -1
  669. esphome/components/update/__init__.py +0 -1
  670. esphome/components/uptime/sensor/uptime_seconds_sensor.cpp +0 -1
  671. esphome/components/uptime/sensor/uptime_seconds_sensor.h +0 -2
  672. esphome/components/usb_host/usb_host_client.cpp +0 -1
  673. esphome/components/usb_host/usb_host_component.cpp +0 -1
  674. esphome/components/valve/__init__.py +0 -1
  675. esphome/components/veml3235/veml3235.cpp +0 -3
  676. esphome/components/veml7700/veml7700.cpp +0 -2
  677. esphome/components/version/version_text_sensor.cpp +0 -1
  678. esphome/components/version/version_text_sensor.h +0 -1
  679. esphome/components/vl53l0x/vl53l0x_sensor.cpp +0 -4
  680. esphome/components/voice_assistant/voice_assistant.cpp +9 -8
  681. esphome/components/web_server/__init__.py +13 -0
  682. esphome/components/web_server/web_server.cpp +188 -353
  683. esphome/components/web_server/web_server.h +61 -1
  684. esphome/components/web_server_base/__init__.py +1 -1
  685. esphome/components/web_server_base/web_server_base.cpp +2 -0
  686. esphome/components/web_server_base/web_server_base.h +6 -0
  687. esphome/components/web_server_idf/web_server_idf.cpp +10 -8
  688. esphome/components/web_server_idf/web_server_idf.h +2 -0
  689. esphome/components/weikai_i2c/weikai_i2c.cpp +1 -2
  690. esphome/components/weikai_spi/weikai_spi.cpp +1 -1
  691. esphome/components/wifi/__init__.py +17 -43
  692. esphome/components/wifi/wifi_component.cpp +100 -36
  693. esphome/components/wifi/wifi_component.h +5 -1
  694. esphome/components/wifi/wifi_component_esp32_arduino.cpp +30 -0
  695. esphome/components/wifi/wifi_component_esp_idf.cpp +30 -0
  696. esphome/components/wifi_info/wifi_info_text_sensor.h +0 -6
  697. esphome/components/wifi_signal/wifi_signal_sensor.h +0 -1
  698. esphome/components/wireguard/wireguard.cpp +0 -2
  699. esphome/components/x9c/x9c.cpp +0 -2
  700. esphome/components/xgzp68xx/xgzp68xx.cpp +0 -1
  701. esphome/components/xl9535/xl9535.cpp +0 -2
  702. esphome/components/zephyr/__init__.py +252 -0
  703. esphome/components/zephyr/const.py +16 -0
  704. esphome/components/zephyr/core.cpp +90 -0
  705. esphome/components/zephyr/gpio.cpp +120 -0
  706. esphome/components/zephyr/gpio.h +38 -0
  707. esphome/components/zephyr/pre_build.py.script +4 -0
  708. esphome/components/zephyr/preferences.cpp +156 -0
  709. esphome/components/zephyr/preferences.h +13 -0
  710. esphome/config.py +38 -16
  711. esphome/config_helpers.py +1 -2
  712. esphome/config_validation.py +12 -16
  713. esphome/const.py +26 -1
  714. esphome/core/__init__.py +92 -51
  715. esphome/core/application.cpp +75 -21
  716. esphome/core/application.h +106 -171
  717. esphome/core/color.h +10 -0
  718. esphome/core/component.cpp +41 -25
  719. esphome/core/component.h +9 -6
  720. esphome/core/component_iterator.cpp +61 -261
  721. esphome/core/component_iterator.h +15 -0
  722. esphome/core/config.py +26 -11
  723. esphome/core/defines.h +40 -2
  724. esphome/core/entity_base.h +18 -0
  725. esphome/core/entity_helpers.py +45 -10
  726. esphome/core/helpers.cpp +8 -15
  727. esphome/core/helpers.h +60 -6
  728. esphome/core/lock_free_queue.h +1 -1
  729. esphome/core/scheduler.cpp +311 -77
  730. esphome/core/scheduler.h +141 -28
  731. esphome/cpp_generator.py +2 -6
  732. esphome/cpp_helpers.py +1 -1
  733. esphome/dashboard/dashboard.py +2 -3
  734. esphome/dashboard/dns.py +2 -8
  735. esphome/dashboard/web_server.py +34 -19
  736. esphome/espota2.py +1 -4
  737. esphome/git.py +3 -1
  738. esphome/helpers.py +23 -4
  739. esphome/log.py +3 -1
  740. esphome/mqtt.py +3 -5
  741. esphome/platformio_api.py +7 -4
  742. esphome/types.py +12 -0
  743. esphome/util.py +20 -8
  744. esphome/voluptuous_schema.py +4 -3
  745. esphome/vscode.py +1 -2
  746. esphome/wizard.py +1 -4
  747. esphome/writer.py +16 -108
  748. esphome/yaml_util.py +7 -5
  749. {esphome-2025.7.5.dist-info → esphome-2025.8.0.dist-info}/METADATA +13 -14
  750. {esphome-2025.7.5.dist-info → esphome-2025.8.0.dist-info}/RECORD +755 -675
  751. esphome/components/mipi_spi/models/commands.py +0 -82
  752. /esphome/components/nfc/binary_sensor/{binary_sensor.h → nfc_binary_sensor.h} +0 -0
  753. {esphome-2025.7.5.dist-info → esphome-2025.8.0.dist-info}/WHEEL +0 -0
  754. {esphome-2025.7.5.dist-info → esphome-2025.8.0.dist-info}/entry_points.txt +0 -0
  755. {esphome-2025.7.5.dist-info → esphome-2025.8.0.dist-info}/licenses/LICENSE +0 -0
  756. {esphome-2025.7.5.dist-info → esphome-2025.8.0.dist-info}/top_level.txt +0 -0
@@ -473,6 +473,12 @@ bool WiFiComponent::wifi_sta_ip_config_(optional<ManualIP> manual_ip) {
473
473
  if (!this->wifi_mode_(true, {}))
474
474
  return false;
475
475
 
476
+ // Check if the STA interface is initialized before using it
477
+ if (s_sta_netif == nullptr) {
478
+ ESP_LOGW(TAG, "STA interface not initialized");
479
+ return false;
480
+ }
481
+
476
482
  esp_netif_dhcp_status_t dhcp_status;
477
483
  esp_err_t err = esp_netif_dhcpc_get_status(s_sta_netif, &dhcp_status);
478
484
  if (err != ESP_OK) {
@@ -640,8 +646,20 @@ const char *get_disconnect_reason_str(uint8_t reason) {
640
646
  return "Handshake Failed";
641
647
  case WIFI_REASON_CONNECTION_FAIL:
642
648
  return "Connection Failed";
649
+ case WIFI_REASON_AP_TSF_RESET:
650
+ return "AP TSF reset";
643
651
  case WIFI_REASON_ROAMING:
644
652
  return "Station Roaming";
653
+ case WIFI_REASON_ASSOC_COMEBACK_TIME_TOO_LONG:
654
+ return "Association comeback time too long";
655
+ case WIFI_REASON_SA_QUERY_TIMEOUT:
656
+ return "SA query timeout";
657
+ case WIFI_REASON_NO_AP_FOUND_W_COMPATIBLE_SECURITY:
658
+ return "No AP found with compatible security";
659
+ case WIFI_REASON_NO_AP_FOUND_IN_AUTHMODE_THRESHOLD:
660
+ return "No AP found in auth mode threshold";
661
+ case WIFI_REASON_NO_AP_FOUND_IN_RSSI_THRESHOLD:
662
+ return "No AP found in RSSI threshold";
645
663
  case WIFI_REASON_UNSPECIFIED:
646
664
  default:
647
665
  return "Unspecified";
@@ -679,6 +697,8 @@ void WiFiComponent::wifi_process_event_(IDFWiFiEvent *data) {
679
697
  } else if (data->event_base == WIFI_EVENT && data->event_id == WIFI_EVENT_STA_STOP) {
680
698
  ESP_LOGV(TAG, "STA stop");
681
699
  s_sta_started = false;
700
+ // Clear the STA interface handle to prevent use-after-free
701
+ s_sta_netif = nullptr;
682
702
 
683
703
  } else if (data->event_base == WIFI_EVENT && data->event_id == WIFI_EVENT_STA_AUTHMODE_CHANGE) {
684
704
  const auto &it = data->data.sta_authmode_change;
@@ -777,6 +797,10 @@ void WiFiComponent::wifi_process_event_(IDFWiFiEvent *data) {
777
797
  } else if (data->event_base == WIFI_EVENT && data->event_id == WIFI_EVENT_AP_STOP) {
778
798
  ESP_LOGV(TAG, "AP stop");
779
799
  s_ap_started = false;
800
+ #ifdef USE_WIFI_AP
801
+ // Clear the AP interface handle to prevent use-after-free
802
+ s_ap_netif = nullptr;
803
+ #endif
780
804
 
781
805
  } else if (data->event_base == WIFI_EVENT && data->event_id == WIFI_EVENT_AP_PROBEREQRECVED) {
782
806
  const auto &it = data->data.ap_probe_req_rx;
@@ -853,6 +877,12 @@ bool WiFiComponent::wifi_ap_ip_config_(optional<ManualIP> manual_ip) {
853
877
  if (!this->wifi_mode_({}, true))
854
878
  return false;
855
879
 
880
+ // Check if the AP interface is initialized before using it
881
+ if (s_ap_netif == nullptr) {
882
+ ESP_LOGW(TAG, "AP interface not initialized");
883
+ return false;
884
+ }
885
+
856
886
  esp_netif_ip_info_t info;
857
887
  if (manual_ip.has_value()) {
858
888
  info.ip = manual_ip->static_ip;
@@ -28,7 +28,6 @@ class IPAddressWiFiInfo : public PollingComponent, public text_sensor::TextSenso
28
28
  }
29
29
  }
30
30
  float get_setup_priority() const override { return setup_priority::AFTER_WIFI; }
31
- std::string unique_id() override { return get_mac_address() + "-wifiinfo-ip"; }
32
31
  void dump_config() override;
33
32
  void add_ip_sensors(uint8_t index, text_sensor::TextSensor *s) { this->ip_sensors_[index] = s; }
34
33
 
@@ -51,7 +50,6 @@ class DNSAddressWifiInfo : public PollingComponent, public text_sensor::TextSens
51
50
  }
52
51
  }
53
52
  float get_setup_priority() const override { return setup_priority::AFTER_WIFI; }
54
- std::string unique_id() override { return get_mac_address() + "-wifiinfo-dns"; }
55
53
  void dump_config() override;
56
54
 
57
55
  protected:
@@ -80,7 +78,6 @@ class ScanResultsWiFiInfo : public PollingComponent, public text_sensor::TextSen
80
78
  }
81
79
  }
82
80
  float get_setup_priority() const override { return setup_priority::AFTER_WIFI; }
83
- std::string unique_id() override { return get_mac_address() + "-wifiinfo-scanresults"; }
84
81
  void dump_config() override;
85
82
 
86
83
  protected:
@@ -97,7 +94,6 @@ class SSIDWiFiInfo : public PollingComponent, public text_sensor::TextSensor {
97
94
  }
98
95
  }
99
96
  float get_setup_priority() const override { return setup_priority::AFTER_WIFI; }
100
- std::string unique_id() override { return get_mac_address() + "-wifiinfo-ssid"; }
101
97
  void dump_config() override;
102
98
 
103
99
  protected:
@@ -116,7 +112,6 @@ class BSSIDWiFiInfo : public PollingComponent, public text_sensor::TextSensor {
116
112
  }
117
113
  }
118
114
  float get_setup_priority() const override { return setup_priority::AFTER_WIFI; }
119
- std::string unique_id() override { return get_mac_address() + "-wifiinfo-bssid"; }
120
115
  void dump_config() override;
121
116
 
122
117
  protected:
@@ -126,7 +121,6 @@ class BSSIDWiFiInfo : public PollingComponent, public text_sensor::TextSensor {
126
121
  class MacAddressWifiInfo : public Component, public text_sensor::TextSensor {
127
122
  public:
128
123
  void setup() override { this->publish_state(get_mac_address_pretty()); }
129
- std::string unique_id() override { return get_mac_address() + "-wifiinfo-macadr"; }
130
124
  void dump_config() override;
131
125
  };
132
126
 
@@ -13,7 +13,6 @@ class WiFiSignalSensor : public sensor::Sensor, public PollingComponent {
13
13
  void update() override { this->publish_state(wifi::global_wifi_component->wifi_rssi()); }
14
14
  void dump_config() override;
15
15
 
16
- std::string unique_id() override { return get_mac_address() + "-wifisignal"; }
17
16
  float get_setup_priority() const override { return setup_priority::AFTER_WIFI; }
18
17
  };
19
18
 
@@ -28,8 +28,6 @@ static const char *const LOGMSG_ONLINE = "online";
28
28
  static const char *const LOGMSG_OFFLINE = "offline";
29
29
 
30
30
  void Wireguard::setup() {
31
- ESP_LOGCONFIG(TAG, "Running setup");
32
-
33
31
  this->wg_config_.address = this->address_.c_str();
34
32
  this->wg_config_.private_key = this->private_key_.c_str();
35
33
  this->wg_config_.endpoint = this->peer_endpoint_.c_str();
@@ -34,8 +34,6 @@ void X9cOutput::trim_value(int change_amount) {
34
34
  }
35
35
 
36
36
  void X9cOutput::setup() {
37
- ESP_LOGCONFIG(TAG, "Running setup");
38
-
39
37
  this->inc_pin_->get_pin();
40
38
  this->inc_pin_->setup();
41
39
  this->inc_pin_->digital_write(false);
@@ -69,7 +69,6 @@ void XGZP68XXComponent::update() {
69
69
  }
70
70
 
71
71
  void XGZP68XXComponent::setup() {
72
- ESP_LOGCONFIG(TAG, "Running setup");
73
72
  uint8_t config;
74
73
 
75
74
  // Display some sample bits to confirm we are talking to the sensor
@@ -7,8 +7,6 @@ namespace xl9535 {
7
7
  static const char *const TAG = "xl9535";
8
8
 
9
9
  void XL9535Component::setup() {
10
- ESP_LOGCONFIG(TAG, "Running setup");
11
-
12
10
  // Check to see if the device can read from the register
13
11
  uint8_t port = 0;
14
12
  if (this->read_register(XL9535_INPUT_PORT_0_REGISTER, &port, 1) != i2c::ERROR_OK) {
@@ -0,0 +1,252 @@
1
+ import os
2
+ from typing import TypedDict
3
+
4
+ import esphome.codegen as cg
5
+ from esphome.const import CONF_BOARD
6
+ from esphome.core import CORE
7
+ from esphome.helpers import copy_file_if_changed, write_file_if_changed
8
+
9
+ from .const import (
10
+ BOOTLOADER_MCUBOOT,
11
+ KEY_BOARD,
12
+ KEY_BOOTLOADER,
13
+ KEY_EXTRA_BUILD_FILES,
14
+ KEY_OVERLAY,
15
+ KEY_PM_STATIC,
16
+ KEY_PRJ_CONF,
17
+ KEY_USER,
18
+ KEY_ZEPHYR,
19
+ zephyr_ns,
20
+ )
21
+
22
+ CODEOWNERS = ["@tomaszduda23"]
23
+ AUTO_LOAD = ["preferences"]
24
+
25
+ PrjConfValueType = bool | str | int
26
+
27
+
28
+ class Section:
29
+ def __init__(self, name, address, size, region):
30
+ self.name = name
31
+ self.address = address
32
+ self.size = size
33
+ self.region = region
34
+ self.end_address = self.address + self.size
35
+
36
+ def __str__(self):
37
+ return (
38
+ f"{self.name}:\n"
39
+ f" address: 0x{self.address:X}\n"
40
+ f" end_address: 0x{self.end_address:X}\n"
41
+ f" region: {self.region}\n"
42
+ f" size: 0x{self.size:X}"
43
+ )
44
+
45
+
46
+ class ZephyrData(TypedDict):
47
+ board: str
48
+ bootloader: str
49
+ prj_conf: dict[str, tuple[PrjConfValueType, bool]]
50
+ overlay: str
51
+ extra_build_files: dict[str, str]
52
+ pm_static: list[Section]
53
+ user: dict[str, list[str]]
54
+
55
+
56
+ def zephyr_set_core_data(config):
57
+ CORE.data[KEY_ZEPHYR] = ZephyrData(
58
+ board=config[CONF_BOARD],
59
+ bootloader=config[KEY_BOOTLOADER],
60
+ prj_conf={},
61
+ overlay="",
62
+ extra_build_files={},
63
+ pm_static=[],
64
+ user={},
65
+ )
66
+ return config
67
+
68
+
69
+ def zephyr_data() -> ZephyrData:
70
+ return CORE.data[KEY_ZEPHYR]
71
+
72
+
73
+ def zephyr_add_prj_conf(
74
+ name: str, value: PrjConfValueType, required: bool = True
75
+ ) -> None:
76
+ """Set an zephyr prj conf value."""
77
+ if not name.startswith("CONFIG_"):
78
+ name = "CONFIG_" + name
79
+ prj_conf = zephyr_data()[KEY_PRJ_CONF]
80
+ if name not in prj_conf:
81
+ prj_conf[name] = (value, required)
82
+ return
83
+ old_value, old_required = prj_conf[name]
84
+ if old_value != value and old_required:
85
+ raise ValueError(
86
+ f"{name} already set with value '{old_value}', cannot set again to '{value}'"
87
+ )
88
+ if required:
89
+ prj_conf[name] = (value, required)
90
+
91
+
92
+ def zephyr_add_overlay(content):
93
+ zephyr_data()[KEY_OVERLAY] += content
94
+
95
+
96
+ def add_extra_build_file(filename: str, path: str) -> bool:
97
+ """Add an extra build file to the project."""
98
+ extra_build_files = zephyr_data()[KEY_EXTRA_BUILD_FILES]
99
+ if filename not in extra_build_files:
100
+ extra_build_files[filename] = path
101
+ return True
102
+ return False
103
+
104
+
105
+ def add_extra_script(stage: str, filename: str, path: str):
106
+ """Add an extra script to the project."""
107
+ key = f"{stage}:{filename}"
108
+ if add_extra_build_file(filename, path):
109
+ cg.add_platformio_option("extra_scripts", [key])
110
+
111
+
112
+ def zephyr_to_code(config):
113
+ cg.add(zephyr_ns.setup_preferences())
114
+ cg.add_build_flag("-DUSE_ZEPHYR")
115
+ cg.set_cpp_standard("gnu++20")
116
+ # build is done by west so bypass board checking in platformio
117
+ cg.add_platformio_option("boards_dir", CORE.relative_build_path("boards"))
118
+
119
+ # c++ support
120
+ zephyr_add_prj_conf("NEWLIB_LIBC", True)
121
+ zephyr_add_prj_conf("CONFIG_FPU", True)
122
+ zephyr_add_prj_conf("NEWLIB_LIBC_FLOAT_PRINTF", True)
123
+ zephyr_add_prj_conf("CPLUSPLUS", True)
124
+ zephyr_add_prj_conf("CONFIG_STD_CPP20", True)
125
+ zephyr_add_prj_conf("LIB_CPLUSPLUS", True)
126
+ # preferences
127
+ zephyr_add_prj_conf("SETTINGS", True)
128
+ zephyr_add_prj_conf("NVS", True)
129
+ zephyr_add_prj_conf("FLASH_MAP", True)
130
+ zephyr_add_prj_conf("CONFIG_FLASH", True)
131
+ # watchdog
132
+ zephyr_add_prj_conf("WATCHDOG", True)
133
+ zephyr_add_prj_conf("WDT_DISABLE_AT_BOOT", False)
134
+ # disable console
135
+ zephyr_add_prj_conf("UART_CONSOLE", False)
136
+ zephyr_add_prj_conf("CONSOLE", False, False)
137
+ # use NFC pins as GPIO
138
+ zephyr_add_prj_conf("NFCT_PINS_AS_GPIOS", True)
139
+
140
+ # <err> os: ***** USAGE FAULT *****
141
+ # <err> os: Illegal load of EXC_RETURN into PC
142
+ zephyr_add_prj_conf("MAIN_STACK_SIZE", 2048)
143
+
144
+ add_extra_script(
145
+ "pre",
146
+ "pre_build.py",
147
+ os.path.join(os.path.dirname(__file__), "pre_build.py.script"),
148
+ )
149
+
150
+
151
+ def _format_prj_conf_val(value: PrjConfValueType) -> str:
152
+ if isinstance(value, bool):
153
+ return "y" if value else "n"
154
+ if isinstance(value, int):
155
+ return str(value)
156
+ if isinstance(value, str):
157
+ return f'"{value}"'
158
+ raise ValueError
159
+
160
+
161
+ def zephyr_add_cdc_acm(config, id):
162
+ zephyr_add_prj_conf("USB_DEVICE_STACK", True)
163
+ zephyr_add_prj_conf("USB_CDC_ACM", True)
164
+ # prevent device to go to susspend, without this communication stop working in python
165
+ # there should be a way to solve it
166
+ zephyr_add_prj_conf("USB_DEVICE_REMOTE_WAKEUP", False)
167
+ # prevent logging when buffer is full
168
+ zephyr_add_prj_conf("USB_CDC_ACM_LOG_LEVEL_WRN", True)
169
+ zephyr_add_overlay(
170
+ f"""
171
+ &zephyr_udc0 {{
172
+ cdc_acm_uart{id}: cdc_acm_uart{id} {{
173
+ compatible = "zephyr,cdc-acm-uart";
174
+ }};
175
+ }};
176
+ """
177
+ )
178
+
179
+
180
+ def zephyr_add_pm_static(section: Section):
181
+ CORE.data[KEY_ZEPHYR][KEY_PM_STATIC].extend(section)
182
+
183
+
184
+ def zephyr_add_user(key, value):
185
+ user = zephyr_data()[KEY_USER]
186
+ if key not in user:
187
+ user[key] = []
188
+ user[key] += [value]
189
+
190
+
191
+ def copy_files():
192
+ user = zephyr_data()[KEY_USER]
193
+ if user:
194
+ zephyr_add_overlay(
195
+ f"""
196
+ / {{
197
+ zephyr,user {{
198
+ {[f"{key} = {', '.join(value)};" for key, value in user.items()][0]}
199
+ }};
200
+ }};"""
201
+ )
202
+
203
+ want_opts = zephyr_data()[KEY_PRJ_CONF]
204
+
205
+ prj_conf = (
206
+ "\n".join(
207
+ f"{name}={_format_prj_conf_val(value[0])}"
208
+ for name, value in sorted(want_opts.items())
209
+ )
210
+ + "\n"
211
+ )
212
+
213
+ write_file_if_changed(CORE.relative_build_path("zephyr/prj.conf"), prj_conf)
214
+
215
+ write_file_if_changed(
216
+ CORE.relative_build_path("zephyr/app.overlay"),
217
+ zephyr_data()[KEY_OVERLAY],
218
+ )
219
+
220
+ if zephyr_data()[KEY_BOOTLOADER] == BOOTLOADER_MCUBOOT or zephyr_data()[
221
+ KEY_BOARD
222
+ ] in ["xiao_ble"]:
223
+ fake_board_manifest = """
224
+ {
225
+ "frameworks": [
226
+ "zephyr"
227
+ ],
228
+ "name": "esphome nrf52",
229
+ "upload": {
230
+ "maximum_ram_size": 248832,
231
+ "maximum_size": 815104
232
+ },
233
+ "url": "https://esphome.io/",
234
+ "vendor": "esphome"
235
+ }
236
+ """
237
+ write_file_if_changed(
238
+ CORE.relative_build_path(f"boards/{zephyr_data()[KEY_BOARD]}.json"),
239
+ fake_board_manifest,
240
+ )
241
+
242
+ for filename, path in zephyr_data()[KEY_EXTRA_BUILD_FILES].items():
243
+ copy_file_if_changed(
244
+ path,
245
+ CORE.relative_build_path(filename),
246
+ )
247
+
248
+ pm_static = "\n".join(str(item) for item in zephyr_data()[KEY_PM_STATIC])
249
+ if pm_static:
250
+ write_file_if_changed(
251
+ CORE.relative_build_path("zephyr/pm_static.yml"), pm_static
252
+ )
@@ -0,0 +1,16 @@
1
+ from typing import Final
2
+
3
+ import esphome.codegen as cg
4
+
5
+ BOOTLOADER_MCUBOOT = "mcuboot"
6
+
7
+ KEY_BOOTLOADER: Final = "bootloader"
8
+ KEY_EXTRA_BUILD_FILES: Final = "extra_build_files"
9
+ KEY_OVERLAY: Final = "overlay"
10
+ KEY_PM_STATIC: Final = "pm_static"
11
+ KEY_PRJ_CONF: Final = "prj_conf"
12
+ KEY_ZEPHYR = "zephyr"
13
+ KEY_BOARD: Final = "board"
14
+ KEY_USER: Final = "user"
15
+
16
+ zephyr_ns = cg.esphome_ns.namespace("zephyr")
@@ -0,0 +1,90 @@
1
+ #ifdef USE_ZEPHYR
2
+
3
+ #include <zephyr/kernel.h>
4
+ #include <zephyr/drivers/watchdog.h>
5
+ #include <zephyr/sys/reboot.h>
6
+ #include <zephyr/random/rand32.h>
7
+ #include "esphome/core/hal.h"
8
+ #include "esphome/core/helpers.h"
9
+
10
+ namespace esphome {
11
+
12
+ static int wdt_channel_id = -1; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables)
13
+ static const device *const WDT = DEVICE_DT_GET(DT_ALIAS(watchdog0));
14
+
15
+ void yield() { ::k_yield(); }
16
+ uint32_t millis() { return k_ticks_to_ms_floor32(k_uptime_ticks()); }
17
+ uint32_t micros() { return k_ticks_to_us_floor32(k_uptime_ticks()); }
18
+ void delayMicroseconds(uint32_t us) { ::k_usleep(us); }
19
+ void delay(uint32_t ms) { ::k_msleep(ms); }
20
+
21
+ void arch_init() {
22
+ if (device_is_ready(WDT)) {
23
+ static wdt_timeout_cfg wdt_config{};
24
+ wdt_config.flags = WDT_FLAG_RESET_SOC;
25
+ wdt_config.window.max = 2000;
26
+ wdt_channel_id = wdt_install_timeout(WDT, &wdt_config);
27
+ if (wdt_channel_id >= 0) {
28
+ wdt_setup(WDT, WDT_OPT_PAUSE_HALTED_BY_DBG | WDT_OPT_PAUSE_IN_SLEEP);
29
+ }
30
+ }
31
+ }
32
+
33
+ void arch_feed_wdt() {
34
+ if (wdt_channel_id >= 0) {
35
+ wdt_feed(WDT, wdt_channel_id);
36
+ }
37
+ }
38
+
39
+ void arch_restart() { sys_reboot(SYS_REBOOT_COLD); }
40
+ uint32_t arch_get_cpu_cycle_count() { return k_cycle_get_32(); }
41
+ uint32_t arch_get_cpu_freq_hz() { return sys_clock_hw_cycles_per_sec(); }
42
+ uint8_t progmem_read_byte(const uint8_t *addr) { return *addr; }
43
+
44
+ Mutex::Mutex() {
45
+ auto *mutex = new k_mutex();
46
+ this->handle_ = mutex;
47
+ k_mutex_init(mutex);
48
+ }
49
+ Mutex::~Mutex() { delete static_cast<k_mutex *>(this->handle_); }
50
+ void Mutex::lock() { k_mutex_lock(static_cast<k_mutex *>(this->handle_), K_FOREVER); }
51
+ bool Mutex::try_lock() { return k_mutex_lock(static_cast<k_mutex *>(this->handle_), K_NO_WAIT) == 0; }
52
+ void Mutex::unlock() { k_mutex_unlock(static_cast<k_mutex *>(this->handle_)); }
53
+
54
+ IRAM_ATTR InterruptLock::InterruptLock() { state_ = irq_lock(); }
55
+ IRAM_ATTR InterruptLock::~InterruptLock() { irq_unlock(state_); }
56
+
57
+ // Zephyr doesn't support lwIP core locking, so this is a no-op
58
+ LwIPLock::LwIPLock() {}
59
+ LwIPLock::~LwIPLock() {}
60
+
61
+ uint32_t random_uint32() { return rand(); } // NOLINT(cert-msc30-c, cert-msc50-cpp)
62
+ bool random_bytes(uint8_t *data, size_t len) {
63
+ sys_rand_get(data, len);
64
+ return true;
65
+ }
66
+
67
+ void get_mac_address_raw(uint8_t *mac) { // NOLINT(readability-non-const-parameter)
68
+ mac[0] = ((NRF_FICR->DEVICEADDR[1] & 0xFFFF) >> 8) | 0xC0;
69
+ mac[1] = NRF_FICR->DEVICEADDR[1] & 0xFFFF;
70
+ mac[2] = NRF_FICR->DEVICEADDR[0] >> 24;
71
+ mac[3] = NRF_FICR->DEVICEADDR[0] >> 16;
72
+ mac[4] = NRF_FICR->DEVICEADDR[0] >> 8;
73
+ mac[5] = NRF_FICR->DEVICEADDR[0];
74
+ }
75
+
76
+ } // namespace esphome
77
+
78
+ void setup();
79
+ void loop();
80
+
81
+ int main() {
82
+ setup();
83
+ while (true) {
84
+ loop();
85
+ esphome::yield();
86
+ }
87
+ return 0;
88
+ }
89
+
90
+ #endif
@@ -0,0 +1,120 @@
1
+ #ifdef USE_ZEPHYR
2
+ #include "gpio.h"
3
+ #include <zephyr/drivers/gpio.h>
4
+ #include "esphome/core/log.h"
5
+
6
+ namespace esphome {
7
+ namespace zephyr {
8
+
9
+ static const char *const TAG = "zephyr";
10
+
11
+ static int flags_to_mode(gpio::Flags flags, bool inverted, bool value) {
12
+ int ret = 0;
13
+ if (flags & gpio::FLAG_INPUT) {
14
+ ret |= GPIO_INPUT;
15
+ }
16
+ if (flags & gpio::FLAG_OUTPUT) {
17
+ ret |= GPIO_OUTPUT;
18
+ if (value != inverted) {
19
+ ret |= GPIO_OUTPUT_INIT_HIGH;
20
+ } else {
21
+ ret |= GPIO_OUTPUT_INIT_LOW;
22
+ }
23
+ }
24
+ if (flags & gpio::FLAG_PULLUP) {
25
+ ret |= GPIO_PULL_UP;
26
+ }
27
+ if (flags & gpio::FLAG_PULLDOWN) {
28
+ ret |= GPIO_PULL_DOWN;
29
+ }
30
+ if (flags & gpio::FLAG_OPEN_DRAIN) {
31
+ ret |= GPIO_OPEN_DRAIN;
32
+ }
33
+ return ret;
34
+ }
35
+
36
+ struct ISRPinArg {
37
+ uint8_t pin;
38
+ bool inverted;
39
+ };
40
+
41
+ ISRInternalGPIOPin ZephyrGPIOPin::to_isr() const {
42
+ auto *arg = new ISRPinArg{}; // NOLINT(cppcoreguidelines-owning-memory)
43
+ arg->pin = this->pin_;
44
+ arg->inverted = this->inverted_;
45
+ return ISRInternalGPIOPin((void *) arg);
46
+ }
47
+
48
+ void ZephyrGPIOPin::attach_interrupt(void (*func)(void *), void *arg, gpio::InterruptType type) const {
49
+ // TODO
50
+ }
51
+
52
+ void ZephyrGPIOPin::setup() {
53
+ const struct device *gpio = nullptr;
54
+ if (this->pin_ < 32) {
55
+ #define GPIO0 DT_NODELABEL(gpio0)
56
+ #if DT_NODE_HAS_STATUS(GPIO0, okay)
57
+ gpio = DEVICE_DT_GET(GPIO0);
58
+ #else
59
+ #error "gpio0 is disabled"
60
+ #endif
61
+ } else {
62
+ #define GPIO1 DT_NODELABEL(gpio1)
63
+ #if DT_NODE_HAS_STATUS(GPIO1, okay)
64
+ gpio = DEVICE_DT_GET(GPIO1);
65
+ #else
66
+ #error "gpio1 is disabled"
67
+ #endif
68
+ }
69
+ if (device_is_ready(gpio)) {
70
+ this->gpio_ = gpio;
71
+ } else {
72
+ ESP_LOGE(TAG, "gpio %u is not ready.", this->pin_);
73
+ return;
74
+ }
75
+ this->pin_mode(this->flags_);
76
+ }
77
+
78
+ void ZephyrGPIOPin::pin_mode(gpio::Flags flags) {
79
+ if (nullptr == this->gpio_) {
80
+ return;
81
+ }
82
+ gpio_pin_configure(this->gpio_, this->pin_ % 32, flags_to_mode(flags, this->inverted_, this->value_));
83
+ }
84
+
85
+ std::string ZephyrGPIOPin::dump_summary() const {
86
+ char buffer[32];
87
+ snprintf(buffer, sizeof(buffer), "GPIO%u, P%u.%u", this->pin_, this->pin_ / 32, this->pin_ % 32);
88
+ return buffer;
89
+ }
90
+
91
+ bool ZephyrGPIOPin::digital_read() {
92
+ if (nullptr == this->gpio_) {
93
+ return false;
94
+ }
95
+ return bool(gpio_pin_get(this->gpio_, this->pin_ % 32) != this->inverted_);
96
+ }
97
+
98
+ void ZephyrGPIOPin::digital_write(bool value) {
99
+ // make sure that value is not ignored since it can be inverted e.g. on switch side
100
+ // that way init state should be correct
101
+ this->value_ = value;
102
+ if (nullptr == this->gpio_) {
103
+ return;
104
+ }
105
+ gpio_pin_set(this->gpio_, this->pin_ % 32, value != this->inverted_ ? 1 : 0);
106
+ }
107
+ void ZephyrGPIOPin::detach_interrupt() const {
108
+ // TODO
109
+ }
110
+
111
+ } // namespace zephyr
112
+
113
+ bool IRAM_ATTR ISRInternalGPIOPin::digital_read() {
114
+ // TODO
115
+ return false;
116
+ }
117
+
118
+ } // namespace esphome
119
+
120
+ #endif
@@ -0,0 +1,38 @@
1
+ #pragma once
2
+
3
+ #ifdef USE_ZEPHYR
4
+ #include "esphome/core/hal.h"
5
+ struct device;
6
+ namespace esphome {
7
+ namespace zephyr {
8
+
9
+ class ZephyrGPIOPin : public InternalGPIOPin {
10
+ public:
11
+ void set_pin(uint8_t pin) { this->pin_ = pin; }
12
+ void set_inverted(bool inverted) { this->inverted_ = inverted; }
13
+ void set_flags(gpio::Flags flags) { this->flags_ = flags; }
14
+
15
+ void setup() override;
16
+ void pin_mode(gpio::Flags flags) override;
17
+ bool digital_read() override;
18
+ void digital_write(bool value) override;
19
+ std::string dump_summary() const override;
20
+ void detach_interrupt() const override;
21
+ ISRInternalGPIOPin to_isr() const override;
22
+ uint8_t get_pin() const override { return this->pin_; }
23
+ bool is_inverted() const override { return this->inverted_; }
24
+ gpio::Flags get_flags() const override { return flags_; }
25
+
26
+ protected:
27
+ void attach_interrupt(void (*func)(void *), void *arg, gpio::InterruptType type) const override;
28
+ uint8_t pin_;
29
+ bool inverted_;
30
+ gpio::Flags flags_;
31
+ const device *gpio_ = nullptr;
32
+ bool value_ = false;
33
+ };
34
+
35
+ } // namespace zephyr
36
+ } // namespace esphome
37
+
38
+ #endif // USE_ZEPHYR
@@ -0,0 +1,4 @@
1
+ Import("env")
2
+
3
+ board_config = env.BoardConfig()
4
+ board_config.update("frameworks", ["arduino", "zephyr"])