esphome 2024.12.3__py3-none-any.whl → 2025.2.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 (366) hide show
  1. esphome/__main__.py +16 -3
  2. esphome/components/adc/__init__.py +17 -11
  3. esphome/components/adc/adc_sensor.h +17 -0
  4. esphome/components/adc/adc_sensor_common.cpp +55 -0
  5. esphome/components/adc/adc_sensor_esp32.cpp +8 -5
  6. esphome/components/adc/adc_sensor_esp8266.cpp +10 -6
  7. esphome/components/adc/adc_sensor_libretiny.cpp +11 -6
  8. esphome/components/adc/adc_sensor_rp2040.cpp +13 -10
  9. esphome/components/adc/sensor.py +9 -3
  10. esphome/components/ads1115/ads1115.cpp +56 -7
  11. esphome/components/ads1115/ads1115.h +13 -1
  12. esphome/components/ads1115/sensor/__init__.py +16 -0
  13. esphome/components/ads1115/sensor/ads1115_sensor.cpp +2 -1
  14. esphome/components/ads1115/sensor/ads1115_sensor.h +2 -0
  15. esphome/components/animation/__init__.py +23 -261
  16. esphome/components/animation/animation.cpp +2 -2
  17. esphome/components/animation/animation.h +2 -1
  18. esphome/components/api/api_pb2.cpp +14 -0
  19. esphome/components/api/api_pb2.h +1 -0
  20. esphome/components/api/client.py +8 -3
  21. esphome/components/audio/__init__.py +112 -0
  22. esphome/components/audio/audio.cpp +67 -0
  23. esphome/components/audio/audio.h +125 -7
  24. esphome/components/audio/audio_decoder.cpp +361 -0
  25. esphome/components/audio/audio_decoder.h +135 -0
  26. esphome/components/audio/audio_reader.cpp +308 -0
  27. esphome/components/audio/audio_reader.h +85 -0
  28. esphome/components/audio/audio_resampler.cpp +159 -0
  29. esphome/components/audio/audio_resampler.h +101 -0
  30. esphome/components/audio/audio_transfer_buffer.cpp +165 -0
  31. esphome/components/audio/audio_transfer_buffer.h +139 -0
  32. esphome/components/audio_adc/__init__.py +41 -0
  33. esphome/components/audio_adc/audio_adc.h +17 -0
  34. esphome/components/audio_adc/automation.h +23 -0
  35. esphome/components/bk72xx/__init__.py +1 -0
  36. esphome/components/ble_client/ble_client.cpp +1 -2
  37. esphome/components/ble_client/sensor/__init__.py +1 -1
  38. esphome/components/ble_client/text_sensor/__init__.py +1 -1
  39. esphome/components/bluetooth_proxy/bluetooth_connection.cpp +5 -0
  40. esphome/components/bluetooth_proxy/bluetooth_connection.h +1 -0
  41. esphome/components/bluetooth_proxy/bluetooth_proxy.cpp +5 -0
  42. esphome/components/ch422g/ch422g.h +2 -0
  43. esphome/components/climate/__init__.py +1 -1
  44. esphome/components/climate_ir/climate_ir.cpp +2 -1
  45. esphome/components/coolix/coolix.cpp +2 -1
  46. esphome/components/cse7766/cse7766.cpp +8 -16
  47. esphome/components/custom/__init__.py +0 -3
  48. esphome/components/custom/binary_sensor/__init__.py +2 -28
  49. esphome/components/custom/climate/__init__.py +2 -27
  50. esphome/components/custom/cover/__init__.py +2 -27
  51. esphome/components/custom/light/__init__.py +2 -27
  52. esphome/components/custom/output/__init__.py +2 -58
  53. esphome/components/custom/sensor/__init__.py +2 -24
  54. esphome/components/custom/switch/__init__.py +2 -24
  55. esphome/components/custom/text_sensor/__init__.py +2 -29
  56. esphome/components/custom_component/__init__.py +3 -27
  57. esphome/components/daly_bms/daly_bms.cpp +6 -0
  58. esphome/components/daly_bms/daly_bms.h +2 -0
  59. esphome/components/daly_bms/sensor.py +6 -0
  60. esphome/components/debug/debug_component.cpp +4 -0
  61. esphome/components/debug/debug_component.h +14 -0
  62. esphome/components/debug/debug_esp32.cpp +154 -74
  63. esphome/components/dfplayer/dfplayer.cpp +15 -2
  64. esphome/components/dfrobot_sen0395/dfrobot_sen0395.cpp +2 -1
  65. esphome/components/dht/dht.cpp +4 -2
  66. esphome/components/dht/sensor.py +1 -1
  67. esphome/components/display/__init__.py +18 -5
  68. esphome/components/display/display.cpp +16 -3
  69. esphome/components/display/rect.cpp +2 -1
  70. esphome/components/es7210/__init__.py +0 -0
  71. esphome/components/es7210/audio_adc.py +51 -0
  72. esphome/components/es7210/es7210.cpp +228 -0
  73. esphome/components/es7210/es7210.h +62 -0
  74. esphome/components/es7210/es7210_const.h +129 -0
  75. esphome/components/es7243e/__init__.py +0 -0
  76. esphome/components/es7243e/audio_adc.py +34 -0
  77. esphome/components/es7243e/es7243e.cpp +125 -0
  78. esphome/components/es7243e/es7243e.h +37 -0
  79. esphome/components/es7243e/es7243e_const.h +54 -0
  80. esphome/components/es8156/__init__.py +0 -0
  81. esphome/components/es8156/audio_dac.py +27 -0
  82. esphome/components/es8156/es8156.cpp +87 -0
  83. esphome/components/es8156/es8156.h +51 -0
  84. esphome/components/es8156/es8156_const.h +68 -0
  85. esphome/components/es8311/audio_dac.py +1 -2
  86. esphome/components/esp32/__init__.py +1 -0
  87. esphome/components/esp32/core.cpp +5 -1
  88. esphome/components/esp32/gpio.h +2 -0
  89. esphome/components/esp32_ble/__init__.py +39 -0
  90. esphome/components/esp32_ble/queue.h +4 -4
  91. esphome/components/esp32_ble_client/ble_client_base.cpp +46 -0
  92. esphome/components/esp32_ble_client/ble_client_base.h +2 -0
  93. esphome/components/esp32_ble_server/__init__.py +582 -12
  94. esphome/components/esp32_ble_server/ble_characteristic.cpp +48 -60
  95. esphome/components/esp32_ble_server/ble_characteristic.h +24 -17
  96. esphome/components/esp32_ble_server/ble_descriptor.cpp +21 -9
  97. esphome/components/esp32_ble_server/ble_descriptor.h +17 -6
  98. esphome/components/esp32_ble_server/ble_server.cpp +62 -67
  99. esphome/components/esp32_ble_server/ble_server.h +28 -32
  100. esphome/components/esp32_ble_server/ble_server_automations.cpp +77 -0
  101. esphome/components/esp32_ble_server/ble_server_automations.h +115 -0
  102. esphome/components/esp32_ble_server/ble_service.cpp +17 -15
  103. esphome/components/esp32_ble_server/ble_service.h +10 -14
  104. esphome/components/esp32_ble_tracker/__init__.py +6 -39
  105. esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +33 -10
  106. esphome/components/esp32_ble_tracker/esp32_ble_tracker.h +8 -4
  107. esphome/components/esp32_dac/esp32_dac.cpp +16 -7
  108. esphome/components/esp32_dac/esp32_dac.h +8 -0
  109. esphome/components/esp32_dac/output.py +16 -4
  110. esphome/components/esp32_improv/__init__.py +2 -8
  111. esphome/components/esp32_improv/esp32_improv_component.cpp +21 -20
  112. esphome/components/esp32_improv/esp32_improv_component.h +3 -4
  113. esphome/components/esp32_rmt/__init__.py +28 -3
  114. esphome/components/esp32_rmt_led_strip/led_strip.cpp +73 -6
  115. esphome/components/esp32_rmt_led_strip/led_strip.h +21 -3
  116. esphome/components/esp32_rmt_led_strip/light.py +72 -7
  117. esphome/components/esp32_touch/esp32_touch.cpp +5 -0
  118. esphome/components/esp8266/__init__.py +1 -0
  119. esphome/components/esp8266/gpio.h +1 -0
  120. esphome/components/ethernet/__init__.py +10 -10
  121. esphome/components/event/event.cpp +4 -2
  122. esphome/components/event/event.h +2 -0
  123. esphome/components/event_emitter/__init__.py +5 -0
  124. esphome/components/event_emitter/event_emitter.cpp +14 -0
  125. esphome/components/event_emitter/event_emitter.h +63 -0
  126. esphome/components/font/__init__.py +1 -1
  127. esphome/components/gcja5/gcja5.cpp +2 -1
  128. esphome/components/graph/graph.cpp +4 -9
  129. esphome/components/haier/haier_base.cpp +2 -1
  130. esphome/components/haier/hon_climate.cpp +2 -1
  131. esphome/components/heatpumpir/heatpumpir.cpp +2 -1
  132. esphome/components/host/__init__.py +1 -0
  133. esphome/components/host/gpio.h +1 -0
  134. esphome/components/http_request/http_request.h +2 -2
  135. esphome/components/http_request/http_request_arduino.cpp +1 -1
  136. esphome/components/http_request/http_request_idf.cpp +1 -1
  137. esphome/components/i2c/i2c_bus_esp_idf.cpp +4 -0
  138. esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp +7 -5
  139. esphome/components/i2s_audio/speaker/__init__.py +53 -6
  140. esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +92 -46
  141. esphome/components/i2s_audio/speaker/i2s_audio_speaker.h +8 -0
  142. esphome/components/ili9xxx/display.py +29 -11
  143. esphome/components/ili9xxx/ili9xxx_display.cpp +2 -5
  144. esphome/components/ili9xxx/ili9xxx_display.h +2 -1
  145. esphome/components/image/__init__.py +443 -255
  146. esphome/components/image/image.cpp +115 -61
  147. esphome/components/image/image.h +15 -24
  148. esphome/components/json/json_util.cpp +8 -34
  149. esphome/components/libretiny/__init__.py +1 -0
  150. esphome/components/libretiny/gpio_arduino.h +1 -0
  151. esphome/components/light/light_color_values.h +1 -1
  152. esphome/components/logger/__init__.py +45 -9
  153. esphome/components/logger/logger.cpp +16 -14
  154. esphome/components/logger/logger.h +11 -7
  155. esphome/components/logger/select/__init__.py +29 -0
  156. esphome/components/logger/select/logger_level_select.cpp +27 -0
  157. esphome/components/logger/select/logger_level_select.h +15 -0
  158. esphome/components/lvgl/__init__.py +96 -73
  159. esphome/components/lvgl/automation.py +39 -7
  160. esphome/components/lvgl/defines.py +8 -2
  161. esphome/components/lvgl/lvgl_esphome.cpp +8 -15
  162. esphome/components/lvgl/lvgl_esphome.h +20 -5
  163. esphome/components/lvgl/schemas.py +25 -14
  164. esphome/components/lvgl/trigger.py +27 -3
  165. esphome/components/lvgl/widgets/dropdown.py +1 -1
  166. esphome/components/lvgl/widgets/keyboard.py +8 -1
  167. esphome/components/lvgl/widgets/meter.py +2 -1
  168. esphome/components/lvgl/widgets/msgbox.py +1 -1
  169. esphome/components/lvgl/widgets/obj.py +1 -12
  170. esphome/components/lvgl/widgets/page.py +37 -2
  171. esphome/components/lvgl/widgets/tabview.py +1 -1
  172. esphome/components/max6956/max6956.h +2 -0
  173. esphome/components/mcp23016/mcp23016.h +2 -0
  174. esphome/components/mcp23xxx_base/mcp23xxx_base.h +2 -0
  175. esphome/components/mdns/__init__.py +1 -1
  176. esphome/components/media_player/__init__.py +37 -8
  177. esphome/components/media_player/automation.h +11 -2
  178. esphome/components/media_player/media_player.cpp +8 -0
  179. esphome/components/media_player/media_player.h +8 -4
  180. esphome/components/micronova/switch/micronova_switch.cpp +4 -2
  181. esphome/components/midea/ac_automations.h +3 -1
  182. esphome/components/midea/air_conditioner.cpp +7 -5
  183. esphome/components/midea/air_conditioner.h +1 -1
  184. esphome/components/midea/climate.py +4 -2
  185. esphome/components/midea/ir_transmitter.h +36 -5
  186. esphome/components/mixer/__init__.py +0 -0
  187. esphome/components/mixer/speaker/__init__.py +172 -0
  188. esphome/components/mixer/speaker/automation.h +19 -0
  189. esphome/components/mixer/speaker/mixer_speaker.cpp +624 -0
  190. esphome/components/mixer/speaker/mixer_speaker.h +207 -0
  191. esphome/components/modbus_controller/text_sensor/modbus_textsensor.cpp +7 -13
  192. esphome/components/mpr121/mpr121.h +2 -0
  193. esphome/components/mqtt/__init__.py +1 -1
  194. esphome/components/mqtt/mqtt_client.cpp +7 -1
  195. esphome/components/mqtt/mqtt_client.h +1 -1
  196. esphome/components/mqtt/mqtt_climate.cpp +2 -2
  197. esphome/components/network/ip_address.h +2 -0
  198. esphome/components/nextion/automation.h +17 -0
  199. esphome/components/nextion/display.py +42 -17
  200. esphome/components/nextion/nextion.cpp +4 -10
  201. esphome/components/nextion/nextion.h +89 -82
  202. esphome/components/nextion/nextion_commands.cpp +10 -10
  203. esphome/components/ntc/sensor.py +2 -4
  204. esphome/components/online_image/__init__.py +98 -46
  205. esphome/components/online_image/bmp_image.cpp +101 -0
  206. esphome/components/online_image/bmp_image.h +40 -0
  207. esphome/components/online_image/image_decoder.cpp +31 -2
  208. esphome/components/online_image/image_decoder.h +24 -15
  209. esphome/components/online_image/jpeg_image.cpp +92 -0
  210. esphome/components/online_image/jpeg_image.h +34 -0
  211. esphome/components/online_image/online_image.cpp +118 -58
  212. esphome/components/online_image/online_image.h +39 -9
  213. esphome/components/online_image/png_image.cpp +7 -3
  214. esphome/components/online_image/png_image.h +2 -1
  215. esphome/components/opentherm/__init__.py +73 -7
  216. esphome/components/opentherm/automation.h +25 -0
  217. esphome/components/opentherm/const.py +1 -0
  218. esphome/components/opentherm/generate.py +39 -6
  219. esphome/components/opentherm/hub.cpp +117 -79
  220. esphome/components/opentherm/hub.h +31 -15
  221. esphome/components/opentherm/opentherm.cpp +47 -23
  222. esphome/components/opentherm/opentherm.h +27 -6
  223. esphome/components/opentherm/opentherm_macros.h +11 -0
  224. esphome/components/opentherm/schema.py +78 -1
  225. esphome/components/opentherm/validate.py +7 -2
  226. esphome/components/pca6416a/pca6416a.h +2 -0
  227. esphome/components/pca9554/pca9554.h +2 -0
  228. esphome/components/pcf8574/pcf8574.h +2 -0
  229. esphome/components/preferences/__init__.py +2 -4
  230. esphome/components/preferences/syncer.h +10 -3
  231. esphome/components/prometheus/prometheus_handler.cpp +313 -0
  232. esphome/components/prometheus/prometheus_handler.h +48 -7
  233. esphome/components/psram/psram.cpp +8 -1
  234. esphome/components/pulse_counter/pulse_counter_sensor.cpp +14 -9
  235. esphome/components/pulse_counter/pulse_counter_sensor.h +4 -4
  236. esphome/components/pulse_meter/pulse_meter_sensor.cpp +2 -0
  237. esphome/components/qspi_dbi/__init__.py +3 -0
  238. esphome/components/qspi_dbi/display.py +74 -47
  239. esphome/components/qspi_dbi/models.py +245 -2
  240. esphome/components/qspi_dbi/qspi_dbi.cpp +9 -16
  241. esphome/components/qspi_dbi/qspi_dbi.h +2 -2
  242. esphome/components/remote_base/__init__.py +77 -25
  243. esphome/components/remote_base/remote_base.cpp +1 -1
  244. esphome/components/remote_base/remote_base.h +20 -2
  245. esphome/components/remote_base/toto_protocol.cpp +100 -0
  246. esphome/components/remote_base/toto_protocol.h +45 -0
  247. esphome/components/remote_receiver/__init__.py +55 -10
  248. esphome/components/remote_receiver/remote_receiver.h +36 -3
  249. esphome/components/remote_receiver/remote_receiver_esp32.cpp +145 -6
  250. esphome/components/remote_transmitter/__init__.py +62 -4
  251. esphome/components/remote_transmitter/remote_transmitter.h +21 -2
  252. esphome/components/remote_transmitter/remote_transmitter_esp32.cpp +140 -4
  253. esphome/components/remote_transmitter/remote_transmitter_esp8266.cpp +3 -3
  254. esphome/components/remote_transmitter/remote_transmitter_libretiny.cpp +3 -3
  255. esphome/components/resampler/__init__.py +0 -0
  256. esphome/components/resampler/speaker/__init__.py +103 -0
  257. esphome/components/resampler/speaker/resampler_speaker.cpp +318 -0
  258. esphome/components/resampler/speaker/resampler_speaker.h +107 -0
  259. esphome/components/resistance/resistance_sensor.h +2 -3
  260. esphome/components/resistance/sensor.py +2 -9
  261. esphome/components/rotary_encoder/rotary_encoder.cpp +8 -4
  262. esphome/components/rp2040/__init__.py +1 -0
  263. esphome/components/rp2040/gpio.h +1 -0
  264. esphome/components/rtl87xx/__init__.py +2 -0
  265. esphome/components/scd30/sensor.py +1 -1
  266. esphome/components/sdl/binary_sensor.py +270 -0
  267. esphome/components/sdl/sdl_esphome.cpp +16 -0
  268. esphome/components/sdl/sdl_esphome.h +9 -0
  269. esphome/components/seeed_mr60bha2/binary_sensor.py +25 -0
  270. esphome/components/seeed_mr60bha2/seeed_mr60bha2.cpp +26 -2
  271. esphome/components/seeed_mr60bha2/seeed_mr60bha2.h +9 -20
  272. esphome/components/seeed_mr60bha2/sensor.py +9 -1
  273. esphome/components/sn74hc165/sn74hc165.h +3 -0
  274. esphome/components/sn74hc595/sn74hc595.h +3 -0
  275. esphome/components/speaker/__init__.py +5 -4
  276. esphome/components/speaker/media_player/__init__.py +458 -0
  277. esphome/components/speaker/media_player/audio_pipeline.cpp +568 -0
  278. esphome/components/speaker/media_player/audio_pipeline.h +159 -0
  279. esphome/components/speaker/media_player/automation.h +26 -0
  280. esphome/components/speaker/media_player/speaker_media_player.cpp +577 -0
  281. esphome/components/speaker/media_player/speaker_media_player.h +160 -0
  282. esphome/components/speaker/speaker.h +20 -0
  283. esphome/components/spi/__init__.py +1 -5
  284. esphome/components/spi/spi.cpp +7 -1
  285. esphome/components/spi/spi.h +21 -2
  286. esphome/components/spi_led_strip/light.py +3 -5
  287. esphome/components/spi_led_strip/spi_led_strip.cpp +67 -0
  288. esphome/components/spi_led_strip/spi_led_strip.h +8 -60
  289. esphome/components/sprinkler/sprinkler.cpp +3 -1
  290. esphome/components/sx1509/sx1509_gpio_pin.h +2 -0
  291. esphome/components/tca9555/tca9555.h +2 -0
  292. esphome/components/toshiba/toshiba.cpp +2 -1
  293. esphome/components/tuya/light/tuya_light.cpp +4 -2
  294. esphome/components/uart/uart_component_esp32_arduino.cpp +2 -2
  295. esphome/components/uart/uart_component_esp_idf.cpp +2 -2
  296. esphome/components/udp/__init__.py +8 -2
  297. esphome/components/udp/udp_component.cpp +25 -56
  298. esphome/components/udp/udp_component.h +3 -0
  299. esphome/components/uponor_smatrix/sensor/__init__.py +14 -4
  300. esphome/components/uponor_smatrix/sensor/uponor_smatrix_sensor.cpp +5 -0
  301. esphome/components/uponor_smatrix/sensor/uponor_smatrix_sensor.h +1 -0
  302. esphome/components/uptime/text_sensor/__init__.py +19 -0
  303. esphome/components/uptime/text_sensor/uptime_text_sensor.cpp +63 -0
  304. esphome/components/uptime/text_sensor/uptime_text_sensor.h +25 -0
  305. esphome/components/voice_assistant/voice_assistant.cpp +24 -14
  306. esphome/components/voice_assistant/voice_assistant.h +8 -0
  307. esphome/components/waveshare_epaper/display.py +22 -1
  308. esphome/components/waveshare_epaper/waveshare_213v3.cpp +9 -3
  309. esphome/components/waveshare_epaper/waveshare_epaper.cpp +1155 -44
  310. esphome/components/waveshare_epaper/waveshare_epaper.h +208 -7
  311. esphome/components/web_server/web_server.cpp +28 -6
  312. esphome/components/weikai/weikai.h +2 -0
  313. esphome/components/wifi/__init__.py +6 -6
  314. esphome/components/wifi/wifi_component.cpp +1 -1
  315. esphome/components/wifi/wifi_component_esp32_arduino.cpp +30 -1
  316. esphome/components/wireguard/__init__.py +2 -2
  317. esphome/components/xl9535/xl9535.h +2 -0
  318. esphome/components/xxtea/__init__.py +3 -0
  319. esphome/components/xxtea/xxtea.cpp +46 -0
  320. esphome/components/xxtea/xxtea.h +26 -0
  321. esphome/components/yashima/yashima.cpp +2 -1
  322. esphome/config.py +9 -5
  323. esphome/config_validation.py +55 -17
  324. esphome/const.py +7 -10
  325. esphome/core/__init__.py +6 -13
  326. esphome/core/base_automation.h +1 -0
  327. esphome/core/config.py +59 -72
  328. esphome/core/defines.h +9 -1
  329. esphome/core/gpio.h +7 -0
  330. esphome/core/helpers.cpp +19 -15
  331. esphome/core/helpers.h +57 -8
  332. esphome/core/log.h +9 -7
  333. esphome/cpp_generator.py +2 -2
  334. esphome/dashboard/web_server.py +1 -1
  335. esphome/espota2.py +3 -2
  336. esphome/loader.py +12 -4
  337. esphome/log.py +5 -7
  338. esphome/yaml_util.py +2 -2
  339. {esphome-2024.12.3.dist-info → esphome-2025.2.0.dist-info}/METADATA +14 -9
  340. {esphome-2024.12.3.dist-info → esphome-2025.2.0.dist-info}/RECORD +349 -300
  341. esphome/components/custom/binary_sensor/custom_binary_sensor.cpp +0 -16
  342. esphome/components/custom/binary_sensor/custom_binary_sensor.h +0 -26
  343. esphome/components/custom/climate/custom_climate.h +0 -22
  344. esphome/components/custom/cover/custom_cover.h +0 -21
  345. esphome/components/custom/light/custom_light_output.h +0 -24
  346. esphome/components/custom/output/custom_output.h +0 -37
  347. esphome/components/custom/sensor/custom_sensor.cpp +0 -16
  348. esphome/components/custom/sensor/custom_sensor.h +0 -24
  349. esphome/components/custom/switch/custom_switch.cpp +0 -16
  350. esphome/components/custom/switch/custom_switch.h +0 -24
  351. esphome/components/custom/text_sensor/custom_text_sensor.cpp +0 -16
  352. esphome/components/custom/text_sensor/custom_text_sensor.h +0 -26
  353. esphome/components/custom_component/custom_component.h +0 -28
  354. esphome/components/esp32_ble_server/ble_2901.cpp +0 -18
  355. esphome/components/esp32_ble_server/ble_2901.h +0 -19
  356. esphome/components/resistance_sampler/__init__.py +0 -6
  357. esphome/components/resistance_sampler/resistance_sampler.h +0 -10
  358. esphome/components/uptime/{sensor.py → sensor/__init__.py} +3 -3
  359. /esphome/components/uptime/{uptime_seconds_sensor.cpp → sensor/uptime_seconds_sensor.cpp} +0 -0
  360. /esphome/components/uptime/{uptime_seconds_sensor.h → sensor/uptime_seconds_sensor.h} +0 -0
  361. /esphome/components/uptime/{uptime_timestamp_sensor.cpp → sensor/uptime_timestamp_sensor.cpp} +0 -0
  362. /esphome/components/uptime/{uptime_timestamp_sensor.h → sensor/uptime_timestamp_sensor.h} +0 -0
  363. {esphome-2024.12.3.dist-info → esphome-2025.2.0.dist-info}/LICENSE +0 -0
  364. {esphome-2024.12.3.dist-info → esphome-2025.2.0.dist-info}/WHEEL +0 -0
  365. {esphome-2024.12.3.dist-info → esphome-2025.2.0.dist-info}/entry_points.txt +0 -0
  366. {esphome-2024.12.3.dist-info → esphome-2025.2.0.dist-info}/top_level.txt +0 -0
