esphome 2024.7.2__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 (353) 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/micro_wake_word/streaming_model.cpp +6 -4
  203. esphome/components/microphone/microphone.h +4 -1
  204. esphome/components/mitsubishi/mitsubishi.cpp +7 -1
  205. esphome/components/modbus_controller/__init__.py +26 -2
  206. esphome/components/modbus_controller/automation.h +19 -0
  207. esphome/components/modbus_controller/const.py +1 -0
  208. esphome/components/modbus_controller/modbus_controller.cpp +8 -0
  209. esphome/components/modbus_controller/modbus_controller.h +3 -0
  210. esphome/components/mqtt/__init__.py +20 -9
  211. esphome/components/mqtt/mqtt_alarm_control_panel.cpp +128 -0
  212. esphome/components/mqtt/mqtt_alarm_control_panel.h +39 -0
  213. esphome/components/mqtt/mqtt_backend.h +3 -1
  214. esphome/components/mqtt/mqtt_backend_esp32.cpp +4 -1
  215. esphome/components/mqtt/mqtt_backend_esp32.h +3 -1
  216. esphome/components/mqtt/mqtt_backend_esp8266.h +3 -1
  217. esphome/components/mqtt/mqtt_backend_libretiny.h +3 -1
  218. esphome/components/mqtt/mqtt_client.cpp +16 -3
  219. esphome/components/mqtt/mqtt_client.h +5 -1
  220. esphome/components/mqtt/mqtt_component.cpp +32 -4
  221. esphome/components/mqtt/mqtt_const.h +2 -0
  222. esphome/components/network/__init__.py +15 -12
  223. esphome/components/network/ip_address.h +3 -0
  224. esphome/components/network/util.cpp +2 -1
  225. esphome/components/network/util.h +3 -1
  226. esphome/components/nextion/base_component.py +5 -8
  227. esphome/components/number/__init__.py +7 -8
  228. esphome/components/online_image/__init__.py +167 -0
  229. esphome/components/online_image/image_decoder.cpp +44 -0
  230. esphome/components/online_image/image_decoder.h +112 -0
  231. esphome/components/online_image/online_image.cpp +283 -0
  232. esphome/components/online_image/online_image.h +195 -0
  233. esphome/components/online_image/png_image.cpp +68 -0
  234. esphome/components/online_image/png_image.h +33 -0
  235. esphome/components/ota/__init__.py +8 -4
  236. esphome/components/pid/pid_climate.h +2 -0
  237. esphome/components/pmwcs3/pmwcs3.cpp +31 -30
  238. esphome/components/remote_base/pronto_protocol.cpp +0 -3
  239. esphome/components/remote_transmitter/remote_transmitter.h +1 -1
  240. esphome/components/rgbct/rgbct_light_output.h +3 -2
  241. esphome/components/rgbw/rgbw_light_output.h +3 -2
  242. esphome/components/rgbww/rgbww_light_output.h +3 -2
  243. esphome/components/rp2040_pio_led_strip/led_strip.cpp +31 -5
  244. esphome/components/rp2040_pio_led_strip/led_strip.h +5 -0
  245. esphome/components/rtttl/rtttl.cpp +108 -21
  246. esphome/components/rtttl/rtttl.h +15 -6
  247. esphome/components/select/__init__.py +7 -7
  248. esphome/components/sensor/__init__.py +29 -10
  249. esphome/components/sensor/filter.cpp +8 -0
  250. esphome/components/sensor/filter.h +9 -0
  251. esphome/components/sml/sml_parser.cpp +48 -22
  252. esphome/components/socket/socket.cpp +11 -14
  253. esphome/components/speaker/__init__.py +14 -5
  254. esphome/components/speaker/automation.h +10 -0
  255. esphome/components/speaker/speaker.h +9 -0
  256. esphome/components/spi/spi.cpp +0 -6
  257. esphome/components/spi/spi.h +2 -19
  258. esphome/components/spi_led_strip/spi_led_strip.h +5 -4
  259. esphome/components/sprinkler/sprinkler.cpp +2 -2
  260. esphome/components/sprinkler/sprinkler.h +1 -1
  261. esphome/components/switch/__init__.py +3 -3
  262. esphome/components/text/__init__.py +5 -5
  263. esphome/components/text_sensor/__init__.py +7 -7
  264. esphome/components/time/__init__.py +8 -8
  265. esphome/components/touchscreen/binary_sensor/__init__.py +24 -10
  266. esphome/components/touchscreen/binary_sensor/touchscreen_binary_sensor.cpp +3 -2
  267. esphome/components/touchscreen/binary_sensor/touchscreen_binary_sensor.h +4 -2
  268. esphome/components/uart/uart_component_host.cpp +6 -2
  269. esphome/components/update/__init__.py +33 -15
  270. esphome/components/update/automation.h +23 -0
  271. esphome/components/update/update_entity.h +3 -1
  272. esphome/components/valve/__init__.py +3 -3
  273. esphome/components/voice_assistant/__init__.py +7 -8
  274. esphome/components/wake_on_lan/wake_on_lan.cpp +2 -0
  275. esphome/components/wake_on_lan/wake_on_lan.h +3 -1
  276. esphome/components/watchdog/__init__.py +1 -0
  277. esphome/components/{http_request → watchdog}/watchdog.cpp +0 -2
  278. esphome/components/{http_request → watchdog}/watchdog.h +0 -2
  279. esphome/components/waveshare_epaper/waveshare_epaper.cpp +5 -5
  280. esphome/components/web_server/server_index_v3.h +3615 -3603
  281. esphome/components/web_server/web_server.cpp +0 -209
  282. esphome/components/web_server/web_server.h +1 -1
  283. esphome/components/web_server/web_server_v1.cpp +217 -0
  284. esphome/components/web_server_base/web_server_base.h +1 -0
  285. esphome/components/wifi/__init__.py +15 -14
  286. esphome/components/wifi/wifi_component.cpp +2 -0
  287. esphome/components/wifi/wifi_component.h +7 -1
  288. esphome/components/wifi/wifi_component_esp32_arduino.cpp +5 -2
  289. esphome/components/wifi/wifi_component_esp8266.cpp +2 -0
  290. esphome/components/wifi/wifi_component_esp_idf.cpp +43 -7
  291. esphome/components/wifi/wifi_component_libretiny.cpp +2 -0
  292. esphome/components/wifi/wifi_component_pico_w.cpp +2 -0
  293. esphome/components/wifi/wpa2_eap.py +6 -7
  294. esphome/components/wifi_info/text_sensor.py +3 -3
  295. esphome/components/wifi_info/wifi_info_text_sensor.cpp +2 -0
  296. esphome/components/wifi_info/wifi_info_text_sensor.h +2 -0
  297. esphome/components/wifi_signal/sensor.py +1 -1
  298. esphome/components/wifi_signal/wifi_signal_sensor.cpp +2 -0
  299. esphome/components/wifi_signal/wifi_signal_sensor.h +2 -1
  300. esphome/components/xiaomi_ble/xiaomi_ble.cpp +20 -3
  301. esphome/components/xiaomi_ble/xiaomi_ble.h +1 -0
  302. esphome/components/xiaomi_lywsd02mmc/__init__.py +0 -0
  303. esphome/components/xiaomi_lywsd02mmc/sensor.py +77 -0
  304. esphome/components/xiaomi_lywsd02mmc/xiaomi_lywsd02mmc.cpp +73 -0
  305. esphome/components/xiaomi_lywsd02mmc/xiaomi_lywsd02mmc.h +37 -0
  306. esphome/config.py +17 -19
  307. esphome/config_validation.py +55 -23
  308. esphome/const.py +25 -9
  309. esphome/core/__init__.py +17 -14
  310. esphome/core/application.h +42 -21
  311. esphome/core/automation.h +5 -3
  312. esphome/core/base_automation.h +3 -2
  313. esphome/core/bytebuffer.cpp +134 -0
  314. esphome/core/bytebuffer.h +96 -0
  315. esphome/core/color.h +24 -16
  316. esphome/core/config.py +3 -3
  317. esphome/core/defines.h +14 -1
  318. esphome/core/entity_base.h +2 -2
  319. esphome/core/entity_helpers.py +1 -2
  320. esphome/core/gpio.h +0 -18
  321. esphome/core/helpers.h +1 -1
  322. esphome/core/optional.h +15 -16
  323. esphome/coroutine.py +1 -1
  324. esphome/cpp_generator.py +1 -1
  325. esphome/cpp_helpers.py +3 -5
  326. esphome/dashboard/core.py +3 -3
  327. esphome/dashboard/dashboard.py +3 -3
  328. esphome/dashboard/entries.py +1 -1
  329. esphome/dashboard/util/file.py +1 -1
  330. esphome/dashboard/web_server.py +3 -3
  331. esphome/external_files.py +5 -3
  332. esphome/final_validate.py +2 -2
  333. esphome/git.py +4 -4
  334. esphome/helpers.py +5 -5
  335. esphome/loader.py +15 -10
  336. esphome/mqtt.py +4 -8
  337. esphome/pins.py +6 -6
  338. esphome/platformio_api.py +5 -5
  339. esphome/storage_json.py +2 -1
  340. esphome/types.py +1 -1
  341. esphome/util.py +2 -3
  342. esphome/voluptuous_schema.py +1 -0
  343. esphome/vscode.py +5 -4
  344. esphome/wizard.py +1 -1
  345. esphome/writer.py +7 -7
  346. esphome/yaml_util.py +3 -3
  347. esphome/zeroconf.py +1 -1
  348. {esphome-2024.7.2.dist-info → esphome-2024.8.0.dist-info}/METADATA +3 -3
  349. {esphome-2024.7.2.dist-info → esphome-2024.8.0.dist-info}/RECORD +353 -247
  350. {esphome-2024.7.2.dist-info → esphome-2024.8.0.dist-info}/LICENSE +0 -0
  351. {esphome-2024.7.2.dist-info → esphome-2024.8.0.dist-info}/WHEEL +0 -0
  352. {esphome-2024.7.2.dist-info → esphome-2024.8.0.dist-info}/entry_points.txt +0 -0
  353. {esphome-2024.7.2.dist-info → esphome-2024.8.0.dist-info}/top_level.txt +0 -0
