esphome 2024.7.3__py3-none-any.whl → 2024.8.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (350) hide show
  1. esphome/__main__.py +15 -81
  2. esphome/automation.py +1 -1
  3. esphome/codegen.py +53 -53
  4. esphome/components/ade7953/sensor.py +1 -1
  5. esphome/components/ade7953_spi/ade7953_spi.cpp +1 -1
  6. esphome/components/airthings_wave_plus/airthings_wave_plus.cpp +5 -2
  7. esphome/components/airthings_wave_plus/airthings_wave_plus.h +2 -0
  8. esphome/components/airthings_wave_plus/sensor.py +12 -0
  9. esphome/components/alarm_control_panel/__init__.py +75 -66
  10. esphome/components/apds9306/__init__.py +4 -0
  11. esphome/components/apds9306/apds9306.cpp +151 -0
  12. esphome/components/apds9306/apds9306.h +66 -0
  13. esphome/components/apds9306/sensor.py +95 -0
  14. esphome/components/api/__init__.py +80 -52
  15. esphome/components/api/api_connection.cpp +14 -1
  16. esphome/components/api/api_pb2.cpp +33 -4
  17. esphome/components/api/api_pb2.h +8 -1
  18. esphome/components/api/api_server.cpp +10 -0
  19. esphome/components/api/api_server.h +3 -0
  20. esphome/components/atm90e32/__init__.py +7 -0
  21. esphome/components/atm90e32/atm90e32.cpp +68 -16
  22. esphome/components/atm90e32/atm90e32.h +20 -7
  23. esphome/components/atm90e32/atm90e32_reg.h +2 -0
  24. esphome/components/atm90e32/button/__init__.py +43 -0
  25. esphome/components/atm90e32/button/atm90e32_button.cpp +20 -0
  26. esphome/components/atm90e32/button/atm90e32_button.h +27 -0
  27. esphome/components/atm90e32/sensor.py +15 -11
  28. esphome/components/bedjet/bedjet_codec.h +1 -1
  29. esphome/components/binary/light/binary_light_output.h +3 -2
  30. esphome/components/binary_sensor/__init__.py +5 -5
  31. esphome/components/ble_client/__init__.py +3 -3
  32. esphome/components/ble_client/output/__init__.py +1 -1
  33. esphome/components/ble_client/sensor/__init__.py +4 -3
  34. esphome/components/ble_client/switch/__init__.py +2 -1
  35. esphome/components/ble_client/text_sensor/__init__.py +4 -3
  36. esphome/components/ble_presence/binary_sensor.py +3 -3
  37. esphome/components/ble_rssi/sensor.py +2 -2
  38. esphome/components/ble_scanner/text_sensor.py +1 -1
  39. esphome/components/bluetooth_proxy/__init__.py +3 -3
  40. esphome/components/bme68x_bsec2/__init__.py +196 -0
  41. esphome/components/bme68x_bsec2/bme68x_bsec2.cpp +523 -0
  42. esphome/components/bme68x_bsec2/bme68x_bsec2.h +163 -0
  43. esphome/components/bme68x_bsec2/sensor.py +130 -0
  44. esphome/components/bme68x_bsec2/text_sensor.py +33 -0
  45. esphome/components/bme68x_bsec2_i2c/__init__.py +28 -0
  46. esphome/components/bme68x_bsec2_i2c/bme68x_bsec2_i2c.cpp +53 -0
  47. esphome/components/bme68x_bsec2_i2c/bme68x_bsec2_i2c.h +28 -0
  48. esphome/components/bmp3xx/sensor.py +1 -1
  49. esphome/components/button/__init__.py +4 -4
  50. esphome/components/climate/__init__.py +5 -5
  51. esphome/components/climate/climate.h +1 -1
  52. esphome/components/cover/__init__.py +8 -8
  53. esphome/components/cst226/touchscreen/cst226_touchscreen.cpp +11 -7
  54. esphome/components/cst226/touchscreen/cst226_touchscreen.h +1 -1
  55. esphome/components/datetime/__init__.py +11 -13
  56. esphome/components/demo/demo_sensor.h +3 -2
  57. esphome/components/display/display.cpp +31 -0
  58. esphome/components/display/display.h +3 -0
  59. esphome/components/display_menu_base/__init__.py +14 -13
  60. esphome/components/ens160/sensor.py +1 -1
  61. esphome/components/esp32/__init__.py +22 -10
  62. esphome/components/esp32/boards.py +1 -1
  63. esphome/components/esp32/gpio.py +12 -13
  64. esphome/components/esp32/gpio_esp32.py +1 -2
  65. esphome/components/esp32/gpio_esp32_c2.py +1 -2
  66. esphome/components/esp32/gpio_esp32_c3.py +1 -5
  67. esphome/components/esp32/gpio_esp32_c6.py +1 -2
  68. esphome/components/esp32/gpio_esp32_h2.py +1 -2
  69. esphome/components/esp32/gpio_esp32_s2.py +1 -2
  70. esphome/components/esp32/gpio_esp32_s3.py +1 -6
  71. esphome/components/esp32_ble/__init__.py +20 -3
  72. esphome/components/esp32_ble/ble.cpp +9 -1
  73. esphome/components/esp32_ble/ble.h +9 -0
  74. esphome/components/esp32_ble/ble_advertising.cpp +42 -9
  75. esphome/components/esp32_ble/ble_advertising.h +21 -1
  76. esphome/components/esp32_ble_beacon/__init__.py +17 -7
  77. esphome/components/esp32_ble_beacon/esp32_ble_beacon.cpp +45 -113
  78. esphome/components/esp32_ble_beacon/esp32_ble_beacon.h +17 -19
  79. esphome/components/esp32_ble_client/__init__.py +0 -1
  80. esphome/components/esp32_ble_server/__init__.py +2 -3
  81. esphome/components/esp32_ble_tracker/__init__.py +2 -2
  82. esphome/components/esp32_improv/__init__.py +2 -4
  83. esphome/components/ethernet/__init__.py +17 -17
  84. esphome/components/ethernet_info/text_sensor.py +2 -2
  85. esphome/components/event/__init__.py +5 -5
  86. esphome/components/fan/__init__.py +14 -14
  87. esphome/components/fan/fan.cpp +2 -2
  88. esphome/components/fingerprint_grow/fingerprint_grow.cpp +1 -1
  89. esphome/components/fingerprint_grow/fingerprint_grow.h +1 -1
  90. esphome/components/graphical_display_menu/__init__.py +11 -8
  91. esphome/components/haier/haier_base.h +2 -2
  92. esphome/components/homeassistant/__init__.py +8 -1
  93. esphome/components/homeassistant/number/__init__.py +33 -0
  94. esphome/components/homeassistant/number/homeassistant_number.cpp +100 -0
  95. esphome/components/homeassistant/number/homeassistant_number.h +31 -0
  96. esphome/components/homeassistant/switch/__init__.py +30 -0
  97. esphome/components/homeassistant/switch/homeassistant_switch.cpp +59 -0
  98. esphome/components/homeassistant/switch/homeassistant_switch.h +22 -0
  99. esphome/components/host/__init__.py +3 -7
  100. esphome/components/http_request/__init__.py +12 -1
  101. esphome/components/http_request/http_request_arduino.cpp +2 -2
  102. esphome/components/http_request/http_request_idf.cpp +11 -2
  103. esphome/components/http_request/http_request_idf.h +10 -0
  104. esphome/components/http_request/ota/ota_http_request.cpp +1 -1
  105. esphome/components/http_request/update/http_request_update.cpp +2 -2
  106. esphome/components/http_request/update/http_request_update.h +2 -1
  107. esphome/components/hx711/hx711.cpp +10 -1
  108. esphome/components/hydreon_rgxx/hydreon_rgxx.cpp +1 -1
  109. esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +11 -2
  110. esphome/components/i2s_audio/speaker/i2s_audio_speaker.h +2 -0
  111. esphome/components/ili9xxx/ili9xxx_defines.h +3 -1
  112. esphome/components/ili9xxx/ili9xxx_display.cpp +9 -22
  113. esphome/components/ili9xxx/ili9xxx_display.h +5 -7
  114. esphome/components/ili9xxx/ili9xxx_init.h +4 -4
  115. esphome/components/improv_base/__init__.py +2 -3
  116. esphome/components/improv_serial/__init__.py +4 -10
  117. esphome/components/improv_serial/improv_serial_component.cpp +4 -0
  118. esphome/components/jsn_sr04t/jsn_sr04t.cpp +18 -1
  119. esphome/components/jsn_sr04t/jsn_sr04t.h +7 -1
  120. esphome/components/jsn_sr04t/sensor.py +13 -0
  121. esphome/components/kalman_combinator/sensor.py +1 -1
  122. esphome/components/light/__init__.py +16 -15
  123. esphome/components/light/addressable_light_effect.h +12 -8
  124. esphome/components/light/automation.h +16 -1
  125. esphome/components/light/automation.py +21 -0
  126. esphome/components/light/base_light_effects.h +5 -5
  127. esphome/components/light/esp_color_correction.h +8 -8
  128. esphome/components/light/types.py +7 -0
  129. esphome/components/lock/__init__.py +3 -3
  130. esphome/components/logger/__init__.py +15 -18
  131. esphome/components/lvgl/__init__.py +346 -0
  132. esphome/components/lvgl/automation.py +226 -0
  133. esphome/components/lvgl/binary_sensor/__init__.py +43 -0
  134. esphome/components/lvgl/defines.py +508 -0
  135. esphome/components/lvgl/encoders.py +77 -0
  136. esphome/components/lvgl/font.cpp +76 -0
  137. esphome/components/lvgl/helpers.py +49 -0
  138. esphome/components/lvgl/light/__init__.py +32 -0
  139. esphome/components/lvgl/light/lvgl_light.h +48 -0
  140. esphome/components/lvgl/lv_validation.py +303 -0
  141. esphome/components/lvgl/lvcode.py +349 -0
  142. esphome/components/lvgl/lvgl_esphome.cpp +407 -0
  143. esphome/components/lvgl/lvgl_esphome.h +274 -0
  144. esphome/components/lvgl/lvgl_hal.h +21 -0
  145. esphome/components/lvgl/number/__init__.py +66 -0
  146. esphome/components/lvgl/number/lvgl_number.h +34 -0
  147. esphome/components/lvgl/schemas.py +436 -0
  148. esphome/components/lvgl/select/__init__.py +55 -0
  149. esphome/components/lvgl/select/lvgl_select.h +62 -0
  150. esphome/components/lvgl/sensor/__init__.py +47 -0
  151. esphome/components/lvgl/styles.py +58 -0
  152. esphome/components/lvgl/switch/__init__.py +56 -0
  153. esphome/components/lvgl/switch/lvgl_switch.h +34 -0
  154. esphome/components/lvgl/text/__init__.py +50 -0
  155. esphome/components/lvgl/text/lvgl_text.h +34 -0
  156. esphome/components/lvgl/text_sensor/__init__.py +42 -0
  157. esphome/components/lvgl/touchscreens.py +45 -0
  158. esphome/components/lvgl/trigger.py +74 -0
  159. esphome/components/lvgl/types.py +191 -0
  160. esphome/components/lvgl/widgets/__init__.py +419 -0
  161. esphome/components/lvgl/widgets/animimg.py +117 -0
  162. esphome/components/lvgl/widgets/arc.py +78 -0
  163. esphome/components/lvgl/widgets/button.py +20 -0
  164. esphome/components/lvgl/widgets/buttonmatrix.py +275 -0
  165. esphome/components/lvgl/widgets/checkbox.py +27 -0
  166. esphome/components/lvgl/widgets/dropdown.py +76 -0
  167. esphome/components/lvgl/widgets/img.py +85 -0
  168. esphome/components/lvgl/widgets/keyboard.py +49 -0
  169. esphome/components/lvgl/widgets/label.py +42 -0
  170. esphome/components/lvgl/widgets/led.py +29 -0
  171. esphome/components/lvgl/widgets/line.py +50 -0
  172. esphome/components/lvgl/widgets/lv_bar.py +55 -0
  173. esphome/components/lvgl/widgets/meter.py +302 -0
  174. esphome/components/lvgl/widgets/msgbox.py +134 -0
  175. esphome/components/lvgl/widgets/obj.py +28 -0
  176. esphome/components/lvgl/widgets/page.py +113 -0
  177. esphome/components/lvgl/widgets/roller.py +77 -0
  178. esphome/components/lvgl/widgets/slider.py +63 -0
  179. esphome/components/lvgl/widgets/spinbox.py +178 -0
  180. esphome/components/lvgl/widgets/spinner.py +43 -0
  181. esphome/components/lvgl/widgets/switch.py +20 -0
  182. esphome/components/lvgl/widgets/tabview.py +114 -0
  183. esphome/components/lvgl/widgets/textarea.py +66 -0
  184. esphome/components/lvgl/widgets/tileview.py +128 -0
  185. esphome/components/m5stack_8angle/__init__.py +33 -0
  186. esphome/components/m5stack_8angle/binary_sensor/__init__.py +30 -0
  187. esphome/components/m5stack_8angle/binary_sensor/m5stack_8angle_binary_sensor.cpp +17 -0
  188. esphome/components/m5stack_8angle/binary_sensor/m5stack_8angle_binary_sensor.h +19 -0
  189. esphome/components/m5stack_8angle/light/__init__.py +31 -0
  190. esphome/components/m5stack_8angle/light/m5stack_8angle_light.cpp +45 -0
  191. esphome/components/m5stack_8angle/light/m5stack_8angle_light.h +37 -0
  192. esphome/components/m5stack_8angle/m5stack_8angle.cpp +74 -0
  193. esphome/components/m5stack_8angle/m5stack_8angle.h +34 -0
  194. esphome/components/m5stack_8angle/sensor/__init__.py +66 -0
  195. esphome/components/m5stack_8angle/sensor/m5stack_8angle_sensor.cpp +24 -0
  196. esphome/components/m5stack_8angle/sensor/m5stack_8angle_sensor.h +27 -0
  197. esphome/components/matrix_keypad/matrix_keypad.cpp +2 -0
  198. esphome/components/max31856/sensor.py +5 -5
  199. esphome/components/media_player/__init__.py +3 -5
  200. esphome/components/media_player/automation.h +31 -27
  201. esphome/components/micro_wake_word/__init__.py +20 -25
  202. esphome/components/microphone/microphone.h +4 -1
  203. esphome/components/modbus_controller/__init__.py +26 -2
  204. esphome/components/modbus_controller/automation.h +19 -0
  205. esphome/components/modbus_controller/const.py +1 -0
  206. esphome/components/modbus_controller/modbus_controller.cpp +8 -0
  207. esphome/components/modbus_controller/modbus_controller.h +3 -0
  208. esphome/components/mqtt/__init__.py +20 -9
  209. esphome/components/mqtt/mqtt_alarm_control_panel.cpp +128 -0
  210. esphome/components/mqtt/mqtt_alarm_control_panel.h +39 -0
  211. esphome/components/mqtt/mqtt_backend.h +3 -1
  212. esphome/components/mqtt/mqtt_backend_esp32.cpp +4 -1
  213. esphome/components/mqtt/mqtt_backend_esp32.h +3 -1
  214. esphome/components/mqtt/mqtt_backend_esp8266.h +3 -1
  215. esphome/components/mqtt/mqtt_backend_libretiny.h +3 -1
  216. esphome/components/mqtt/mqtt_client.cpp +16 -3
  217. esphome/components/mqtt/mqtt_client.h +5 -1
  218. esphome/components/mqtt/mqtt_component.cpp +32 -4
  219. esphome/components/mqtt/mqtt_const.h +2 -0
  220. esphome/components/network/__init__.py +15 -12
  221. esphome/components/network/ip_address.h +3 -0
  222. esphome/components/network/util.cpp +2 -1
  223. esphome/components/network/util.h +3 -1
  224. esphome/components/nextion/base_component.py +5 -8
  225. esphome/components/number/__init__.py +7 -8
  226. esphome/components/online_image/__init__.py +167 -0
  227. esphome/components/online_image/image_decoder.cpp +44 -0
  228. esphome/components/online_image/image_decoder.h +112 -0
  229. esphome/components/online_image/online_image.cpp +283 -0
  230. esphome/components/online_image/online_image.h +195 -0
  231. esphome/components/online_image/png_image.cpp +68 -0
  232. esphome/components/online_image/png_image.h +33 -0
  233. esphome/components/ota/__init__.py +8 -4
  234. esphome/components/pid/pid_climate.h +2 -0
  235. esphome/components/remote_base/pronto_protocol.cpp +0 -3
  236. esphome/components/remote_transmitter/remote_transmitter.h +1 -1
  237. esphome/components/rgbct/rgbct_light_output.h +3 -2
  238. esphome/components/rgbw/rgbw_light_output.h +3 -2
  239. esphome/components/rgbww/rgbww_light_output.h +3 -2
  240. esphome/components/rp2040_pio_led_strip/led_strip.cpp +31 -5
  241. esphome/components/rp2040_pio_led_strip/led_strip.h +5 -0
  242. esphome/components/rtttl/rtttl.cpp +108 -21
  243. esphome/components/rtttl/rtttl.h +15 -6
  244. esphome/components/select/__init__.py +7 -7
  245. esphome/components/sensor/__init__.py +29 -10
  246. esphome/components/sensor/filter.cpp +8 -0
  247. esphome/components/sensor/filter.h +9 -0
  248. esphome/components/sml/sml_parser.cpp +48 -22
  249. esphome/components/socket/socket.cpp +11 -14
  250. esphome/components/speaker/__init__.py +14 -5
  251. esphome/components/speaker/automation.h +10 -0
  252. esphome/components/speaker/speaker.h +9 -0
  253. esphome/components/spi/spi.cpp +0 -6
  254. esphome/components/spi/spi.h +2 -19
  255. esphome/components/spi_led_strip/spi_led_strip.h +5 -4
  256. esphome/components/sprinkler/sprinkler.cpp +2 -2
  257. esphome/components/sprinkler/sprinkler.h +1 -1
  258. esphome/components/switch/__init__.py +3 -3
  259. esphome/components/text/__init__.py +5 -5
  260. esphome/components/text_sensor/__init__.py +7 -7
  261. esphome/components/time/__init__.py +8 -8
  262. esphome/components/touchscreen/binary_sensor/__init__.py +24 -10
  263. esphome/components/touchscreen/binary_sensor/touchscreen_binary_sensor.cpp +3 -2
  264. esphome/components/touchscreen/binary_sensor/touchscreen_binary_sensor.h +4 -2
  265. esphome/components/uart/uart_component_host.cpp +6 -2
  266. esphome/components/update/__init__.py +33 -15
  267. esphome/components/update/automation.h +23 -0
  268. esphome/components/update/update_entity.h +3 -1
  269. esphome/components/valve/__init__.py +3 -3
  270. esphome/components/voice_assistant/__init__.py +7 -8
  271. esphome/components/wake_on_lan/wake_on_lan.cpp +2 -0
  272. esphome/components/wake_on_lan/wake_on_lan.h +3 -1
  273. esphome/components/watchdog/__init__.py +1 -0
  274. esphome/components/{http_request → watchdog}/watchdog.cpp +0 -2
  275. esphome/components/{http_request → watchdog}/watchdog.h +0 -2
  276. esphome/components/waveshare_epaper/waveshare_epaper.cpp +5 -5
  277. esphome/components/web_server/server_index_v3.h +3615 -3603
  278. esphome/components/web_server/web_server.cpp +0 -209
  279. esphome/components/web_server/web_server.h +1 -1
  280. esphome/components/web_server/web_server_v1.cpp +217 -0
  281. esphome/components/web_server_base/web_server_base.h +1 -0
  282. esphome/components/wifi/__init__.py +15 -14
  283. esphome/components/wifi/wifi_component.cpp +2 -0
  284. esphome/components/wifi/wifi_component.h +7 -1
  285. esphome/components/wifi/wifi_component_esp32_arduino.cpp +5 -2
  286. esphome/components/wifi/wifi_component_esp8266.cpp +2 -0
  287. esphome/components/wifi/wifi_component_esp_idf.cpp +43 -7
  288. esphome/components/wifi/wifi_component_libretiny.cpp +2 -0
  289. esphome/components/wifi/wifi_component_pico_w.cpp +2 -0
  290. esphome/components/wifi/wpa2_eap.py +6 -7
  291. esphome/components/wifi_info/text_sensor.py +3 -3
  292. esphome/components/wifi_info/wifi_info_text_sensor.cpp +2 -0
  293. esphome/components/wifi_info/wifi_info_text_sensor.h +2 -0
  294. esphome/components/wifi_signal/sensor.py +1 -1
  295. esphome/components/wifi_signal/wifi_signal_sensor.cpp +2 -0
  296. esphome/components/wifi_signal/wifi_signal_sensor.h +2 -1
  297. esphome/components/xiaomi_ble/xiaomi_ble.cpp +20 -3
  298. esphome/components/xiaomi_ble/xiaomi_ble.h +1 -0
  299. esphome/components/xiaomi_lywsd02mmc/__init__.py +0 -0
  300. esphome/components/xiaomi_lywsd02mmc/sensor.py +77 -0
  301. esphome/components/xiaomi_lywsd02mmc/xiaomi_lywsd02mmc.cpp +73 -0
  302. esphome/components/xiaomi_lywsd02mmc/xiaomi_lywsd02mmc.h +37 -0
  303. esphome/config.py +17 -19
  304. esphome/config_validation.py +55 -23
  305. esphome/const.py +25 -9
  306. esphome/core/__init__.py +17 -14
  307. esphome/core/application.h +42 -21
  308. esphome/core/automation.h +5 -3
  309. esphome/core/base_automation.h +3 -2
  310. esphome/core/bytebuffer.cpp +134 -0
  311. esphome/core/bytebuffer.h +96 -0
  312. esphome/core/color.h +24 -16
  313. esphome/core/config.py +3 -3
  314. esphome/core/defines.h +14 -1
  315. esphome/core/entity_base.h +2 -2
  316. esphome/core/entity_helpers.py +1 -2
  317. esphome/core/gpio.h +0 -18
  318. esphome/core/helpers.h +1 -1
  319. esphome/core/optional.h +15 -16
  320. esphome/coroutine.py +1 -1
  321. esphome/cpp_generator.py +1 -1
  322. esphome/cpp_helpers.py +3 -5
  323. esphome/dashboard/core.py +3 -3
  324. esphome/dashboard/dashboard.py +3 -3
  325. esphome/dashboard/entries.py +1 -1
  326. esphome/dashboard/util/file.py +1 -1
  327. esphome/dashboard/web_server.py +3 -3
  328. esphome/external_files.py +5 -3
  329. esphome/final_validate.py +2 -2
  330. esphome/git.py +4 -4
  331. esphome/helpers.py +5 -5
  332. esphome/loader.py +15 -10
  333. esphome/mqtt.py +4 -8
  334. esphome/pins.py +6 -6
  335. esphome/platformio_api.py +5 -5
  336. esphome/storage_json.py +2 -1
  337. esphome/types.py +1 -1
  338. esphome/util.py +2 -3
  339. esphome/voluptuous_schema.py +1 -0
  340. esphome/vscode.py +5 -4
  341. esphome/wizard.py +1 -1
  342. esphome/writer.py +7 -7
  343. esphome/yaml_util.py +3 -3
  344. esphome/zeroconf.py +1 -1
  345. {esphome-2024.7.3.dist-info → esphome-2024.8.0.dist-info}/METADATA +3 -3
  346. {esphome-2024.7.3.dist-info → esphome-2024.8.0.dist-info}/RECORD +350 -244
  347. {esphome-2024.7.3.dist-info → esphome-2024.8.0.dist-info}/LICENSE +0 -0
  348. {esphome-2024.7.3.dist-info → esphome-2024.8.0.dist-info}/WHEEL +0 -0
  349. {esphome-2024.7.3.dist-info → esphome-2024.8.0.dist-info}/entry_points.txt +0 -0
  350. {esphome-2024.7.3.dist-info → esphome-2024.8.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,19 @@
1
+ #pragma once
2
+
3
+ #include "esphome/components/binary_sensor/binary_sensor.h"
4
+ #include "esphome/core/component.h"
5
+
6
+ #include "../m5stack_8angle.h"
7
+
8
+ namespace esphome {
9
+ namespace m5stack_8angle {
10
+
11
+ class M5Stack8AngleSwitchBinarySensor : public binary_sensor::BinarySensor,
12
+ public PollingComponent,
13
+ public Parented<M5Stack8AngleComponent> {
14
+ public:
15
+ void update() override;
16
+ };
17
+
18
+ } // namespace m5stack_8angle
19
+ } // namespace esphome
@@ -0,0 +1,31 @@
1
+ import esphome.codegen as cg
2
+ import esphome.config_validation as cv
3
+ from esphome.components import light
4
+
5
+ from esphome.const import CONF_OUTPUT_ID
6
+
7
+ from .. import M5Stack8AngleComponent, m5stack_8angle_ns, CONF_M5STACK_8ANGLE_ID
8
+
9
+
10
+ M5Stack8AngleLightsComponent = m5stack_8angle_ns.class_(
11
+ "M5Stack8AngleLightOutput",
12
+ light.AddressableLight,
13
+ )
14
+
15
+
16
+ CONFIG_SCHEMA = cv.All(
17
+ light.ADDRESSABLE_LIGHT_SCHEMA.extend(
18
+ {
19
+ cv.GenerateID(CONF_M5STACK_8ANGLE_ID): cv.use_id(M5Stack8AngleComponent),
20
+ cv.GenerateID(CONF_OUTPUT_ID): cv.declare_id(M5Stack8AngleLightsComponent),
21
+ }
22
+ )
23
+ )
24
+
25
+
26
+ async def to_code(config):
27
+ hub = await cg.get_variable(config[CONF_M5STACK_8ANGLE_ID])
28
+ lights = cg.new_Pvariable(config[CONF_OUTPUT_ID])
29
+ await light.register_light(lights, config)
30
+ await cg.register_component(lights, config)
31
+ cg.add(lights.set_parent(hub))
@@ -0,0 +1,45 @@
1
+ #include "m5stack_8angle_light.h"
2
+
3
+ #include "esphome/core/log.h"
4
+
5
+ namespace esphome {
6
+ namespace m5stack_8angle {
7
+
8
+ static const char *const TAG = "m5stack_8angle.light";
9
+
10
+ void M5Stack8AngleLightOutput::setup() {
11
+ ExternalRAMAllocator<uint8_t> allocator(ExternalRAMAllocator<uint8_t>::ALLOW_FAILURE);
12
+ this->buf_ = allocator.allocate(M5STACK_8ANGLE_NUM_LEDS * M5STACK_8ANGLE_BYTES_PER_LED);
13
+ if (this->buf_ == nullptr) {
14
+ ESP_LOGE(TAG, "Failed to allocate buffer of size %u", M5STACK_8ANGLE_NUM_LEDS * M5STACK_8ANGLE_BYTES_PER_LED);
15
+ this->mark_failed();
16
+ return;
17
+ };
18
+ memset(this->buf_, 0xFF, M5STACK_8ANGLE_NUM_LEDS * M5STACK_8ANGLE_BYTES_PER_LED);
19
+
20
+ this->effect_data_ = allocator.allocate(M5STACK_8ANGLE_NUM_LEDS);
21
+ if (this->effect_data_ == nullptr) {
22
+ ESP_LOGE(TAG, "Failed to allocate effect data of size %u", M5STACK_8ANGLE_NUM_LEDS);
23
+ this->mark_failed();
24
+ return;
25
+ };
26
+ memset(this->effect_data_, 0x00, M5STACK_8ANGLE_NUM_LEDS);
27
+ }
28
+
29
+ void M5Stack8AngleLightOutput::write_state(light::LightState *state) {
30
+ for (int i = 0; i < M5STACK_8ANGLE_NUM_LEDS;
31
+ i++) { // write one LED at a time, otherwise the message will be truncated
32
+ this->parent_->write_register(M5STACK_8ANGLE_REGISTER_RGB_24B + i * M5STACK_8ANGLE_BYTES_PER_LED,
33
+ this->buf_ + i * M5STACK_8ANGLE_BYTES_PER_LED, M5STACK_8ANGLE_BYTES_PER_LED);
34
+ }
35
+ }
36
+
37
+ light::ESPColorView M5Stack8AngleLightOutput::get_view_internal(int32_t index) const {
38
+ size_t pos = index * M5STACK_8ANGLE_BYTES_PER_LED;
39
+ // red, green, blue, white, effect_data, color_correction
40
+ return {this->buf_ + pos, this->buf_ + pos + 1, this->buf_ + pos + 2,
41
+ nullptr, this->effect_data_ + index, &this->correction_};
42
+ }
43
+
44
+ } // namespace m5stack_8angle
45
+ } // namespace esphome
@@ -0,0 +1,37 @@
1
+ #pragma once
2
+
3
+ #include "esphome/components/light/addressable_light.h"
4
+ #include "esphome/components/light/light_output.h"
5
+
6
+ #include "../m5stack_8angle.h"
7
+
8
+ namespace esphome {
9
+ namespace m5stack_8angle {
10
+
11
+ static const uint8_t M5STACK_8ANGLE_NUM_LEDS = 9;
12
+ static const uint8_t M5STACK_8ANGLE_BYTES_PER_LED = 4;
13
+
14
+ class M5Stack8AngleLightOutput : public light::AddressableLight, public Parented<M5Stack8AngleComponent> {
15
+ public:
16
+ void setup() override;
17
+
18
+ void write_state(light::LightState *state) override;
19
+
20
+ int32_t size() const override { return M5STACK_8ANGLE_NUM_LEDS; }
21
+ light::LightTraits get_traits() override {
22
+ auto traits = light::LightTraits();
23
+ traits.set_supported_color_modes({light::ColorMode::RGB});
24
+ return traits;
25
+ };
26
+
27
+ void clear_effect_data() override { memset(this->effect_data_, 0x00, M5STACK_8ANGLE_NUM_LEDS); };
28
+
29
+ protected:
30
+ light::ESPColorView get_view_internal(int32_t index) const override;
31
+
32
+ uint8_t *buf_{nullptr};
33
+ uint8_t *effect_data_{nullptr};
34
+ };
35
+
36
+ } // namespace m5stack_8angle
37
+ } // namespace esphome
@@ -0,0 +1,74 @@
1
+ #include "m5stack_8angle.h"
2
+ #include "esphome/core/hal.h"
3
+ #include "esphome/core/log.h"
4
+
5
+ namespace esphome {
6
+ namespace m5stack_8angle {
7
+
8
+ static const char *const TAG = "m5stack_8angle";
9
+
10
+ void M5Stack8AngleComponent::setup() {
11
+ ESP_LOGCONFIG(TAG, "Setting up M5STACK_8ANGLE...");
12
+ i2c::ErrorCode err;
13
+
14
+ err = this->read(nullptr, 0);
15
+ if (err != i2c::NO_ERROR) {
16
+ ESP_LOGE(TAG, "I2C error %02X...", err);
17
+ this->mark_failed();
18
+ return;
19
+ };
20
+
21
+ err = this->read_register(M5STACK_8ANGLE_REGISTER_FW_VERSION, &this->fw_version_, 1);
22
+ if (err != i2c::NO_ERROR) {
23
+ ESP_LOGE(TAG, "I2C error %02X...", err);
24
+ this->mark_failed();
25
+ return;
26
+ };
27
+ }
28
+
29
+ void M5Stack8AngleComponent::dump_config() {
30
+ ESP_LOGCONFIG(TAG, "M5STACK_8ANGLE:");
31
+ LOG_I2C_DEVICE(this);
32
+ ESP_LOGCONFIG(TAG, " Firmware version: %d ", this->fw_version_);
33
+ }
34
+
35
+ float M5Stack8AngleComponent::read_knob_pos(uint8_t channel, AnalogBits bits) {
36
+ int32_t raw_pos = this->read_knob_pos_raw(channel, bits);
37
+ if (raw_pos == -1) {
38
+ return NAN;
39
+ }
40
+ return (float) raw_pos / ((1 << bits) - 1);
41
+ }
42
+
43
+ int32_t M5Stack8AngleComponent::read_knob_pos_raw(uint8_t channel, AnalogBits bits) {
44
+ uint16_t knob_pos = 0;
45
+ i2c::ErrorCode err;
46
+ if (bits == BITS_8) {
47
+ err = this->read_register(M5STACK_8ANGLE_REGISTER_ANALOG_INPUT_8B + channel, (uint8_t *) &knob_pos, 1);
48
+ } else if (bits == BITS_12) {
49
+ err = this->read_register(M5STACK_8ANGLE_REGISTER_ANALOG_INPUT_12B + (channel * 2), (uint8_t *) &knob_pos, 2);
50
+ } else {
51
+ ESP_LOGE(TAG, "Invalid number of bits: %d", bits);
52
+ return -1;
53
+ }
54
+ if (err == i2c::NO_ERROR) {
55
+ return knob_pos;
56
+ } else {
57
+ return -1;
58
+ }
59
+ }
60
+
61
+ int8_t M5Stack8AngleComponent::read_switch() {
62
+ uint8_t out;
63
+ i2c::ErrorCode err = this->read_register(M5STACK_8ANGLE_REGISTER_DIGITAL_INPUT, (uint8_t *) &out, 1);
64
+ if (err == i2c::NO_ERROR) {
65
+ return out ? 1 : 0;
66
+ } else {
67
+ return -1;
68
+ }
69
+ }
70
+
71
+ float M5Stack8AngleComponent::get_setup_priority() const { return setup_priority::DATA; }
72
+
73
+ } // namespace m5stack_8angle
74
+ } // namespace esphome
@@ -0,0 +1,34 @@
1
+ #pragma once
2
+
3
+ #include "esphome/components/i2c/i2c.h"
4
+ #include "esphome/core/component.h"
5
+
6
+ namespace esphome {
7
+ namespace m5stack_8angle {
8
+
9
+ static const uint8_t M5STACK_8ANGLE_REGISTER_ANALOG_INPUT_12B = 0x00;
10
+ static const uint8_t M5STACK_8ANGLE_REGISTER_ANALOG_INPUT_8B = 0x10;
11
+ static const uint8_t M5STACK_8ANGLE_REGISTER_DIGITAL_INPUT = 0x20;
12
+ static const uint8_t M5STACK_8ANGLE_REGISTER_RGB_24B = 0x30;
13
+ static const uint8_t M5STACK_8ANGLE_REGISTER_FW_VERSION = 0xFE;
14
+
15
+ enum AnalogBits : uint8_t {
16
+ BITS_8 = 8,
17
+ BITS_12 = 12,
18
+ };
19
+
20
+ class M5Stack8AngleComponent : public i2c::I2CDevice, public Component {
21
+ public:
22
+ void setup() override;
23
+ void dump_config() override;
24
+ float get_setup_priority() const override;
25
+ float read_knob_pos(uint8_t channel, AnalogBits bits = AnalogBits::BITS_8);
26
+ int32_t read_knob_pos_raw(uint8_t channel, AnalogBits bits = AnalogBits::BITS_8);
27
+ int8_t read_switch();
28
+
29
+ protected:
30
+ uint8_t fw_version_;
31
+ };
32
+
33
+ } // namespace m5stack_8angle
34
+ } // namespace esphome
@@ -0,0 +1,66 @@
1
+ import esphome.codegen as cg
2
+ import esphome.config_validation as cv
3
+ from esphome.components import sensor
4
+
5
+ from esphome.const import (
6
+ CONF_BIT_DEPTH,
7
+ CONF_CHANNEL,
8
+ CONF_RAW,
9
+ ICON_ROTATE_RIGHT,
10
+ STATE_CLASS_MEASUREMENT,
11
+ )
12
+
13
+ from .. import (
14
+ AnalogBits,
15
+ M5Stack8AngleComponent,
16
+ m5stack_8angle_ns,
17
+ CONF_M5STACK_8ANGLE_ID,
18
+ )
19
+
20
+
21
+ M5Stack8AngleKnobSensor = m5stack_8angle_ns.class_(
22
+ "M5Stack8AngleKnobSensor",
23
+ sensor.Sensor,
24
+ cg.PollingComponent,
25
+ )
26
+
27
+
28
+ BIT_DEPTHS = {
29
+ 8: AnalogBits.BITS_8,
30
+ 12: AnalogBits.BITS_12,
31
+ }
32
+
33
+ _validate_bits = cv.float_with_unit("bits", "bit")
34
+
35
+
36
+ CONFIG_SCHEMA = cv.All(
37
+ cv.Schema(
38
+ {
39
+ cv.GenerateID(): cv.declare_id(M5Stack8AngleKnobSensor),
40
+ cv.GenerateID(CONF_M5STACK_8ANGLE_ID): cv.use_id(M5Stack8AngleComponent),
41
+ cv.Required(CONF_CHANNEL): cv.int_range(min=1, max=8),
42
+ cv.Optional(CONF_BIT_DEPTH, default="8bit"): cv.All(
43
+ _validate_bits, cv.enum(BIT_DEPTHS)
44
+ ),
45
+ cv.Optional(CONF_RAW, default=False): cv.boolean,
46
+ }
47
+ )
48
+ .extend(
49
+ sensor.sensor_schema(
50
+ M5Stack8AngleKnobSensor,
51
+ accuracy_decimals=2,
52
+ icon=ICON_ROTATE_RIGHT,
53
+ state_class=STATE_CLASS_MEASUREMENT,
54
+ )
55
+ )
56
+ .extend(cv.polling_component_schema("10s"))
57
+ )
58
+
59
+
60
+ async def to_code(config):
61
+ var = await sensor.new_sensor(config)
62
+ await cg.register_component(var, config)
63
+ await cg.register_parented(var, config[CONF_M5STACK_8ANGLE_ID])
64
+ cg.add(var.set_channel(config[CONF_CHANNEL] - 1))
65
+ cg.add(var.set_bit_depth(BIT_DEPTHS[config[CONF_BIT_DEPTH]]))
66
+ cg.add(var.set_raw(config[CONF_RAW]))
@@ -0,0 +1,24 @@
1
+ #include "m5stack_8angle_sensor.h"
2
+
3
+ namespace esphome {
4
+ namespace m5stack_8angle {
5
+
6
+ void M5Stack8AngleKnobSensor::update() {
7
+ if (this->parent_ != nullptr) {
8
+ int32_t raw_pos = this->parent_->read_knob_pos_raw(this->channel_, this->bits_);
9
+ if (raw_pos == -1) {
10
+ this->status_set_warning("Could not read knob position from M5Stack 8Angle.");
11
+ return;
12
+ }
13
+ if (this->raw_) {
14
+ this->publish_state(raw_pos);
15
+ } else {
16
+ float knob_pos = (float) raw_pos / ((1 << this->bits_) - 1);
17
+ this->publish_state(knob_pos);
18
+ }
19
+ this->status_clear_warning();
20
+ };
21
+ }
22
+
23
+ } // namespace m5stack_8angle
24
+ } // namespace esphome
@@ -0,0 +1,27 @@
1
+ #pragma once
2
+
3
+ #include "esphome/components/sensor/sensor.h"
4
+ #include "esphome/core/component.h"
5
+
6
+ #include "../m5stack_8angle.h"
7
+
8
+ namespace esphome {
9
+ namespace m5stack_8angle {
10
+
11
+ class M5Stack8AngleKnobSensor : public sensor::Sensor,
12
+ public PollingComponent,
13
+ public Parented<M5Stack8AngleComponent> {
14
+ public:
15
+ void update() override;
16
+ void set_channel(uint8_t channel) { this->channel_ = channel; };
17
+ void set_bit_depth(AnalogBits bits) { this->bits_ = bits; };
18
+ void set_raw(bool raw) { this->raw_ = raw; };
19
+
20
+ protected:
21
+ uint8_t channel_;
22
+ AnalogBits bits_;
23
+ bool raw_;
24
+ };
25
+
26
+ } // namespace m5stack_8angle
27
+ } // namespace esphome
@@ -8,6 +8,7 @@ static const char *const TAG = "matrix_keypad";
8
8
 
9
9
  void MatrixKeypad::setup() {
10
10
  for (auto *pin : this->rows_) {
11
+ pin->setup();
11
12
  if (!has_diodes_) {
12
13
  pin->pin_mode(gpio::FLAG_INPUT);
13
14
  } else {
@@ -15,6 +16,7 @@ void MatrixKeypad::setup() {
15
16
  }
16
17
  }
17
18
  for (auto *pin : this->columns_) {
19
+ pin->setup();
18
20
  if (has_pulldowns_) {
19
21
  pin->pin_mode(gpio::FLAG_INPUT);
20
22
  } else {
@@ -1,6 +1,6 @@
1
1
  import esphome.codegen as cg
2
- import esphome.config_validation as cv
3
2
  from esphome.components import sensor, spi
3
+ import esphome.config_validation as cv
4
4
  from esphome.const import (
5
5
  CONF_MAINS_FILTER,
6
6
  DEVICE_CLASS_TEMPERATURE,
@@ -15,8 +15,8 @@ MAX31856Sensor = max31856_ns.class_(
15
15
 
16
16
  MAX31865ConfigFilter = max31856_ns.enum("MAX31856ConfigFilter")
17
17
  FILTER = {
18
- "50HZ": MAX31865ConfigFilter.FILTER_50HZ,
19
- "60HZ": MAX31865ConfigFilter.FILTER_60HZ,
18
+ 50: MAX31865ConfigFilter.FILTER_50HZ,
19
+ 60: MAX31865ConfigFilter.FILTER_60HZ,
20
20
  }
21
21
 
22
22
  CONFIG_SCHEMA = (
@@ -29,8 +29,8 @@ CONFIG_SCHEMA = (
29
29
  )
30
30
  .extend(
31
31
  {
32
- cv.Optional(CONF_MAINS_FILTER, default="60HZ"): cv.enum(
33
- FILTER, upper=True, space=""
32
+ cv.Optional(CONF_MAINS_FILTER, default="60Hz"): cv.All(
33
+ cv.frequency, cv.enum(FILTER, int=True)
34
34
  ),
35
35
  }
36
36
  )
@@ -1,20 +1,18 @@
1
1
  from esphome import automation
2
- import esphome.config_validation as cv
3
- import esphome.codegen as cg
4
-
5
2
  from esphome.automation import maybe_simple_id
3
+ import esphome.codegen as cg
4
+ import esphome.config_validation as cv
6
5
  from esphome.const import (
7
6
  CONF_ID,
7
+ CONF_ON_IDLE,
8
8
  CONF_ON_STATE,
9
9
  CONF_TRIGGER_ID,
10
10
  CONF_VOLUME,
11
- CONF_ON_IDLE,
12
11
  )
13
12
  from esphome.core import CORE
14
13
  from esphome.coroutine import coroutine_with_priority
15
14
  from esphome.cpp_helpers import setup_entity
16
15
 
17
-
18
16
  CODEOWNERS = ["@jesserockz"]
19
17
 
20
18
  IS_PLATFORM_COMPONENT = True
@@ -7,30 +7,24 @@ namespace esphome {
7
7
 
8
8
  namespace media_player {
9
9
 
10
- #define MEDIA_PLAYER_SIMPLE_COMMAND_ACTION(ACTION_CLASS, ACTION_COMMAND) \
11
- template<typename... Ts> class ACTION_CLASS : public Action<Ts...>, public Parented<MediaPlayer> { \
12
- void play(Ts... x) override { \
13
- this->parent_->make_call().set_command(MediaPlayerCommand::MEDIA_PLAYER_COMMAND_##ACTION_COMMAND).perform(); \
14
- } \
15
- };
16
-
17
- #define MEDIA_PLAYER_SIMPLE_STATE_TRIGGER(TRIGGER_CLASS, TRIGGER_STATE) \
18
- class TRIGGER_CLASS : public Trigger<> { \
19
- public: \
20
- explicit TRIGGER_CLASS(MediaPlayer *player) { \
21
- player->add_on_state_callback([this, player]() { \
22
- if (player->state == MediaPlayerState::MEDIA_PLAYER_STATE_##TRIGGER_STATE) \
23
- this->trigger(); \
24
- }); \
25
- } \
26
- };
10
+ template<MediaPlayerCommand Command, typename... Ts>
11
+ class MediaPlayerCommandAction : public Action<Ts...>, public Parented<MediaPlayer> {
12
+ public:
13
+ void play(Ts... x) override { this->parent_->make_call().set_command(Command).perform(); }
14
+ };
27
15
 
28
- MEDIA_PLAYER_SIMPLE_COMMAND_ACTION(PlayAction, PLAY)
29
- MEDIA_PLAYER_SIMPLE_COMMAND_ACTION(PauseAction, PAUSE)
30
- MEDIA_PLAYER_SIMPLE_COMMAND_ACTION(StopAction, STOP)
31
- MEDIA_PLAYER_SIMPLE_COMMAND_ACTION(ToggleAction, TOGGLE)
32
- MEDIA_PLAYER_SIMPLE_COMMAND_ACTION(VolumeUpAction, VOLUME_UP)
33
- MEDIA_PLAYER_SIMPLE_COMMAND_ACTION(VolumeDownAction, VOLUME_DOWN)
16
+ template<typename... Ts>
17
+ using PlayAction = MediaPlayerCommandAction<MediaPlayerCommand::MEDIA_PLAYER_COMMAND_PLAY, Ts...>;
18
+ template<typename... Ts>
19
+ using PauseAction = MediaPlayerCommandAction<MediaPlayerCommand::MEDIA_PLAYER_COMMAND_PAUSE, Ts...>;
20
+ template<typename... Ts>
21
+ using StopAction = MediaPlayerCommandAction<MediaPlayerCommand::MEDIA_PLAYER_COMMAND_STOP, Ts...>;
22
+ template<typename... Ts>
23
+ using ToggleAction = MediaPlayerCommandAction<MediaPlayerCommand::MEDIA_PLAYER_COMMAND_TOGGLE, Ts...>;
24
+ template<typename... Ts>
25
+ using VolumeUpAction = MediaPlayerCommandAction<MediaPlayerCommand::MEDIA_PLAYER_COMMAND_VOLUME_UP, Ts...>;
26
+ template<typename... Ts>
27
+ using VolumeDownAction = MediaPlayerCommandAction<MediaPlayerCommand::MEDIA_PLAYER_COMMAND_VOLUME_DOWN, Ts...>;
34
28
 
35
29
  template<typename... Ts> class PlayMediaAction : public Action<Ts...>, public Parented<MediaPlayer> {
36
30
  TEMPLATABLE_VALUE(std::string, media_url)
@@ -49,10 +43,20 @@ class StateTrigger : public Trigger<> {
49
43
  }
50
44
  };
51
45
 
52
- MEDIA_PLAYER_SIMPLE_STATE_TRIGGER(IdleTrigger, IDLE)
53
- MEDIA_PLAYER_SIMPLE_STATE_TRIGGER(PlayTrigger, PLAYING)
54
- MEDIA_PLAYER_SIMPLE_STATE_TRIGGER(PauseTrigger, PAUSED)
55
- MEDIA_PLAYER_SIMPLE_STATE_TRIGGER(AnnouncementTrigger, ANNOUNCING)
46
+ template<MediaPlayerState State> class MediaPlayerStateTrigger : public Trigger<> {
47
+ public:
48
+ explicit MediaPlayerStateTrigger(MediaPlayer *player) {
49
+ player->add_on_state_callback([this, player]() {
50
+ if (player->state == State)
51
+ this->trigger();
52
+ });
53
+ }
54
+ };
55
+
56
+ using IdleTrigger = MediaPlayerStateTrigger<MediaPlayerState::MEDIA_PLAYER_STATE_IDLE>;
57
+ using PlayTrigger = MediaPlayerStateTrigger<MediaPlayerState::MEDIA_PLAYER_STATE_PLAYING>;
58
+ using PauseTrigger = MediaPlayerStateTrigger<MediaPlayerState::MEDIA_PLAYER_STATE_PAUSED>;
59
+ using AnnouncementTrigger = MediaPlayerStateTrigger<MediaPlayerState::MEDIA_PLAYER_STATE_ANNOUNCING>;
56
60
 
57
61
  template<typename... Ts> class IsIdleCondition : public Condition<Ts...>, public Parented<MediaPlayer> {
58
62
  public:
@@ -1,39 +1,34 @@
1
- import logging
2
-
3
- import json
4
1
  import hashlib
5
- from urllib.parse import urljoin
2
+ import json
3
+ import logging
6
4
  from pathlib import Path
5
+ from urllib.parse import urljoin
6
+
7
7
  import requests
8
8
 
9
- import esphome.config_validation as cv
9
+ from esphome import automation, external_files, git
10
+ from esphome.automation import register_action, register_condition
10
11
  import esphome.codegen as cg
11
-
12
- from esphome.core import CORE, HexInt
13
-
14
12
  from esphome.components import esp32, microphone
15
- from esphome import automation, git, external_files
16
- from esphome.automation import register_action, register_condition
17
-
18
-
13
+ import esphome.config_validation as cv
19
14
  from esphome.const import (
20
- __version__,
15
+ CONF_FILE,
21
16
  CONF_ID,
22
17
  CONF_MICROPHONE,
23
18
  CONF_MODEL,
24
- CONF_URL,
25
- CONF_FILE,
19
+ CONF_PASSWORD,
26
20
  CONF_PATH,
21
+ CONF_RAW_DATA_ID,
27
22
  CONF_REF,
28
23
  CONF_REFRESH,
29
24
  CONF_TYPE,
25
+ CONF_URL,
30
26
  CONF_USERNAME,
31
- CONF_PASSWORD,
32
- CONF_RAW_DATA_ID,
33
27
  TYPE_GIT,
34
28
  TYPE_LOCAL,
29
+ __version__,
35
30
  )
36
-
31
+ from esphome.core import CORE, HexInt
37
32
 
38
33
  _LOGGER = logging.getLogger(__name__)
39
34
 
@@ -174,12 +169,12 @@ def _convert_manifest_v1_to_v2(v1_manifest):
174
169
  CONF_SLIDING_WINDOW_AVERAGE_SIZE
175
170
  ]
176
171
  del v2_manifest[KEY_MICRO][CONF_SLIDING_WINDOW_AVERAGE_SIZE]
177
- v2_manifest[KEY_MICRO][
178
- CONF_TENSOR_ARENA_SIZE
179
- ] = 45672 # Original Inception-based V1 manifest models require a minimum of 45672 bytes
180
- v2_manifest[KEY_MICRO][
181
- CONF_FEATURE_STEP_SIZE
182
- ] = 20 # Original Inception-based V1 manifest models use a 20 ms feature step size
172
+
173
+ # Original Inception-based V1 manifest models require a minimum of 45672 bytes
174
+ v2_manifest[KEY_MICRO][CONF_TENSOR_ARENA_SIZE] = 45672
175
+
176
+ # Original Inception-based V1 manifest models use a 20 ms feature step size
177
+ v2_manifest[KEY_MICRO][CONF_FEATURE_STEP_SIZE] = 20
183
178
 
184
179
  return v2_manifest
185
180
 
@@ -502,7 +497,7 @@ async def to_code(config):
502
497
  )
503
498
 
504
499
  cg.add(var.set_features_step_size(manifest[KEY_MICRO][CONF_FEATURE_STEP_SIZE]))
505
- cg.add_library("kahrendt/ESPMicroSpeechFeatures", "1.0.0")
500
+ cg.add_library("kahrendt/ESPMicroSpeechFeatures", "1.1.0")
506
501
 
507
502
 
508
503
  MICRO_WAKE_WORD_ACTION_SCHEMA = cv.Schema({cv.GenerateID(): cv.use_id(MicroWakeWord)})
@@ -1,6 +1,9 @@
1
1
  #pragma once
2
2
 
3
- #include "esphome/core/entity_base.h"
3
+ #include <stddef.h>
4
+ #include <cstdint>
5
+ #include <functional>
6
+ #include <vector>
4
7
  #include "esphome/core/helpers.h"
5
8
 
6
9
  namespace esphome {
@@ -1,8 +1,16 @@
1
1
  import binascii
2
2
  import esphome.codegen as cg
3
3
  import esphome.config_validation as cv
4
+ from esphome import automation
4
5
  from esphome.components import modbus
5
- from esphome.const import CONF_ADDRESS, CONF_ID, CONF_NAME, CONF_LAMBDA, CONF_OFFSET
6
+ from esphome.const import (
7
+ CONF_ADDRESS,
8
+ CONF_ID,
9
+ CONF_NAME,
10
+ CONF_LAMBDA,
11
+ CONF_OFFSET,
12
+ CONF_TRIGGER_ID,
13
+ )
6
14
  from esphome.cpp_helpers import logging
7
15
  from .const import (
8
16
  CONF_BITMASK,
@@ -12,6 +20,7 @@ from .const import (
12
20
  CONF_CUSTOM_COMMAND,
13
21
  CONF_FORCE_NEW_RANGE,
14
22
  CONF_MODBUS_CONTROLLER_ID,
23
+ CONF_ON_COMMAND_SENT,
15
24
  CONF_REGISTER_COUNT,
16
25
  CONF_REGISTER_TYPE,
17
26
  CONF_RESPONSE_SIZE,
@@ -97,6 +106,10 @@ TYPE_REGISTER_MAP = {
97
106
  "FP32_R": 2,
98
107
  }
99
108
 
109
+ ModbusCommandSentTrigger = modbus_controller_ns.class_(
110
+ "ModbusCommandSentTrigger", automation.Trigger.template(cg.int_, cg.int_)
111
+ )
112
+
100
113
  _LOGGER = logging.getLogger(__name__)
101
114
 
102
115
  ModbusServerRegisterSchema = cv.Schema(
@@ -120,13 +133,19 @@ CONFIG_SCHEMA = cv.All(
120
133
  cv.Optional(
121
134
  CONF_SERVER_REGISTERS,
122
135
  ): cv.ensure_list(ModbusServerRegisterSchema),
136
+ cv.Optional(CONF_ON_COMMAND_SENT): automation.validate_automation(
137
+ {
138
+ cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(
139
+ ModbusCommandSentTrigger
140
+ ),
141
+ }
142
+ ),
123
143
  }
124
144
  )
125
145
  .extend(cv.polling_component_schema("60s"))
126
146
  .extend(modbus.modbus_device_schema(0x01))
127
147
  )
128
148
 
129
-
130
149
  ModbusItemBaseSchema = cv.Schema(
131
150
  {
132
151
  cv.GenerateID(CONF_MODBUS_CONTROLLER_ID): cv.use_id(ModbusController),
@@ -254,6 +273,11 @@ async def to_code(config):
254
273
  )
255
274
  )
256
275
  await register_modbus_device(var, config)
276
+ for conf in config.get(CONF_ON_COMMAND_SENT, []):
277
+ trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], var)
278
+ await automation.build_automation(
279
+ trigger, [(int, "function_code"), (int, "address")], conf
280
+ )
257
281
 
258
282
 
259
283
  async def register_modbus_device(var, config):