esphome 2025.6.2__py3-none-any.whl → 2025.7.0b1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (601) hide show
  1. esphome/__main__.py +1 -3
  2. esphome/codegen.py +2 -0
  3. esphome/components/ac_dimmer/ac_dimmer.cpp +6 -6
  4. esphome/components/adc/__init__.py +25 -1
  5. esphome/components/adc/adc_sensor.h +11 -11
  6. esphome/components/adc/adc_sensor_common.cpp +1 -1
  7. esphome/components/adc/adc_sensor_esp32.cpp +16 -8
  8. esphome/components/ade7880/ade7880.h +0 -2
  9. esphome/components/ads1115/ads1115.h +0 -1
  10. esphome/components/ads1118/ads1118.h +0 -1
  11. esphome/components/ags10/ags10.h +0 -2
  12. esphome/components/aic3204/aic3204.h +0 -1
  13. esphome/components/alarm_control_panel/__init__.py +5 -2
  14. esphome/components/alpha3/alpha3.h +0 -1
  15. esphome/components/am43/cover/am43_cover.h +0 -1
  16. esphome/components/am43/sensor/am43_sensor.h +0 -1
  17. esphome/components/analog_threshold/analog_threshold_binary_sensor.h +0 -2
  18. esphome/components/anova/anova.cpp +5 -1
  19. esphome/components/anova/anova.h +0 -1
  20. esphome/components/apds9960/apds9960.cpp +1 -1
  21. esphome/components/api/__init__.py +42 -20
  22. esphome/components/api/api_connection.cpp +318 -391
  23. esphome/components/api/api_connection.h +206 -126
  24. esphome/components/api/api_frame_helper.cpp +89 -124
  25. esphome/components/api/api_frame_helper.h +57 -45
  26. esphome/components/api/api_pb2.cpp +414 -4350
  27. esphome/components/api/api_pb2.h +287 -198
  28. esphome/components/api/api_pb2_dump.cpp +4333 -0
  29. esphome/components/api/api_pb2_service.cpp +180 -425
  30. esphome/components/api/api_pb2_service.h +7 -6
  31. esphome/components/api/api_pb2_size.h +2 -4
  32. esphome/components/api/api_server.cpp +138 -167
  33. esphome/components/api/api_server.h +66 -12
  34. esphome/components/api/client.py +10 -4
  35. esphome/components/api/list_entities.cpp +36 -105
  36. esphome/components/api/list_entities.h +31 -23
  37. esphome/components/api/proto.h +26 -3
  38. esphome/components/api/subscribe_state.cpp +23 -29
  39. esphome/components/api/subscribe_state.h +26 -19
  40. esphome/components/as5600/as5600.h +0 -1
  41. esphome/components/async_tcp/__init__.py +14 -5
  42. esphome/components/atc_mithermometer/atc_mithermometer.h +0 -1
  43. esphome/components/atm90e32/atm90e32.cpp +2 -1
  44. esphome/components/audio/audio_decoder.cpp +1 -1
  45. esphome/components/audio/audio_transfer_buffer.cpp +2 -2
  46. esphome/components/b_parasite/b_parasite.h +0 -1
  47. esphome/components/bedjet/bedjet_hub.cpp +5 -1
  48. esphome/components/bedjet/climate/bedjet_climate.cpp +5 -1
  49. esphome/components/beken_spi_led_strip/led_strip.cpp +4 -2
  50. esphome/components/bh1750/bh1750.cpp +5 -5
  51. esphome/components/binary_sensor/__init__.py +82 -5
  52. esphome/components/binary_sensor/automation.h +19 -1
  53. esphome/components/binary_sensor/binary_sensor.cpp +12 -30
  54. esphome/components/binary_sensor/binary_sensor.h +11 -25
  55. esphome/components/binary_sensor/filter.cpp +29 -24
  56. esphome/components/binary_sensor/filter.h +20 -10
  57. esphome/components/ble_client/output/ble_binary_output.h +0 -1
  58. esphome/components/ble_client/sensor/ble_rssi_sensor.cpp +5 -1
  59. esphome/components/ble_client/sensor/ble_rssi_sensor.h +0 -1
  60. esphome/components/ble_client/sensor/ble_sensor.cpp +5 -1
  61. esphome/components/ble_client/sensor/ble_sensor.h +0 -1
  62. esphome/components/ble_client/switch/ble_switch.h +0 -1
  63. esphome/components/ble_client/text_sensor/ble_text_sensor.cpp +5 -1
  64. esphome/components/ble_client/text_sensor/ble_text_sensor.h +0 -1
  65. esphome/components/ble_presence/ble_presence_device.h +0 -1
  66. esphome/components/ble_rssi/ble_rssi_sensor.h +0 -1
  67. esphome/components/ble_scanner/ble_scanner.h +0 -1
  68. esphome/components/bluetooth_proxy/bluetooth_connection.h +9 -2
  69. esphome/components/bluetooth_proxy/bluetooth_proxy.cpp +16 -6
  70. esphome/components/bluetooth_proxy/bluetooth_proxy.h +8 -2
  71. esphome/components/bme680/sensor.py +1 -1
  72. esphome/components/bmp581/bmp581.h +0 -2
  73. esphome/components/button/__init__.py +5 -2
  74. esphome/components/camera/__init__.py +1 -0
  75. esphome/components/camera/camera.cpp +22 -0
  76. esphome/components/camera/camera.h +80 -0
  77. esphome/components/canbus/__init__.py +1 -0
  78. esphome/components/cap1188/cap1188.h +0 -1
  79. esphome/components/captive_portal/__init__.py +12 -2
  80. esphome/components/captive_portal/captive_portal.cpp +12 -2
  81. esphome/components/captive_portal/captive_portal.h +5 -2
  82. esphome/components/ccs811/ccs811.h +0 -2
  83. esphome/components/climate/__init__.py +5 -2
  84. esphome/components/cm1106/sensor.py +2 -2
  85. esphome/components/const/__init__.py +2 -0
  86. esphome/components/copy/binary_sensor/copy_binary_sensor.h +0 -1
  87. esphome/components/copy/button/copy_button.h +0 -1
  88. esphome/components/copy/cover/copy_cover.h +0 -1
  89. esphome/components/copy/fan/copy_fan.h +0 -1
  90. esphome/components/copy/lock/copy_lock.h +0 -1
  91. esphome/components/copy/number/copy_number.h +0 -1
  92. esphome/components/copy/select/copy_select.h +0 -1
  93. esphome/components/copy/sensor/copy_sensor.h +0 -1
  94. esphome/components/copy/switch/copy_switch.h +0 -1
  95. esphome/components/copy/text/copy_text.h +0 -1
  96. esphome/components/copy/text_sensor/copy_text_sensor.h +0 -1
  97. esphome/components/cover/__init__.py +5 -2
  98. esphome/components/cs5460a/cs5460a.h +0 -1
  99. esphome/components/datetime/__init__.py +4 -2
  100. esphome/components/debug/__init__.py +20 -0
  101. esphome/components/deep_sleep/__init__.py +43 -9
  102. esphome/components/demo/__init__.py +2 -2
  103. esphome/components/display/display.cpp +4 -3
  104. esphome/components/display/display.h +0 -2
  105. esphome/components/display/display_buffer.cpp +1 -1
  106. esphome/components/ds2484/__init__.py +1 -0
  107. esphome/components/ds2484/ds2484.cpp +209 -0
  108. esphome/components/ds2484/ds2484.h +43 -0
  109. esphome/components/ds2484/one_wire.py +37 -0
  110. esphome/components/duty_time/duty_time_sensor.h +0 -1
  111. esphome/components/ens160_base/ens160_base.h +0 -1
  112. esphome/components/es7210/es7210.h +0 -1
  113. esphome/components/es7243e/es7243e.h +0 -1
  114. esphome/components/es8156/es8156.h +0 -1
  115. esphome/components/es8311/es8311.h +0 -1
  116. esphome/components/es8388/es8388.h +0 -1
  117. esphome/components/esp32/__init__.py +102 -135
  118. esphome/components/esp32/core.cpp +0 -4
  119. esphome/components/esp32/gpio.h +1 -1
  120. esphome/components/esp32/helpers.cpp +69 -0
  121. esphome/components/esp32_ble/ble.cpp +5 -6
  122. esphome/components/esp32_ble/ble.h +29 -14
  123. esphome/components/esp32_ble/ble_event.h +6 -6
  124. esphome/components/esp32_ble_client/ble_client_base.cpp +21 -6
  125. esphome/components/esp32_ble_client/ble_client_base.h +24 -9
  126. esphome/components/esp32_ble_tracker/__init__.py +2 -8
  127. esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +5 -5
  128. esphome/components/esp32_ble_tracker/esp32_ble_tracker.h +11 -7
  129. esphome/components/esp32_camera/__init__.py +111 -97
  130. esphome/components/esp32_camera/esp32_camera.cpp +41 -31
  131. esphome/components/esp32_camera/esp32_camera.h +35 -30
  132. esphome/components/esp32_camera_web_server/__init__.py +2 -1
  133. esphome/components/esp32_camera_web_server/camera_web_server.cpp +8 -8
  134. esphome/components/esp32_camera_web_server/camera_web_server.h +3 -3
  135. esphome/components/esp32_hall/sensor.py +2 -21
  136. esphome/components/esp32_hosted/__init__.py +101 -0
  137. esphome/components/esp32_hosted/esp32_hosted.py.script +12 -0
  138. esphome/components/esp32_improv/esp32_improv_component.cpp +3 -0
  139. esphome/components/esp32_rmt/__init__.py +0 -58
  140. esphome/components/esp32_rmt_led_strip/led_strip.cpp +77 -63
  141. esphome/components/esp32_rmt_led_strip/led_strip.h +11 -17
  142. esphome/components/esp32_rmt_led_strip/light.py +14 -76
  143. esphome/components/esp32_touch/esp32_touch.h +174 -28
  144. esphome/components/esp32_touch/esp32_touch_common.cpp +162 -0
  145. esphome/components/esp32_touch/esp32_touch_v1.cpp +238 -0
  146. esphome/components/esp32_touch/esp32_touch_v2.cpp +397 -0
  147. esphome/components/esp8266/__init__.py +1 -0
  148. esphome/components/esp8266/gpio.cpp +10 -10
  149. esphome/components/esp8266/helpers.cpp +31 -0
  150. esphome/components/esphome/ota/__init__.py +1 -0
  151. esphome/components/esphome/ota/ota_esphome.cpp +24 -19
  152. esphome/components/ethernet/__init__.py +42 -23
  153. esphome/components/ethernet/esp_eth_phy_jl1101.c +0 -16
  154. esphome/components/ethernet/ethernet_component.cpp +69 -29
  155. esphome/components/ethernet/ethernet_component.h +18 -10
  156. esphome/components/event/__init__.py +5 -2
  157. esphome/components/ezo/ezo.h +0 -1
  158. esphome/components/ezo_pmp/ezo_pmp.h +0 -1
  159. esphome/components/fan/__init__.py +5 -2
  160. esphome/components/feedback/feedback_cover.h +0 -1
  161. esphome/components/font/__init__.py +92 -82
  162. esphome/components/font/font.cpp +9 -2
  163. esphome/components/font/font.h +20 -5
  164. esphome/components/fs3000/fs3000.h +0 -1
  165. esphome/components/gcja5/gcja5.h +0 -1
  166. esphome/components/gl_r01_i2c/__init__.py +0 -0
  167. esphome/components/gl_r01_i2c/gl_r01_i2c.cpp +68 -0
  168. esphome/components/gl_r01_i2c/gl_r01_i2c.h +22 -0
  169. esphome/components/gl_r01_i2c/sensor.py +36 -0
  170. esphome/components/gp8403/gp8403.h +0 -1
  171. esphome/components/gpio/binary_sensor/__init__.py +17 -0
  172. esphome/components/gpio/binary_sensor/gpio_binary_sensor.cpp +77 -3
  173. esphome/components/gpio/binary_sensor/gpio_binary_sensor.h +40 -0
  174. esphome/components/grove_gas_mc_v2/grove_gas_mc_v2.h +0 -2
  175. esphome/components/he60r/he60r.h +0 -1
  176. esphome/components/heatpumpir/climate.py +2 -1
  177. esphome/components/heatpumpir/heatpumpir.cpp +1 -0
  178. esphome/components/heatpumpir/heatpumpir.h +1 -0
  179. esphome/components/honeywellabp2_i2c/honeywellabp2.h +0 -1
  180. esphome/components/host/__init__.py +2 -1
  181. esphome/components/host/helpers.cpp +57 -0
  182. esphome/components/http_request/__init__.py +19 -1
  183. esphome/components/http_request/http_request.h +1 -1
  184. esphome/components/http_request/http_request_arduino.cpp +0 -1
  185. esphome/components/http_request/http_request_arduino.h +1 -0
  186. esphome/components/http_request/http_request_idf.cpp +0 -1
  187. esphome/components/http_request/ota/ota_http_request.cpp +1 -1
  188. esphome/components/http_request/update/http_request_update.cpp +28 -9
  189. esphome/components/hydreon_rgxx/hydreon_rgxx.cpp +3 -9
  190. esphome/components/hydreon_rgxx/sensor.py +1 -1
  191. esphome/components/i2c/__init__.py +23 -11
  192. esphome/components/i2c/i2c_bus.h +8 -1
  193. esphome/components/i2c/i2c_bus_arduino.cpp +4 -3
  194. esphome/components/i2c/i2c_bus_arduino.h +6 -3
  195. esphome/components/i2c/i2c_bus_esp_idf.h +5 -3
  196. esphome/components/i2c_device/i2c_device.h +0 -1
  197. esphome/components/i2s_audio/__init__.py +2 -10
  198. esphome/components/i2s_audio/i2s_audio.cpp +1 -5
  199. esphome/components/i2s_audio/media_player/__init__.py +2 -2
  200. esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +2 -2
  201. esphome/components/iaqcore/iaqcore.h +0 -2
  202. esphome/components/image/__init__.py +123 -24
  203. esphome/components/improv_serial/improv_serial_component.cpp +0 -4
  204. esphome/components/ina219/ina219.cpp +7 -0
  205. esphome/components/ina219/ina219.h +1 -0
  206. esphome/components/ina260/ina260.h +0 -2
  207. esphome/components/inkbird_ibsth1_mini/inkbird_ibsth1_mini.h +0 -1
  208. esphome/components/inkplate6/display.py +15 -0
  209. esphome/components/inkplate6/inkplate.cpp +2 -2
  210. esphome/components/integration/integration_sensor.h +0 -1
  211. esphome/components/internal_temperature/internal_temperature.cpp +8 -27
  212. esphome/components/internal_temperature/sensor.py +0 -26
  213. esphome/components/interval/interval.h +0 -2
  214. esphome/components/ld2410/button/__init__.py +3 -3
  215. esphome/components/ld2410/button/factory_reset_button.cpp +9 -0
  216. esphome/components/ld2410/button/{reset_button.h → factory_reset_button.h} +2 -2
  217. esphome/components/ld2410/ld2410.cpp +430 -261
  218. esphome/components/ld2410/ld2410.h +44 -146
  219. esphome/components/ld2410/number/__init__.py +2 -2
  220. esphome/components/ld2410/sensor.py +1 -1
  221. esphome/components/ld2410/switch/__init__.py +1 -1
  222. esphome/components/ld2420/ld2420.cpp +196 -100
  223. esphome/components/ld2420/ld2420.h +46 -118
  224. esphome/components/ld2420/number/__init__.py +2 -2
  225. esphome/components/ld2420/sensor/__init__.py +6 -2
  226. esphome/components/ld2420/sensor/ld2420_sensor.h +1 -1
  227. esphome/components/ld2450/button/__init__.py +3 -3
  228. esphome/components/ld2450/button/factory_reset_button.cpp +9 -0
  229. esphome/components/ld2450/button/{reset_button.h → factory_reset_button.h} +2 -2
  230. esphome/components/ld2450/ld2450.cpp +384 -232
  231. esphome/components/ld2450/ld2450.h +60 -69
  232. esphome/components/ld2450/switch/__init__.py +1 -1
  233. esphome/components/ledc/ledc_output.cpp +1 -63
  234. esphome/components/libretiny/__init__.py +4 -3
  235. esphome/components/libretiny/const.py +5 -0
  236. esphome/components/libretiny/generate_components.py +1 -0
  237. esphome/components/libretiny/helpers.cpp +35 -0
  238. esphome/components/libretiny/lt_component.cpp +5 -3
  239. esphome/components/light/__init__.py +4 -2
  240. esphome/components/light/addressable_light.h +3 -3
  241. esphome/components/light/light_call.cpp +180 -243
  242. esphome/components/light/light_call.h +72 -20
  243. esphome/components/light/light_color_values.h +14 -14
  244. esphome/components/light/light_state.h +15 -13
  245. esphome/components/light/transformers.h +2 -2
  246. esphome/components/ln882x/__init__.py +52 -0
  247. esphome/components/ln882x/boards.py +285 -0
  248. esphome/components/lock/__init__.py +5 -2
  249. esphome/components/logger/__init__.py +40 -3
  250. esphome/components/logger/logger.cpp +47 -12
  251. esphome/components/logger/logger.h +80 -49
  252. esphome/components/logger/logger_esp32.cpp +3 -3
  253. esphome/components/lps22/__init__.py +0 -0
  254. esphome/components/lps22/lps22.cpp +75 -0
  255. esphome/components/lps22/lps22.h +27 -0
  256. esphome/components/lps22/sensor.py +58 -0
  257. esphome/components/ltr390/ltr390.h +0 -1
  258. esphome/components/ltr501/ltr501.h +0 -1
  259. esphome/components/ltr_als_ps/ltr_als_ps.h +0 -1
  260. esphome/components/lvgl/__init__.py +1 -1
  261. esphome/components/lvgl/schemas.py +66 -6
  262. esphome/components/lvgl/styles.py +24 -16
  263. esphome/components/lvgl/widgets/__init__.py +12 -2
  264. esphome/components/lvgl/widgets/lv_bar.py +40 -19
  265. esphome/components/m5stack_8angle/light/m5stack_8angle_light.cpp +1 -1
  266. esphome/components/max9611/max9611.h +0 -1
  267. esphome/components/mcp23016/__init__.py +1 -1
  268. esphome/components/mcp23xxx_base/__init__.py +1 -1
  269. esphome/components/mcp4461/__init__.py +1 -1
  270. esphome/components/mcp4461/output/__init__.py +3 -2
  271. esphome/components/mcp9600/mcp9600.h +0 -2
  272. esphome/components/md5/md5.cpp +3 -3
  273. esphome/components/md5/md5.h +1 -6
  274. esphome/components/mdns/__init__.py +22 -11
  275. esphome/components/media_player/__init__.py +4 -3
  276. esphome/components/micro_wake_word/__init__.py +1 -5
  277. esphome/components/micro_wake_word/streaming_model.cpp +2 -2
  278. esphome/components/microphone/microphone.cpp +7 -9
  279. esphome/components/microphone/microphone.h +0 -2
  280. esphome/components/mipi_spi/display.py +1 -0
  281. esphome/components/mmc5603/mmc5603.cpp +1 -1
  282. esphome/components/modbus/modbus.cpp +33 -15
  283. esphome/components/modbus/modbus.h +9 -0
  284. esphome/components/modbus_controller/__init__.py +42 -10
  285. esphome/components/modbus_controller/modbus_controller.cpp +92 -11
  286. esphome/components/modbus_controller/modbus_controller.h +61 -7
  287. esphome/components/mopeka_pro_check/mopeka_pro_check.h +0 -1
  288. esphome/components/mopeka_std_check/mopeka_std_check.h +0 -1
  289. esphome/components/mpl3115a2/mpl3115a2.h +0 -2
  290. esphome/components/mqtt/__init__.py +16 -0
  291. esphome/components/mqtt/mqtt_backend.h +2 -1
  292. esphome/components/mqtt/mqtt_backend_esp32.cpp +126 -45
  293. esphome/components/mqtt/mqtt_backend_esp32.h +106 -4
  294. esphome/components/mqtt/mqtt_client.cpp +15 -9
  295. esphome/components/mqtt/mqtt_client.h +8 -3
  296. esphome/components/ms8607/ms8607.h +0 -1
  297. esphome/components/neopixelbus/light.py +4 -1
  298. esphome/components/neopixelbus/neopixelbus_light.h +1 -1
  299. esphome/components/network/__init__.py +4 -1
  300. esphome/components/network/ip_address.h +1 -0
  301. esphome/components/nextion/__init__.py +16 -0
  302. esphome/components/nextion/base_component.py +1 -0
  303. esphome/components/nextion/binary_sensor/nextion_binarysensor.cpp +1 -1
  304. esphome/components/nextion/display.py +14 -4
  305. esphome/components/nextion/nextion.cpp +166 -101
  306. esphome/components/nextion/nextion.h +84 -53
  307. esphome/components/nextion/nextion_commands.cpp +11 -10
  308. esphome/components/nextion/nextion_component.cpp +28 -28
  309. esphome/components/nextion/nextion_component.h +53 -18
  310. esphome/components/nextion/nextion_component_base.h +3 -0
  311. esphome/components/nextion/nextion_upload.cpp +36 -0
  312. esphome/components/nextion/nextion_upload_arduino.cpp +10 -35
  313. esphome/components/nextion/nextion_upload_idf.cpp +9 -33
  314. esphome/components/nextion/sensor/nextion_sensor.cpp +1 -1
  315. esphome/components/nextion/switch/nextion_switch.cpp +1 -1
  316. esphome/components/nextion/text_sensor/nextion_textsensor.cpp +1 -1
  317. esphome/components/nfc/nfc.cpp +3 -22
  318. esphome/components/nfc/nfc.h +3 -3
  319. esphome/components/number/__init__.py +5 -2
  320. esphome/components/online_image/__init__.py +5 -0
  321. esphome/components/online_image/online_image.cpp +6 -2
  322. esphome/components/online_image/online_image.h +4 -1
  323. esphome/components/opentherm/opentherm.cpp +7 -12
  324. esphome/components/openthread/__init__.py +47 -40
  325. esphome/components/openthread/const.py +1 -0
  326. esphome/components/openthread/openthread_esp.cpp +27 -5
  327. esphome/components/opt3001/__init__.py +0 -0
  328. esphome/components/opt3001/opt3001.cpp +122 -0
  329. esphome/components/opt3001/opt3001.h +27 -0
  330. esphome/components/opt3001/sensor.py +35 -0
  331. esphome/components/ota/__init__.py +17 -0
  332. esphome/components/ota/ota_backend.h +27 -1
  333. esphome/components/ota/ota_backend_arduino_esp32.cpp +12 -2
  334. esphome/components/ota/ota_backend_arduino_esp32.h +3 -0
  335. esphome/components/ota/ota_backend_arduino_esp8266.cpp +18 -4
  336. esphome/components/ota/ota_backend_arduino_esp8266.h +3 -0
  337. esphome/components/ota/ota_backend_arduino_libretiny.cpp +12 -2
  338. esphome/components/ota/ota_backend_arduino_libretiny.h +3 -0
  339. esphome/components/ota/ota_backend_arduino_rp2040.cpp +9 -2
  340. esphome/components/ota/ota_backend_arduino_rp2040.h +3 -0
  341. esphome/components/ota/ota_backend_esp_idf.cpp +10 -16
  342. esphome/components/ota/ota_backend_esp_idf.h +1 -0
  343. esphome/components/packages/__init__.py +5 -2
  344. esphome/components/packet_transport/binary_sensor.py +61 -4
  345. esphome/components/packet_transport/packet_transport.cpp +31 -1
  346. esphome/components/packet_transport/packet_transport.h +11 -5
  347. esphome/components/pcf8574/__init__.py +1 -1
  348. esphome/components/pi4ioe5v6408/__init__.py +84 -0
  349. esphome/components/pi4ioe5v6408/pi4ioe5v6408.cpp +171 -0
  350. esphome/components/pi4ioe5v6408/pi4ioe5v6408.h +70 -0
  351. esphome/components/pmsa003i/pmsa003i.h +0 -1
  352. esphome/components/pmsx003/pmsx003.h +0 -1
  353. esphome/components/pn7150/pn7150.cpp +7 -7
  354. esphome/components/pn7150/pn7150.h +0 -1
  355. esphome/components/pn7160/pn7160.cpp +7 -7
  356. esphome/components/pn7160/pn7160.h +0 -1
  357. esphome/components/preferences/syncer.h +2 -0
  358. esphome/components/prometheus/prometheus_handler.h +1 -1
  359. esphome/components/psram/psram.cpp +0 -20
  360. esphome/components/pulse_counter/pulse_counter_sensor.h +0 -1
  361. esphome/components/pulse_meter/pulse_meter_sensor.cpp +8 -4
  362. esphome/components/pulse_width/pulse_width.h +0 -1
  363. esphome/components/pvvx_mithermometer/display/pvvx_display.cpp +0 -4
  364. esphome/components/pvvx_mithermometer/display/pvvx_display.h +0 -2
  365. esphome/components/pvvx_mithermometer/pvvx_mithermometer.h +0 -1
  366. esphome/components/qr_code/__init__.py +13 -10
  367. esphome/components/qwiic_pir/qwiic_pir.h +0 -1
  368. esphome/components/radon_eye_ble/radon_eye_listener.cpp +1 -1
  369. esphome/components/rc522/rc522.h +0 -1
  370. esphome/components/rdm6300/rdm6300.h +0 -2
  371. esphome/components/remote_base/__init__.py +7 -5
  372. esphome/components/remote_base/remote_base.cpp +24 -21
  373. esphome/components/remote_base/remote_base.h +3 -26
  374. esphome/components/remote_receiver/__init__.py +40 -46
  375. esphome/components/remote_receiver/remote_receiver.h +4 -18
  376. esphome/components/remote_receiver/remote_receiver_esp32.cpp +0 -87
  377. esphome/components/remote_receiver/remote_receiver_esp8266.cpp +1 -1
  378. esphome/components/remote_transmitter/__init__.py +42 -43
  379. esphome/components/remote_transmitter/remote_transmitter.h +2 -14
  380. esphome/components/remote_transmitter/remote_transmitter_esp32.cpp +0 -77
  381. esphome/components/resistance/resistance_sensor.h +0 -1
  382. esphome/components/rp2040/__init__.py +1 -0
  383. esphome/components/rp2040/helpers.cpp +55 -0
  384. esphome/components/rp2040_pio_led_strip/led_strip.cpp +2 -2
  385. esphome/components/rpi_dpi_rgb/rpi_dpi_rgb.cpp +0 -4
  386. esphome/components/rtttl/__init__.py +4 -4
  387. esphome/components/rtttl/rtttl.cpp +10 -1
  388. esphome/components/ruuvitag/ruuvitag.h +0 -1
  389. esphome/components/safe_mode/safe_mode.cpp +2 -0
  390. esphome/components/safe_mode/safe_mode.h +4 -1
  391. esphome/components/scd30/scd30.h +0 -1
  392. esphome/components/scd30/sensor.py +2 -2
  393. esphome/components/scd4x/scd4x.cpp +61 -54
  394. esphome/components/scd4x/scd4x.h +17 -15
  395. esphome/components/scd4x/sensor.py +4 -4
  396. esphome/components/script/script.h +0 -2
  397. esphome/components/sdp3x/sensor.py +1 -1
  398. esphome/components/select/__init__.py +5 -2
  399. esphome/components/sen5x/sen5x.h +0 -1
  400. esphome/components/senseair/senseair.h +0 -1
  401. esphome/components/sensor/__init__.py +4 -2
  402. esphome/components/sensor/filter.cpp +1 -1
  403. esphome/components/sensor/sensor.cpp +12 -6
  404. esphome/components/sensor/sensor.h +13 -5
  405. esphome/components/servo/servo.h +0 -1
  406. esphome/components/sfa30/sfa30.h +0 -1
  407. esphome/components/sgp30/sgp30.h +0 -1
  408. esphome/components/sgp4x/sgp4x.h +0 -1
  409. esphome/components/shelly_dimmer/stm32flash.cpp +1 -2
  410. esphome/components/sht4x/sht4x.h +0 -1
  411. esphome/components/sm300d2/sm300d2.h +0 -2
  412. esphome/components/smt100/sensor.py +8 -4
  413. esphome/components/smt100/smt100.cpp +5 -5
  414. esphome/components/smt100/smt100.h +3 -3
  415. esphome/components/sn74hc595/__init__.py +1 -1
  416. esphome/components/sn74hc595/sn74hc595.cpp +5 -4
  417. esphome/components/sntp/sntp_component.cpp +9 -3
  418. esphome/components/sntp/time.py +2 -0
  419. esphome/components/socket/__init__.py +17 -0
  420. esphome/components/spi/__init__.py +27 -6
  421. esphome/components/spi/spi.cpp +3 -2
  422. esphome/components/spi/spi.h +9 -3
  423. esphome/components/spi/spi_arduino.cpp +3 -5
  424. esphome/components/spi/spi_esp_idf.cpp +40 -21
  425. esphome/components/spi_led_strip/spi_led_strip.cpp +1 -1
  426. esphome/components/sps30/sps30.h +0 -1
  427. esphome/components/ssd1306_base/ssd1306_base.cpp +1 -1
  428. esphome/components/st7701s/st7701s.cpp +0 -4
  429. esphome/components/status/status_binary_sensor.h +0 -2
  430. esphome/components/substitutions/__init__.py +76 -19
  431. esphome/components/substitutions/jinja.py +99 -0
  432. esphome/components/sun/sun.cpp +3 -4
  433. esphome/components/switch/__init__.py +5 -2
  434. esphome/components/switch/binary_sensor/switch_binary_sensor.h +0 -1
  435. esphome/components/sx126x/__init__.py +317 -0
  436. esphome/components/sx126x/automation.h +62 -0
  437. esphome/components/sx126x/packet_transport/__init__.py +26 -0
  438. esphome/components/sx126x/packet_transport/sx126x_transport.cpp +26 -0
  439. esphome/components/sx126x/packet_transport/sx126x_transport.h +25 -0
  440. esphome/components/sx126x/sx126x.cpp +523 -0
  441. esphome/components/sx126x/sx126x.h +140 -0
  442. esphome/components/sx126x/sx126x_reg.h +163 -0
  443. esphome/components/sx127x/__init__.py +325 -0
  444. esphome/components/sx127x/automation.h +62 -0
  445. esphome/components/sx127x/packet_transport/__init__.py +26 -0
  446. esphome/components/sx127x/packet_transport/sx127x_transport.cpp +26 -0
  447. esphome/components/sx127x/packet_transport/sx127x_transport.h +25 -0
  448. esphome/components/sx127x/sx127x.cpp +498 -0
  449. esphome/components/sx127x/sx127x.h +128 -0
  450. esphome/components/sx127x/sx127x_reg.h +295 -0
  451. esphome/components/syslog/esphome_syslog.cpp +5 -3
  452. esphome/components/syslog/esphome_syslog.h +1 -1
  453. esphome/components/tca9555/__init__.py +1 -1
  454. esphome/components/template/binary_sensor/template_binary_sensor.cpp +1 -9
  455. esphome/components/text/__init__.py +5 -2
  456. esphome/components/text_sensor/__init__.py +5 -2
  457. esphome/components/thermostat/thermostat_climate.cpp +34 -31
  458. esphome/components/thermostat/thermostat_climate.h +43 -39
  459. esphome/components/time/__init__.py +16 -2
  460. esphome/components/time/real_time_clock.cpp +4 -0
  461. esphome/components/time/real_time_clock.h +5 -1
  462. esphome/components/tlc5971/tlc5971.cpp +4 -1
  463. esphome/components/tmp1075/tmp1075.h +0 -2
  464. esphome/components/tof10120/tof10120_sensor.h +0 -1
  465. esphome/components/tormatic/tormatic_cover.h +0 -1
  466. esphome/components/total_daily_energy/total_daily_energy.h +0 -1
  467. esphome/components/tsl2591/tsl2591.cpp +1 -1
  468. esphome/components/ttp229_bsf/ttp229_bsf.h +0 -1
  469. esphome/components/ttp229_lsf/ttp229_lsf.h +0 -1
  470. esphome/components/tx20/tx20.cpp +2 -2
  471. esphome/components/uart/__init__.py +18 -0
  472. esphome/components/uart/uart_component_esp_idf.cpp +1 -5
  473. esphome/components/update/__init__.py +5 -2
  474. esphome/components/update/update_entity.h +8 -0
  475. esphome/components/usb_host/__init__.py +5 -2
  476. esphome/components/valve/__init__.py +5 -2
  477. esphome/components/vbus/vbus.h +0 -1
  478. esphome/components/veml3235/veml3235.h +0 -1
  479. esphome/components/veml7700/veml7700.h +0 -1
  480. esphome/components/vl53l0x/vl53l0x_sensor.h +0 -1
  481. esphome/components/voice_assistant/voice_assistant.cpp +4 -4
  482. esphome/components/watchdog/watchdog.cpp +0 -4
  483. esphome/components/waveshare_epaper/waveshare_epaper.cpp +6 -6
  484. esphome/components/web_server/__init__.py +34 -19
  485. esphome/components/web_server/ota/__init__.py +32 -0
  486. esphome/components/web_server/ota/ota_web_server.cpp +210 -0
  487. esphome/components/web_server/ota/ota_web_server.h +26 -0
  488. esphome/components/web_server/web_server.cpp +311 -430
  489. esphome/components/web_server/web_server.h +33 -23
  490. esphome/components/web_server/web_server_v1.cpp +4 -5
  491. esphome/components/web_server_base/__init__.py +5 -2
  492. esphome/components/web_server_base/web_server_base.cpp +2 -94
  493. esphome/components/web_server_base/web_server_base.h +5 -25
  494. esphome/components/web_server_idf/multipart.cpp +254 -0
  495. esphome/components/web_server_idf/multipart.h +86 -0
  496. esphome/components/web_server_idf/utils.cpp +32 -0
  497. esphome/components/web_server_idf/utils.h +10 -0
  498. esphome/components/web_server_idf/web_server_idf.cpp +162 -16
  499. esphome/components/web_server_idf/web_server_idf.h +11 -10
  500. esphome/components/wiegand/wiegand.cpp +2 -2
  501. esphome/components/wifi/__init__.py +18 -0
  502. esphome/components/wifi/wifi_component.cpp +17 -22
  503. esphome/components/wifi/wifi_component.h +27 -23
  504. esphome/components/wifi/wifi_component_esp32_arduino.cpp +52 -59
  505. esphome/components/wifi/wifi_component_esp8266.cpp +46 -46
  506. esphome/components/wifi/wifi_component_esp_idf.cpp +35 -36
  507. esphome/components/wifi/wifi_component_libretiny.cpp +26 -27
  508. esphome/components/wifi/wifi_component_pico_w.cpp +3 -3
  509. esphome/components/wifi_info/wifi_info_text_sensor.cpp +6 -6
  510. esphome/components/wireguard/__init__.py +2 -11
  511. esphome/components/xiaomi_ble/xiaomi_ble.cpp +13 -1
  512. esphome/components/xiaomi_ble/xiaomi_ble.h +1 -0
  513. esphome/components/xiaomi_cgd1/xiaomi_cgd1.h +0 -1
  514. esphome/components/xiaomi_cgdk2/xiaomi_cgdk2.h +0 -1
  515. esphome/components/xiaomi_cgg1/xiaomi_cgg1.h +0 -1
  516. esphome/components/xiaomi_cgpr1/xiaomi_cgpr1.h +0 -1
  517. esphome/components/xiaomi_gcls002/xiaomi_gcls002.h +0 -1
  518. esphome/components/xiaomi_hhccjcy01/xiaomi_hhccjcy01.h +0 -1
  519. esphome/components/xiaomi_hhccjcy10/xiaomi_hhccjcy10.h +0 -1
  520. esphome/components/xiaomi_hhccpot002/xiaomi_hhccpot002.h +0 -1
  521. esphome/components/xiaomi_jqjcy01ym/xiaomi_jqjcy01ym.h +0 -1
  522. esphome/components/xiaomi_lywsd02/xiaomi_lywsd02.h +0 -1
  523. esphome/components/xiaomi_lywsd02mmc/xiaomi_lywsd02mmc.h +0 -1
  524. esphome/components/xiaomi_lywsd03mmc/xiaomi_lywsd03mmc.h +0 -1
  525. esphome/components/xiaomi_lywsdcgq/xiaomi_lywsdcgq.h +0 -1
  526. esphome/components/xiaomi_mhoc303/xiaomi_mhoc303.h +0 -1
  527. esphome/components/xiaomi_mhoc401/xiaomi_mhoc401.h +0 -1
  528. esphome/components/xiaomi_miscale/xiaomi_miscale.h +0 -1
  529. esphome/components/xiaomi_mjyd02yla/xiaomi_mjyd02yla.h +0 -1
  530. esphome/components/xiaomi_mue4094rt/xiaomi_mue4094rt.h +0 -1
  531. esphome/components/xiaomi_rtcgq02lm/xiaomi_rtcgq02lm.h +0 -1
  532. esphome/components/xiaomi_wx08zm/xiaomi_wx08zm.h +0 -1
  533. esphome/components/xiaomi_xmwsdj04mmc/__init__.py +0 -0
  534. esphome/components/xiaomi_xmwsdj04mmc/sensor.py +77 -0
  535. esphome/components/xiaomi_xmwsdj04mmc/xiaomi_xmwsdj04mmc.cpp +77 -0
  536. esphome/components/xiaomi_xmwsdj04mmc/xiaomi_xmwsdj04mmc.h +36 -0
  537. esphome/components/zio_ultrasonic/zio_ultrasonic.h +0 -2
  538. esphome/components/zyaura/zyaura.h +0 -1
  539. esphome/config.py +88 -22
  540. esphome/config_helpers.py +74 -1
  541. esphome/config_validation.py +12 -1
  542. esphome/const.py +65 -10
  543. esphome/core/__init__.py +18 -2
  544. esphome/core/application.cpp +163 -10
  545. esphome/core/application.h +145 -165
  546. esphome/core/area.h +19 -0
  547. esphome/core/automation.h +58 -9
  548. esphome/core/color.cpp +3 -5
  549. esphome/core/color.h +16 -16
  550. esphome/core/component.cpp +151 -18
  551. esphome/core/component.h +98 -4
  552. esphome/core/component_iterator.cpp +7 -7
  553. esphome/core/component_iterator.h +9 -7
  554. esphome/core/config.py +155 -6
  555. esphome/core/controller.cpp +4 -2
  556. esphome/core/controller.h +1 -1
  557. esphome/core/datatypes.h +2 -2
  558. esphome/core/defines.h +17 -2
  559. esphome/core/device.h +20 -0
  560. esphome/core/entity_base.cpp +20 -15
  561. esphome/core/entity_base.h +76 -0
  562. esphome/core/entity_helpers.py +162 -1
  563. esphome/core/event_pool.h +81 -0
  564. esphome/core/helpers.cpp +75 -230
  565. esphome/core/helpers.h +164 -104
  566. esphome/core/lock_free_queue.h +151 -0
  567. esphome/core/log.cpp +2 -2
  568. esphome/core/log.h +2 -0
  569. esphome/core/optional.h +5 -0
  570. esphome/core/ring_buffer.cpp +2 -2
  571. esphome/core/scheduler.cpp +278 -103
  572. esphome/core/scheduler.h +157 -17
  573. esphome/core/time.cpp +5 -5
  574. esphome/core/time.h +5 -5
  575. esphome/cpp_generator.py +17 -0
  576. esphome/cpp_helpers.py +0 -22
  577. esphome/cpp_types.py +3 -1
  578. esphome/dashboard/entries.py +1 -1
  579. esphome/dashboard/util/text.py +5 -21
  580. esphome/dashboard/web_server.py +9 -1
  581. esphome/helpers.py +47 -0
  582. esphome/loader.py +15 -1
  583. esphome/pins.py +14 -8
  584. esphome/wizard.py +16 -3
  585. esphome/writer.py +21 -3
  586. esphome/yaml_util.py +0 -2
  587. {esphome-2025.6.2.dist-info → esphome-2025.7.0b1.dist-info}/METADATA +10 -9
  588. {esphome-2025.6.2.dist-info → esphome-2025.7.0b1.dist-info}/RECORD +593 -533
  589. esphome/components/esp32_ble/ble_event_pool.h +0 -72
  590. esphome/components/esp32_ble/queue.h +0 -85
  591. esphome/components/esp32_hall/esp32_hall.cpp +0 -25
  592. esphome/components/esp32_hall/esp32_hall.h +0 -23
  593. esphome/components/esp32_touch/esp32_touch.cpp +0 -355
  594. esphome/components/ld2410/button/reset_button.cpp +0 -9
  595. esphome/components/ld2450/button/reset_button.cpp +0 -9
  596. esphome/components/openthread/tlv.py +0 -65
  597. /esphome/{dashboard/enum.py → enum.py} +0 -0
  598. {esphome-2025.6.2.dist-info → esphome-2025.7.0b1.dist-info}/WHEEL +0 -0
  599. {esphome-2025.6.2.dist-info → esphome-2025.7.0b1.dist-info}/entry_points.txt +0 -0
  600. {esphome-2025.6.2.dist-info → esphome-2025.7.0b1.dist-info}/licenses/LICENSE +0 -0
  601. {esphome-2025.6.2.dist-info → esphome-2025.7.0b1.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,99 @@
1
+ import logging
2
+ import math
3
+ import re
4
+ import jinja2 as jinja
5
+ from jinja2.nativetypes import NativeEnvironment
6
+
7
+ TemplateError = jinja.TemplateError
8
+ TemplateSyntaxError = jinja.TemplateSyntaxError
9
+ TemplateRuntimeError = jinja.TemplateRuntimeError
10
+ UndefinedError = jinja.UndefinedError
11
+ Undefined = jinja.Undefined
12
+
13
+ _LOGGER = logging.getLogger(__name__)
14
+
15
+ DETECT_JINJA = r"(\$\{)"
16
+ detect_jinja_re = re.compile(
17
+ r"<%.+?%>" # Block form expression: <% ... %>
18
+ r"|\$\{[^}]+\}", # Braced form expression: ${ ... }
19
+ flags=re.MULTILINE,
20
+ )
21
+
22
+
23
+ def has_jinja(st):
24
+ return detect_jinja_re.search(st) is not None
25
+
26
+
27
+ class JinjaStr(str):
28
+ """
29
+ Wraps a string containing an unresolved Jinja expression,
30
+ storing the variables visible to it when it failed to resolve.
31
+ For example, an expression inside a package, `${ A * B }` may fail
32
+ to resolve at package parsing time if `A` is a local package var
33
+ but `B` is a substitution defined in the root yaml.
34
+ Therefore, we store the value of `A` as an upvalue bound
35
+ to the original string so we may be able to resolve `${ A * B }`
36
+ later in the main substitutions pass.
37
+ """
38
+
39
+ def __new__(cls, value: str, upvalues=None):
40
+ obj = super().__new__(cls, value)
41
+ obj.upvalues = upvalues or {}
42
+ return obj
43
+
44
+ def __init__(self, value: str, upvalues=None):
45
+ self.upvalues = upvalues or {}
46
+
47
+
48
+ class Jinja:
49
+ """
50
+ Wraps a Jinja environment
51
+ """
52
+
53
+ def __init__(self, context_vars):
54
+ self.env = NativeEnvironment(
55
+ trim_blocks=True,
56
+ lstrip_blocks=True,
57
+ block_start_string="<%",
58
+ block_end_string="%>",
59
+ line_statement_prefix="#",
60
+ line_comment_prefix="##",
61
+ variable_start_string="${",
62
+ variable_end_string="}",
63
+ undefined=jinja.StrictUndefined,
64
+ )
65
+ self.env.add_extension("jinja2.ext.do")
66
+ self.env.globals["math"] = math # Inject entire math module
67
+ self.context_vars = {**context_vars}
68
+ self.env.globals = {**self.env.globals, **self.context_vars}
69
+
70
+ def expand(self, content_str):
71
+ """
72
+ Renders a string that may contain Jinja expressions or statements
73
+ Returns the resulting processed string if all values could be resolved.
74
+ Otherwise, it returns a tagged (JinjaStr) string that captures variables
75
+ in scope (upvalues), like a closure for later evaluation.
76
+ """
77
+ result = None
78
+ override_vars = {}
79
+ if isinstance(content_str, JinjaStr):
80
+ # If `value` is already a JinjaStr, it means we are trying to evaluate it again
81
+ # in a parent pass.
82
+ # Hopefully, all required variables are visible now.
83
+ override_vars = content_str.upvalues
84
+ try:
85
+ template = self.env.from_string(content_str)
86
+ result = template.render(override_vars)
87
+ if isinstance(result, Undefined):
88
+ # This happens when the expression is simply an undefined variable. Jinja does not
89
+ # raise an exception, instead we get "Undefined".
90
+ # Trigger an UndefinedError exception so we skip to below.
91
+ print("" + result)
92
+ except (TemplateSyntaxError, UndefinedError) as err:
93
+ # `content_str` contains a Jinja expression that refers to a variable that is undefined
94
+ # in this scope. Perhaps it refers to a root substitution that is not visible yet.
95
+ # Therefore, return the original `content_str` as a JinjaStr, which contains the variables
96
+ # that are actually visible to it at this point to postpone evaluation.
97
+ return JinjaStr(content_str, {**self.context_vars, **override_vars}), err
98
+
99
+ return result, None
@@ -1,5 +1,6 @@
1
1
  #include "sun.h"
2
2
  #include "esphome/core/log.h"
3
+ #include <numbers>
3
4
 
4
5
  /*
5
6
  The formulas/algorithms in this module are based on the book
@@ -18,14 +19,12 @@ using namespace esphome::sun::internal;
18
19
 
19
20
  static const char *const TAG = "sun";
20
21
 
21
- #undef PI
22
22
  #undef degrees
23
23
  #undef radians
24
24
  #undef sq
25
25
 
26
- static const num_t PI = 3.141592653589793;
27
- inline num_t degrees(num_t rad) { return rad * 180 / PI; }
28
- inline num_t radians(num_t deg) { return deg * PI / 180; }
26
+ inline num_t degrees(num_t rad) { return rad * 180 / std::numbers::pi; }
27
+ inline num_t radians(num_t deg) { return deg * std::numbers::pi / 180; }
29
28
  inline num_t arcdeg(num_t deg, num_t minutes, num_t seconds) { return deg + minutes / 60 + seconds / 3600; }
30
29
  inline num_t sq(num_t x) { return x * x; }
31
30
  inline num_t cb(num_t x) { return x * x * x; }
@@ -20,8 +20,8 @@ from esphome.const import (
20
20
  DEVICE_CLASS_SWITCH,
21
21
  )
22
22
  from esphome.core import CORE, coroutine_with_priority
23
+ from esphome.core.entity_helpers import entity_duplicate_validator, setup_entity
23
24
  from esphome.cpp_generator import MockObjClass
24
- from esphome.cpp_helpers import setup_entity
25
25
 
26
26
  CODEOWNERS = ["@esphome/core"]
27
27
  IS_PLATFORM_COMPONENT = True
@@ -91,6 +91,9 @@ _SWITCH_SCHEMA = (
91
91
  )
92
92
 
93
93
 
94
+ _SWITCH_SCHEMA.add_extra(entity_duplicate_validator("switch"))
95
+
96
+
94
97
  def switch_schema(
95
98
  class_: MockObjClass,
96
99
  *,
@@ -131,7 +134,7 @@ SWITCH_SCHEMA.add_extra(cv.deprecated_schema_constant("switch"))
131
134
 
132
135
 
133
136
  async def setup_switch_core_(var, config):
134
- await setup_entity(var, config)
137
+ await setup_entity(var, config, "switch")
135
138
 
136
139
  if (inverted := config.get(CONF_INVERTED)) is not None:
137
140
  cg.add(var.set_inverted(inverted))
@@ -12,7 +12,6 @@ class SwitchBinarySensor : public binary_sensor::BinarySensor, public Component
12
12
  void set_source(Switch *source) { source_ = source; }
13
13
  void setup() override;
14
14
  void dump_config() override;
15
- float get_setup_priority() const override { return setup_priority::DATA; }
16
15
 
17
16
  protected:
18
17
  Switch *source_;
@@ -0,0 +1,317 @@
1
+ from esphome import automation, pins
2
+ import esphome.codegen as cg
3
+ from esphome.components import spi
4
+ import esphome.config_validation as cv
5
+ from esphome.const import CONF_BUSY_PIN, CONF_DATA, CONF_FREQUENCY, CONF_ID
6
+ from esphome.core import TimePeriod
7
+
8
+ MULTI_CONF = True
9
+ CODEOWNERS = ["@swoboda1337"]
10
+ DEPENDENCIES = ["spi"]
11
+
12
+ CONF_SX126X_ID = "sx126x_id"
13
+
14
+ CONF_BANDWIDTH = "bandwidth"
15
+ CONF_BITRATE = "bitrate"
16
+ CONF_CODING_RATE = "coding_rate"
17
+ CONF_CRC_ENABLE = "crc_enable"
18
+ CONF_DEVIATION = "deviation"
19
+ CONF_DIO1_PIN = "dio1_pin"
20
+ CONF_HW_VERSION = "hw_version"
21
+ CONF_MODULATION = "modulation"
22
+ CONF_ON_PACKET = "on_packet"
23
+ CONF_PA_POWER = "pa_power"
24
+ CONF_PA_RAMP = "pa_ramp"
25
+ CONF_PAYLOAD_LENGTH = "payload_length"
26
+ CONF_PREAMBLE_DETECT = "preamble_detect"
27
+ CONF_PREAMBLE_SIZE = "preamble_size"
28
+ CONF_RST_PIN = "rst_pin"
29
+ CONF_RX_START = "rx_start"
30
+ CONF_RF_SWITCH = "rf_switch"
31
+ CONF_SHAPING = "shaping"
32
+ CONF_SPREADING_FACTOR = "spreading_factor"
33
+ CONF_SYNC_VALUE = "sync_value"
34
+ CONF_TCXO_VOLTAGE = "tcxo_voltage"
35
+ CONF_TCXO_DELAY = "tcxo_delay"
36
+
37
+ sx126x_ns = cg.esphome_ns.namespace("sx126x")
38
+ SX126x = sx126x_ns.class_("SX126x", cg.Component, spi.SPIDevice)
39
+ SX126xListener = sx126x_ns.class_("SX126xListener")
40
+ SX126xBw = sx126x_ns.enum("SX126xBw")
41
+ SX126xPacketType = sx126x_ns.enum("SX126xPacketType")
42
+ SX126xTcxoCtrl = sx126x_ns.enum("SX126xTcxoCtrl")
43
+ SX126xRampTime = sx126x_ns.enum("SX126xRampTime")
44
+ SX126xPulseShape = sx126x_ns.enum("SX126xPulseShape")
45
+ SX126xLoraCr = sx126x_ns.enum("SX126xLoraCr")
46
+
47
+ BW = {
48
+ "4_8kHz": SX126xBw.SX126X_BW_4800,
49
+ "5_8kHz": SX126xBw.SX126X_BW_5800,
50
+ "7_3kHz": SX126xBw.SX126X_BW_7300,
51
+ "9_7kHz": SX126xBw.SX126X_BW_9700,
52
+ "11_7kHz": SX126xBw.SX126X_BW_11700,
53
+ "14_6kHz": SX126xBw.SX126X_BW_14600,
54
+ "19_5kHz": SX126xBw.SX126X_BW_19500,
55
+ "23_4kHz": SX126xBw.SX126X_BW_23400,
56
+ "29_3kHz": SX126xBw.SX126X_BW_29300,
57
+ "39_0kHz": SX126xBw.SX126X_BW_39000,
58
+ "46_9kHz": SX126xBw.SX126X_BW_46900,
59
+ "58_6kHz": SX126xBw.SX126X_BW_58600,
60
+ "78_2kHz": SX126xBw.SX126X_BW_78200,
61
+ "93_8kHz": SX126xBw.SX126X_BW_93800,
62
+ "117_3kHz": SX126xBw.SX126X_BW_117300,
63
+ "156_2kHz": SX126xBw.SX126X_BW_156200,
64
+ "187_2kHz": SX126xBw.SX126X_BW_187200,
65
+ "234_3kHz": SX126xBw.SX126X_BW_234300,
66
+ "312_0kHz": SX126xBw.SX126X_BW_312000,
67
+ "373_6kHz": SX126xBw.SX126X_BW_373600,
68
+ "467_0kHz": SX126xBw.SX126X_BW_467000,
69
+ "7_8kHz": SX126xBw.SX126X_BW_7810,
70
+ "10_4kHz": SX126xBw.SX126X_BW_10420,
71
+ "15_6kHz": SX126xBw.SX126X_BW_15630,
72
+ "20_8kHz": SX126xBw.SX126X_BW_20830,
73
+ "31_3kHz": SX126xBw.SX126X_BW_31250,
74
+ "41_7kHz": SX126xBw.SX126X_BW_41670,
75
+ "62_5kHz": SX126xBw.SX126X_BW_62500,
76
+ "125_0kHz": SX126xBw.SX126X_BW_125000,
77
+ "250_0kHz": SX126xBw.SX126X_BW_250000,
78
+ "500_0kHz": SX126xBw.SX126X_BW_500000,
79
+ }
80
+
81
+ CODING_RATE = {
82
+ "CR_4_5": SX126xLoraCr.LORA_CR_4_5,
83
+ "CR_4_6": SX126xLoraCr.LORA_CR_4_6,
84
+ "CR_4_7": SX126xLoraCr.LORA_CR_4_7,
85
+ "CR_4_8": SX126xLoraCr.LORA_CR_4_8,
86
+ }
87
+
88
+ MOD = {
89
+ "LORA": SX126xPacketType.PACKET_TYPE_LORA,
90
+ "FSK": SX126xPacketType.PACKET_TYPE_GFSK,
91
+ }
92
+
93
+ TCXO_VOLTAGE = {
94
+ "1_6V": SX126xTcxoCtrl.TCXO_CTRL_1_6V,
95
+ "1_7V": SX126xTcxoCtrl.TCXO_CTRL_1_7V,
96
+ "1_8V": SX126xTcxoCtrl.TCXO_CTRL_1_8V,
97
+ "2_2V": SX126xTcxoCtrl.TCXO_CTRL_2_2V,
98
+ "2_4V": SX126xTcxoCtrl.TCXO_CTRL_2_4V,
99
+ "2_7V": SX126xTcxoCtrl.TCXO_CTRL_2_7V,
100
+ "3_0V": SX126xTcxoCtrl.TCXO_CTRL_3_0V,
101
+ "3_3V": SX126xTcxoCtrl.TCXO_CTRL_3_3V,
102
+ "NONE": SX126xTcxoCtrl.TCXO_CTRL_NONE,
103
+ }
104
+
105
+ RAMP = {
106
+ "10us": SX126xRampTime.PA_RAMP_10,
107
+ "20us": SX126xRampTime.PA_RAMP_20,
108
+ "40us": SX126xRampTime.PA_RAMP_40,
109
+ "80us": SX126xRampTime.PA_RAMP_80,
110
+ "200us": SX126xRampTime.PA_RAMP_200,
111
+ "800us": SX126xRampTime.PA_RAMP_800,
112
+ "1700us": SX126xRampTime.PA_RAMP_1700,
113
+ "3400us": SX126xRampTime.PA_RAMP_3400,
114
+ }
115
+
116
+ SHAPING = {
117
+ "GAUSSIAN_BT_0_3": SX126xPulseShape.GAUSSIAN_BT_0_3,
118
+ "GAUSSIAN_BT_0_5": SX126xPulseShape.GAUSSIAN_BT_0_5,
119
+ "GAUSSIAN_BT_0_7": SX126xPulseShape.GAUSSIAN_BT_0_7,
120
+ "GAUSSIAN_BT_1_0": SX126xPulseShape.GAUSSIAN_BT_1_0,
121
+ "NONE": SX126xPulseShape.NO_FILTER,
122
+ }
123
+
124
+ RunImageCalAction = sx126x_ns.class_(
125
+ "RunImageCalAction", automation.Action, cg.Parented.template(SX126x)
126
+ )
127
+ SendPacketAction = sx126x_ns.class_(
128
+ "SendPacketAction", automation.Action, cg.Parented.template(SX126x)
129
+ )
130
+ SetModeTxAction = sx126x_ns.class_(
131
+ "SetModeTxAction", automation.Action, cg.Parented.template(SX126x)
132
+ )
133
+ SetModeRxAction = sx126x_ns.class_(
134
+ "SetModeRxAction", automation.Action, cg.Parented.template(SX126x)
135
+ )
136
+ SetModeSleepAction = sx126x_ns.class_(
137
+ "SetModeSleepAction", automation.Action, cg.Parented.template(SX126x)
138
+ )
139
+ SetModeStandbyAction = sx126x_ns.class_(
140
+ "SetModeStandbyAction", automation.Action, cg.Parented.template(SX126x)
141
+ )
142
+
143
+
144
+ def validate_raw_data(value):
145
+ if isinstance(value, str):
146
+ return value.encode("utf-8")
147
+ if isinstance(value, list):
148
+ return cv.Schema([cv.hex_uint8_t])(value)
149
+ raise cv.Invalid(
150
+ "data must either be a string wrapped in quotes or a list of bytes"
151
+ )
152
+
153
+
154
+ def validate_config(config):
155
+ lora_bws = [
156
+ "7_8kHz",
157
+ "10_4kHz",
158
+ "15_6kHz",
159
+ "20_8kHz",
160
+ "31_3kHz",
161
+ "41_7kHz",
162
+ "62_5kHz",
163
+ "125_0kHz",
164
+ "250_0kHz",
165
+ "500_0kHz",
166
+ ]
167
+ if config[CONF_MODULATION] == "LORA":
168
+ if config[CONF_BANDWIDTH] not in lora_bws:
169
+ raise cv.Invalid(f"{config[CONF_BANDWIDTH]} is not available with LORA")
170
+ if config[CONF_PREAMBLE_SIZE] > 0 and config[CONF_PREAMBLE_SIZE] < 6:
171
+ raise cv.Invalid("Minimum preamble size is 6 with LORA")
172
+ if config[CONF_SPREADING_FACTOR] == 6 and config[CONF_PAYLOAD_LENGTH] == 0:
173
+ raise cv.Invalid("Payload length must be set when spreading factor is 6")
174
+ else:
175
+ if config[CONF_BANDWIDTH] in lora_bws:
176
+ raise cv.Invalid(f"{config[CONF_BANDWIDTH]} is not available with FSK")
177
+ if config[CONF_PREAMBLE_DETECT] > len(config[CONF_SYNC_VALUE]):
178
+ raise cv.Invalid("Preamble detection length must be <= sync value length")
179
+ return config
180
+
181
+
182
+ CONFIG_SCHEMA = (
183
+ cv.Schema(
184
+ {
185
+ cv.GenerateID(): cv.declare_id(SX126x),
186
+ cv.Optional(CONF_BANDWIDTH, default="125_0kHz"): cv.enum(BW),
187
+ cv.Optional(CONF_BITRATE, default=4800): cv.int_range(min=600, max=300000),
188
+ cv.Required(CONF_BUSY_PIN): pins.internal_gpio_input_pin_schema,
189
+ cv.Optional(CONF_CODING_RATE, default="CR_4_5"): cv.enum(CODING_RATE),
190
+ cv.Optional(CONF_CRC_ENABLE, default=False): cv.boolean,
191
+ cv.Optional(CONF_DEVIATION, default=5000): cv.int_range(min=0, max=100000),
192
+ cv.Required(CONF_DIO1_PIN): pins.internal_gpio_input_pin_schema,
193
+ cv.Required(CONF_FREQUENCY): cv.int_range(min=137000000, max=1020000000),
194
+ cv.Required(CONF_HW_VERSION): cv.one_of(
195
+ "sx1261", "sx1262", "sx1268", "llcc68", lower=True
196
+ ),
197
+ cv.Required(CONF_MODULATION): cv.enum(MOD),
198
+ cv.Optional(CONF_ON_PACKET): automation.validate_automation(single=True),
199
+ cv.Optional(CONF_PA_POWER, default=17): cv.int_range(min=-3, max=22),
200
+ cv.Optional(CONF_PA_RAMP, default="40us"): cv.enum(RAMP),
201
+ cv.Optional(CONF_PAYLOAD_LENGTH, default=0): cv.int_range(min=0, max=256),
202
+ cv.Optional(CONF_PREAMBLE_DETECT, default=2): cv.int_range(min=0, max=4),
203
+ cv.Required(CONF_PREAMBLE_SIZE): cv.int_range(min=1, max=65535),
204
+ cv.Required(CONF_RST_PIN): pins.internal_gpio_output_pin_schema,
205
+ cv.Optional(CONF_RX_START, default=True): cv.boolean,
206
+ cv.Required(CONF_RF_SWITCH): cv.boolean,
207
+ cv.Optional(CONF_SHAPING, default="NONE"): cv.enum(SHAPING),
208
+ cv.Optional(CONF_SPREADING_FACTOR, default=7): cv.int_range(min=6, max=12),
209
+ cv.Optional(CONF_SYNC_VALUE, default=[]): cv.ensure_list(cv.hex_uint8_t),
210
+ cv.Optional(CONF_TCXO_VOLTAGE, default="NONE"): cv.enum(TCXO_VOLTAGE),
211
+ cv.Optional(CONF_TCXO_DELAY, default="5ms"): cv.All(
212
+ cv.positive_time_period_microseconds,
213
+ cv.Range(max=TimePeriod(microseconds=262144000)),
214
+ ),
215
+ },
216
+ )
217
+ .extend(cv.COMPONENT_SCHEMA)
218
+ .extend(spi.spi_device_schema(True, 8e6, "mode0"))
219
+ .add_extra(validate_config)
220
+ )
221
+
222
+
223
+ async def to_code(config):
224
+ var = cg.new_Pvariable(config[CONF_ID])
225
+ await cg.register_component(var, config)
226
+ await spi.register_spi_device(var, config)
227
+ if CONF_ON_PACKET in config:
228
+ await automation.build_automation(
229
+ var.get_packet_trigger(),
230
+ [
231
+ (cg.std_vector.template(cg.uint8), "x"),
232
+ (cg.float_, "rssi"),
233
+ (cg.float_, "snr"),
234
+ ],
235
+ config[CONF_ON_PACKET],
236
+ )
237
+ if CONF_DIO1_PIN in config:
238
+ dio1_pin = await cg.gpio_pin_expression(config[CONF_DIO1_PIN])
239
+ cg.add(var.set_dio1_pin(dio1_pin))
240
+ rst_pin = await cg.gpio_pin_expression(config[CONF_RST_PIN])
241
+ cg.add(var.set_rst_pin(rst_pin))
242
+ busy_pin = await cg.gpio_pin_expression(config[CONF_BUSY_PIN])
243
+ cg.add(var.set_busy_pin(busy_pin))
244
+ cg.add(var.set_bandwidth(config[CONF_BANDWIDTH]))
245
+ cg.add(var.set_frequency(config[CONF_FREQUENCY]))
246
+ cg.add(var.set_hw_version(config[CONF_HW_VERSION]))
247
+ cg.add(var.set_deviation(config[CONF_DEVIATION]))
248
+ cg.add(var.set_modulation(config[CONF_MODULATION]))
249
+ cg.add(var.set_pa_ramp(config[CONF_PA_RAMP]))
250
+ cg.add(var.set_pa_power(config[CONF_PA_POWER]))
251
+ cg.add(var.set_shaping(config[CONF_SHAPING]))
252
+ cg.add(var.set_bitrate(config[CONF_BITRATE]))
253
+ cg.add(var.set_crc_enable(config[CONF_CRC_ENABLE]))
254
+ cg.add(var.set_payload_length(config[CONF_PAYLOAD_LENGTH]))
255
+ cg.add(var.set_preamble_size(config[CONF_PREAMBLE_SIZE]))
256
+ cg.add(var.set_preamble_detect(config[CONF_PREAMBLE_DETECT]))
257
+ cg.add(var.set_coding_rate(config[CONF_CODING_RATE]))
258
+ cg.add(var.set_spreading_factor(config[CONF_SPREADING_FACTOR]))
259
+ cg.add(var.set_sync_value(config[CONF_SYNC_VALUE]))
260
+ cg.add(var.set_rx_start(config[CONF_RX_START]))
261
+ cg.add(var.set_rf_switch(config[CONF_RF_SWITCH]))
262
+ cg.add(var.set_tcxo_voltage(config[CONF_TCXO_VOLTAGE]))
263
+ cg.add(var.set_tcxo_delay(config[CONF_TCXO_DELAY]))
264
+
265
+
266
+ NO_ARGS_ACTION_SCHEMA = automation.maybe_simple_id(
267
+ {
268
+ cv.GenerateID(): cv.use_id(SX126x),
269
+ }
270
+ )
271
+
272
+
273
+ @automation.register_action(
274
+ "sx126x.run_image_cal", RunImageCalAction, NO_ARGS_ACTION_SCHEMA
275
+ )
276
+ @automation.register_action(
277
+ "sx126x.set_mode_tx", SetModeTxAction, NO_ARGS_ACTION_SCHEMA
278
+ )
279
+ @automation.register_action(
280
+ "sx126x.set_mode_rx", SetModeRxAction, NO_ARGS_ACTION_SCHEMA
281
+ )
282
+ @automation.register_action(
283
+ "sx126x.set_mode_sleep", SetModeSleepAction, NO_ARGS_ACTION_SCHEMA
284
+ )
285
+ @automation.register_action(
286
+ "sx126x.set_mode_standby", SetModeStandbyAction, NO_ARGS_ACTION_SCHEMA
287
+ )
288
+ async def no_args_action_to_code(config, action_id, template_arg, args):
289
+ var = cg.new_Pvariable(action_id, template_arg)
290
+ await cg.register_parented(var, config[CONF_ID])
291
+ return var
292
+
293
+
294
+ SEND_PACKET_ACTION_SCHEMA = cv.maybe_simple_value(
295
+ {
296
+ cv.GenerateID(): cv.use_id(SX126x),
297
+ cv.Required(CONF_DATA): cv.templatable(validate_raw_data),
298
+ },
299
+ key=CONF_DATA,
300
+ )
301
+
302
+
303
+ @automation.register_action(
304
+ "sx126x.send_packet", SendPacketAction, SEND_PACKET_ACTION_SCHEMA
305
+ )
306
+ async def send_packet_action_to_code(config, action_id, template_arg, args):
307
+ var = cg.new_Pvariable(action_id, template_arg)
308
+ await cg.register_parented(var, config[CONF_ID])
309
+ data = config[CONF_DATA]
310
+ if isinstance(data, bytes):
311
+ data = list(data)
312
+ if cg.is_template(data):
313
+ templ = await cg.templatable(data, args, cg.std_vector.template(cg.uint8))
314
+ cg.add(var.set_data_template(templ))
315
+ else:
316
+ cg.add(var.set_data_static(data))
317
+ return var
@@ -0,0 +1,62 @@
1
+ #pragma once
2
+
3
+ #include "esphome/core/component.h"
4
+ #include "esphome/core/automation.h"
5
+ #include "esphome/components/sx126x/sx126x.h"
6
+
7
+ namespace esphome {
8
+ namespace sx126x {
9
+
10
+ template<typename... Ts> class RunImageCalAction : public Action<Ts...>, public Parented<SX126x> {
11
+ public:
12
+ void play(Ts... x) override { this->parent_->run_image_cal(); }
13
+ };
14
+
15
+ template<typename... Ts> class SendPacketAction : public Action<Ts...>, public Parented<SX126x> {
16
+ public:
17
+ void set_data_template(std::function<std::vector<uint8_t>(Ts...)> func) {
18
+ this->data_func_ = func;
19
+ this->static_ = false;
20
+ }
21
+
22
+ void set_data_static(const std::vector<uint8_t> &data) {
23
+ this->data_static_ = data;
24
+ this->static_ = true;
25
+ }
26
+
27
+ void play(Ts... x) override {
28
+ if (this->static_) {
29
+ this->parent_->transmit_packet(this->data_static_);
30
+ } else {
31
+ this->parent_->transmit_packet(this->data_func_(x...));
32
+ }
33
+ }
34
+
35
+ protected:
36
+ bool static_{false};
37
+ std::function<std::vector<uint8_t>(Ts...)> data_func_{};
38
+ std::vector<uint8_t> data_static_{};
39
+ };
40
+
41
+ template<typename... Ts> class SetModeTxAction : public Action<Ts...>, public Parented<SX126x> {
42
+ public:
43
+ void play(Ts... x) override { this->parent_->set_mode_tx(); }
44
+ };
45
+
46
+ template<typename... Ts> class SetModeRxAction : public Action<Ts...>, public Parented<SX126x> {
47
+ public:
48
+ void play(Ts... x) override { this->parent_->set_mode_rx(); }
49
+ };
50
+
51
+ template<typename... Ts> class SetModeSleepAction : public Action<Ts...>, public Parented<SX126x> {
52
+ public:
53
+ void play(Ts... x) override { this->parent_->set_mode_sleep(); }
54
+ };
55
+
56
+ template<typename... Ts> class SetModeStandbyAction : public Action<Ts...>, public Parented<SX126x> {
57
+ public:
58
+ void play(Ts... x) override { this->parent_->set_mode_standby(STDBY_XOSC); }
59
+ };
60
+
61
+ } // namespace sx126x
62
+ } // namespace esphome
@@ -0,0 +1,26 @@
1
+ import esphome.codegen as cg
2
+ from esphome.components.packet_transport import (
3
+ PacketTransport,
4
+ new_packet_transport,
5
+ transport_schema,
6
+ )
7
+ import esphome.config_validation as cv
8
+ from esphome.cpp_types import PollingComponent
9
+
10
+ from .. import CONF_SX126X_ID, SX126x, SX126xListener, sx126x_ns
11
+
12
+ SX126xTransport = sx126x_ns.class_(
13
+ "SX126xTransport", PacketTransport, PollingComponent, SX126xListener
14
+ )
15
+
16
+ CONFIG_SCHEMA = transport_schema(SX126xTransport).extend(
17
+ {
18
+ cv.GenerateID(CONF_SX126X_ID): cv.use_id(SX126x),
19
+ }
20
+ )
21
+
22
+
23
+ async def to_code(config):
24
+ var, _ = await new_packet_transport(config)
25
+ sx126x = await cg.get_variable(config[CONF_SX126X_ID])
26
+ cg.add(var.set_parent(sx126x))
@@ -0,0 +1,26 @@
1
+ #include "esphome/core/log.h"
2
+ #include "esphome/core/application.h"
3
+ #include "sx126x_transport.h"
4
+
5
+ namespace esphome {
6
+ namespace sx126x {
7
+
8
+ static const char *const TAG = "sx126x_transport";
9
+
10
+ void SX126xTransport::setup() {
11
+ PacketTransport::setup();
12
+ this->parent_->register_listener(this);
13
+ }
14
+
15
+ void SX126xTransport::update() {
16
+ PacketTransport::update();
17
+ this->updated_ = true;
18
+ this->resend_data_ = true;
19
+ }
20
+
21
+ void SX126xTransport::send_packet(const std::vector<uint8_t> &buf) const { this->parent_->transmit_packet(buf); }
22
+
23
+ void SX126xTransport::on_packet(const std::vector<uint8_t> &packet, float rssi, float snr) { this->process_(packet); }
24
+
25
+ } // namespace sx126x
26
+ } // namespace esphome
@@ -0,0 +1,25 @@
1
+ #pragma once
2
+
3
+ #include "esphome/core/component.h"
4
+ #include "esphome/components/sx126x/sx126x.h"
5
+ #include "esphome/components/packet_transport/packet_transport.h"
6
+ #include <vector>
7
+
8
+ namespace esphome {
9
+ namespace sx126x {
10
+
11
+ class SX126xTransport : public packet_transport::PacketTransport, public Parented<SX126x>, public SX126xListener {
12
+ public:
13
+ void setup() override;
14
+ void update() override;
15
+ void on_packet(const std::vector<uint8_t> &packet, float rssi, float snr) override;
16
+ float get_setup_priority() const override { return setup_priority::AFTER_WIFI; }
17
+
18
+ protected:
19
+ void send_packet(const std::vector<uint8_t> &buf) const override;
20
+ bool should_send() override { return true; }
21
+ size_t get_max_packet_size() override { return this->parent_->get_max_packet_size(); }
22
+ };
23
+
24
+ } // namespace sx126x
25
+ } // namespace esphome