@@ -10,7 +10,7 @@ SmlFile::SmlFile(bytes buffer) : buffer_(std::move(buffer)) {
10
10
  this->pos_ = 0;
11
11
  while (this->pos_ < this->buffer_.size()) {
12
12
  if (this->buffer_[this->pos_] == 0x00)
13
- break; // fill byte detected -> no more messages
13
+ break; // EndOfSmlMsg
14
14
 
15
15
  SmlNode message = SmlNode();
16
16
  if (!this->setup_node(&message))
@@ -20,40 +20,66 @@ SmlFile::SmlFile(bytes buffer) : buffer_(std::move(buffer)) {
20
20
  }
21
21
 
22
22
  bool SmlFile::setup_node(SmlNode *node) {
23
- uint8_t type = this->buffer_[this->pos_] >> 4; // type including overlength info
24
- uint8_t length = this->buffer_[this->pos_] & 0x0f; // length including TL bytes
25
- bool is_list = (type & 0x07) == SML_LIST;
26
- bool has_extended_length = type & 0x08; // we have a long list/value (>15 entries)
27
- uint8_t parse_length = length;
28
- if (has_extended_length) {
23
+ // If the TL field is 0x00, this is the end of the message
24
+ // (see 6.3.1 of SML protocol definition)
25
+ if (this->buffer_[this->pos_] == 0x00) {
26
+ // Increment past this byte and signal that the message is done
27
+ this->pos_ += 1;
28
+ return true;
29
+ }
30
+
31
+ // Extract data from initial TL field
32
+ uint8_t type = (this->buffer_[this->pos_] >> 4) & 0x07; // type without overlength info
33
+ bool overlength = (this->buffer_[this->pos_] >> 4) & 0x08; // overlength information
34
+ uint8_t length = this->buffer_[this->pos_] & 0x0f; // length (including TL bytes)
35
+
36
+ // Check if we need additional length bytes
37
+ if (overlength) {
38
+ // Shift the current length to the higher nibble
39
+ // and add the lower nibble of the next byte to the length
29
40
  length = (length << 4) + (this->buffer_[this->pos_ + 1] & 0x0f);
30
- parse_length = length;
41
+ // We are basically done with the first TL field now,
42
+ // so increment past that, we now point to the second TL field
31
43
  this->pos_ += 1;
44
+ // Decrement the length for value fields (not lists),
45
+ // since the byte we just handled is counted as part of the field
46
+ // in case of values but not for lists
47
+ if (type != SML_LIST)
48
+ length -= 1;
49
+
50
+ // Technically, this is not enough, the standard allows for more than two length fields.
51
+ // However I don't think it is very common to have more than 255 entries in a list
32
52
  }
33
53
 
34
- if (this->pos_ + parse_length >= this->buffer_.size())
54
+ // We are done with the last TL field(s), so advance the position
55
+ this->pos_ += 1;
56
+ // and decrement the length for non-list fields
57
+ if (type != SML_LIST)
58
+ length -= 1;
59
+
60
+ // Check if the buffer length is long enough
61
+ if (this->pos_ + length > this->buffer_.size())
35
62
  return false;
36
63
 
37
- node->type = type & 0x07;
64
+ node->type = type;
38
65
  node->nodes.clear();
39
66
  node->value_bytes.clear();
40
67
 
41
- // if the list is a has_extended_length list with e.g. 16 elements this is a 0x00 byte but not the end of message
42
- if (!has_extended_length && this->buffer_[this->pos_] == 0x00) { // end of message
43
- this->pos_ += 1;
44
- } else if (is_list) { // list
45
- this->pos_ += 1;
46
- node->nodes.reserve(parse_length);
47
- for (size_t i = 0; i != parse_length; i++) {
68
+ if (type == SML_LIST) {
69
+ node->nodes.reserve(length);
70
+ for (size_t i = 0; i != length; i++) {
48
71
  SmlNode child_node = SmlNode();
49
72
  if (!this->setup_node(&child_node))
50
73
  return false;
51
74
  node->nodes.emplace_back(child_node);
52
75
  }
53
- } else { // value
54
- node->value_bytes =
55
- bytes(this->buffer_.begin() + this->pos_ + 1, this->buffer_.begin() + this->pos_ + parse_length);
56
- this->pos_ += parse_length;
76
+ } else {
77
+ // Value starts at the current position
78
+ // Value ends "length" bytes later,
79
+ // (since the TL field is counted but already subtracted from length)
80
+ node->value_bytes = bytes(this->buffer_.begin() + this->pos_, this->buffer_.begin() + this->pos_ + length);
81
+ // Increment the pointer past all consumed bytes
82
+ this->pos_ += length;
57
83
  }
58
84
  return true;
59
85
  }
@@ -101,7 +127,7 @@ int64_t bytes_to_int(const bytes &buffer) {
101
127
  // see https://stackoverflow.com/questions/42534749/signed-extension-from-24-bit-to-32-bit-in-c
102
128
  if (buffer.size() < 8) {
103
129
  const int bits = buffer.size() * 8;
104
- const uint64_t m = 1u << (bits - 1);
130
+ const uint64_t m = 1ull << (bits - 1);
105
131
  tmp = (tmp ^ m) - m;
106
132
  }
107
133
 
@@ -19,24 +19,22 @@ std::unique_ptr<Socket> socket_ip(int type, int protocol) {
19
19
 
20
20
  socklen_t set_sockaddr(struct sockaddr *addr, socklen_t addrlen, const std::string &ip_address, uint16_t port) {
21
21
  #if USE_NETWORK_IPV6
22
- if (addrlen < sizeof(sockaddr_in6)) {
23
- errno = EINVAL;
24
- return 0;
25
- }
26
- auto *server = reinterpret_cast<sockaddr_in6 *>(addr);
27
- memset(server, 0, sizeof(sockaddr_in6));
28
- server->sin6_family = AF_INET6;
29
- server->sin6_port = htons(port);
22
+ if (ip_address.find(':') != std::string::npos) {
23
+ if (addrlen < sizeof(sockaddr_in6)) {
24
+ errno = EINVAL;
25
+ return 0;
26
+ }
27
+ auto *server = reinterpret_cast<sockaddr_in6 *>(addr);
28
+ memset(server, 0, sizeof(sockaddr_in6));
29
+ server->sin6_family = AF_INET6;
30
+ server->sin6_port = htons(port);
30
31
 
31
- if (ip_address.find('.') != std::string::npos) {
32
- server->sin6_addr.un.u32_addr[3] = inet_addr(ip_address.c_str());
33
- } else {
34
32
  ip6_addr_t ip6;
35
33
  inet6_aton(ip_address.c_str(), &ip6);
36
34
  memcpy(server->sin6_addr.un.u32_addr, ip6.addr, sizeof(ip6.addr));
35
+ return sizeof(sockaddr_in6);
37
36
  }
38
- return sizeof(sockaddr_in6);
39
- #else
37
+ #endif /* USE_NETWORK_IPV6 */
40
38
  if (addrlen < sizeof(sockaddr_in)) {
41
39
  errno = EINVAL;
42
40
  return 0;
@@ -47,7 +45,6 @@ socklen_t set_sockaddr(struct sockaddr *addr, socklen_t addrlen, const std::stri
47
45
  server->sin_addr.s_addr = inet_addr(ip_address.c_str());
48
46
  server->sin_port = htons(port);
49
47
  return sizeof(sockaddr_in);
50
- #endif /* USE_NETWORK_IPV6 */
51
48
  }
52
49
 
53
50
  socklen_t set_sockaddr_any(struct sockaddr *addr, socklen_t addrlen, uint16_t port) {
@@ -1,13 +1,11 @@
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
6
- from esphome.const import CONF_ID, CONF_DATA
3
+ import esphome.codegen as cg
4
+ import esphome.config_validation as cv
5
+ from esphome.const import CONF_DATA, CONF_ID
7
6
  from esphome.core import CORE
8
7
  from esphome.coroutine import coroutine_with_priority
9
8
 
10
-
11
9
  CODEOWNERS = ["@jesserockz"]
12
10
 
13
11
  IS_PLATFORM_COMPONENT = True
@@ -22,8 +20,12 @@ PlayAction = speaker_ns.class_(
22
20
  StopAction = speaker_ns.class_(
23
21
  "StopAction", automation.Action, cg.Parented.template(Speaker)
24
22
  )
23
+ FinishAction = speaker_ns.class_(
24
+ "FinishAction", automation.Action, cg.Parented.template(Speaker)
25
+ )
25
26
 
26
27
  IsPlayingCondition = speaker_ns.class_("IsPlayingCondition", automation.Condition)
28
+ IsStoppedCondition = speaker_ns.class_("IsStoppedCondition", automation.Condition)
27
29
 
28
30
 
29
31
  async def setup_speaker_core_(var, config):
@@ -75,11 +77,18 @@ async def speaker_play_action(config, action_id, template_arg, args):
75
77
  automation.register_action("speaker.stop", StopAction, SPEAKER_AUTOMATION_SCHEMA)(
76
78
  speaker_action
77
79
  )
80
+ automation.register_action("speaker.finish", FinishAction, SPEAKER_AUTOMATION_SCHEMA)(
81
+ speaker_action
82
+ )
78
83
 
79
84
  automation.register_condition(
80
85
  "speaker.is_playing", IsPlayingCondition, SPEAKER_AUTOMATION_SCHEMA
81
86
  )(speaker_action)
82
87
 
88
+ automation.register_condition(
89
+ "speaker.is_stopped", IsStoppedCondition, SPEAKER_AUTOMATION_SCHEMA
90
+ )(speaker_action)
91
+
83
92
 
84
93
  @coroutine_with_priority(100.0)
85
94
  async def to_code(config):
@@ -39,10 +39,20 @@ template<typename... Ts> class StopAction : public Action<Ts...>, public Parente
39
39
  void play(Ts... x) override { this->parent_->stop(); }
40
40
  };
41
41
 
42
+ template<typename... Ts> class FinishAction : public Action<Ts...>, public Parented<Speaker> {
43
+ public:
44
+ void play(Ts... x) override { this->parent_->finish(); }
45
+ };
46
+
42
47
  template<typename... Ts> class IsPlayingCondition : public Condition<Ts...>, public Parented<Speaker> {
43
48
  public:
44
49
  bool check(Ts... x) override { return this->parent_->is_running(); }
45
50
  };
46
51
 
52
+ template<typename... Ts> class IsStoppedCondition : public Condition<Ts...>, public Parented<Speaker> {
53
+ public:
54
+ bool check(Ts... x) override { return this->parent_->is_stopped(); }
55
+ };
56
+
47
57
  } // namespace speaker
48
58
  } // namespace esphome
@@ -1,5 +1,9 @@
1
1
  #pragma once
2
2
 
3
+ #include <stddef.h>
4
+ #include <cstdint>
5
+ #include <vector>
6
+
3
7
  namespace esphome {
4
8
  namespace speaker {
5
9
 
@@ -17,10 +21,15 @@ class Speaker {
17
21
 
18
22
  virtual void start() = 0;
19
23
  virtual void stop() = 0;
24
+ // In compare between *STOP()* and *FINISH()*; *FINISH()* will stop after emptying the play buffer,
25
+ // while *STOP()* will break directly.
26
+ // When finish() is not implemented on the plateform component it should just do a normal stop.
27
+ virtual void finish() { this->stop(); }
20
28
 
21
29
  virtual bool has_buffered_data() const = 0;
22
30
 
23
31
  bool is_running() const { return this->state_ == STATE_RUNNING; }
32
+ bool is_stopped() const { return this->state_ == STATE_STOPPED; }
24
33
 
25
34
  protected:
26
35
  State state_{STATE_STOPPED};
@@ -7,10 +7,6 @@ namespace spi {
7
7
 
8
8
  const char *const TAG = "spi";
9
9
 
10
- SPIDelegate *const SPIDelegate::NULL_DELEGATE = // NOLINT(cppcoreguidelines-avoid-non-const-global-variables)
11
- new SPIDelegateDummy();
12
- // https://bugs.llvm.org/show_bug.cgi?id=48040
13
-
14
10
  bool SPIDelegate::is_ready() { return true; }
15
11
 
16
12
  GPIOPin *const NullPin::NULL_PIN = new NullPin(); // NOLINT(cppcoreguidelines-avoid-non-const-global-variables)
@@ -79,8 +75,6 @@ void SPIComponent::dump_config() {
79
75
  }
80
76
  }
81
77
 
82
- void SPIDelegateDummy::begin_transaction() { ESP_LOGE(TAG, "SPIDevice not initialised - did you call spi_setup()?"); }
83
-
84
78
  uint8_t SPIDelegateBitBash::transfer(uint8_t data) { return this->transfer_(data, 8); }
85
79
 
86
80
  void SPIDelegateBitBash::write(uint16_t data, size_t num_bits) { this->transfer_(data, num_bits); }
@@ -163,8 +163,6 @@ class Utility {
163
163
  }
164
164
  };
165
165
 
166
- class SPIDelegateDummy;
167
-
168
166
  // represents a device attached to an SPI bus, with a defined clock rate, mode and bit order. On Arduino this is
169
167
  // a thin wrapper over SPIClass.
170
168
  class SPIDelegate {
@@ -250,21 +248,6 @@ class SPIDelegate {
250
248
  uint32_t data_rate_{1000000};
251
249
  SPIMode mode_{MODE0};
252
250
  GPIOPin *cs_pin_{NullPin::NULL_PIN};
253
- static SPIDelegate *const NULL_DELEGATE; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables)
254
- };
255
-
256
- /**
257
- * A dummy SPIDelegate that complains if it's used.
258
- */
259
-
260
- class SPIDelegateDummy : public SPIDelegate {
261
- public:
262
- SPIDelegateDummy() = default;
263
-
264
- uint8_t transfer(uint8_t data) override { return 0; }
265
- void end_transaction() override{};
266
-
267
- void begin_transaction() override;
268
251
  };
269
252
 
270
253
  /**
@@ -382,7 +365,7 @@ class SPIClient {
382
365
 
383
366
  virtual void spi_teardown() {
384
367
  this->parent_->unregister_device(this);
385
- this->delegate_ = SPIDelegate::NULL_DELEGATE;
368
+ this->delegate_ = nullptr;
386
369
  }
387
370
 
388
371
  bool spi_is_ready() { return this->delegate_->is_ready(); }
@@ -393,7 +376,7 @@ class SPIClient {
393
376
  uint32_t data_rate_{1000000};
394
377
  SPIComponent *parent_{nullptr};
395
378
  GPIOPin *cs_{nullptr};
396
- SPIDelegate *delegate_{SPIDelegate::NULL_DELEGATE};
379
+ SPIDelegate *delegate_{nullptr};
397
380
  };
398
381
 
399
382
  /**
@@ -13,7 +13,7 @@ class SpiLedStrip : public light::AddressableLight,
13
13
  public spi::SPIDevice<spi::BIT_ORDER_MSB_FIRST, spi::CLOCK_POLARITY_HIGH, spi::CLOCK_PHASE_TRAILING,
14
14
  spi::DATA_RATE_1MHZ> {
15
15
  public:
16
- void setup() { this->spi_setup(); }
16
+ void setup() override { this->spi_setup(); }
17
17
 
18
18
  int32_t size() const override { return this->num_leds_; }
19
19
 
@@ -43,13 +43,14 @@ class SpiLedStrip : public light::AddressableLight,
43
43
  memset(this->buf_, 0, 4);
44
44
  }
45
45
 
46
- void dump_config() {
46
+ void dump_config() override {
47
47
  esph_log_config(TAG, "SPI LED Strip:");
48
48
  esph_log_config(TAG, " LEDs: %d", this->num_leds_);
49
- if (this->data_rate_ >= spi::DATA_RATE_1MHZ)
49
+ if (this->data_rate_ >= spi::DATA_RATE_1MHZ) {
50
50
  esph_log_config(TAG, " Data rate: %uMHz", (unsigned) (this->data_rate_ / 1000000));
51
- else
51
+ } else {
52
52
  esph_log_config(TAG, " Data rate: %ukHz", (unsigned) (this->data_rate_ / 1000));
53
+ }
53
54
  }
54
55
 
55
56
  void write_state(light::LightState *state) override {
@@ -647,7 +647,7 @@ void Sprinkler::set_valve_run_duration(const optional<size_t> valve_number, cons
647
647
  return;
648
648
  }
649
649
  auto call = this->valve_[valve_number.value()].run_duration_number->make_call();
650
- if (this->valve_[valve_number.value()].run_duration_number->traits.get_unit_of_measurement() == min_str) {
650
+ if (this->valve_[valve_number.value()].run_duration_number->traits.get_unit_of_measurement() == MIN_STR) {
651
651
  call.set_value(run_duration.value() / 60.0);
652
652
  } else {
653
653
  call.set_value(run_duration.value());
@@ -729,7 +729,7 @@ uint32_t Sprinkler::valve_run_duration(const size_t valve_number) {
729
729
  return 0;
730
730
  }
731
731
  if (this->valve_[valve_number].run_duration_number != nullptr) {
732
- if (this->valve_[valve_number].run_duration_number->traits.get_unit_of_measurement() == min_str) {
732
+ if (this->valve_[valve_number].run_duration_number->traits.get_unit_of_measurement() == MIN_STR) {
733
733
  return static_cast<uint32_t>(roundf(this->valve_[valve_number].run_duration_number->state * 60));
734
734
  } else {
735
735
  return static_cast<uint32_t>(roundf(this->valve_[valve_number].run_duration_number->state));
@@ -11,7 +11,7 @@
11
11
  namespace esphome {
12
12
  namespace sprinkler {
13
13
 
14
- const std::string min_str = "min";
14
+ const std::string MIN_STR = "min";
15
15
 
16
16
  enum SprinklerState : uint8_t {
17
17
  // NOTE: these states are used by both SprinklerValveOperator and Sprinkler (the controller)!
@@ -1,8 +1,8 @@
1
- import esphome.codegen as cg
2
- import esphome.config_validation as cv
3
1
  from esphome import automation
4
2
  from esphome.automation import Condition, maybe_simple_id
3
+ import esphome.codegen as cg
5
4
  from esphome.components import mqtt, web_server
5
+ import esphome.config_validation as cv
6
6
  from esphome.const import (
7
7
  CONF_DEVICE_CLASS,
8
8
  CONF_ENTITY_CATEGORY,
@@ -10,11 +10,11 @@ from esphome.const import (
10
10
  CONF_ID,
11
11
  CONF_INVERTED,
12
12
  CONF_MQTT_ID,
13
- CONF_WEB_SERVER_ID,
14
13
  CONF_ON_TURN_OFF,
15
14
  CONF_ON_TURN_ON,
16
15
  CONF_RESTORE_MODE,
17
16
  CONF_TRIGGER_ID,
17
+ CONF_WEB_SERVER_ID,
18
18
  DEVICE_CLASS_EMPTY,
19
19
  DEVICE_CLASS_OUTLET,
20
20
  DEVICE_CLASS_SWITCH,
@@ -1,18 +1,18 @@
1
1
  from typing import Optional
2
- import esphome.codegen as cg
3
- import esphome.config_validation as cv
2
+
4
3
  from esphome import automation
4
+ import esphome.codegen as cg
5
5
  from esphome.components import mqtt, web_server
6
+ import esphome.config_validation as cv
6
7
  from esphome.const import (
7
8
  CONF_ID,
8
9
  CONF_MODE,
10
+ CONF_MQTT_ID,
9
11
  CONF_ON_VALUE,
10
12
  CONF_TRIGGER_ID,
11
- CONF_MQTT_ID,
12
- CONF_WEB_SERVER_ID,
13
13
  CONF_VALUE,
14
+ CONF_WEB_SERVER_ID,
14
15
  )
15
-
16
16
  from esphome.core import CORE, coroutine_with_priority
17
17
  from esphome.cpp_helpers import setup_entity
18
18
 
@@ -1,21 +1,21 @@
1
- import esphome.codegen as cg
2
- import esphome.config_validation as cv
3
1
  from esphome import automation
2
+ import esphome.codegen as cg
4
3
  from esphome.components import mqtt, web_server
4
+ import esphome.config_validation as cv
5
5
  from esphome.const import (
6
6
  CONF_DEVICE_CLASS,
7
7
  CONF_ENTITY_CATEGORY,
8
8
  CONF_FILTERS,
9
+ CONF_FROM,
9
10
  CONF_ICON,
10
11
  CONF_ID,
11
- CONF_ON_VALUE,
12
- CONF_ON_RAW_VALUE,
13
- CONF_TRIGGER_ID,
14
12
  CONF_MQTT_ID,
15
- CONF_WEB_SERVER_ID,
13
+ CONF_ON_RAW_VALUE,
14
+ CONF_ON_VALUE,
16
15
  CONF_STATE,
17
- CONF_FROM,
18
16
  CONF_TO,
17
+ CONF_TRIGGER_ID,
18
+ CONF_WEB_SERVER_ID,
19
19
  DEVICE_CLASS_DATE,
20
20
  DEVICE_CLASS_EMPTY,
21
21
  DEVICE_CLASS_TIMESTAMP,
@@ -1,32 +1,32 @@
1
- import logging
2
1
  from importlib import resources
2
+ import logging
3
3
  from typing import Optional
4
4
 
5
5
  import tzlocal
6
6
 
7
+ from esphome import automation
8
+ from esphome.automation import Condition
7
9
  import esphome.codegen as cg
8
10
  import esphome.config_validation as cv
9
- from esphome import automation
10
11
  from esphome.const import (
11
- CONF_ID,
12
+ CONF_AT,
12
13
  CONF_CRON,
13
14
  CONF_DAYS_OF_MONTH,
14
15
  CONF_DAYS_OF_WEEK,
16
+ CONF_HOUR,
15
17
  CONF_HOURS,
18
+ CONF_ID,
19
+ CONF_MINUTE,
16
20
  CONF_MINUTES,
17
21
  CONF_MONTHS,
18
22
  CONF_ON_TIME,
19
23
  CONF_ON_TIME_SYNC,
24
+ CONF_SECOND,
20
25
  CONF_SECONDS,
21
26
  CONF_TIMEZONE,
22
27
  CONF_TRIGGER_ID,
23
- CONF_AT,
24
- CONF_SECOND,
25
- CONF_HOUR,
26
- CONF_MINUTE,
27
28
  )
28
29
  from esphome.core import coroutine_with_priority
29
- from esphome.automation import Condition
30
30
 
31
31
  _LOGGER = logging.getLogger(__name__)
32
32
 
@@ -1,10 +1,9 @@
1
1
  import esphome.codegen as cg
2
- import esphome.config_validation as cv
3
-
4
2
  from esphome.components import binary_sensor, display
5
- from esphome.const import CONF_PAGE_ID
3
+ import esphome.config_validation as cv
4
+ from esphome.const import CONF_PAGE_ID, CONF_PAGES
6
5
 
7
- from .. import touchscreen_ns, CONF_TOUCHSCREEN_ID, Touchscreen, TouchListener
6
+ from .. import CONF_TOUCHSCREEN_ID, TouchListener, Touchscreen, touchscreen_ns
8
7
 
9
8
  DEPENDENCIES = ["touchscreen"]
10
9
 
@@ -22,7 +21,7 @@ CONF_Y_MIN = "y_min"
22
21
  CONF_Y_MAX = "y_max"
23
22
 
24
23
 
25
- def validate_coords(config):
24
+ def _validate_coords(config):
26
25
  if (
27
26
  config[CONF_X_MAX] < config[CONF_X_MIN]
28
27
  or config[CONF_Y_MAX] < config[CONF_Y_MIN]
@@ -33,6 +32,15 @@ def validate_coords(config):
33
32
  return config
34
33
 
35
34
 
35
+ def _set_pages(config: dict) -> dict:
36
+ if CONF_PAGES in config or CONF_PAGE_ID not in config:
37
+ return config
38
+
39
+ config = config.copy()
40
+ config[CONF_PAGES] = [config.pop(CONF_PAGE_ID)]
41
+ return config
42
+
43
+
36
44
  CONFIG_SCHEMA = cv.All(
37
45
  binary_sensor.binary_sensor_schema(TouchscreenBinarySensor)
38
46
  .extend(
@@ -42,11 +50,17 @@ CONFIG_SCHEMA = cv.All(
42
50
  cv.Required(CONF_X_MAX): cv.int_range(min=0, max=2000),
43
51
  cv.Required(CONF_Y_MIN): cv.int_range(min=0, max=2000),
44
52
  cv.Required(CONF_Y_MAX): cv.int_range(min=0, max=2000),
45
- cv.Optional(CONF_PAGE_ID): cv.use_id(display.DisplayPage),
53
+ cv.Exclusive(CONF_PAGE_ID, group_of_exclusion=CONF_PAGES): cv.use_id(
54
+ display.DisplayPage
55
+ ),
56
+ cv.Exclusive(CONF_PAGES, group_of_exclusion=CONF_PAGES): cv.ensure_list(
57
+ cv.use_id(display.DisplayPage)
58
+ ),
46
59
  }
47
60
  )
48
61
  .extend(cv.COMPONENT_SCHEMA),
49
- validate_coords,
62
+ _validate_coords,
63
+ _set_pages,
50
64
  )
51
65
 
52
66
 
@@ -64,6 +78,6 @@ async def to_code(config):
64
78
  )
65
79
  )
66
80
 
67
- if CONF_PAGE_ID in config:
68
- page = await cg.get_variable(config[CONF_PAGE_ID])
69
- cg.add(var.set_page(page))
81
+ for page_id in config.get(CONF_PAGES, []):
82
+ page = await cg.get_variable(page_id)
83
+ cg.add(var.add_page(page))
@@ -11,8 +11,9 @@ void TouchscreenBinarySensor::setup() {
11
11
  void TouchscreenBinarySensor::touch(TouchPoint tp) {
12
12
  bool touched = (tp.x >= this->x_min_ && tp.x <= this->x_max_ && tp.y >= this->y_min_ && tp.y <= this->y_max_);
13
13
 
14
- if (this->page_ != nullptr) {
15
- touched &= this->page_ == this->parent_->get_display()->get_active_page();
14
+ if (!this->pages_.empty()) {
15
+ auto *current_page = this->parent_->get_display()->get_active_page();
16
+ touched &= std::find(this->pages_.begin(), this->pages_.end(), current_page) != this->pages_.end();
16
17
  }
17
18
  if (touched) {
18
19
  this->publish_state(true);
@@ -6,6 +6,8 @@
6
6
  #include "esphome/core/component.h"
7
7
  #include "esphome/core/helpers.h"
8
8
 
9
+ #include <vector>
10
+
9
11
  namespace esphome {
10
12
  namespace touchscreen {
11
13
 
@@ -30,14 +32,14 @@ class TouchscreenBinarySensor : public binary_sensor::BinarySensor,
30
32
  int16_t get_width() { return this->x_max_ - this->x_min_; }
31
33
  int16_t get_height() { return this->y_max_ - this->y_min_; }
32
34
 
33
- void set_page(display::DisplayPage *page) { this->page_ = page; }
35
+ void add_page(display::DisplayPage *page) { this->pages_.push_back(page); }
34
36
 
35
37
  void touch(TouchPoint tp) override;
36
38
  void release() override;
37
39
 
38
40
  protected:
39
41
  int16_t x_min_, x_max_, y_min_, y_max_;
40
- display::DisplayPage *page_{nullptr};
42
+ std::vector<display::DisplayPage *> pages_{};
41
43
  };
42
44
 
43
45
  } // namespace touchscreen
@@ -5,8 +5,8 @@
5
5
  #include "esphome/core/helpers.h"
6
6
  #include "esphome/core/log.h"
7
7
 
8
- #ifndef __linux__
9
- #error This HostUartComponent implementation is only for Linux
8
+ #if !(defined(__linux__) || defined(__APPLE__))
9
+ #error This HostUartComponent implementation is not supported on this host OS
10
10
  #endif
11
11
 
12
12
  #include <stdio.h>
@@ -24,6 +24,9 @@
24
24
  namespace {
25
25
 
26
26
  speed_t get_baud(int baud) {
27
+ #ifdef __APPLE__
28
+ return baud;
29
+ #else
27
30
  switch (baud) {
28
31
  case 50:
29
32
  return B50;
@@ -88,6 +91,7 @@ speed_t get_baud(int baud) {
88
91
  default:
89
92
  return B0;
90
93
  }
94
+ #endif
91
95
  }
92
96
 
93
97
  } // namespace