esphome 2025.6.2__py3-none-any.whl → 2025.7.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 (648) 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 +57 -21
  22. esphome/components/api/api_connection.cpp +344 -539
  23. esphome/components/api/api_connection.h +224 -141
  24. esphome/components/api/api_frame_helper.cpp +91 -127
  25. esphome/components/api/api_frame_helper.h +64 -54
  26. esphome/components/api/api_pb2.cpp +1837 -9044
  27. esphome/components/api/api_pb2.h +532 -685
  28. esphome/components/api/api_pb2_dump.cpp +4432 -0
  29. esphome/components/api/api_pb2_service.cpp +184 -425
  30. esphome/components/api/api_pb2_service.h +13 -6
  31. esphome/components/api/api_server.cpp +131 -167
  32. esphome/components/api/api_server.h +38 -10
  33. esphome/components/api/client.py +10 -4
  34. esphome/components/api/custom_api_device.h +8 -0
  35. esphome/components/api/list_entities.cpp +37 -104
  36. esphome/components/api/list_entities.h +33 -23
  37. esphome/components/api/proto.h +532 -26
  38. esphome/components/api/subscribe_state.cpp +23 -29
  39. esphome/components/api/subscribe_state.h +26 -19
  40. esphome/components/api/user_services.h +2 -0
  41. esphome/components/as3935_spi/as3935_spi.h +0 -2
  42. esphome/components/as5600/as5600.h +0 -1
  43. esphome/components/async_tcp/__init__.py +14 -5
  44. esphome/components/atc_mithermometer/atc_mithermometer.h +0 -1
  45. esphome/components/atm90e32/atm90e32.cpp +2 -1
  46. esphome/components/audio/audio_decoder.cpp +1 -1
  47. esphome/components/audio/audio_transfer_buffer.cpp +2 -2
  48. esphome/components/b_parasite/b_parasite.h +0 -1
  49. esphome/components/bedjet/bedjet_hub.cpp +5 -1
  50. esphome/components/bedjet/climate/bedjet_climate.cpp +5 -1
  51. esphome/components/beken_spi_led_strip/led_strip.cpp +4 -2
  52. esphome/components/bh1750/bh1750.cpp +5 -5
  53. esphome/components/binary_sensor/__init__.py +82 -5
  54. esphome/components/binary_sensor/automation.h +19 -1
  55. esphome/components/binary_sensor/binary_sensor.cpp +12 -30
  56. esphome/components/binary_sensor/binary_sensor.h +11 -25
  57. esphome/components/binary_sensor/filter.cpp +29 -24
  58. esphome/components/binary_sensor/filter.h +20 -10
  59. esphome/components/ble_client/output/ble_binary_output.h +0 -1
  60. esphome/components/ble_client/sensor/ble_rssi_sensor.cpp +5 -1
  61. esphome/components/ble_client/sensor/ble_rssi_sensor.h +0 -1
  62. esphome/components/ble_client/sensor/ble_sensor.cpp +5 -1
  63. esphome/components/ble_client/sensor/ble_sensor.h +0 -1
  64. esphome/components/ble_client/switch/ble_switch.h +0 -1
  65. esphome/components/ble_client/text_sensor/ble_text_sensor.cpp +5 -1
  66. esphome/components/ble_client/text_sensor/ble_text_sensor.h +0 -1
  67. esphome/components/ble_presence/ble_presence_device.h +0 -1
  68. esphome/components/ble_rssi/ble_rssi_sensor.h +0 -1
  69. esphome/components/ble_scanner/ble_scanner.h +0 -1
  70. esphome/components/bluetooth_proxy/bluetooth_connection.h +9 -2
  71. esphome/components/bluetooth_proxy/bluetooth_proxy.cpp +16 -6
  72. esphome/components/bluetooth_proxy/bluetooth_proxy.h +8 -2
  73. esphome/components/bme680/sensor.py +1 -1
  74. esphome/components/bmp581/bmp581.h +0 -2
  75. esphome/components/button/__init__.py +5 -2
  76. esphome/components/camera/__init__.py +1 -0
  77. esphome/components/camera/camera.cpp +22 -0
  78. esphome/components/camera/camera.h +80 -0
  79. esphome/components/canbus/__init__.py +1 -0
  80. esphome/components/cap1188/cap1188.h +0 -1
  81. esphome/components/captive_portal/__init__.py +12 -2
  82. esphome/components/captive_portal/captive_portal.cpp +12 -2
  83. esphome/components/captive_portal/captive_portal.h +5 -2
  84. esphome/components/ccs811/ccs811.h +0 -2
  85. esphome/components/climate/__init__.py +5 -2
  86. esphome/components/cm1106/sensor.py +2 -2
  87. esphome/components/const/__init__.py +2 -0
  88. esphome/components/copy/binary_sensor/copy_binary_sensor.h +0 -1
  89. esphome/components/copy/button/copy_button.h +0 -1
  90. esphome/components/copy/cover/copy_cover.h +0 -1
  91. esphome/components/copy/fan/copy_fan.h +0 -1
  92. esphome/components/copy/lock/copy_lock.h +0 -1
  93. esphome/components/copy/number/copy_number.h +0 -1
  94. esphome/components/copy/select/copy_select.h +0 -1
  95. esphome/components/copy/sensor/copy_sensor.h +0 -1
  96. esphome/components/copy/switch/copy_switch.h +0 -1
  97. esphome/components/copy/text/copy_text.h +0 -1
  98. esphome/components/copy/text_sensor/copy_text_sensor.h +0 -1
  99. esphome/components/cover/__init__.py +5 -2
  100. esphome/components/cs5460a/cs5460a.h +0 -1
  101. esphome/components/datetime/__init__.py +4 -2
  102. esphome/components/debug/__init__.py +20 -0
  103. esphome/components/debug/debug_esp32.cpp +2 -0
  104. esphome/components/deep_sleep/__init__.py +43 -9
  105. esphome/components/demo/__init__.py +2 -2
  106. esphome/components/display/display.cpp +4 -3
  107. esphome/components/display/display.h +0 -2
  108. esphome/components/display/display_buffer.cpp +1 -1
  109. esphome/components/ds2484/__init__.py +1 -0
  110. esphome/components/ds2484/ds2484.cpp +209 -0
  111. esphome/components/ds2484/ds2484.h +43 -0
  112. esphome/components/ds2484/one_wire.py +37 -0
  113. esphome/components/duty_time/duty_time_sensor.h +0 -1
  114. esphome/components/ens160_base/ens160_base.h +0 -1
  115. esphome/components/es7210/es7210.h +0 -1
  116. esphome/components/es7243e/es7243e.h +0 -1
  117. esphome/components/es8156/es8156.h +0 -1
  118. esphome/components/es8311/es8311.h +0 -1
  119. esphome/components/es8388/es8388.h +0 -1
  120. esphome/components/esp32/__init__.py +103 -135
  121. esphome/components/esp32/core.cpp +0 -4
  122. esphome/components/esp32/gpio.h +1 -1
  123. esphome/components/esp32/helpers.cpp +69 -0
  124. esphome/components/esp32_ble/ble.cpp +5 -6
  125. esphome/components/esp32_ble/ble.h +29 -14
  126. esphome/components/esp32_ble/ble_event.h +6 -6
  127. esphome/components/esp32_ble_client/ble_client_base.cpp +21 -6
  128. esphome/components/esp32_ble_client/ble_client_base.h +24 -9
  129. esphome/components/esp32_ble_tracker/__init__.py +2 -8
  130. esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +5 -5
  131. esphome/components/esp32_ble_tracker/esp32_ble_tracker.h +11 -7
  132. esphome/components/esp32_camera/__init__.py +112 -98
  133. esphome/components/esp32_camera/esp32_camera.cpp +41 -31
  134. esphome/components/esp32_camera/esp32_camera.h +35 -30
  135. esphome/components/esp32_camera_web_server/__init__.py +2 -1
  136. esphome/components/esp32_camera_web_server/camera_web_server.cpp +8 -8
  137. esphome/components/esp32_camera_web_server/camera_web_server.h +3 -3
  138. esphome/components/esp32_hall/sensor.py +2 -21
  139. esphome/components/esp32_hosted/__init__.py +101 -0
  140. esphome/components/esp32_hosted/esp32_hosted.py.script +12 -0
  141. esphome/components/esp32_improv/esp32_improv_component.cpp +3 -0
  142. esphome/components/esp32_rmt/__init__.py +0 -58
  143. esphome/components/esp32_rmt_led_strip/led_strip.cpp +77 -63
  144. esphome/components/esp32_rmt_led_strip/led_strip.h +11 -17
  145. esphome/components/esp32_rmt_led_strip/light.py +14 -76
  146. esphome/components/esp32_touch/esp32_touch.h +174 -28
  147. esphome/components/esp32_touch/esp32_touch_common.cpp +162 -0
  148. esphome/components/esp32_touch/esp32_touch_v1.cpp +240 -0
  149. esphome/components/esp32_touch/esp32_touch_v2.cpp +397 -0
  150. esphome/components/esp8266/__init__.py +2 -0
  151. esphome/components/esp8266/gpio.cpp +10 -10
  152. esphome/components/esp8266/helpers.cpp +31 -0
  153. esphome/components/esp_ldo/__init__.py +10 -8
  154. esphome/components/esp_ldo/esp_ldo.h +3 -0
  155. esphome/components/esphome/ota/__init__.py +1 -0
  156. esphome/components/esphome/ota/ota_esphome.cpp +24 -19
  157. esphome/components/ethernet/__init__.py +42 -23
  158. esphome/components/ethernet/esp_eth_phy_jl1101.c +0 -16
  159. esphome/components/ethernet/ethernet_component.cpp +69 -29
  160. esphome/components/ethernet/ethernet_component.h +18 -10
  161. esphome/components/event/__init__.py +5 -2
  162. esphome/components/ezo/ezo.h +0 -1
  163. esphome/components/ezo_pmp/ezo_pmp.h +0 -1
  164. esphome/components/fan/__init__.py +5 -2
  165. esphome/components/fan/fan.cpp +4 -0
  166. esphome/components/feedback/feedback_cover.h +0 -1
  167. esphome/components/font/__init__.py +92 -82
  168. esphome/components/font/font.cpp +9 -2
  169. esphome/components/font/font.h +20 -5
  170. esphome/components/fs3000/fs3000.h +0 -1
  171. esphome/components/gcja5/gcja5.h +0 -1
  172. esphome/components/gl_r01_i2c/__init__.py +0 -0
  173. esphome/components/gl_r01_i2c/gl_r01_i2c.cpp +68 -0
  174. esphome/components/gl_r01_i2c/gl_r01_i2c.h +22 -0
  175. esphome/components/gl_r01_i2c/sensor.py +36 -0
  176. esphome/components/gp8403/gp8403.h +0 -1
  177. esphome/components/gpio/binary_sensor/__init__.py +39 -1
  178. esphome/components/gpio/binary_sensor/gpio_binary_sensor.cpp +77 -3
  179. esphome/components/gpio/binary_sensor/gpio_binary_sensor.h +40 -0
  180. esphome/components/grove_gas_mc_v2/grove_gas_mc_v2.h +0 -2
  181. esphome/components/he60r/he60r.h +0 -1
  182. esphome/components/heatpumpir/climate.py +2 -1
  183. esphome/components/heatpumpir/heatpumpir.cpp +1 -0
  184. esphome/components/heatpumpir/heatpumpir.h +1 -0
  185. esphome/components/honeywellabp2_i2c/honeywellabp2.h +0 -1
  186. esphome/components/host/__init__.py +3 -1
  187. esphome/components/host/helpers.cpp +57 -0
  188. esphome/components/http_request/__init__.py +19 -1
  189. esphome/components/http_request/http_request.h +1 -1
  190. esphome/components/http_request/http_request_arduino.cpp +0 -1
  191. esphome/components/http_request/http_request_arduino.h +1 -0
  192. esphome/components/http_request/http_request_idf.cpp +0 -1
  193. esphome/components/http_request/ota/ota_http_request.cpp +1 -1
  194. esphome/components/http_request/update/http_request_update.cpp +35 -16
  195. esphome/components/hydreon_rgxx/hydreon_rgxx.cpp +3 -9
  196. esphome/components/hydreon_rgxx/sensor.py +1 -1
  197. esphome/components/i2c/__init__.py +23 -11
  198. esphome/components/i2c/i2c_bus.h +8 -1
  199. esphome/components/i2c/i2c_bus_arduino.cpp +4 -3
  200. esphome/components/i2c/i2c_bus_arduino.h +6 -3
  201. esphome/components/i2c/i2c_bus_esp_idf.h +5 -3
  202. esphome/components/i2c_device/i2c_device.h +0 -1
  203. esphome/components/i2s_audio/__init__.py +2 -10
  204. esphome/components/i2s_audio/i2s_audio.cpp +1 -5
  205. esphome/components/i2s_audio/media_player/__init__.py +2 -2
  206. esphome/components/i2s_audio/speaker/__init__.py +1 -1
  207. esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +2 -2
  208. esphome/components/iaqcore/iaqcore.h +0 -2
  209. esphome/components/image/__init__.py +123 -24
  210. esphome/components/improv_serial/improv_serial_component.cpp +0 -4
  211. esphome/components/ina219/ina219.cpp +7 -0
  212. esphome/components/ina219/ina219.h +1 -0
  213. esphome/components/ina260/ina260.h +0 -2
  214. esphome/components/inkbird_ibsth1_mini/inkbird_ibsth1_mini.h +0 -1
  215. esphome/components/inkplate6/display.py +15 -0
  216. esphome/components/inkplate6/inkplate.cpp +2 -2
  217. esphome/components/integration/integration_sensor.h +0 -1
  218. esphome/components/internal_temperature/internal_temperature.cpp +8 -27
  219. esphome/components/internal_temperature/sensor.py +0 -26
  220. esphome/components/interval/interval.h +0 -2
  221. esphome/components/json/__init__.py +1 -1
  222. esphome/components/json/json_util.cpp +56 -63
  223. esphome/components/ld2410/button/__init__.py +3 -3
  224. esphome/components/ld2410/button/factory_reset_button.cpp +9 -0
  225. esphome/components/ld2410/button/{reset_button.h → factory_reset_button.h} +2 -2
  226. esphome/components/ld2410/ld2410.cpp +421 -268
  227. esphome/components/ld2410/ld2410.h +44 -146
  228. esphome/components/ld2410/number/__init__.py +2 -2
  229. esphome/components/ld2410/sensor.py +1 -1
  230. esphome/components/ld2410/switch/__init__.py +1 -1
  231. esphome/components/ld2420/binary_sensor/ld2420_binary_sensor.cpp +2 -2
  232. esphome/components/ld2420/button/reconfig_buttons.cpp +1 -1
  233. esphome/components/ld2420/ld2420.cpp +252 -147
  234. esphome/components/ld2420/ld2420.h +52 -126
  235. esphome/components/ld2420/number/__init__.py +2 -2
  236. esphome/components/ld2420/number/gate_config_number.cpp +1 -1
  237. esphome/components/ld2420/select/operating_mode_select.cpp +1 -1
  238. esphome/components/ld2420/sensor/__init__.py +6 -2
  239. esphome/components/ld2420/sensor/ld2420_sensor.cpp +2 -2
  240. esphome/components/ld2420/sensor/ld2420_sensor.h +1 -1
  241. esphome/components/ld2420/text_sensor/text_sensor.cpp +2 -2
  242. esphome/components/ld2450/button/__init__.py +3 -3
  243. esphome/components/ld2450/button/factory_reset_button.cpp +9 -0
  244. esphome/components/ld2450/button/{reset_button.h → factory_reset_button.h} +2 -2
  245. esphome/components/ld2450/ld2450.cpp +384 -232
  246. esphome/components/ld2450/ld2450.h +60 -69
  247. esphome/components/ld2450/switch/__init__.py +1 -1
  248. esphome/components/ledc/ledc_output.cpp +1 -63
  249. esphome/components/libretiny/__init__.py +5 -3
  250. esphome/components/libretiny/const.py +5 -0
  251. esphome/components/libretiny/generate_components.py +1 -0
  252. esphome/components/libretiny/helpers.cpp +35 -0
  253. esphome/components/libretiny/lt_component.cpp +5 -3
  254. esphome/components/light/__init__.py +4 -2
  255. esphome/components/light/addressable_light.h +3 -3
  256. esphome/components/light/light_call.cpp +180 -243
  257. esphome/components/light/light_call.h +72 -20
  258. esphome/components/light/light_color_values.h +14 -14
  259. esphome/components/light/light_json_schema.cpp +17 -16
  260. esphome/components/light/light_state.h +15 -13
  261. esphome/components/light/transformers.h +2 -2
  262. esphome/components/ln882x/__init__.py +52 -0
  263. esphome/components/ln882x/boards.py +285 -0
  264. esphome/components/lock/__init__.py +5 -2
  265. esphome/components/logger/__init__.py +40 -3
  266. esphome/components/logger/logger.cpp +47 -12
  267. esphome/components/logger/logger.h +80 -49
  268. esphome/components/logger/logger_esp32.cpp +3 -3
  269. esphome/components/lps22/__init__.py +0 -0
  270. esphome/components/lps22/lps22.cpp +75 -0
  271. esphome/components/lps22/lps22.h +27 -0
  272. esphome/components/lps22/sensor.py +58 -0
  273. esphome/components/ltr390/ltr390.h +0 -1
  274. esphome/components/ltr501/ltr501.h +0 -1
  275. esphome/components/ltr_als_ps/ltr_als_ps.h +0 -1
  276. esphome/components/lvgl/__init__.py +1 -1
  277. esphome/components/lvgl/schemas.py +66 -6
  278. esphome/components/lvgl/styles.py +24 -16
  279. esphome/components/lvgl/widgets/__init__.py +12 -2
  280. esphome/components/lvgl/widgets/lv_bar.py +40 -19
  281. esphome/components/lvgl/widgets/meter.py +20 -13
  282. esphome/components/m5stack_8angle/light/m5stack_8angle_light.cpp +1 -1
  283. esphome/components/max9611/max9611.h +0 -1
  284. esphome/components/mcp23016/__init__.py +1 -1
  285. esphome/components/mcp23xxx_base/__init__.py +1 -1
  286. esphome/components/mcp4461/__init__.py +1 -1
  287. esphome/components/mcp4461/output/__init__.py +3 -2
  288. esphome/components/mcp9600/mcp9600.h +0 -2
  289. esphome/components/md5/md5.cpp +3 -3
  290. esphome/components/md5/md5.h +1 -6
  291. esphome/components/mdns/__init__.py +22 -11
  292. esphome/components/media_player/__init__.py +4 -3
  293. esphome/components/micro_wake_word/__init__.py +1 -5
  294. esphome/components/micro_wake_word/streaming_model.cpp +2 -2
  295. esphome/components/microphone/microphone.cpp +7 -9
  296. esphome/components/microphone/microphone.h +0 -2
  297. esphome/components/mipi_spi/display.py +1 -0
  298. esphome/components/mmc5603/mmc5603.cpp +1 -1
  299. esphome/components/modbus/modbus.cpp +33 -15
  300. esphome/components/modbus/modbus.h +9 -0
  301. esphome/components/modbus_controller/__init__.py +42 -10
  302. esphome/components/modbus_controller/modbus_controller.cpp +92 -11
  303. esphome/components/modbus_controller/modbus_controller.h +61 -7
  304. esphome/components/mopeka_pro_check/mopeka_pro_check.h +0 -1
  305. esphome/components/mopeka_std_check/mopeka_std_check.h +0 -1
  306. esphome/components/mpl3115a2/mpl3115a2.h +0 -2
  307. esphome/components/mqtt/__init__.py +16 -0
  308. esphome/components/mqtt/mqtt_alarm_control_panel.cpp +2 -1
  309. esphome/components/mqtt/mqtt_backend.h +2 -1
  310. esphome/components/mqtt/mqtt_backend_esp32.cpp +132 -47
  311. esphome/components/mqtt/mqtt_backend_esp32.h +106 -4
  312. esphome/components/mqtt/mqtt_binary_sensor.cpp +1 -0
  313. esphome/components/mqtt/mqtt_button.cpp +4 -1
  314. esphome/components/mqtt/mqtt_client.cpp +17 -9
  315. esphome/components/mqtt/mqtt_client.h +8 -3
  316. esphome/components/mqtt/mqtt_climate.cpp +6 -4
  317. esphome/components/mqtt/mqtt_component.cpp +3 -1
  318. esphome/components/mqtt/mqtt_cover.cpp +1 -0
  319. esphome/components/mqtt/mqtt_date.cpp +4 -3
  320. esphome/components/mqtt/mqtt_datetime.cpp +7 -6
  321. esphome/components/mqtt/mqtt_event.cpp +6 -3
  322. esphome/components/mqtt/mqtt_fan.cpp +1 -0
  323. esphome/components/mqtt/mqtt_light.cpp +8 -4
  324. esphome/components/mqtt/mqtt_lock.cpp +3 -1
  325. esphome/components/mqtt/mqtt_number.cpp +1 -0
  326. esphome/components/mqtt/mqtt_select.cpp +2 -1
  327. esphome/components/mqtt/mqtt_sensor.cpp +3 -1
  328. esphome/components/mqtt/mqtt_switch.cpp +3 -1
  329. esphome/components/mqtt/mqtt_text.cpp +1 -0
  330. esphome/components/mqtt/mqtt_text_sensor.cpp +3 -1
  331. esphome/components/mqtt/mqtt_time.cpp +4 -3
  332. esphome/components/mqtt/mqtt_update.cpp +1 -0
  333. esphome/components/mqtt/mqtt_valve.cpp +3 -1
  334. esphome/components/ms8607/ms8607.cpp +1 -1
  335. esphome/components/ms8607/ms8607.h +0 -1
  336. esphome/components/neopixelbus/light.py +4 -1
  337. esphome/components/neopixelbus/neopixelbus_light.h +1 -1
  338. esphome/components/network/__init__.py +4 -1
  339. esphome/components/network/ip_address.h +1 -0
  340. esphome/components/nextion/__init__.py +16 -0
  341. esphome/components/nextion/base_component.py +1 -0
  342. esphome/components/nextion/binary_sensor/nextion_binarysensor.cpp +1 -1
  343. esphome/components/nextion/display.py +14 -4
  344. esphome/components/nextion/nextion.cpp +166 -101
  345. esphome/components/nextion/nextion.h +84 -53
  346. esphome/components/nextion/nextion_commands.cpp +11 -10
  347. esphome/components/nextion/nextion_component.cpp +28 -28
  348. esphome/components/nextion/nextion_component.h +53 -18
  349. esphome/components/nextion/nextion_component_base.h +3 -0
  350. esphome/components/nextion/nextion_upload.cpp +36 -0
  351. esphome/components/nextion/nextion_upload_arduino.cpp +10 -35
  352. esphome/components/nextion/nextion_upload_idf.cpp +9 -33
  353. esphome/components/nextion/sensor/nextion_sensor.cpp +1 -1
  354. esphome/components/nextion/switch/nextion_switch.cpp +1 -1
  355. esphome/components/nextion/text_sensor/nextion_textsensor.cpp +1 -1
  356. esphome/components/nfc/nfc.cpp +3 -22
  357. esphome/components/nfc/nfc.h +3 -3
  358. esphome/components/number/__init__.py +5 -2
  359. esphome/components/online_image/__init__.py +9 -1
  360. esphome/components/online_image/online_image.cpp +17 -7
  361. esphome/components/online_image/online_image.h +10 -2
  362. esphome/components/opentherm/opentherm.cpp +7 -12
  363. esphome/components/opentherm/output/output.cpp +1 -1
  364. esphome/components/openthread/__init__.py +47 -40
  365. esphome/components/openthread/const.py +1 -0
  366. esphome/components/openthread/openthread_esp.cpp +27 -5
  367. esphome/components/opt3001/__init__.py +0 -0
  368. esphome/components/opt3001/opt3001.cpp +122 -0
  369. esphome/components/opt3001/opt3001.h +27 -0
  370. esphome/components/opt3001/sensor.py +35 -0
  371. esphome/components/ota/__init__.py +17 -0
  372. esphome/components/ota/ota_backend.h +27 -1
  373. esphome/components/ota/ota_backend_arduino_esp32.cpp +12 -2
  374. esphome/components/ota/ota_backend_arduino_esp32.h +3 -0
  375. esphome/components/ota/ota_backend_arduino_esp8266.cpp +18 -4
  376. esphome/components/ota/ota_backend_arduino_esp8266.h +3 -0
  377. esphome/components/ota/ota_backend_arduino_libretiny.cpp +12 -2
  378. esphome/components/ota/ota_backend_arduino_libretiny.h +3 -0
  379. esphome/components/ota/ota_backend_arduino_rp2040.cpp +9 -2
  380. esphome/components/ota/ota_backend_arduino_rp2040.h +3 -0
  381. esphome/components/ota/ota_backend_esp_idf.cpp +10 -16
  382. esphome/components/ota/ota_backend_esp_idf.h +1 -0
  383. esphome/components/packages/__init__.py +5 -2
  384. esphome/components/packet_transport/binary_sensor.py +61 -4
  385. esphome/components/packet_transport/packet_transport.cpp +34 -1
  386. esphome/components/packet_transport/packet_transport.h +11 -5
  387. esphome/components/pcf8574/__init__.py +1 -1
  388. esphome/components/pi4ioe5v6408/__init__.py +84 -0
  389. esphome/components/pi4ioe5v6408/pi4ioe5v6408.cpp +171 -0
  390. esphome/components/pi4ioe5v6408/pi4ioe5v6408.h +70 -0
  391. esphome/components/pmsa003i/pmsa003i.h +0 -1
  392. esphome/components/pmsx003/pmsx003.h +0 -1
  393. esphome/components/pn7150/pn7150.cpp +7 -7
  394. esphome/components/pn7150/pn7150.h +0 -1
  395. esphome/components/pn7160/pn7160.cpp +7 -7
  396. esphome/components/pn7160/pn7160.h +0 -1
  397. esphome/components/preferences/syncer.h +2 -0
  398. esphome/components/prometheus/prometheus_handler.h +1 -1
  399. esphome/components/psram/psram.cpp +0 -20
  400. esphome/components/pulse_counter/pulse_counter_sensor.h +0 -1
  401. esphome/components/pulse_meter/pulse_meter_sensor.cpp +8 -4
  402. esphome/components/pulse_width/pulse_width.h +0 -1
  403. esphome/components/pvvx_mithermometer/display/pvvx_display.cpp +0 -4
  404. esphome/components/pvvx_mithermometer/display/pvvx_display.h +0 -2
  405. esphome/components/pvvx_mithermometer/pvvx_mithermometer.h +0 -1
  406. esphome/components/qr_code/__init__.py +13 -10
  407. esphome/components/qwiic_pir/qwiic_pir.h +0 -1
  408. esphome/components/radon_eye_ble/radon_eye_listener.cpp +1 -1
  409. esphome/components/rc522/rc522.h +0 -1
  410. esphome/components/rdm6300/rdm6300.h +0 -2
  411. esphome/components/remote_base/__init__.py +7 -5
  412. esphome/components/remote_base/remote_base.cpp +24 -21
  413. esphome/components/remote_base/remote_base.h +3 -26
  414. esphome/components/remote_receiver/__init__.py +40 -46
  415. esphome/components/remote_receiver/remote_receiver.h +4 -18
  416. esphome/components/remote_receiver/remote_receiver_esp32.cpp +0 -87
  417. esphome/components/remote_receiver/remote_receiver_esp8266.cpp +1 -1
  418. esphome/components/remote_transmitter/__init__.py +42 -43
  419. esphome/components/remote_transmitter/remote_transmitter.h +2 -14
  420. esphome/components/remote_transmitter/remote_transmitter_esp32.cpp +0 -77
  421. esphome/components/resistance/resistance_sensor.h +0 -1
  422. esphome/components/rp2040/__init__.py +2 -0
  423. esphome/components/rp2040/helpers.cpp +55 -0
  424. esphome/components/rp2040_pio_led_strip/led_strip.cpp +2 -2
  425. esphome/components/rpi_dpi_rgb/rpi_dpi_rgb.cpp +0 -4
  426. esphome/components/rtttl/__init__.py +4 -4
  427. esphome/components/rtttl/rtttl.cpp +10 -1
  428. esphome/components/ruuvitag/ruuvitag.h +0 -1
  429. esphome/components/safe_mode/safe_mode.cpp +2 -0
  430. esphome/components/safe_mode/safe_mode.h +4 -1
  431. esphome/components/scd30/scd30.h +0 -1
  432. esphome/components/scd30/sensor.py +2 -2
  433. esphome/components/scd4x/scd4x.cpp +61 -54
  434. esphome/components/scd4x/scd4x.h +17 -15
  435. esphome/components/scd4x/sensor.py +4 -4
  436. esphome/components/script/script.h +0 -2
  437. esphome/components/sdp3x/sensor.py +1 -1
  438. esphome/components/select/__init__.py +5 -2
  439. esphome/components/sen5x/sen5x.h +0 -1
  440. esphome/components/senseair/senseair.h +0 -1
  441. esphome/components/sensor/__init__.py +4 -2
  442. esphome/components/sensor/filter.cpp +1 -1
  443. esphome/components/sensor/sensor.cpp +12 -6
  444. esphome/components/sensor/sensor.h +13 -5
  445. esphome/components/servo/servo.cpp +2 -2
  446. esphome/components/servo/servo.h +0 -1
  447. esphome/components/sfa30/sfa30.h +0 -1
  448. esphome/components/sgp30/sgp30.h +0 -1
  449. esphome/components/sgp4x/sgp4x.h +0 -1
  450. esphome/components/shelly_dimmer/stm32flash.cpp +1 -2
  451. esphome/components/sht4x/sht4x.h +0 -1
  452. esphome/components/sm300d2/sm300d2.h +0 -2
  453. esphome/components/smt100/sensor.py +8 -4
  454. esphome/components/smt100/smt100.cpp +5 -5
  455. esphome/components/smt100/smt100.h +3 -3
  456. esphome/components/sn74hc595/__init__.py +1 -1
  457. esphome/components/sn74hc595/sn74hc595.cpp +5 -4
  458. esphome/components/sntp/sntp_component.cpp +9 -3
  459. esphome/components/sntp/time.py +2 -0
  460. esphome/components/socket/__init__.py +17 -0
  461. esphome/components/spi/__init__.py +27 -6
  462. esphome/components/spi/spi.cpp +3 -2
  463. esphome/components/spi/spi.h +9 -3
  464. esphome/components/spi/spi_arduino.cpp +3 -5
  465. esphome/components/spi/spi_esp_idf.cpp +40 -21
  466. esphome/components/spi_led_strip/spi_led_strip.cpp +1 -1
  467. esphome/components/sps30/sps30.h +0 -1
  468. esphome/components/ssd1306_base/ssd1306_base.cpp +1 -1
  469. esphome/components/st7701s/st7701s.cpp +0 -4
  470. esphome/components/status/status_binary_sensor.h +0 -2
  471. esphome/components/substitutions/__init__.py +81 -21
  472. esphome/components/substitutions/jinja.py +99 -0
  473. esphome/components/sun/sun.cpp +3 -4
  474. esphome/components/switch/__init__.py +5 -2
  475. esphome/components/switch/binary_sensor/switch_binary_sensor.h +0 -1
  476. esphome/components/sx126x/__init__.py +317 -0
  477. esphome/components/sx126x/automation.h +62 -0
  478. esphome/components/sx126x/packet_transport/__init__.py +26 -0
  479. esphome/components/sx126x/packet_transport/sx126x_transport.cpp +26 -0
  480. esphome/components/sx126x/packet_transport/sx126x_transport.h +25 -0
  481. esphome/components/sx126x/sx126x.cpp +523 -0
  482. esphome/components/sx126x/sx126x.h +140 -0
  483. esphome/components/sx126x/sx126x_reg.h +163 -0
  484. esphome/components/sx127x/__init__.py +325 -0
  485. esphome/components/sx127x/automation.h +62 -0
  486. esphome/components/sx127x/packet_transport/__init__.py +26 -0
  487. esphome/components/sx127x/packet_transport/sx127x_transport.cpp +26 -0
  488. esphome/components/sx127x/packet_transport/sx127x_transport.h +25 -0
  489. esphome/components/sx127x/sx127x.cpp +498 -0
  490. esphome/components/sx127x/sx127x.h +128 -0
  491. esphome/components/sx127x/sx127x_reg.h +295 -0
  492. esphome/components/syslog/esphome_syslog.cpp +5 -3
  493. esphome/components/syslog/esphome_syslog.h +1 -1
  494. esphome/components/tca9555/__init__.py +1 -1
  495. esphome/components/template/binary_sensor/template_binary_sensor.cpp +1 -9
  496. esphome/components/text/__init__.py +5 -2
  497. esphome/components/text_sensor/__init__.py +5 -2
  498. esphome/components/thermostat/thermostat_climate.cpp +34 -31
  499. esphome/components/thermostat/thermostat_climate.h +43 -39
  500. esphome/components/time/__init__.py +16 -2
  501. esphome/components/time/real_time_clock.cpp +4 -0
  502. esphome/components/time/real_time_clock.h +5 -1
  503. esphome/components/tlc5971/tlc5971.cpp +4 -1
  504. esphome/components/tmp1075/tmp1075.h +0 -2
  505. esphome/components/tof10120/tof10120_sensor.h +0 -1
  506. esphome/components/tormatic/tormatic_cover.h +0 -1
  507. esphome/components/total_daily_energy/total_daily_energy.h +0 -1
  508. esphome/components/tsl2591/tsl2591.cpp +1 -1
  509. esphome/components/ttp229_bsf/ttp229_bsf.h +0 -1
  510. esphome/components/ttp229_lsf/ttp229_lsf.h +0 -1
  511. esphome/components/tx20/tx20.cpp +2 -2
  512. esphome/components/uart/__init__.py +18 -0
  513. esphome/components/uart/uart_component_esp_idf.cpp +1 -5
  514. esphome/components/update/__init__.py +5 -2
  515. esphome/components/update/update_entity.h +8 -0
  516. esphome/components/usb_host/__init__.py +5 -2
  517. esphome/components/usb_host/usb_host_client.cpp +10 -10
  518. esphome/components/usb_uart/cp210x.cpp +1 -1
  519. esphome/components/usb_uart/usb_uart.cpp +41 -44
  520. esphome/components/usb_uart/usb_uart.h +4 -3
  521. esphome/components/valve/__init__.py +5 -2
  522. esphome/components/vbus/vbus.h +0 -1
  523. esphome/components/veml3235/veml3235.h +0 -1
  524. esphome/components/veml7700/veml7700.h +0 -1
  525. esphome/components/vl53l0x/vl53l0x_sensor.h +0 -1
  526. esphome/components/voice_assistant/voice_assistant.cpp +4 -4
  527. esphome/components/watchdog/watchdog.cpp +0 -4
  528. esphome/components/waveshare_epaper/waveshare_epaper.cpp +6 -6
  529. esphome/components/web_server/__init__.py +34 -19
  530. esphome/components/web_server/ota/__init__.py +32 -0
  531. esphome/components/web_server/ota/ota_web_server.cpp +210 -0
  532. esphome/components/web_server/ota/ota_web_server.h +26 -0
  533. esphome/components/web_server/web_server.cpp +324 -439
  534. esphome/components/web_server/web_server.h +33 -23
  535. esphome/components/web_server/web_server_v1.cpp +4 -5
  536. esphome/components/web_server_base/__init__.py +5 -2
  537. esphome/components/web_server_base/web_server_base.cpp +2 -94
  538. esphome/components/web_server_base/web_server_base.h +5 -25
  539. esphome/components/web_server_idf/multipart.cpp +254 -0
  540. esphome/components/web_server_idf/multipart.h +86 -0
  541. esphome/components/web_server_idf/utils.cpp +32 -0
  542. esphome/components/web_server_idf/utils.h +10 -0
  543. esphome/components/web_server_idf/web_server_idf.cpp +164 -16
  544. esphome/components/web_server_idf/web_server_idf.h +11 -10
  545. esphome/components/wiegand/wiegand.cpp +2 -2
  546. esphome/components/wifi/__init__.py +18 -0
  547. esphome/components/wifi/wifi_component.cpp +17 -22
  548. esphome/components/wifi/wifi_component.h +27 -23
  549. esphome/components/wifi/wifi_component_esp32_arduino.cpp +52 -59
  550. esphome/components/wifi/wifi_component_esp8266.cpp +46 -46
  551. esphome/components/wifi/wifi_component_esp_idf.cpp +35 -36
  552. esphome/components/wifi/wifi_component_libretiny.cpp +26 -27
  553. esphome/components/wifi/wifi_component_pico_w.cpp +3 -3
  554. esphome/components/wifi_info/wifi_info_text_sensor.cpp +6 -6
  555. esphome/components/wireguard/__init__.py +2 -11
  556. esphome/components/xiaomi_ble/xiaomi_ble.cpp +13 -1
  557. esphome/components/xiaomi_ble/xiaomi_ble.h +1 -0
  558. esphome/components/xiaomi_cgd1/xiaomi_cgd1.h +0 -1
  559. esphome/components/xiaomi_cgdk2/xiaomi_cgdk2.h +0 -1
  560. esphome/components/xiaomi_cgg1/xiaomi_cgg1.h +0 -1
  561. esphome/components/xiaomi_cgpr1/xiaomi_cgpr1.h +0 -1
  562. esphome/components/xiaomi_gcls002/xiaomi_gcls002.h +0 -1
  563. esphome/components/xiaomi_hhccjcy01/xiaomi_hhccjcy01.h +0 -1
  564. esphome/components/xiaomi_hhccjcy10/xiaomi_hhccjcy10.h +0 -1
  565. esphome/components/xiaomi_hhccpot002/xiaomi_hhccpot002.h +0 -1
  566. esphome/components/xiaomi_jqjcy01ym/xiaomi_jqjcy01ym.h +0 -1
  567. esphome/components/xiaomi_lywsd02/xiaomi_lywsd02.h +0 -1
  568. esphome/components/xiaomi_lywsd02mmc/xiaomi_lywsd02mmc.h +0 -1
  569. esphome/components/xiaomi_lywsd03mmc/xiaomi_lywsd03mmc.h +0 -1
  570. esphome/components/xiaomi_lywsdcgq/xiaomi_lywsdcgq.h +0 -1
  571. esphome/components/xiaomi_mhoc303/xiaomi_mhoc303.h +0 -1
  572. esphome/components/xiaomi_mhoc401/xiaomi_mhoc401.h +0 -1
  573. esphome/components/xiaomi_miscale/xiaomi_miscale.h +0 -1
  574. esphome/components/xiaomi_mjyd02yla/xiaomi_mjyd02yla.h +0 -1
  575. esphome/components/xiaomi_mue4094rt/xiaomi_mue4094rt.h +0 -1
  576. esphome/components/xiaomi_rtcgq02lm/xiaomi_rtcgq02lm.h +0 -1
  577. esphome/components/xiaomi_wx08zm/xiaomi_wx08zm.h +0 -1
  578. esphome/components/xiaomi_xmwsdj04mmc/__init__.py +0 -0
  579. esphome/components/xiaomi_xmwsdj04mmc/sensor.py +77 -0
  580. esphome/components/xiaomi_xmwsdj04mmc/xiaomi_xmwsdj04mmc.cpp +77 -0
  581. esphome/components/xiaomi_xmwsdj04mmc/xiaomi_xmwsdj04mmc.h +36 -0
  582. esphome/components/zio_ultrasonic/zio_ultrasonic.h +0 -2
  583. esphome/components/zyaura/zyaura.h +0 -1
  584. esphome/config.py +88 -22
  585. esphome/config_helpers.py +74 -1
  586. esphome/config_validation.py +12 -1
  587. esphome/const.py +65 -10
  588. esphome/core/__init__.py +18 -2
  589. esphome/core/application.cpp +169 -10
  590. esphome/core/application.h +145 -165
  591. esphome/core/area.h +19 -0
  592. esphome/core/automation.h +58 -9
  593. esphome/core/color.cpp +3 -5
  594. esphome/core/color.h +16 -16
  595. esphome/core/component.cpp +156 -22
  596. esphome/core/component.h +98 -4
  597. esphome/core/component_iterator.cpp +11 -9
  598. esphome/core/component_iterator.h +12 -10
  599. esphome/core/config.py +155 -6
  600. esphome/core/controller.cpp +4 -2
  601. esphome/core/controller.h +1 -1
  602. esphome/core/datatypes.h +2 -2
  603. esphome/core/defines.h +17 -2
  604. esphome/core/device.h +20 -0
  605. esphome/core/entity_base.cpp +20 -15
  606. esphome/core/entity_base.h +76 -0
  607. esphome/core/entity_helpers.py +168 -1
  608. esphome/core/event_pool.h +81 -0
  609. esphome/core/helpers.cpp +75 -230
  610. esphome/core/helpers.h +165 -105
  611. esphome/core/lock_free_queue.h +151 -0
  612. esphome/core/log.cpp +2 -2
  613. esphome/core/log.h +2 -0
  614. esphome/core/optional.h +5 -0
  615. esphome/core/ring_buffer.cpp +2 -2
  616. esphome/core/scheduler.cpp +275 -103
  617. esphome/core/scheduler.h +154 -17
  618. esphome/core/time.cpp +5 -5
  619. esphome/core/time.h +5 -5
  620. esphome/cpp_generator.py +17 -0
  621. esphome/cpp_helpers.py +0 -22
  622. esphome/cpp_types.py +3 -1
  623. esphome/dashboard/entries.py +1 -1
  624. esphome/dashboard/util/text.py +5 -21
  625. esphome/dashboard/web_server.py +9 -1
  626. esphome/helpers.py +47 -0
  627. esphome/loader.py +15 -1
  628. esphome/pins.py +14 -8
  629. esphome/platformio_api.py +2 -0
  630. esphome/wizard.py +17 -4
  631. esphome/writer.py +44 -3
  632. esphome/yaml_util.py +0 -2
  633. {esphome-2025.6.2.dist-info → esphome-2025.7.0.dist-info}/METADATA +10 -9
  634. {esphome-2025.6.2.dist-info → esphome-2025.7.0.dist-info}/RECORD +639 -580
  635. esphome/components/api/api_pb2_size.h +0 -361
  636. esphome/components/esp32_ble/ble_event_pool.h +0 -72
  637. esphome/components/esp32_ble/queue.h +0 -85
  638. esphome/components/esp32_hall/esp32_hall.cpp +0 -25
  639. esphome/components/esp32_hall/esp32_hall.h +0 -23
  640. esphome/components/esp32_touch/esp32_touch.cpp +0 -355
  641. esphome/components/ld2410/button/reset_button.cpp +0 -9
  642. esphome/components/ld2450/button/reset_button.cpp +0 -9
  643. esphome/components/openthread/tlv.py +0 -65
  644. /esphome/{dashboard/enum.py → enum.py} +0 -0
  645. {esphome-2025.6.2.dist-info → esphome-2025.7.0.dist-info}/WHEEL +0 -0
  646. {esphome-2025.6.2.dist-info → esphome-2025.7.0.dist-info}/entry_points.txt +0 -0
  647. {esphome-2025.6.2.dist-info → esphome-2025.7.0.dist-info}/licenses/LICENSE +0 -0
  648. {esphome-2025.6.2.dist-info → esphome-2025.7.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,140 @@
1
+ #pragma once
2
+
3
+ #include "esphome/components/spi/spi.h"
4
+ #include "esphome/core/automation.h"
5
+ #include "esphome/core/component.h"
6
+ #include "sx126x_reg.h"
7
+ #include <utility>
8
+ #include <vector>
9
+
10
+ namespace esphome {
11
+ namespace sx126x {
12
+
13
+ enum SX126xBw : uint8_t {
14
+ // FSK
15
+ SX126X_BW_4800,
16
+ SX126X_BW_5800,
17
+ SX126X_BW_7300,
18
+ SX126X_BW_9700,
19
+ SX126X_BW_11700,
20
+ SX126X_BW_14600,
21
+ SX126X_BW_19500,
22
+ SX126X_BW_23400,
23
+ SX126X_BW_29300,
24
+ SX126X_BW_39000,
25
+ SX126X_BW_46900,
26
+ SX126X_BW_58600,
27
+ SX126X_BW_78200,
28
+ SX126X_BW_93800,
29
+ SX126X_BW_117300,
30
+ SX126X_BW_156200,
31
+ SX126X_BW_187200,
32
+ SX126X_BW_234300,
33
+ SX126X_BW_312000,
34
+ SX126X_BW_373600,
35
+ SX126X_BW_467000,
36
+ // LORA
37
+ SX126X_BW_7810,
38
+ SX126X_BW_10420,
39
+ SX126X_BW_15630,
40
+ SX126X_BW_20830,
41
+ SX126X_BW_31250,
42
+ SX126X_BW_41670,
43
+ SX126X_BW_62500,
44
+ SX126X_BW_125000,
45
+ SX126X_BW_250000,
46
+ SX126X_BW_500000,
47
+ };
48
+
49
+ enum class SX126xError { NONE = 0, TIMEOUT, INVALID_PARAMS };
50
+
51
+ class SX126xListener {
52
+ public:
53
+ virtual void on_packet(const std::vector<uint8_t> &packet, float rssi, float snr) = 0;
54
+ };
55
+
56
+ class SX126x : public Component,
57
+ public spi::SPIDevice<spi::BIT_ORDER_MSB_FIRST, spi::CLOCK_POLARITY_LOW, spi::CLOCK_PHASE_LEADING,
58
+ spi::DATA_RATE_8MHZ> {
59
+ public:
60
+ size_t get_max_packet_size();
61
+ float get_setup_priority() const override { return setup_priority::PROCESSOR; }
62
+ void setup() override;
63
+ void loop() override;
64
+ void dump_config() override;
65
+ void set_bandwidth(SX126xBw bandwidth) { this->bandwidth_ = bandwidth; }
66
+ void set_bitrate(uint32_t bitrate) { this->bitrate_ = bitrate; }
67
+ void set_busy_pin(InternalGPIOPin *busy_pin) { this->busy_pin_ = busy_pin; }
68
+ void set_coding_rate(uint8_t coding_rate) { this->coding_rate_ = coding_rate; }
69
+ void set_crc_enable(bool crc_enable) { this->crc_enable_ = crc_enable; }
70
+ void set_deviation(uint32_t deviation) { this->deviation_ = deviation; }
71
+ void set_dio1_pin(InternalGPIOPin *dio1_pin) { this->dio1_pin_ = dio1_pin; }
72
+ void set_frequency(uint32_t frequency) { this->frequency_ = frequency; }
73
+ void set_hw_version(const std::string &hw_version) { this->hw_version_ = hw_version; }
74
+ void set_mode_rx();
75
+ void set_mode_tx();
76
+ void set_mode_standby(SX126xStandbyMode mode);
77
+ void set_mode_sleep();
78
+ void set_modulation(uint8_t modulation) { this->modulation_ = modulation; }
79
+ void set_pa_power(int8_t power) { this->pa_power_ = power; }
80
+ void set_pa_ramp(uint8_t ramp) { this->pa_ramp_ = ramp; }
81
+ void set_payload_length(uint8_t payload_length) { this->payload_length_ = payload_length; }
82
+ void set_preamble_detect(uint16_t preamble_detect) { this->preamble_detect_ = preamble_detect; }
83
+ void set_preamble_size(uint16_t preamble_size) { this->preamble_size_ = preamble_size; }
84
+ void set_rst_pin(InternalGPIOPin *rst_pin) { this->rst_pin_ = rst_pin; }
85
+ void set_rx_start(bool rx_start) { this->rx_start_ = rx_start; }
86
+ void set_rf_switch(bool rf_switch) { this->rf_switch_ = rf_switch; }
87
+ void set_shaping(uint8_t shaping) { this->shaping_ = shaping; }
88
+ void set_spreading_factor(uint8_t spreading_factor) { this->spreading_factor_ = spreading_factor; }
89
+ void set_sync_value(const std::vector<uint8_t> &sync_value) { this->sync_value_ = sync_value; }
90
+ void set_tcxo_voltage(uint8_t tcxo_voltage) { this->tcxo_voltage_ = tcxo_voltage; }
91
+ void set_tcxo_delay(uint32_t tcxo_delay) { this->tcxo_delay_ = tcxo_delay; }
92
+ void run_image_cal();
93
+ void configure();
94
+ SX126xError transmit_packet(const std::vector<uint8_t> &packet);
95
+ void register_listener(SX126xListener *listener) { this->listeners_.push_back(listener); }
96
+ Trigger<std::vector<uint8_t>, float, float> *get_packet_trigger() const { return this->packet_trigger_; };
97
+
98
+ protected:
99
+ void configure_fsk_ook_();
100
+ void configure_lora_();
101
+ void set_packet_params_(uint8_t payload_length);
102
+ uint8_t read_fifo_(uint8_t offset, std::vector<uint8_t> &packet);
103
+ void write_fifo_(uint8_t offset, const std::vector<uint8_t> &packet);
104
+ void write_opcode_(uint8_t opcode, uint8_t *data, uint8_t size);
105
+ uint8_t read_opcode_(uint8_t opcode, uint8_t *data, uint8_t size);
106
+ void write_register_(uint16_t reg, uint8_t *data, uint8_t size);
107
+ void read_register_(uint16_t reg, uint8_t *data, uint8_t size);
108
+ void call_listeners_(const std::vector<uint8_t> &packet, float rssi, float snr);
109
+ void wait_busy_();
110
+ Trigger<std::vector<uint8_t>, float, float> *packet_trigger_{new Trigger<std::vector<uint8_t>, float, float>()};
111
+ std::vector<SX126xListener *> listeners_;
112
+ std::vector<uint8_t> packet_;
113
+ std::vector<uint8_t> sync_value_;
114
+ InternalGPIOPin *busy_pin_{nullptr};
115
+ InternalGPIOPin *dio1_pin_{nullptr};
116
+ InternalGPIOPin *rst_pin_{nullptr};
117
+ std::string hw_version_;
118
+ char version_[16];
119
+ SX126xBw bandwidth_{SX126X_BW_125000};
120
+ uint32_t bitrate_{0};
121
+ uint32_t deviation_{0};
122
+ uint32_t frequency_{0};
123
+ uint32_t payload_length_{0};
124
+ uint32_t tcxo_delay_{0};
125
+ uint16_t preamble_detect_{0};
126
+ uint16_t preamble_size_{0};
127
+ uint8_t tcxo_voltage_{0};
128
+ uint8_t coding_rate_{0};
129
+ uint8_t modulation_{PACKET_TYPE_LORA};
130
+ uint8_t pa_ramp_{0};
131
+ uint8_t shaping_{0};
132
+ uint8_t spreading_factor_{0};
133
+ int8_t pa_power_{0};
134
+ bool crc_enable_{false};
135
+ bool rx_start_{false};
136
+ bool rf_switch_{false};
137
+ };
138
+
139
+ } // namespace sx126x
140
+ } // namespace esphome
@@ -0,0 +1,163 @@
1
+ #pragma once
2
+
3
+ #include "esphome/core/hal.h"
4
+
5
+ namespace esphome {
6
+ namespace sx126x {
7
+
8
+ static const uint32_t XTAL_FREQ = 32000000;
9
+
10
+ enum SX126xOpCode : uint8_t {
11
+ RADIO_GET_STATUS = 0xC0,
12
+ RADIO_WRITE_REGISTER = 0x0D,
13
+ RADIO_READ_REGISTER = 0x1D,
14
+ RADIO_WRITE_BUFFER = 0x0E,
15
+ RADIO_READ_BUFFER = 0x1E,
16
+ RADIO_SET_SLEEP = 0x84,
17
+ RADIO_SET_STANDBY = 0x80,
18
+ RADIO_SET_FS = 0xC1,
19
+ RADIO_SET_TX = 0x83,
20
+ RADIO_SET_RX = 0x82,
21
+ RADIO_SET_RXDUTYCYCLE = 0x94,
22
+ RADIO_SET_CAD = 0xC5,
23
+ RADIO_SET_TXCONTINUOUSWAVE = 0xD1,
24
+ RADIO_SET_TXCONTINUOUSPREAMBLE = 0xD2,
25
+ RADIO_SET_PACKETTYPE = 0x8A,
26
+ RADIO_GET_PACKETTYPE = 0x11,
27
+ RADIO_SET_RFFREQUENCY = 0x86,
28
+ RADIO_SET_TXPARAMS = 0x8E,
29
+ RADIO_SET_PACONFIG = 0x95,
30
+ RADIO_SET_CADPARAMS = 0x88,
31
+ RADIO_SET_BUFFERBASEADDRESS = 0x8F,
32
+ RADIO_SET_MODULATIONPARAMS = 0x8B,
33
+ RADIO_SET_PACKETPARAMS = 0x8C,
34
+ RADIO_GET_RXBUFFERSTATUS = 0x13,
35
+ RADIO_GET_PACKETSTATUS = 0x14,
36
+ RADIO_GET_RSSIINST = 0x15,
37
+ RADIO_GET_STATS = 0x10,
38
+ RADIO_RESET_STATS = 0x00,
39
+ RADIO_SET_DIOIRQPARAMS = 0x08,
40
+ RADIO_GET_IRQSTATUS = 0x12,
41
+ RADIO_CLR_IRQSTATUS = 0x02,
42
+ RADIO_CALIBRATE = 0x89,
43
+ RADIO_CALIBRATEIMAGE = 0x98,
44
+ RADIO_SET_REGULATORMODE = 0x96,
45
+ RADIO_GET_ERROR = 0x17,
46
+ RADIO_CLR_ERROR = 0x07,
47
+ RADIO_SET_TCXOMODE = 0x97,
48
+ RADIO_SET_TXFALLBACKMODE = 0x93,
49
+ RADIO_SET_RFSWITCHMODE = 0x9D,
50
+ RADIO_SET_STOPRXTIMERONPREAMBLE = 0x9F,
51
+ RADIO_SET_LORASYMBTIMEOUT = 0xA0,
52
+ };
53
+
54
+ enum SX126xRegister : uint16_t {
55
+ REG_VERSION_STRING = 0x0320,
56
+ REG_GFSK_SYNCWORD = 0x06C0,
57
+ REG_LORA_SYNCWORD = 0x0740,
58
+ REG_OCP = 0x08E7,
59
+ };
60
+
61
+ enum SX126xStandbyMode : uint8_t {
62
+ STDBY_RC = 0x00,
63
+ STDBY_XOSC = 0x01,
64
+ };
65
+
66
+ enum SX126xPacketType : uint8_t {
67
+ PACKET_TYPE_GFSK = 0x00,
68
+ PACKET_TYPE_LORA = 0x01,
69
+ PACKET_TYPE_LRHSS = 0x03,
70
+ };
71
+
72
+ enum SX126xFskBw : uint8_t {
73
+ FSK_BW_4800 = 0x1F,
74
+ FSK_BW_5800 = 0x17,
75
+ FSK_BW_7300 = 0x0F,
76
+ FSK_BW_9700 = 0x1E,
77
+ FSK_BW_11700 = 0x16,
78
+ FSK_BW_14600 = 0x0E,
79
+ FSK_BW_19500 = 0x1D,
80
+ FSK_BW_23400 = 0x15,
81
+ FSK_BW_29300 = 0x0D,
82
+ FSK_BW_39000 = 0x1C,
83
+ FSK_BW_46900 = 0x14,
84
+ FSK_BW_58600 = 0x0C,
85
+ FSK_BW_78200 = 0x1B,
86
+ FSK_BW_93800 = 0x13,
87
+ FSK_BW_117300 = 0x0B,
88
+ FSK_BW_156200 = 0x1A,
89
+ FSK_BW_187200 = 0x12,
90
+ FSK_BW_234300 = 0x0A,
91
+ FSK_BW_312000 = 0x19,
92
+ FSK_BW_373600 = 0x11,
93
+ FSK_BW_467000 = 0x09,
94
+ };
95
+
96
+ enum SX126xLoraBw : uint8_t {
97
+ LORA_BW_7810 = 0x00,
98
+ LORA_BW_10420 = 0x08,
99
+ LORA_BW_15630 = 0x01,
100
+ LORA_BW_20830 = 0x09,
101
+ LORA_BW_31250 = 0x02,
102
+ LORA_BW_41670 = 0x0A,
103
+ LORA_BW_62500 = 0x03,
104
+ LORA_BW_125000 = 0x04,
105
+ LORA_BW_250000 = 0x05,
106
+ LORA_BW_500000 = 0x06,
107
+ };
108
+
109
+ enum SX126xLoraCr : uint8_t {
110
+ LORA_CR_4_5 = 0x01,
111
+ LORA_CR_4_6 = 0x02,
112
+ LORA_CR_4_7 = 0x03,
113
+ LORA_CR_4_8 = 0x04,
114
+ };
115
+
116
+ enum SX126xIrqMasks : uint16_t {
117
+ IRQ_RADIO_NONE = 0x0000,
118
+ IRQ_TX_DONE = 0x0001,
119
+ IRQ_RX_DONE = 0x0002,
120
+ IRQ_PREAMBLE_DETECTED = 0x0004,
121
+ IRQ_SYNCWORD_VALID = 0x0008,
122
+ IRQ_HEADER_VALID = 0x0010,
123
+ IRQ_HEADER_ERROR = 0x0020,
124
+ IRQ_CRC_ERROR = 0x0040,
125
+ IRQ_CAD_DONE = 0x0080,
126
+ IRQ_CAD_ACTIVITY_DETECTED = 0x0100,
127
+ IRQ_RX_TX_TIMEOUT = 0x0200,
128
+ IRQ_RADIO_ALL = 0xFFFF,
129
+ };
130
+
131
+ enum SX126xTcxoCtrl : uint8_t {
132
+ TCXO_CTRL_1_6V = 0x00,
133
+ TCXO_CTRL_1_7V = 0x01,
134
+ TCXO_CTRL_1_8V = 0x02,
135
+ TCXO_CTRL_2_2V = 0x03,
136
+ TCXO_CTRL_2_4V = 0x04,
137
+ TCXO_CTRL_2_7V = 0x05,
138
+ TCXO_CTRL_3_0V = 0x06,
139
+ TCXO_CTRL_3_3V = 0x07,
140
+ TCXO_CTRL_NONE = 0xFF,
141
+ };
142
+
143
+ enum SX126xPulseShape : uint8_t {
144
+ NO_FILTER = 0x00,
145
+ GAUSSIAN_BT_0_3 = 0x08,
146
+ GAUSSIAN_BT_0_5 = 0x09,
147
+ GAUSSIAN_BT_0_7 = 0x0A,
148
+ GAUSSIAN_BT_1_0 = 0x0B,
149
+ };
150
+
151
+ enum SX126xRampTime : uint8_t {
152
+ PA_RAMP_10 = 0x00,
153
+ PA_RAMP_20 = 0x01,
154
+ PA_RAMP_40 = 0x02,
155
+ PA_RAMP_80 = 0x03,
156
+ PA_RAMP_200 = 0x04,
157
+ PA_RAMP_800 = 0x05,
158
+ PA_RAMP_1700 = 0x06,
159
+ PA_RAMP_3400 = 0x07,
160
+ };
161
+
162
+ } // namespace sx126x
163
+ } // namespace esphome
@@ -0,0 +1,325 @@
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_DATA, CONF_FREQUENCY, CONF_ID
6
+
7
+ MULTI_CONF = True
8
+ CODEOWNERS = ["@swoboda1337"]
9
+ DEPENDENCIES = ["spi"]
10
+
11
+ CONF_SX127X_ID = "sx127x_id"
12
+
13
+ CONF_AUTO_CAL = "auto_cal"
14
+ CONF_BANDWIDTH = "bandwidth"
15
+ CONF_BITRATE = "bitrate"
16
+ CONF_BITSYNC = "bitsync"
17
+ CONF_CODING_RATE = "coding_rate"
18
+ CONF_CRC_ENABLE = "crc_enable"
19
+ CONF_DEVIATION = "deviation"
20
+ CONF_DIO0_PIN = "dio0_pin"
21
+ CONF_MODULATION = "modulation"
22
+ CONF_ON_PACKET = "on_packet"
23
+ CONF_PA_PIN = "pa_pin"
24
+ CONF_PA_POWER = "pa_power"
25
+ CONF_PA_RAMP = "pa_ramp"
26
+ CONF_PACKET_MODE = "packet_mode"
27
+ CONF_PAYLOAD_LENGTH = "payload_length"
28
+ CONF_PREAMBLE_DETECT = "preamble_detect"
29
+ CONF_PREAMBLE_ERRORS = "preamble_errors"
30
+ CONF_PREAMBLE_POLARITY = "preamble_polarity"
31
+ CONF_PREAMBLE_SIZE = "preamble_size"
32
+ CONF_RST_PIN = "rst_pin"
33
+ CONF_RX_FLOOR = "rx_floor"
34
+ CONF_RX_START = "rx_start"
35
+ CONF_SHAPING = "shaping"
36
+ CONF_SPREADING_FACTOR = "spreading_factor"
37
+ CONF_SYNC_VALUE = "sync_value"
38
+
39
+ sx127x_ns = cg.esphome_ns.namespace("sx127x")
40
+ SX127x = sx127x_ns.class_("SX127x", cg.Component, spi.SPIDevice)
41
+ SX127xListener = sx127x_ns.class_("SX127xListener")
42
+ SX127xBw = sx127x_ns.enum("SX127xBw")
43
+ SX127xOpMode = sx127x_ns.enum("SX127xOpMode")
44
+ SX127xPaConfig = sx127x_ns.enum("SX127xPaConfig")
45
+ SX127xPaRamp = sx127x_ns.enum("SX127xPaRamp")
46
+ SX127xModemCfg1 = sx127x_ns.enum("SX127xModemCfg1")
47
+
48
+ BW = {
49
+ "2_6kHz": SX127xBw.SX127X_BW_2_6,
50
+ "3_1kHz": SX127xBw.SX127X_BW_3_1,
51
+ "3_9kHz": SX127xBw.SX127X_BW_3_9,
52
+ "5_2kHz": SX127xBw.SX127X_BW_5_2,
53
+ "6_3kHz": SX127xBw.SX127X_BW_6_3,
54
+ "7_8kHz": SX127xBw.SX127X_BW_7_8,
55
+ "10_4kHz": SX127xBw.SX127X_BW_10_4,
56
+ "12_5kHz": SX127xBw.SX127X_BW_12_5,
57
+ "15_6kHz": SX127xBw.SX127X_BW_15_6,
58
+ "20_8kHz": SX127xBw.SX127X_BW_20_8,
59
+ "25_0kHz": SX127xBw.SX127X_BW_25_0,
60
+ "31_3kHz": SX127xBw.SX127X_BW_31_3,
61
+ "41_7kHz": SX127xBw.SX127X_BW_41_7,
62
+ "50_0kHz": SX127xBw.SX127X_BW_50_0,
63
+ "62_5kHz": SX127xBw.SX127X_BW_62_5,
64
+ "83_3kHz": SX127xBw.SX127X_BW_83_3,
65
+ "100_0kHz": SX127xBw.SX127X_BW_100_0,
66
+ "125_0kHz": SX127xBw.SX127X_BW_125_0,
67
+ "166_7kHz": SX127xBw.SX127X_BW_166_7,
68
+ "200_0kHz": SX127xBw.SX127X_BW_200_0,
69
+ "250_0kHz": SX127xBw.SX127X_BW_250_0,
70
+ "500_0kHz": SX127xBw.SX127X_BW_500_0,
71
+ }
72
+
73
+ CODING_RATE = {
74
+ "CR_4_5": SX127xModemCfg1.CODING_RATE_4_5,
75
+ "CR_4_6": SX127xModemCfg1.CODING_RATE_4_6,
76
+ "CR_4_7": SX127xModemCfg1.CODING_RATE_4_7,
77
+ "CR_4_8": SX127xModemCfg1.CODING_RATE_4_8,
78
+ }
79
+
80
+ MOD = {
81
+ "LORA": SX127xOpMode.MOD_LORA,
82
+ "FSK": SX127xOpMode.MOD_FSK,
83
+ "OOK": SX127xOpMode.MOD_OOK,
84
+ }
85
+
86
+ PA_PIN = {
87
+ "RFO": SX127xPaConfig.PA_PIN_RFO,
88
+ "BOOST": SX127xPaConfig.PA_PIN_BOOST,
89
+ }
90
+
91
+ RAMP = {
92
+ "10us": SX127xPaRamp.PA_RAMP_10,
93
+ "12us": SX127xPaRamp.PA_RAMP_12,
94
+ "15us": SX127xPaRamp.PA_RAMP_15,
95
+ "20us": SX127xPaRamp.PA_RAMP_20,
96
+ "25us": SX127xPaRamp.PA_RAMP_25,
97
+ "31us": SX127xPaRamp.PA_RAMP_31,
98
+ "40us": SX127xPaRamp.PA_RAMP_40,
99
+ "50us": SX127xPaRamp.PA_RAMP_50,
100
+ "62us": SX127xPaRamp.PA_RAMP_62,
101
+ "100us": SX127xPaRamp.PA_RAMP_100,
102
+ "125us": SX127xPaRamp.PA_RAMP_125,
103
+ "250us": SX127xPaRamp.PA_RAMP_250,
104
+ "500us": SX127xPaRamp.PA_RAMP_500,
105
+ "1000us": SX127xPaRamp.PA_RAMP_1000,
106
+ "2000us": SX127xPaRamp.PA_RAMP_2000,
107
+ "3400us": SX127xPaRamp.PA_RAMP_3400,
108
+ }
109
+
110
+ SHAPING = {
111
+ "CUTOFF_BR_X_2": SX127xPaRamp.CUTOFF_BR_X_2,
112
+ "CUTOFF_BR_X_1": SX127xPaRamp.CUTOFF_BR_X_1,
113
+ "GAUSSIAN_BT_0_3": SX127xPaRamp.GAUSSIAN_BT_0_3,
114
+ "GAUSSIAN_BT_0_5": SX127xPaRamp.GAUSSIAN_BT_0_5,
115
+ "GAUSSIAN_BT_1_0": SX127xPaRamp.GAUSSIAN_BT_1_0,
116
+ "NONE": SX127xPaRamp.SHAPING_NONE,
117
+ }
118
+
119
+ RunImageCalAction = sx127x_ns.class_(
120
+ "RunImageCalAction", automation.Action, cg.Parented.template(SX127x)
121
+ )
122
+ SendPacketAction = sx127x_ns.class_(
123
+ "SendPacketAction", automation.Action, cg.Parented.template(SX127x)
124
+ )
125
+ SetModeTxAction = sx127x_ns.class_(
126
+ "SetModeTxAction", automation.Action, cg.Parented.template(SX127x)
127
+ )
128
+ SetModeRxAction = sx127x_ns.class_(
129
+ "SetModeRxAction", automation.Action, cg.Parented.template(SX127x)
130
+ )
131
+ SetModeSleepAction = sx127x_ns.class_(
132
+ "SetModeSleepAction", automation.Action, cg.Parented.template(SX127x)
133
+ )
134
+ SetModeStandbyAction = sx127x_ns.class_(
135
+ "SetModeStandbyAction", automation.Action, cg.Parented.template(SX127x)
136
+ )
137
+
138
+
139
+ def validate_raw_data(value):
140
+ if isinstance(value, str):
141
+ return value.encode("utf-8")
142
+ if isinstance(value, list):
143
+ return cv.Schema([cv.hex_uint8_t])(value)
144
+ raise cv.Invalid(
145
+ "data must either be a string wrapped in quotes or a list of bytes"
146
+ )
147
+
148
+
149
+ def validate_config(config):
150
+ if config[CONF_MODULATION] == "LORA":
151
+ bws = [
152
+ "7_8kHz",
153
+ "10_4kHz",
154
+ "15_6kHz",
155
+ "20_8kHz",
156
+ "31_3kHz",
157
+ "41_7kHz",
158
+ "62_5kHz",
159
+ "125_0kHz",
160
+ "250_0kHz",
161
+ "500_0kHz",
162
+ ]
163
+ if config[CONF_BANDWIDTH] not in bws:
164
+ raise cv.Invalid(f"{config[CONF_BANDWIDTH]} is not available with LORA")
165
+ if CONF_DIO0_PIN not in config:
166
+ raise cv.Invalid("Cannot use LoRa without dio0_pin")
167
+ if config[CONF_PREAMBLE_SIZE] < 6:
168
+ raise cv.Invalid("Minimum 'preamble_size' is 6 with LORA")
169
+ if config[CONF_SPREADING_FACTOR] == 6 and config[CONF_PAYLOAD_LENGTH] == 0:
170
+ raise cv.Invalid("Payload length must be set when spreading factor is 6")
171
+ else:
172
+ if config[CONF_BANDWIDTH] == "500_0kHz":
173
+ raise cv.Invalid(f"{config[CONF_BANDWIDTH]} is only available with LORA")
174
+ if CONF_BITSYNC not in config:
175
+ raise cv.Invalid("Config 'bitsync' required with FSK/OOK")
176
+ if CONF_PACKET_MODE not in config:
177
+ raise cv.Invalid("Config 'packet_mode' required with FSK/OOK")
178
+ if config[CONF_PACKET_MODE] and CONF_DIO0_PIN not in config:
179
+ raise cv.Invalid("Config 'dio0_pin' required in packet mode")
180
+ if config[CONF_PAYLOAD_LENGTH] > 64:
181
+ raise cv.Invalid("Payload length must be <= 64 with FSK/OOK")
182
+ if config[CONF_PA_PIN] == "RFO" and config[CONF_PA_POWER] > 15:
183
+ raise cv.Invalid("PA power must be <= 15 dbm when using the RFO pin")
184
+ if config[CONF_PA_PIN] == "BOOST" and config[CONF_PA_POWER] < 2:
185
+ raise cv.Invalid("PA power must be >= 2 dbm when using the BOOST pin")
186
+ return config
187
+
188
+
189
+ CONFIG_SCHEMA = (
190
+ cv.Schema(
191
+ {
192
+ cv.GenerateID(): cv.declare_id(SX127x),
193
+ cv.Optional(CONF_AUTO_CAL, default=True): cv.boolean,
194
+ cv.Optional(CONF_BANDWIDTH, default="125_0kHz"): cv.enum(BW),
195
+ cv.Optional(CONF_BITRATE, default=4800): cv.int_range(min=500, max=300000),
196
+ cv.Optional(CONF_BITSYNC): cv.boolean,
197
+ cv.Optional(CONF_CODING_RATE, default="CR_4_5"): cv.enum(CODING_RATE),
198
+ cv.Optional(CONF_CRC_ENABLE, default=False): cv.boolean,
199
+ cv.Optional(CONF_DEVIATION, default=5000): cv.int_range(min=0, max=100000),
200
+ cv.Optional(CONF_DIO0_PIN): pins.internal_gpio_input_pin_schema,
201
+ cv.Required(CONF_FREQUENCY): cv.int_range(min=137000000, max=1020000000),
202
+ cv.Required(CONF_MODULATION): cv.enum(MOD),
203
+ cv.Optional(CONF_ON_PACKET): automation.validate_automation(single=True),
204
+ cv.Optional(CONF_PA_PIN, default="BOOST"): cv.enum(PA_PIN),
205
+ cv.Optional(CONF_PA_POWER, default=17): cv.int_range(min=0, max=17),
206
+ cv.Optional(CONF_PA_RAMP, default="40us"): cv.enum(RAMP),
207
+ cv.Optional(CONF_PACKET_MODE): cv.boolean,
208
+ cv.Optional(CONF_PAYLOAD_LENGTH, default=0): cv.int_range(min=0, max=256),
209
+ cv.Optional(CONF_PREAMBLE_DETECT, default=0): cv.int_range(min=0, max=3),
210
+ cv.Optional(CONF_PREAMBLE_ERRORS, default=0): cv.int_range(min=0, max=31),
211
+ cv.Optional(CONF_PREAMBLE_POLARITY, default=0xAA): cv.All(
212
+ cv.hex_int, cv.one_of(0xAA, 0x55)
213
+ ),
214
+ cv.Optional(CONF_PREAMBLE_SIZE, default=0): cv.int_range(min=0, max=65535),
215
+ cv.Required(CONF_RST_PIN): pins.internal_gpio_output_pin_schema,
216
+ cv.Optional(CONF_RX_FLOOR, default=-94): cv.float_range(min=-128, max=-1),
217
+ cv.Optional(CONF_RX_START, default=True): cv.boolean,
218
+ cv.Optional(CONF_SHAPING, default="NONE"): cv.enum(SHAPING),
219
+ cv.Optional(CONF_SPREADING_FACTOR, default=7): cv.int_range(min=6, max=12),
220
+ cv.Optional(CONF_SYNC_VALUE, default=[]): cv.ensure_list(cv.hex_uint8_t),
221
+ },
222
+ )
223
+ .extend(cv.COMPONENT_SCHEMA)
224
+ .extend(spi.spi_device_schema(True, 8e6, "mode0"))
225
+ .add_extra(validate_config)
226
+ )
227
+
228
+
229
+ async def to_code(config):
230
+ var = cg.new_Pvariable(config[CONF_ID])
231
+ await cg.register_component(var, config)
232
+ await spi.register_spi_device(var, config)
233
+ if CONF_ON_PACKET in config:
234
+ await automation.build_automation(
235
+ var.get_packet_trigger(),
236
+ [
237
+ (cg.std_vector.template(cg.uint8), "x"),
238
+ (cg.float_, "rssi"),
239
+ (cg.float_, "snr"),
240
+ ],
241
+ config[CONF_ON_PACKET],
242
+ )
243
+ if CONF_DIO0_PIN in config:
244
+ dio0_pin = await cg.gpio_pin_expression(config[CONF_DIO0_PIN])
245
+ cg.add(var.set_dio0_pin(dio0_pin))
246
+ rst_pin = await cg.gpio_pin_expression(config[CONF_RST_PIN])
247
+ cg.add(var.set_rst_pin(rst_pin))
248
+ cg.add(var.set_auto_cal(config[CONF_AUTO_CAL]))
249
+ cg.add(var.set_bandwidth(config[CONF_BANDWIDTH]))
250
+ cg.add(var.set_frequency(config[CONF_FREQUENCY]))
251
+ cg.add(var.set_deviation(config[CONF_DEVIATION]))
252
+ cg.add(var.set_modulation(config[CONF_MODULATION]))
253
+ if config[CONF_MODULATION] != "LORA":
254
+ cg.add(var.set_bitrate(config[CONF_BITRATE]))
255
+ cg.add(var.set_bitsync(config[CONF_BITSYNC]))
256
+ cg.add(var.set_packet_mode(config[CONF_PACKET_MODE]))
257
+ cg.add(var.set_pa_pin(config[CONF_PA_PIN]))
258
+ cg.add(var.set_pa_ramp(config[CONF_PA_RAMP]))
259
+ cg.add(var.set_pa_power(config[CONF_PA_POWER]))
260
+ cg.add(var.set_shaping(config[CONF_SHAPING]))
261
+ cg.add(var.set_crc_enable(config[CONF_CRC_ENABLE]))
262
+ cg.add(var.set_payload_length(config[CONF_PAYLOAD_LENGTH]))
263
+ cg.add(var.set_preamble_detect(config[CONF_PREAMBLE_DETECT]))
264
+ cg.add(var.set_preamble_size(config[CONF_PREAMBLE_SIZE]))
265
+ cg.add(var.set_preamble_polarity(config[CONF_PREAMBLE_POLARITY]))
266
+ cg.add(var.set_preamble_errors(config[CONF_PREAMBLE_ERRORS]))
267
+ cg.add(var.set_coding_rate(config[CONF_CODING_RATE]))
268
+ cg.add(var.set_spreading_factor(config[CONF_SPREADING_FACTOR]))
269
+ cg.add(var.set_sync_value(config[CONF_SYNC_VALUE]))
270
+ cg.add(var.set_rx_floor(config[CONF_RX_FLOOR]))
271
+ cg.add(var.set_rx_start(config[CONF_RX_START]))
272
+
273
+
274
+ NO_ARGS_ACTION_SCHEMA = automation.maybe_simple_id(
275
+ {
276
+ cv.GenerateID(): cv.use_id(SX127x),
277
+ }
278
+ )
279
+
280
+
281
+ @automation.register_action(
282
+ "sx127x.run_image_cal", RunImageCalAction, NO_ARGS_ACTION_SCHEMA
283
+ )
284
+ @automation.register_action(
285
+ "sx127x.set_mode_tx", SetModeTxAction, NO_ARGS_ACTION_SCHEMA
286
+ )
287
+ @automation.register_action(
288
+ "sx127x.set_mode_rx", SetModeRxAction, NO_ARGS_ACTION_SCHEMA
289
+ )
290
+ @automation.register_action(
291
+ "sx127x.set_mode_sleep", SetModeSleepAction, NO_ARGS_ACTION_SCHEMA
292
+ )
293
+ @automation.register_action(
294
+ "sx127x.set_mode_standby", SetModeStandbyAction, NO_ARGS_ACTION_SCHEMA
295
+ )
296
+ async def no_args_action_to_code(config, action_id, template_arg, args):
297
+ var = cg.new_Pvariable(action_id, template_arg)
298
+ await cg.register_parented(var, config[CONF_ID])
299
+ return var
300
+
301
+
302
+ SEND_PACKET_ACTION_SCHEMA = cv.maybe_simple_value(
303
+ {
304
+ cv.GenerateID(): cv.use_id(SX127x),
305
+ cv.Required(CONF_DATA): cv.templatable(validate_raw_data),
306
+ },
307
+ key=CONF_DATA,
308
+ )
309
+
310
+
311
+ @automation.register_action(
312
+ "sx127x.send_packet", SendPacketAction, SEND_PACKET_ACTION_SCHEMA
313
+ )
314
+ async def send_packet_action_to_code(config, action_id, template_arg, args):
315
+ var = cg.new_Pvariable(action_id, template_arg)
316
+ await cg.register_parented(var, config[CONF_ID])
317
+ data = config[CONF_DATA]
318
+ if isinstance(data, bytes):
319
+ data = list(data)
320
+ if cg.is_template(data):
321
+ templ = await cg.templatable(data, args, cg.std_vector.template(cg.uint8))
322
+ cg.add(var.set_data_template(templ))
323
+ else:
324
+ cg.add(var.set_data_static(data))
325
+ 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/sx127x/sx127x.h"
6
+
7
+ namespace esphome {
8
+ namespace sx127x {
9
+
10
+ template<typename... Ts> class RunImageCalAction : public Action<Ts...>, public Parented<SX127x> {
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<SX127x> {
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<SX127x> {
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<SX127x> {
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<SX127x> {
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<SX127x> {
57
+ public:
58
+ void play(Ts... x) override { this->parent_->set_mode_standby(); }
59
+ };
60
+
61
+ } // namespace sx127x
62
+ } // namespace esphome