@@ -24,6 +24,7 @@ from esphome.const import (
24
24
  )
25
25
  from esphome.core import TimePeriod
26
26
 
27
+ from . import CONF_DRAW_FROM_ORIGIN, CONF_DRAW_ROUNDING
27
28
  from .models import DriverChip
28
29
 
29
30
  DEPENDENCIES = ["spi"]
@@ -41,7 +42,6 @@ COLOR_ORDERS = {
41
42
  }
42
43
  DATA_PIN_SCHEMA = pins.internal_gpio_output_pin_schema
43
44
 
44
- CONF_DRAW_FROM_ORIGIN = "draw_from_origin"
45
45
  DELAY_FLAG = 0xFF
46
46
 
47
47
 
@@ -78,56 +78,81 @@ def _validate(config):
78
78
  return config
79
79
 
80
80
 
81
- CONFIG_SCHEMA = cv.All(
82
- display.FULL_DISPLAY_SCHEMA.extend(
83
- cv.Schema(
84
- {
85
- cv.GenerateID(): cv.declare_id(QSPI_DBI),
86
- cv.Required(CONF_MODEL): cv.one_of(
87
- *DriverChip.chips.keys(), upper=True
88
- ),
89
- cv.Optional(CONF_INIT_SEQUENCE): cv.ensure_list(map_sequence),
90
- cv.Required(CONF_DIMENSIONS): cv.Any(
91
- cv.dimensions,
92
- cv.Schema(
93
- {
94
- cv.Required(CONF_WIDTH): validate_dimension,
95
- cv.Required(CONF_HEIGHT): validate_dimension,
96
- cv.Optional(
97
- CONF_OFFSET_HEIGHT, default=0
98
- ): validate_dimension,
99
- cv.Optional(
100
- CONF_OFFSET_WIDTH, default=0
101
- ): validate_dimension,
102
- }
103
- ),
104
- ),
105
- cv.Optional(CONF_TRANSFORM): cv.Schema(
81
+ def power_of_two(value):
82
+ value = cv.int_range(1, 128)(value)
83
+ if value & (value - 1) != 0:
84
+ raise cv.Invalid("value must be a power of two")
85
+ return value
86
+
87
+
88
+ BASE_SCHEMA = display.FULL_DISPLAY_SCHEMA.extend(
89
+ cv.Schema(
90
+ {
91
+ cv.GenerateID(): cv.declare_id(QSPI_DBI),
92
+ cv.Optional(CONF_INIT_SEQUENCE): cv.ensure_list(map_sequence),
93
+ cv.Required(CONF_DIMENSIONS): cv.Any(
94
+ cv.dimensions,
95
+ cv.Schema(
106
96
  {
107
- cv.Optional(CONF_MIRROR_X, default=False): cv.boolean,
108
- cv.Optional(CONF_MIRROR_Y, default=False): cv.boolean,
109
- cv.Optional(CONF_SWAP_XY, default=False): cv.boolean,
97
+ cv.Required(CONF_WIDTH): validate_dimension,
98
+ cv.Required(CONF_HEIGHT): validate_dimension,
99
+ cv.Optional(CONF_OFFSET_HEIGHT, default=0): validate_dimension,
100
+ cv.Optional(CONF_OFFSET_WIDTH, default=0): validate_dimension,
110
101
  }
111
102
  ),
112
- cv.Optional(CONF_COLOR_ORDER, default="RGB"): cv.enum(
113
- COLOR_ORDERS, upper=True
114
- ),
115
- cv.Optional(CONF_INVERT_COLORS, default=False): cv.boolean,
116
- cv.Optional(CONF_RESET_PIN): pins.gpio_output_pin_schema,
117
- cv.Optional(CONF_ENABLE_PIN): pins.gpio_output_pin_schema,
118
- cv.Optional(CONF_BRIGHTNESS, default=0xD0): cv.int_range(
119
- 0, 0xFF, min_included=True, max_included=True
120
- ),
121
- cv.Optional(CONF_DRAW_FROM_ORIGIN, default=False): cv.boolean,
103
+ ),
104
+ cv.Optional(CONF_DRAW_FROM_ORIGIN, default=False): cv.boolean,
105
+ cv.Optional(CONF_RESET_PIN): pins.gpio_output_pin_schema,
106
+ cv.Optional(CONF_ENABLE_PIN): pins.gpio_output_pin_schema,
107
+ cv.Optional(CONF_BRIGHTNESS, default=0xD0): cv.int_range(
108
+ 0, 0xFF, min_included=True, max_included=True
109
+ ),
110
+ }
111
+ ).extend(
112
+ spi.spi_device_schema(
113
+ cs_pin_required=False,
114
+ default_mode="MODE0",
115
+ default_data_rate=10e6,
116
+ quad=True,
117
+ )
118
+ )
119
+ )
120
+
121
+
122
+ def model_property(name, defaults, fallback):
123
+ return cv.Optional(name, default=defaults.get(name, fallback))
124
+
125
+
126
+ def model_schema(defaults):
127
+ transform = cv.Schema(
128
+ {
129
+ cv.Optional(CONF_MIRROR_X, default=False): cv.boolean,
130
+ cv.Optional(CONF_MIRROR_Y, default=False): cv.boolean,
131
+ }
132
+ )
133
+ if defaults.get(CONF_SWAP_XY, True):
134
+ transform = transform.extend(
135
+ {
136
+ cv.Optional(CONF_SWAP_XY, default=False): cv.boolean,
122
137
  }
123
- ).extend(
124
- spi.spi_device_schema(
125
- cs_pin_required=False,
126
- default_mode="MODE0",
127
- default_data_rate=10e6,
128
- quad=True,
129
- )
130
138
  )
139
+ return BASE_SCHEMA.extend(
140
+ {
141
+ model_property(CONF_INVERT_COLORS, defaults, False): cv.boolean,
142
+ model_property(CONF_COLOR_ORDER, defaults, "RGB"): cv.enum(
143
+ COLOR_ORDERS, upper=True
144
+ ),
145
+ model_property(CONF_DRAW_ROUNDING, defaults, 2): power_of_two,
146
+ cv.Optional(CONF_TRANSFORM): transform,
147
+ }
148
+ )
149
+
150
+
151
+ CONFIG_SCHEMA = cv.All(
152
+ cv.typed_schema(
153
+ {k.upper(): model_schema(v.defaults) for k, v in DriverChip.chips.items()},
154
+ upper=True,
155
+ key=CONF_MODEL,
131
156
  ),
132
157
  cv.only_with_esp_idf,
133
158
  )
@@ -152,6 +177,7 @@ async def to_code(config):
152
177
  cg.add(var.set_brightness(config[CONF_BRIGHTNESS]))
153
178
  cg.add(var.set_model(config[CONF_MODEL]))
154
179
  cg.add(var.set_draw_from_origin(config[CONF_DRAW_FROM_ORIGIN]))
180
+ cg.add(var.set_draw_rounding(config[CONF_DRAW_ROUNDING]))
155
181
  if enable_pin := config.get(CONF_ENABLE_PIN):
156
182
  enable = await cg.gpio_pin_expression(enable_pin)
157
183
  cg.add(var.set_enable_pin(enable))
@@ -163,7 +189,8 @@ async def to_code(config):
163
189
  if transform := config.get(CONF_TRANSFORM):
164
190
  cg.add(var.set_mirror_x(transform[CONF_MIRROR_X]))
165
191
  cg.add(var.set_mirror_y(transform[CONF_MIRROR_Y]))
166
- cg.add(var.set_swap_xy(transform[CONF_SWAP_XY]))
192
+ # swap_xy is not implemented for some chips
193
+ cg.add(var.set_swap_xy(transform.get(CONF_SWAP_XY, False)))
167
194
 
168
195
  if CONF_DIMENSIONS in config:
169
196
  dimensions = config[CONF_DIMENSIONS]
@@ -1,5 +1,10 @@
1
1
  # Commands
2
+ from esphome.const import CONF_INVERT_COLORS, CONF_SWAP_XY
3
+
4
+ from . import CONF_DRAW_ROUNDING
5
+
2
6
  SW_RESET_CMD = 0x01
7
+ SLEEP_IN = 0x10
3
8
  SLEEP_OUT = 0x11
4
9
  NORON = 0x13
5
10
  INVERT_OFF = 0x20
@@ -24,11 +29,12 @@ PAGESEL = 0xFE
24
29
  class DriverChip:
25
30
  chips = {}
26
31
 
27
- def __init__(self, name: str):
32
+ def __init__(self, name: str, defaults=None):
28
33
  name = name.upper()
29
34
  self.name = name
30
35
  self.chips[name] = self
31
36
  self.initsequence = []
37
+ self.defaults = defaults or {}
32
38
 
33
39
  def cmd(self, c, *args):
34
40
  """
@@ -59,9 +65,246 @@ chip.cmd(TEON, 0x00)
59
65
  chip.cmd(PIXFMT, 0x55)
60
66
  chip.cmd(NORON)
61
67
 
62
- chip = DriverChip("AXS15231")
68
+ chip = DriverChip("AXS15231", {CONF_DRAW_ROUNDING: 8, CONF_SWAP_XY: False})
63
69
  chip.cmd(0xBB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xA5)
64
70
  chip.cmd(0xC1, 0x33)
65
71
  chip.cmd(0xBB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00)
66
72
 
73
+ chip = DriverChip(
74
+ "JC4832W535",
75
+ {
76
+ CONF_DRAW_ROUNDING: 8,
77
+ CONF_SWAP_XY: False,
78
+ },
79
+ )
80
+ chip.cmd(DISPLAY_OFF)
81
+ chip.delay(20)
82
+ chip.cmd(SLEEP_IN)
83
+ chip.delay(80)
84
+ chip.cmd(SLEEP_OUT)
85
+ chip.cmd(INVERT_OFF)
86
+ # A magic sequence to enable the windowed drawing mode
87
+ chip.cmd(0xBB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xA5)
88
+ chip.cmd(0xC1, 0x33)
89
+ chip.cmd(0xBB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00)
90
+
91
+ chip = DriverChip("JC3636W518", {CONF_INVERT_COLORS: True})
92
+ chip.cmd(0xF0, 0x08)
93
+ chip.cmd(0xF2, 0x08)
94
+ chip.cmd(0x9B, 0x51)
95
+ chip.cmd(0x86, 0x53)
96
+ chip.cmd(0xF2, 0x80)
97
+ chip.cmd(0xF0, 0x00)
98
+ chip.cmd(0xF0, 0x01)
99
+ chip.cmd(0xF1, 0x01)
100
+ chip.cmd(0xB0, 0x54)
101
+ chip.cmd(0xB1, 0x3F)
102
+ chip.cmd(0xB2, 0x2A)
103
+ chip.cmd(0xB4, 0x46)
104
+ chip.cmd(0xB5, 0x34)
105
+ chip.cmd(0xB6, 0xD5)
106
+ chip.cmd(0xB7, 0x30)
107
+ chip.cmd(0xBA, 0x00)
108
+ chip.cmd(0xBB, 0x08)
109
+ chip.cmd(0xBC, 0x08)
110
+ chip.cmd(0xBD, 0x00)
111
+ chip.cmd(0xC0, 0x80)
112
+ chip.cmd(0xC1, 0x10)
113
+ chip.cmd(0xC2, 0x37)
114
+ chip.cmd(0xC3, 0x80)
115
+ chip.cmd(0xC4, 0x10)
116
+ chip.cmd(0xC5, 0x37)
117
+ chip.cmd(0xC6, 0xA9)
118
+ chip.cmd(0xC7, 0x41)
119
+ chip.cmd(0xC8, 0x51)
120
+ chip.cmd(0xC9, 0xA9)
121
+ chip.cmd(0xCA, 0x41)
122
+ chip.cmd(0xCB, 0x51)
123
+ chip.cmd(0xD0, 0x91)
124
+ chip.cmd(0xD1, 0x68)
125
+ chip.cmd(0xD2, 0x69)
126
+ chip.cmd(0xF5, 0x00, 0xA5)
127
+ chip.cmd(0xDD, 0x3F)
128
+ chip.cmd(0xDE, 0x3F)
129
+ chip.cmd(0xF1, 0x10)
130
+ chip.cmd(0xF0, 0x00)
131
+ chip.cmd(0xF0, 0x02)
132
+ chip.cmd(
133
+ 0xE0,
134
+ 0x70,
135
+ 0x09,
136
+ 0x12,
137
+ 0x0C,
138
+ 0x0B,
139
+ 0x27,
140
+ 0x38,
141
+ 0x54,
142
+ 0x4E,
143
+ 0x19,
144
+ 0x15,
145
+ 0x15,
146
+ 0x2C,
147
+ 0x2F,
148
+ )
149
+ chip.cmd(
150
+ 0xE1,
151
+ 0x70,
152
+ 0x08,
153
+ 0x11,
154
+ 0x0C,
155
+ 0x0B,
156
+ 0x27,
157
+ 0x38,
158
+ 0x43,
159
+ 0x4C,
160
+ 0x18,
161
+ 0x14,
162
+ 0x14,
163
+ 0x2B,
164
+ 0x2D,
165
+ )
166
+ chip.cmd(0xF0, 0x10)
167
+ chip.cmd(0xF3, 0x10)
168
+ chip.cmd(0xE0, 0x08)
169
+ chip.cmd(0xE1, 0x00)
170
+ chip.cmd(0xE2, 0x00)
171
+ chip.cmd(0xE3, 0x00)
172
+ chip.cmd(0xE4, 0xE0)
173
+ chip.cmd(0xE5, 0x06)
174
+ chip.cmd(0xE6, 0x21)
175
+ chip.cmd(0xE7, 0x00)
176
+ chip.cmd(0xE8, 0x05)
177
+ chip.cmd(0xE9, 0x82)
178
+ chip.cmd(0xEA, 0xDF)
179
+ chip.cmd(0xEB, 0x89)
180
+ chip.cmd(0xEC, 0x20)
181
+ chip.cmd(0xED, 0x14)
182
+ chip.cmd(0xEE, 0xFF)
183
+ chip.cmd(0xEF, 0x00)
184
+ chip.cmd(0xF8, 0xFF)
185
+ chip.cmd(0xF9, 0x00)
186
+ chip.cmd(0xFA, 0x00)
187
+ chip.cmd(0xFB, 0x30)
188
+ chip.cmd(0xFC, 0x00)
189
+ chip.cmd(0xFD, 0x00)
190
+ chip.cmd(0xFE, 0x00)
191
+ chip.cmd(0xFF, 0x00)
192
+ chip.cmd(0x60, 0x42)
193
+ chip.cmd(0x61, 0xE0)
194
+ chip.cmd(0x62, 0x40)
195
+ chip.cmd(0x63, 0x40)
196
+ chip.cmd(0x64, 0x02)
197
+ chip.cmd(0x65, 0x00)
198
+ chip.cmd(0x66, 0x40)
199
+ chip.cmd(0x67, 0x03)
200
+ chip.cmd(0x68, 0x00)
201
+ chip.cmd(0x69, 0x00)
202
+ chip.cmd(0x6A, 0x00)
203
+ chip.cmd(0x6B, 0x00)
204
+ chip.cmd(0x70, 0x42)
205
+ chip.cmd(0x71, 0xE0)
206
+ chip.cmd(0x72, 0x40)
207
+ chip.cmd(0x73, 0x40)
208
+ chip.cmd(0x74, 0x02)
209
+ chip.cmd(0x75, 0x00)
210
+ chip.cmd(0x76, 0x40)
211
+ chip.cmd(0x77, 0x03)
212
+ chip.cmd(0x78, 0x00)
213
+ chip.cmd(0x79, 0x00)
214
+ chip.cmd(0x7A, 0x00)
215
+ chip.cmd(0x7B, 0x00)
216
+ chip.cmd(0x80, 0x48)
217
+ chip.cmd(0x81, 0x00)
218
+ chip.cmd(0x82, 0x05)
219
+ chip.cmd(0x83, 0x02)
220
+ chip.cmd(0x84, 0xDD)
221
+ chip.cmd(0x85, 0x00)
222
+ chip.cmd(0x86, 0x00)
223
+ chip.cmd(0x87, 0x00)
224
+ chip.cmd(0x88, 0x48)
225
+ chip.cmd(0x89, 0x00)
226
+ chip.cmd(0x8A, 0x07)
227
+ chip.cmd(0x8B, 0x02)
228
+ chip.cmd(0x8C, 0xDF)
229
+ chip.cmd(0x8D, 0x00)
230
+ chip.cmd(0x8E, 0x00)
231
+ chip.cmd(0x8F, 0x00)
232
+ chip.cmd(0x90, 0x48)
233
+ chip.cmd(0x91, 0x00)
234
+ chip.cmd(0x92, 0x09)
235
+ chip.cmd(0x93, 0x02)
236
+ chip.cmd(0x94, 0xE1)
237
+ chip.cmd(0x95, 0x00)
238
+ chip.cmd(0x96, 0x00)
239
+ chip.cmd(0x97, 0x00)
240
+ chip.cmd(0x98, 0x48)
241
+ chip.cmd(0x99, 0x00)
242
+ chip.cmd(0x9A, 0x0B)
243
+ chip.cmd(0x9B, 0x02)
244
+ chip.cmd(0x9C, 0xE3)
245
+ chip.cmd(0x9D, 0x00)
246
+ chip.cmd(0x9E, 0x00)
247
+ chip.cmd(0x9F, 0x00)
248
+ chip.cmd(0xA0, 0x48)
249
+ chip.cmd(0xA1, 0x00)
250
+ chip.cmd(0xA2, 0x04)
251
+ chip.cmd(0xA3, 0x02)
252
+ chip.cmd(0xA4, 0xDC)
253
+ chip.cmd(0xA5, 0x00)
254
+ chip.cmd(0xA6, 0x00)
255
+ chip.cmd(0xA7, 0x00)
256
+ chip.cmd(0xA8, 0x48)
257
+ chip.cmd(0xA9, 0x00)
258
+ chip.cmd(0xAA, 0x06)
259
+ chip.cmd(0xAB, 0x02)
260
+ chip.cmd(0xAC, 0xDE)
261
+ chip.cmd(0xAD, 0x00)
262
+ chip.cmd(0xAE, 0x00)
263
+ chip.cmd(0xAF, 0x00)
264
+ chip.cmd(0xB0, 0x48)
265
+ chip.cmd(0xB1, 0x00)
266
+ chip.cmd(0xB2, 0x08)
267
+ chip.cmd(0xB3, 0x02)
268
+ chip.cmd(0xB4, 0xE0)
269
+ chip.cmd(0xB5, 0x00)
270
+ chip.cmd(0xB6, 0x00)
271
+ chip.cmd(0xB7, 0x00)
272
+ chip.cmd(0xB8, 0x48)
273
+ chip.cmd(0xB9, 0x00)
274
+ chip.cmd(0xBA, 0x0A)
275
+ chip.cmd(0xBB, 0x02)
276
+ chip.cmd(0xBC, 0xE2)
277
+ chip.cmd(0xBD, 0x00)
278
+ chip.cmd(0xBE, 0x00)
279
+ chip.cmd(0xBF, 0x00)
280
+ chip.cmd(0xC0, 0x12)
281
+ chip.cmd(0xC1, 0xAA)
282
+ chip.cmd(0xC2, 0x65)
283
+ chip.cmd(0xC3, 0x74)
284
+ chip.cmd(0xC4, 0x47)
285
+ chip.cmd(0xC5, 0x56)
286
+ chip.cmd(0xC6, 0x00)
287
+ chip.cmd(0xC7, 0x88)
288
+ chip.cmd(0xC8, 0x99)
289
+ chip.cmd(0xC9, 0x33)
290
+ chip.cmd(0xD0, 0x21)
291
+ chip.cmd(0xD1, 0xAA)
292
+ chip.cmd(0xD2, 0x65)
293
+ chip.cmd(0xD3, 0x74)
294
+ chip.cmd(0xD4, 0x47)
295
+ chip.cmd(0xD5, 0x56)
296
+ chip.cmd(0xD6, 0x00)
297
+ chip.cmd(0xD7, 0x88)
298
+ chip.cmd(0xD8, 0x99)
299
+ chip.cmd(0xD9, 0x33)
300
+ chip.cmd(0xF3, 0x01)
301
+ chip.cmd(0xF0, 0x00)
302
+ chip.cmd(0xF0, 0x01)
303
+ chip.cmd(0xF1, 0x01)
304
+ chip.cmd(0xA0, 0x0B)
305
+ chip.cmd(0xA3, 0x2A)
306
+ chip.cmd(0xA5, 0xC3)
307
+ chip.cmd(PIXFMT, 0x55)
308
+
309
+
67
310
  DriverChip("Custom")
@@ -33,19 +33,12 @@ void QspiDbi::update() {
33
33
  this->do_update_();
34
34
  if (this->buffer_ == nullptr || this->x_low_ > this->x_high_ || this->y_low_ > this->y_high_)
35
35
  return;
36
- // Start addresses and widths/heights must be divisible by 2 (CASET/RASET restriction in datasheet)
37
- if (this->x_low_ % 2 == 1) {
38
- this->x_low_--;
39
- }
40
- if (this->x_high_ % 2 == 0) {
41
- this->x_high_++;
42
- }
43
- if (this->y_low_ % 2 == 1) {
44
- this->y_low_--;
45
- }
46
- if (this->y_high_ % 2 == 0) {
47
- this->y_high_++;
48
- }
36
+ // Some chips require that the drawing window be aligned on certain boundaries
37
+ auto dr = this->draw_rounding_;
38
+ this->x_low_ = this->x_low_ / dr * dr;
39
+ this->y_low_ = this->y_low_ / dr * dr;
40
+ this->x_high_ = (this->x_high_ + dr) / dr * dr - 1;
41
+ this->y_high_ = (this->y_high_ + dr) / dr * dr - 1;
49
42
  if (this->draw_from_origin_) {
50
43
  this->x_low_ = 0;
51
44
  this->y_low_ = 0;
@@ -175,10 +168,9 @@ void QspiDbi::write_to_display_(int x_start, int y_start, int w, int h, const ui
175
168
  this->write_cmd_addr_data(8, 0x32, 24, 0x2C00, ptr, w * h * 2, 4);
176
169
  } else {
177
170
  auto stride = x_offset + w + x_pad;
178
- uint16_t cmd = 0x2C00;
171
+ this->write_cmd_addr_data(8, 0x32, 24, 0x2C00, nullptr, 0, 4);
179
172
  for (int y = 0; y != h; y++) {
180
- this->write_cmd_addr_data(8, 0x32, 24, cmd, ptr + ((y + y_offset) * stride + x_offset) * 2, w * 2, 4);
181
- cmd = 0x3C00;
173
+ this->write_cmd_addr_data(0, 0, 0, 0, ptr + ((y + y_offset) * stride + x_offset) * 2, w * 2, 4);
182
174
  }
183
175
  }
184
176
  this->disable();
@@ -220,6 +212,7 @@ void QspiDbi::dump_config() {
220
212
  ESP_LOGCONFIG("", "Model: %s", this->model_);
221
213
  ESP_LOGCONFIG(TAG, " Height: %u", this->height_);
222
214
  ESP_LOGCONFIG(TAG, " Width: %u", this->width_);
215
+ ESP_LOGCONFIG(TAG, " Draw rounding: %u", this->draw_rounding_);
223
216
  LOG_PIN(" CS Pin: ", this->cs_);
224
217
  LOG_PIN(" Reset Pin: ", this->reset_pin_);
225
218
  ESP_LOGCONFIG(TAG, " SPI Data rate: %dMHz", (unsigned) (this->data_rate_ / 1000000));
@@ -4,12 +4,10 @@
4
4
  #pragma once
5
5
 
6
6
  #ifdef USE_ESP_IDF
7
- #include "esphome/core/component.h"
8
7
  #include "esphome/components/spi/spi.h"
9
8
  #include "esphome/components/display/display.h"
10
9
  #include "esphome/components/display/display_buffer.h"
11
10
  #include "esphome/components/display/display_color_utils.h"
12
- #include "esp_lcd_panel_ops.h"
13
11
 
14
12
  #include "esp_lcd_panel_rgb.h"
15
13
 
@@ -105,6 +103,7 @@ class QspiDbi : public display::DisplayBuffer,
105
103
  int get_height_internal() override { return this->height_; }
106
104
  bool can_proceed() override { return this->setup_complete_; }
107
105
  void add_init_sequence(const std::vector<uint8_t> &sequence) { this->init_sequences_.push_back(sequence); }
106
+ void set_draw_rounding(unsigned rounding) { this->draw_rounding_ = rounding; }
108
107
 
109
108
  protected:
110
109
  void check_buffer_() {
@@ -161,6 +160,7 @@ class QspiDbi : public display::DisplayBuffer,
161
160
  bool mirror_x_{};
162
161
  bool mirror_y_{};
163
162
  bool draw_from_origin_{false};
163
+ unsigned draw_rounding_{2};
164
164
  uint8_t brightness_{0xD0};
165
165
  const char *model_{"Unknown"};
166
166
  std::vector<std::vector<uint8_t>> init_sequences_{};
@@ -1,41 +1,41 @@
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 binary_sensor
4
+ import esphome.config_validation as cv
5
5
  from esphome.const import (
6
+ CONF_ADDRESS,
7
+ CONF_BUTTON,
8
+ CONF_CARRIER_FREQUENCY,
9
+ CONF_CHANNEL,
10
+ CONF_CHECK,
11
+ CONF_CODE,
12
+ CONF_COMMAND,
6
13
  CONF_COMMAND_REPEATS,
7
14
  CONF_DATA,
8
- CONF_TRIGGER_ID,
15
+ CONF_DELTA,
16
+ CONF_DEVICE,
17
+ CONF_FAMILY,
18
+ CONF_GROUP,
19
+ CONF_ID,
20
+ CONF_INVERTED,
21
+ CONF_LEVEL,
22
+ CONF_MAGNITUDE,
9
23
  CONF_NBITS,
10
- CONF_ADDRESS,
11
- CONF_COMMAND,
12
- CONF_CODE,
13
- CONF_PULSE_LENGTH,
14
- CONF_SYNC,
15
- CONF_ZERO,
16
24
  CONF_ONE,
17
- CONF_INVERTED,
18
25
  CONF_PROTOCOL,
19
- CONF_GROUP,
20
- CONF_DEVICE,
26
+ CONF_PULSE_LENGTH,
27
+ CONF_RC_CODE_1,
28
+ CONF_RC_CODE_2,
29
+ CONF_REPEAT,
21
30
  CONF_SECOND,
22
31
  CONF_STATE,
23
- CONF_CHANNEL,
24
- CONF_FAMILY,
25
- CONF_REPEAT,
26
- CONF_WAIT_TIME,
32
+ CONF_SYNC,
27
33
  CONF_TIMES,
34
+ CONF_TRIGGER_ID,
28
35
  CONF_TYPE_ID,
29
- CONF_CARRIER_FREQUENCY,
30
- CONF_RC_CODE_1,
31
- CONF_RC_CODE_2,
32
- CONF_MAGNITUDE,
36
+ CONF_WAIT_TIME,
33
37
  CONF_WAND_ID,
34
- CONF_LEVEL,
35
- CONF_DELTA,
36
- CONF_ID,
37
- CONF_BUTTON,
38
- CONF_CHECK,
38
+ CONF_ZERO,
39
39
  )
40
40
  from esphome.core import coroutine
41
41
  from esphome.schema_extractors import SCHEMA_EXTRACT, schema_extractor
@@ -1963,3 +1963,55 @@ async def mirage_action(var, config, args):
1963
1963
  vec_ = cg.std_vector.template(cg.uint8)
1964
1964
  template_ = await cg.templatable(config[CONF_CODE], args, vec_, vec_)
1965
1965
  cg.add(var.set_code(template_))
1966
+
1967
+
1968
+ # Toto
1969
+ (
1970
+ TotoData,
1971
+ TotoBinarySensor,
1972
+ TotoTrigger,
1973
+ TotoAction,
1974
+ TotoDumper,
1975
+ ) = declare_protocol("Toto")
1976
+
1977
+ TOTO_SCHEMA = cv.Schema(
1978
+ {
1979
+ cv.Optional(CONF_RC_CODE_1, default=0): cv.hex_int_range(0, 0xF),
1980
+ cv.Optional(CONF_RC_CODE_2, default=0): cv.hex_int_range(0, 0xF),
1981
+ cv.Required(CONF_COMMAND): cv.hex_uint8_t,
1982
+ }
1983
+ )
1984
+
1985
+
1986
+ @register_binary_sensor("toto", TotoBinarySensor, TOTO_SCHEMA)
1987
+ def toto_binary_sensor(var, config):
1988
+ cg.add(
1989
+ var.set_data(
1990
+ cg.StructInitializer(
1991
+ TotoData,
1992
+ ("rc_code_1", config[CONF_RC_CODE_1]),
1993
+ ("rc_code_2", config[CONF_RC_CODE_2]),
1994
+ ("command", config[CONF_COMMAND]),
1995
+ )
1996
+ )
1997
+ )
1998
+
1999
+
2000
+ @register_trigger("toto", TotoTrigger, TotoData)
2001
+ def toto_trigger(var, config):
2002
+ pass
2003
+
2004
+
2005
+ @register_dumper("toto", TotoDumper)
2006
+ def toto_dumper(var, config):
2007
+ pass
2008
+
2009
+
2010
+ @register_action("toto", TotoAction, TOTO_SCHEMA)
2011
+ async def Toto_action(var, config, args):
2012
+ template_ = await cg.templatable(config[CONF_RC_CODE_1], args, cg.uint8)
2013
+ cg.add(var.set_rc_code_1(template_))
2014
+ template_ = await cg.templatable(config[CONF_RC_CODE_2], args, cg.uint8)
2015
+ cg.add(var.set_rc_code_2(template_))
2016
+ template_ = await cg.templatable(config[CONF_COMMAND], args, cg.uint8)
2017
+ cg.add(var.set_command(template_))
@@ -8,7 +8,7 @@ namespace remote_base {
8
8
 
9
9
  static const char *const TAG = "remote_base";
10
10
 
11
- #ifdef USE_ESP32
11
+ #if defined(USE_ESP32) && ESP_IDF_VERSION_MAJOR < 5
12
12
  RemoteRMTChannel::RemoteRMTChannel(uint8_t mem_block_num) : mem_block_num_(mem_block_num) {
13
13
  static rmt_channel_t next_rmt_channel = RMT_CHANNEL_0;
14
14
  this->channel_ = next_rmt_channel;
@@ -8,7 +8,7 @@
8
8
  #include "esphome/core/component.h"
9
9
  #include "esphome/core/hal.h"
10
10
 
11
- #ifdef USE_ESP32
11
+ #if defined(USE_ESP32) && ESP_IDF_VERSION_MAJOR < 5
12
12
  #include <driver/rmt.h>
13
13
  #endif
14
14
 
@@ -54,7 +54,7 @@ class RemoteReceiveData {
54
54
  uint32_t get_index() const { return index_; }
55
55
  int32_t operator[](uint32_t index) const { return this->data_[index]; }
56
56
  int32_t size() const { return this->data_.size(); }
57
- bool is_valid(uint32_t offset) const { return this->index_ + offset < this->data_.size(); }
57
+ bool is_valid(uint32_t offset = 0) const { return this->index_ + offset < this->data_.size(); }
58
58
  int32_t peek(uint32_t offset = 0) const { return this->data_[this->index_ + offset]; }
59
59
  bool peek_mark(uint32_t length, uint32_t offset = 0) const;
60
60
  bool peek_space(uint32_t length, uint32_t offset = 0) const;
@@ -112,25 +112,43 @@ class RemoteComponentBase {
112
112
  #ifdef USE_ESP32
113
113
  class RemoteRMTChannel {
114
114
  public:
115
+ #if ESP_IDF_VERSION_MAJOR >= 5
116
+ void set_clock_resolution(uint32_t clock_resolution) { this->clock_resolution_ = clock_resolution; }
117
+ void set_rmt_symbols(uint32_t rmt_symbols) { this->rmt_symbols_ = rmt_symbols; }
118
+ #else
115
119
  explicit RemoteRMTChannel(uint8_t mem_block_num = 1);
116
120
  explicit RemoteRMTChannel(rmt_channel_t channel, uint8_t mem_block_num = 1);
117
121
 
118
122
  void config_rmt(rmt_config_t &rmt);
119
123
  void set_clock_divider(uint8_t clock_divider) { this->clock_divider_ = clock_divider; }
124
+ #endif
120
125
 
121
126
  protected:
122
127
  uint32_t from_microseconds_(uint32_t us) {
128
+ #if ESP_IDF_VERSION_MAJOR >= 5
129
+ const uint32_t ticks_per_ten_us = this->clock_resolution_ / 100000u;
130
+ #else
123
131
  const uint32_t ticks_per_ten_us = 80000000u / this->clock_divider_ / 100000u;
132
+ #endif
124
133
  return us * ticks_per_ten_us / 10;
125
134
  }
126
135
  uint32_t to_microseconds_(uint32_t ticks) {
136
+ #if ESP_IDF_VERSION_MAJOR >= 5
137
+ const uint32_t ticks_per_ten_us = this->clock_resolution_ / 100000u;
138
+ #else
127
139
  const uint32_t ticks_per_ten_us = 80000000u / this->clock_divider_ / 100000u;
140
+ #endif
128
141
  return (ticks * 10) / ticks_per_ten_us;
129
142
  }
130
143
  RemoteComponentBase *remote_base_;
144
+ #if ESP_IDF_VERSION_MAJOR >= 5
145
+ uint32_t clock_resolution_{1000000};
146
+ uint32_t rmt_symbols_;
147
+ #else
131
148
  rmt_channel_t channel_{RMT_CHANNEL_0};
132
149
  uint8_t mem_block_num_;
133
150
  uint8_t clock_divider_{80};
151
+ #endif
134
152
  };
135
153
  #endif
136
154