esphome 2025.8.4__py3-none-any.whl → 2025.9.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 (369) hide show
  1. esphome/__main__.py +177 -105
  2. esphome/components/absolute_humidity/absolute_humidity.cpp +3 -5
  3. esphome/components/adc/__init__.py +1 -26
  4. esphome/components/adc/adc_sensor_esp32.cpp +29 -6
  5. esphome/components/adc/sensor.py +20 -0
  6. esphome/components/ade7880/ade7880.cpp +1 -1
  7. esphome/components/ags10/ags10.cpp +3 -18
  8. esphome/components/ags10/ags10.h +2 -12
  9. esphome/components/aht10/aht10.cpp +3 -3
  10. esphome/components/airthings_ble/__init__.py +2 -2
  11. esphome/components/alarm_control_panel/__init__.py +2 -2
  12. esphome/components/am2315c/am2315c.cpp +1 -17
  13. esphome/components/am2315c/am2315c.h +2 -3
  14. esphome/components/api/__init__.py +2 -2
  15. esphome/components/api/api_connection.cpp +38 -34
  16. esphome/components/api/api_connection.h +20 -40
  17. esphome/components/api/api_frame_helper.cpp +25 -25
  18. esphome/components/api/api_frame_helper.h +3 -3
  19. esphome/components/api/api_frame_helper_noise.cpp +75 -40
  20. esphome/components/api/api_frame_helper_noise.h +3 -7
  21. esphome/components/api/api_frame_helper_plaintext.cpp +17 -4
  22. esphome/components/api/api_frame_helper_plaintext.h +1 -4
  23. esphome/components/api/api_pb2.cpp +12 -2
  24. esphome/components/api/api_pb2.h +144 -143
  25. esphome/components/api/api_pb2_dump.cpp +6 -1
  26. esphome/components/api/api_pb2_service.cpp +0 -14
  27. esphome/components/api/api_pb2_service.h +1 -3
  28. esphome/components/api/client.py +5 -3
  29. esphome/components/api/proto.cpp +33 -37
  30. esphome/components/async_tcp/__init__.py +2 -2
  31. esphome/components/atm90e26/sensor.py +2 -0
  32. esphome/components/atm90e32/sensor.py +4 -2
  33. esphome/components/audio_adc/__init__.py +2 -2
  34. esphome/components/audio_dac/__init__.py +2 -2
  35. esphome/components/axs15231/touchscreen/axs15231_touchscreen.cpp +1 -1
  36. esphome/components/bedjet/bedjet_hub.cpp +1 -1
  37. esphome/components/binary_sensor/__init__.py +2 -2
  38. esphome/components/binary_sensor/binary_sensor.cpp +13 -0
  39. esphome/components/binary_sensor/binary_sensor.h +4 -7
  40. esphome/components/bl0940/__init__.py +6 -1
  41. esphome/components/bl0940/bl0940.cpp +178 -41
  42. esphome/components/bl0940/bl0940.h +121 -76
  43. esphome/components/bl0940/button/__init__.py +27 -0
  44. esphome/components/bl0940/button/calibration_reset_button.cpp +20 -0
  45. esphome/components/bl0940/button/calibration_reset_button.h +19 -0
  46. esphome/components/bl0940/number/__init__.py +94 -0
  47. esphome/components/bl0940/number/calibration_number.cpp +29 -0
  48. esphome/components/bl0940/number/calibration_number.h +26 -0
  49. esphome/components/bl0940/sensor.py +151 -2
  50. esphome/components/bl0942/bl0942.cpp +1 -1
  51. esphome/components/ble_client/output/__init__.py +4 -4
  52. esphome/components/bluetooth_proxy/__init__.py +1 -1
  53. esphome/components/bluetooth_proxy/bluetooth_connection.h +1 -1
  54. esphome/components/bluetooth_proxy/bluetooth_proxy.cpp +15 -7
  55. esphome/components/bluetooth_proxy/bluetooth_proxy.h +6 -3
  56. esphome/components/button/__init__.py +2 -2
  57. esphome/components/button/button.cpp +13 -0
  58. esphome/components/button/button.h +4 -7
  59. esphome/components/camera/buffer.h +18 -0
  60. esphome/components/camera/buffer_impl.cpp +20 -0
  61. esphome/components/camera/buffer_impl.h +26 -0
  62. esphome/components/camera/camera.h +43 -0
  63. esphome/components/camera/encoder.h +69 -0
  64. esphome/components/camera_encoder/__init__.py +62 -0
  65. esphome/components/camera_encoder/encoder_buffer_impl.cpp +23 -0
  66. esphome/components/camera_encoder/encoder_buffer_impl.h +25 -0
  67. esphome/components/camera_encoder/esp32_camera_jpeg_encoder.cpp +82 -0
  68. esphome/components/camera_encoder/esp32_camera_jpeg_encoder.h +39 -0
  69. esphome/components/captive_portal/__init__.py +2 -2
  70. esphome/components/captive_portal/captive_index.h +77 -97
  71. esphome/components/captive_portal/captive_portal.cpp +35 -12
  72. esphome/components/captive_portal/captive_portal.h +3 -3
  73. esphome/components/ccs811/ccs811.cpp +3 -3
  74. esphome/components/climate/__init__.py +2 -2
  75. esphome/components/climate/climate.cpp +1 -1
  76. esphome/components/cover/__init__.py +5 -5
  77. esphome/components/cover/cover.cpp +1 -1
  78. esphome/components/cover/cover.h +2 -2
  79. esphome/components/dallas_temp/dallas_temp.cpp +2 -2
  80. esphome/components/datetime/__init__.py +2 -2
  81. esphome/components/datetime/date_entity.h +2 -2
  82. esphome/components/datetime/datetime_entity.h +2 -2
  83. esphome/components/datetime/time_entity.h +2 -2
  84. esphome/components/debug/debug_esp32.cpp +1 -1
  85. esphome/components/display/__init__.py +4 -4
  86. esphome/components/duty_time/duty_time_sensor.cpp +1 -1
  87. esphome/components/esp32/__init__.py +0 -5
  88. esphome/components/esp32/gpio.cpp +27 -23
  89. esphome/components/esp32/gpio.h +26 -11
  90. esphome/components/esp32/preferences.cpp +8 -4
  91. esphome/components/esp32_ble/__init__.py +7 -2
  92. esphome/components/esp32_ble/ble_uuid.cpp +30 -9
  93. esphome/components/esp32_ble_beacon/esp32_ble_beacon.cpp +4 -3
  94. esphome/components/esp32_ble_client/ble_client_base.cpp +7 -3
  95. esphome/components/esp32_ble_client/ble_client_base.h +8 -5
  96. esphome/components/esp32_ble_tracker/__init__.py +2 -2
  97. esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +11 -47
  98. esphome/components/esp32_ble_tracker/esp32_ble_tracker.h +2 -14
  99. esphome/components/esp8266/__init__.py +2 -2
  100. esphome/components/esp8266/core.cpp +2 -2
  101. esphome/components/esp8266/gpio.py +4 -4
  102. esphome/components/esp8266/preferences.cpp +30 -28
  103. esphome/components/esphome/ota/__init__.py +2 -2
  104. esphome/components/esphome/ota/ota_esphome.cpp +21 -19
  105. esphome/components/esphome/ota/ota_esphome.h +6 -5
  106. esphome/components/ethernet/__init__.py +18 -2
  107. esphome/components/ethernet/ethernet_component.cpp +53 -3
  108. esphome/components/ethernet/ethernet_component.h +4 -0
  109. esphome/components/event/__init__.py +2 -2
  110. esphome/components/event/event.h +4 -4
  111. esphome/components/factory_reset/button/factory_reset_button.cpp +18 -1
  112. esphome/components/factory_reset/button/factory_reset_button.h +6 -1
  113. esphome/components/factory_reset/switch/factory_reset_switch.cpp +18 -1
  114. esphome/components/factory_reset/switch/factory_reset_switch.h +5 -1
  115. esphome/components/fan/__init__.py +2 -2
  116. esphome/components/fan/fan.cpp +2 -1
  117. esphome/components/gdk101/gdk101.cpp +4 -4
  118. esphome/components/globals/__init__.py +2 -2
  119. esphome/components/gpio/binary_sensor/gpio_binary_sensor.cpp +19 -18
  120. esphome/components/gpio_expander/cached_gpio.h +36 -16
  121. esphome/components/grove_gas_mc_v2/grove_gas_mc_v2.cpp +5 -5
  122. esphome/components/gt911/touchscreen/gt911_touchscreen.cpp +1 -1
  123. esphome/components/haier/haier_base.cpp +1 -1
  124. esphome/components/haier/hon_climate.cpp +1 -1
  125. esphome/components/hlw8012/hlw8012.cpp +5 -5
  126. esphome/components/honeywellabp2_i2c/honeywellabp2.cpp +4 -4
  127. esphome/components/host/preferences.h +3 -2
  128. esphome/components/hte501/hte501.cpp +3 -21
  129. esphome/components/hte501/hte501.h +2 -3
  130. esphome/components/http_request/ota/__init__.py +2 -2
  131. esphome/components/i2c/__init__.py +2 -2
  132. esphome/components/i2c/i2c.cpp +13 -9
  133. esphome/components/i2c/i2c_bus.h +36 -6
  134. esphome/components/i2s_audio/__init__.py +8 -2
  135. esphome/components/i2s_audio/media_player/__init__.py +1 -1
  136. esphome/components/i2s_audio/microphone/__init__.py +1 -1
  137. esphome/components/i2s_audio/speaker/__init__.py +1 -1
  138. esphome/components/ina2xx_base/__init__.py +4 -2
  139. esphome/components/inkplate/__init__.py +1 -0
  140. esphome/components/inkplate/const.py +105 -0
  141. esphome/components/inkplate/display.py +238 -0
  142. esphome/components/{inkplate6 → inkplate}/inkplate.cpp +156 -74
  143. esphome/components/{inkplate6 → inkplate}/inkplate.h +28 -68
  144. esphome/components/inkplate6/__init__.py +0 -1
  145. esphome/components/inkplate6/display.py +2 -211
  146. esphome/components/integration/integration_sensor.cpp +1 -1
  147. esphome/components/json/__init__.py +2 -2
  148. esphome/components/lc709203f/lc709203f.cpp +4 -17
  149. esphome/components/lc709203f/lc709203f.h +2 -3
  150. esphome/components/ld2420/text_sensor/{text_sensor.cpp → ld2420_text_sensor.cpp} +1 -1
  151. esphome/components/ld2450/ld2450.cpp +1 -1
  152. esphome/components/libretiny/preferences.cpp +13 -5
  153. esphome/components/light/__init__.py +2 -2
  154. esphome/components/light/addressable_light_effect.h +7 -0
  155. esphome/components/light/base_light_effects.h +8 -0
  156. esphome/components/light/light_call.cpp +22 -20
  157. esphome/components/light/light_effect.cpp +36 -0
  158. esphome/components/light/light_effect.h +14 -0
  159. esphome/components/light/light_json_schema.cpp +9 -1
  160. esphome/components/light/light_state.cpp +2 -2
  161. esphome/components/light/light_state.h +38 -0
  162. esphome/components/lock/__init__.py +2 -2
  163. esphome/components/lock/lock.h +2 -2
  164. esphome/components/logger/__init__.py +2 -2
  165. esphome/components/logger/logger.cpp +25 -4
  166. esphome/components/logger/logger.h +1 -1
  167. esphome/components/logger/logger_esp32.cpp +16 -8
  168. esphome/components/logger/logger_esp8266.cpp +11 -3
  169. esphome/components/logger/logger_libretiny.cpp +13 -3
  170. esphome/components/logger/logger_rp2040.cpp +14 -3
  171. esphome/components/logger/logger_zephyr.cpp +15 -4
  172. esphome/components/lvgl/defines.py +1 -0
  173. esphome/components/lvgl/hello_world.py +96 -33
  174. esphome/components/lvgl/number/lvgl_number.h +1 -1
  175. esphome/components/lvgl/select/lvgl_select.h +1 -1
  176. esphome/components/lvgl/widgets/__init__.py +0 -1
  177. esphome/components/lvgl/widgets/spinbox.py +20 -11
  178. esphome/components/m5stack_8angle/binary_sensor/m5stack_8angle_binary_sensor.cpp +1 -1
  179. esphome/components/m5stack_8angle/sensor/m5stack_8angle_sensor.cpp +1 -1
  180. esphome/components/mapping/__init__.py +13 -5
  181. esphome/components/mapping/mapping.h +69 -0
  182. esphome/components/max17043/max17043.cpp +2 -2
  183. esphome/components/mcp23016/__init__.py +1 -0
  184. esphome/components/mcp23016/mcp23016.cpp +20 -5
  185. esphome/components/mcp23016/mcp23016.h +10 -4
  186. esphome/components/mcp23x08_base/mcp23x08_base.cpp +1 -1
  187. esphome/components/mcp23x17_base/mcp23x17_base.cpp +2 -2
  188. esphome/components/md5/md5.cpp +3 -2
  189. esphome/components/mdns/__init__.py +2 -2
  190. esphome/components/mdns/mdns_component.cpp +145 -54
  191. esphome/components/media_player/__init__.py +2 -2
  192. esphome/components/micro_wake_word/__init__.py +2 -2
  193. esphome/components/microphone/__init__.py +2 -2
  194. esphome/components/mipi/__init__.py +77 -33
  195. esphome/components/mipi_rgb/__init__.py +2 -0
  196. esphome/components/mipi_rgb/display.py +321 -0
  197. esphome/components/mipi_rgb/mipi_rgb.cpp +388 -0
  198. esphome/components/mipi_rgb/mipi_rgb.h +127 -0
  199. esphome/components/mipi_rgb/models/guition.py +24 -0
  200. esphome/components/mipi_rgb/models/lilygo.py +228 -0
  201. esphome/components/mipi_rgb/models/rpi.py +9 -0
  202. esphome/components/mipi_rgb/models/st7701s.py +214 -0
  203. esphome/components/mipi_rgb/models/waveshare.py +64 -0
  204. esphome/components/mipi_spi/models/jc.py +229 -0
  205. esphome/components/mlx90614/mlx90614.cpp +1 -16
  206. esphome/components/mlx90614/mlx90614.h +0 -1
  207. esphome/components/mqtt/__init__.py +2 -2
  208. esphome/components/mqtt/mqtt_client.cpp +1 -1
  209. esphome/components/mqtt/mqtt_sensor.cpp +7 -2
  210. esphome/components/ms5611/ms5611.cpp +7 -6
  211. esphome/components/network/__init__.py +2 -2
  212. esphome/components/nextion/nextion_upload.cpp +4 -1
  213. esphome/components/nrf52/__init__.py +49 -6
  214. esphome/components/nrf52/const.py +1 -0
  215. esphome/components/nrf52/dfu.cpp +51 -0
  216. esphome/components/nrf52/dfu.h +24 -0
  217. esphome/components/ntc/ntc.cpp +1 -1
  218. esphome/components/number/__init__.py +2 -2
  219. esphome/components/number/automation.cpp +1 -1
  220. esphome/components/number/number.cpp +21 -0
  221. esphome/components/number/number.h +4 -13
  222. esphome/components/opentherm/hub.h +6 -6
  223. esphome/components/opentherm/number/{number.cpp → opentherm_number.cpp} +2 -2
  224. esphome/components/opentherm/output/{output.cpp → opentherm_output.cpp} +1 -1
  225. esphome/components/opentherm/switch/{switch.cpp → opentherm_switch.cpp} +1 -1
  226. esphome/components/openthread/openthread.cpp +41 -7
  227. esphome/components/openthread/openthread.h +11 -0
  228. esphome/components/ota/__init__.py +2 -2
  229. esphome/components/pca6416a/__init__.py +1 -0
  230. esphome/components/pca6416a/pca6416a.cpp +20 -5
  231. esphome/components/pca6416a/pca6416a.h +12 -5
  232. esphome/components/pca9554/__init__.py +2 -1
  233. esphome/components/pca9554/pca9554.cpp +12 -18
  234. esphome/components/pca9554/pca9554.h +10 -9
  235. esphome/components/pcf8574/__init__.py +1 -0
  236. esphome/components/pcf8574/pcf8574.cpp +14 -5
  237. esphome/components/pcf8574/pcf8574.h +13 -6
  238. esphome/components/pi4ioe5v6408/pi4ioe5v6408.cpp +7 -7
  239. esphome/components/pipsolar/__init__.py +3 -3
  240. esphome/components/pipsolar/output/__init__.py +4 -4
  241. esphome/components/pulse_width/pulse_width.cpp +2 -2
  242. esphome/components/qmp6988/qmp6988.cpp +81 -126
  243. esphome/components/qmp6988/qmp6988.h +31 -37
  244. esphome/components/radon_eye_ble/__init__.py +2 -2
  245. esphome/components/remote_base/__init__.py +6 -8
  246. esphome/components/rotary_encoder/rotary_encoder.cpp +1 -1
  247. esphome/components/rp2040/__init__.py +2 -2
  248. esphome/components/runtime_stats/runtime_stats.cpp +10 -23
  249. esphome/components/runtime_stats/runtime_stats.h +4 -10
  250. esphome/components/safe_mode/__init__.py +2 -2
  251. esphome/components/safe_mode/safe_mode.cpp +33 -31
  252. esphome/components/script/script.cpp +6 -0
  253. esphome/components/script/script.h +19 -5
  254. esphome/components/sdm_meter/sensor.py +3 -1
  255. esphome/components/select/__init__.py +2 -2
  256. esphome/components/select/select.cpp +3 -3
  257. esphome/components/select/select.h +2 -2
  258. esphome/components/select/select_call.cpp +1 -1
  259. esphome/components/sen5x/sen5x.cpp +57 -55
  260. esphome/components/sen5x/sen5x.h +21 -15
  261. esphome/components/sen5x/sensor.py +67 -44
  262. esphome/components/sensirion_common/i2c_sensirion.cpp +18 -47
  263. esphome/components/sensirion_common/i2c_sensirion.h +39 -55
  264. esphome/components/sensor/__init__.py +2 -2
  265. esphome/components/sensor/automation.h +1 -1
  266. esphome/components/sensor/sensor.cpp +34 -6
  267. esphome/components/sensor/sensor.h +4 -21
  268. esphome/components/sgp30/sgp30.cpp +34 -35
  269. esphome/components/sgp30/sgp30.h +11 -10
  270. esphome/components/sgp4x/sgp4x.cpp +2 -2
  271. esphome/components/shelly_dimmer/light.py +7 -7
  272. esphome/components/sht4x/sht4x.cpp +1 -1
  273. esphome/components/sntp/sntp_component.cpp +36 -9
  274. esphome/components/sntp/sntp_component.h +7 -0
  275. esphome/components/sound_level/sound_level.cpp +1 -1
  276. esphome/components/speaker/__init__.py +2 -2
  277. esphome/components/speaker/media_player/__init__.py +2 -2
  278. esphome/components/speaker/media_player/speaker_media_player.cpp +1 -1
  279. esphome/components/spi/__init__.py +2 -2
  280. esphome/components/sprinkler/sprinkler.cpp +1 -1
  281. esphome/components/sps30/sps30.cpp +18 -23
  282. esphome/components/sps30/sps30.h +3 -3
  283. esphome/components/status_led/__init__.py +2 -2
  284. esphome/components/stepper/__init__.py +2 -2
  285. esphome/components/switch/__init__.py +2 -2
  286. esphome/components/switch/switch.cpp +5 -5
  287. esphome/components/sx1509/__init__.py +1 -1
  288. esphome/components/sx1509/sx1509.cpp +12 -7
  289. esphome/components/sx1509/sx1509.h +11 -4
  290. esphome/components/tca9555/tca9555.cpp +5 -5
  291. esphome/components/tee501/tee501.cpp +2 -21
  292. esphome/components/tee501/tee501.h +2 -4
  293. esphome/components/template/alarm_control_panel/template_alarm_control_panel.cpp +1 -1
  294. esphome/components/template/datetime/template_date.cpp +1 -1
  295. esphome/components/template/datetime/template_datetime.cpp +2 -2
  296. esphome/components/template/datetime/template_time.cpp +1 -1
  297. esphome/components/template/number/template_number.cpp +1 -1
  298. esphome/components/template/select/template_select.cpp +1 -1
  299. esphome/components/template/text/template_text.cpp +1 -1
  300. esphome/components/text/__init__.py +2 -2
  301. esphome/components/text/text.h +2 -2
  302. esphome/components/text_sensor/__init__.py +2 -2
  303. esphome/components/text_sensor/text_sensor.h +4 -4
  304. esphome/components/thermostat/climate.py +11 -7
  305. esphome/components/thermostat/thermostat_climate.cpp +237 -206
  306. esphome/components/thermostat/thermostat_climate.h +52 -41
  307. esphome/components/time/__init__.py +2 -2
  308. esphome/components/tmp1075/tmp1075.cpp +1 -1
  309. esphome/components/total_daily_energy/total_daily_energy.cpp +1 -1
  310. esphome/components/touchscreen/__init__.py +2 -2
  311. esphome/components/tuya/number/tuya_number.cpp +1 -1
  312. esphome/components/udp/udp_component.cpp +3 -3
  313. esphome/components/ufire_ec/ufire_ec.cpp +4 -4
  314. esphome/components/ufire_ise/ufire_ise.cpp +4 -4
  315. esphome/components/update/__init__.py +2 -2
  316. esphome/components/usb_uart/usb_uart.cpp +1 -1
  317. esphome/components/valve/__init__.py +5 -5
  318. esphome/components/valve/valve.cpp +1 -1
  319. esphome/components/valve/valve.h +2 -2
  320. esphome/components/wake_on_lan/wake_on_lan.cpp +2 -2
  321. esphome/components/waveshare_epaper/waveshare_213v3.cpp +1 -1
  322. esphome/components/web_server/__init__.py +2 -2
  323. esphome/components/web_server/ota/__init__.py +2 -2
  324. esphome/components/web_server/ota/ota_web_server.cpp +11 -0
  325. esphome/components/web_server/server_index_v2.h +149 -149
  326. esphome/components/web_server/web_server.cpp +58 -12
  327. esphome/components/web_server_base/__init__.py +2 -2
  328. esphome/components/wifi/__init__.py +5 -5
  329. esphome/components/wifi/wifi_component.cpp +4 -4
  330. esphome/components/wifi/wifi_component_esp_idf.cpp +2 -0
  331. esphome/components/wifi_info/wifi_info_text_sensor.h +3 -2
  332. esphome/config_validation.py +2 -2
  333. esphome/const.py +3 -1
  334. esphome/core/__init__.py +1 -0
  335. esphome/core/application.cpp +89 -51
  336. esphome/core/application.h +1 -0
  337. esphome/core/component.cpp +41 -19
  338. esphome/core/component.h +17 -13
  339. esphome/core/config.py +7 -7
  340. esphome/core/defines.h +5 -0
  341. esphome/core/entity_base.cpp +22 -8
  342. esphome/core/entity_base.h +43 -0
  343. esphome/core/helpers.cpp +34 -20
  344. esphome/core/helpers.h +33 -3
  345. esphome/core/ring_buffer.cpp +6 -2
  346. esphome/core/ring_buffer.h +2 -1
  347. esphome/core/scheduler.cpp +178 -97
  348. esphome/core/scheduler.h +67 -36
  349. esphome/core/time.cpp +6 -20
  350. esphome/coroutine.py +80 -3
  351. esphome/cpp_generator.py +13 -0
  352. esphome/cpp_helpers.py +2 -2
  353. esphome/dashboard/web_server.py +69 -15
  354. esphome/espota2.py +13 -6
  355. esphome/helpers.py +68 -83
  356. esphome/resolver.py +67 -0
  357. esphome/util.py +9 -6
  358. esphome/wizard.py +81 -34
  359. esphome/writer.py +13 -0
  360. {esphome-2025.8.4.dist-info → esphome-2025.9.0.dist-info}/METADATA +9 -9
  361. {esphome-2025.8.4.dist-info → esphome-2025.9.0.dist-info}/RECORD +369 -338
  362. /esphome/components/ld2420/text_sensor/{text_sensor.h → ld2420_text_sensor.h} +0 -0
  363. /esphome/components/opentherm/number/{number.h → opentherm_number.h} +0 -0
  364. /esphome/components/opentherm/output/{output.h → opentherm_output.h} +0 -0
  365. /esphome/components/opentherm/switch/{switch.h → opentherm_switch.h} +0 -0
  366. {esphome-2025.8.4.dist-info → esphome-2025.9.0.dist-info}/WHEEL +0 -0
  367. {esphome-2025.8.4.dist-info → esphome-2025.9.0.dist-info}/entry_points.txt +0 -0
  368. {esphome-2025.8.4.dist-info → esphome-2025.9.0.dist-info}/licenses/LICENSE +0 -0
  369. {esphome-2025.8.4.dist-info → esphome-2025.9.0.dist-info}/top_level.txt +0 -0
@@ -6,11 +6,11 @@
6
6
  #include <hal/gpio_hal.h>
7
7
 
8
8
  namespace esphome {
9
- namespace inkplate6 {
9
+ namespace inkplate {
10
10
 
11
11
  static const char *const TAG = "inkplate";
12
12
 
13
- void Inkplate6::setup() {
13
+ void Inkplate::setup() {
14
14
  for (uint32_t i = 0; i < 256; i++) {
15
15
  this->pin_lut_[i] = ((i & 0b00000011) << 4) | (((i & 0b00001100) >> 2) << 18) | (((i & 0b00010000) >> 4) << 23) |
16
16
  (((i & 0b11100000) >> 5) << 25);
@@ -56,7 +56,7 @@ void Inkplate6::setup() {
56
56
  /**
57
57
  * Allocate buffers. May be called after setup to re-initialise if e.g. greyscale is changed.
58
58
  */
59
- void Inkplate6::initialize_() {
59
+ void Inkplate::initialize_() {
60
60
  RAMAllocator<uint8_t> allocator;
61
61
  RAMAllocator<uint32_t> allocator32;
62
62
  uint32_t buffer_size = this->get_buffer_length_();
@@ -81,29 +81,25 @@ void Inkplate6::initialize_() {
81
81
  return;
82
82
  }
83
83
  if (this->greyscale_) {
84
- uint8_t glut_size = 9;
85
-
86
- this->glut_ = allocator32.allocate(256 * glut_size);
84
+ this->glut_ = allocator32.allocate(256 * GLUT_SIZE);
87
85
  if (this->glut_ == nullptr) {
88
86
  ESP_LOGE(TAG, "Could not allocate glut!");
89
87
  this->mark_failed();
90
88
  return;
91
89
  }
92
- this->glut2_ = allocator32.allocate(256 * glut_size);
90
+ this->glut2_ = allocator32.allocate(256 * GLUT_SIZE);
93
91
  if (this->glut2_ == nullptr) {
94
92
  ESP_LOGE(TAG, "Could not allocate glut2!");
95
93
  this->mark_failed();
96
94
  return;
97
95
  }
98
96
 
99
- const auto *const waveform3_bit = waveform3BitAll[this->model_];
100
-
101
- for (int i = 0; i < glut_size; i++) {
97
+ for (uint8_t i = 0; i < GLUT_SIZE; i++) {
102
98
  for (uint32_t j = 0; j < 256; j++) {
103
- uint8_t z = (waveform3_bit[j & 0x07][i] << 2) | (waveform3_bit[(j >> 4) & 0x07][i]);
99
+ uint8_t z = (this->waveform_[j & 0x07][i] << 2) | (this->waveform_[(j >> 4) & 0x07][i]);
104
100
  this->glut_[i * 256 + j] = ((z & 0b00000011) << 4) | (((z & 0b00001100) >> 2) << 18) |
105
101
  (((z & 0b00010000) >> 4) << 23) | (((z & 0b11100000) >> 5) << 25);
106
- z = ((waveform3_bit[j & 0x07][i] << 2) | (waveform3_bit[(j >> 4) & 0x07][i])) << 4;
102
+ z = ((this->waveform_[j & 0x07][i] << 2) | (this->waveform_[(j >> 4) & 0x07][i])) << 4;
107
103
  this->glut2_[i * 256 + j] = ((z & 0b00000011) << 4) | (((z & 0b00001100) >> 2) << 18) |
108
104
  (((z & 0b00010000) >> 4) << 23) | (((z & 0b11100000) >> 5) << 25);
109
105
  }
@@ -130,9 +126,9 @@ void Inkplate6::initialize_() {
130
126
  memset(this->buffer_, 0, buffer_size);
131
127
  }
132
128
 
133
- float Inkplate6::get_setup_priority() const { return setup_priority::PROCESSOR; }
129
+ float Inkplate::get_setup_priority() const { return setup_priority::PROCESSOR; }
134
130
 
135
- size_t Inkplate6::get_buffer_length_() {
131
+ size_t Inkplate::get_buffer_length_() {
136
132
  if (this->greyscale_) {
137
133
  return size_t(this->get_width_internal()) * size_t(this->get_height_internal()) / 2u;
138
134
  } else {
@@ -140,7 +136,7 @@ size_t Inkplate6::get_buffer_length_() {
140
136
  }
141
137
  }
142
138
 
143
- void Inkplate6::update() {
139
+ void Inkplate::update() {
144
140
  this->do_update_();
145
141
 
146
142
  if (this->full_update_every_ > 0 && this->partial_updates_ >= this->full_update_every_) {
@@ -150,7 +146,7 @@ void Inkplate6::update() {
150
146
  this->display();
151
147
  }
152
148
 
153
- void HOT Inkplate6::draw_absolute_pixel_internal(int x, int y, Color color) {
149
+ void HOT Inkplate::draw_absolute_pixel_internal(int x, int y, Color color) {
154
150
  if (x >= this->get_width_internal() || y >= this->get_height_internal() || x < 0 || y < 0)
155
151
  return;
156
152
 
@@ -171,18 +167,18 @@ void HOT Inkplate6::draw_absolute_pixel_internal(int x, int y, Color color) {
171
167
  // uint8_t gs = (uint8_t)(px*7);
172
168
 
173
169
  uint8_t gs = ((color.red * 2126 / 10000) + (color.green * 7152 / 10000) + (color.blue * 722 / 10000)) >> 5;
174
- this->buffer_[pos] = (pixelMaskGLUT[x_sub] & current) | (x_sub ? gs : gs << 4);
170
+ this->buffer_[pos] = (PIXEL_MASK_GLUT[x_sub] & current) | (x_sub ? gs : gs << 4);
175
171
 
176
172
  } else {
177
173
  int x1 = x / 8;
178
174
  int x_sub = x % 8;
179
175
  uint32_t pos = (x1 + y * (this->get_width_internal() / 8));
180
176
  uint8_t current = this->partial_buffer_[pos];
181
- this->partial_buffer_[pos] = (~pixelMaskLUT[x_sub] & current) | (color.is_on() ? 0 : pixelMaskLUT[x_sub]);
177
+ this->partial_buffer_[pos] = (~PIXEL_MASK_LUT[x_sub] & current) | (color.is_on() ? 0 : PIXEL_MASK_LUT[x_sub]);
182
178
  }
183
179
  }
184
180
 
185
- void Inkplate6::dump_config() {
181
+ void Inkplate::dump_config() {
186
182
  LOG_DISPLAY("", "Inkplate", this);
187
183
  ESP_LOGCONFIG(TAG,
188
184
  " Greyscale: %s\n"
@@ -214,7 +210,7 @@ void Inkplate6::dump_config() {
214
210
  LOG_UPDATE_INTERVAL(this);
215
211
  }
216
212
 
217
- void Inkplate6::eink_off_() {
213
+ void Inkplate::eink_off_() {
218
214
  ESP_LOGV(TAG, "Eink off called");
219
215
  if (!panel_on_)
220
216
  return;
@@ -242,7 +238,7 @@ void Inkplate6::eink_off_() {
242
238
  pins_z_state_();
243
239
  }
244
240
 
245
- void Inkplate6::eink_on_() {
241
+ void Inkplate::eink_on_() {
246
242
  ESP_LOGV(TAG, "Eink on called");
247
243
  if (panel_on_)
248
244
  return;
@@ -284,7 +280,7 @@ void Inkplate6::eink_on_() {
284
280
  this->oe_pin_->digital_write(true);
285
281
  }
286
282
 
287
- bool Inkplate6::read_power_status_() {
283
+ bool Inkplate::read_power_status_() {
288
284
  uint8_t data;
289
285
  auto err = this->read_register(0x0F, &data, 1);
290
286
  if (err == i2c::ERROR_OK) {
@@ -293,7 +289,7 @@ bool Inkplate6::read_power_status_() {
293
289
  return false;
294
290
  }
295
291
 
296
- void Inkplate6::fill(Color color) {
292
+ void Inkplate::fill(Color color) {
297
293
  ESP_LOGV(TAG, "Fill called");
298
294
  uint32_t start_time = millis();
299
295
 
@@ -308,7 +304,7 @@ void Inkplate6::fill(Color color) {
308
304
  ESP_LOGV(TAG, "Fill finished (%ums)", millis() - start_time);
309
305
  }
310
306
 
311
- void Inkplate6::display() {
307
+ void Inkplate::display() {
312
308
  ESP_LOGV(TAG, "Display called");
313
309
  uint32_t start_time = millis();
314
310
 
@@ -324,7 +320,7 @@ void Inkplate6::display() {
324
320
  ESP_LOGV(TAG, "Display finished (full) (%ums)", millis() - start_time);
325
321
  }
326
322
 
327
- void Inkplate6::display1b_() {
323
+ void Inkplate::display1b_() {
328
324
  ESP_LOGV(TAG, "Display1b called");
329
325
  uint32_t start_time = millis();
330
326
 
@@ -334,32 +330,71 @@ void Inkplate6::display1b_() {
334
330
  uint8_t buffer_value;
335
331
  const uint8_t *buffer_ptr;
336
332
  eink_on_();
337
- if (this->model_ == INKPLATE_6_PLUS) {
338
- clean_fast_(0, 1);
339
- clean_fast_(1, 15);
340
- clean_fast_(2, 1);
341
- clean_fast_(0, 5);
342
- clean_fast_(2, 1);
343
- clean_fast_(1, 15);
344
- } else {
345
- clean_fast_(0, 1);
346
- clean_fast_(1, 21);
347
- clean_fast_(2, 1);
348
- clean_fast_(0, 12);
349
- clean_fast_(2, 1);
350
- clean_fast_(1, 21);
351
- clean_fast_(2, 1);
352
- clean_fast_(0, 12);
353
- clean_fast_(2, 1);
333
+ uint8_t rep = 4;
334
+ switch (this->model_) {
335
+ case INKPLATE_10:
336
+ clean_fast_(0, 1);
337
+ clean_fast_(1, 10);
338
+ clean_fast_(2, 1);
339
+ clean_fast_(0, 10);
340
+ clean_fast_(2, 1);
341
+ clean_fast_(1, 10);
342
+ clean_fast_(2, 1);
343
+ clean_fast_(0, 10);
344
+ rep = 5;
345
+ break;
346
+ case INKPLATE_6_PLUS:
347
+ clean_fast_(0, 1);
348
+ clean_fast_(1, 15);
349
+ clean_fast_(2, 1);
350
+ clean_fast_(0, 5);
351
+ clean_fast_(2, 1);
352
+ clean_fast_(1, 15);
353
+ break;
354
+ case INKPLATE_6:
355
+ case INKPLATE_6_V2:
356
+ clean_fast_(0, 1);
357
+ clean_fast_(1, 18);
358
+ clean_fast_(2, 1);
359
+ clean_fast_(0, 18);
360
+ clean_fast_(2, 1);
361
+ clean_fast_(1, 18);
362
+ clean_fast_(2, 1);
363
+ clean_fast_(0, 18);
364
+ clean_fast_(2, 1);
365
+ if (this->model_ == INKPLATE_6_V2)
366
+ rep = 5;
367
+ break;
368
+ case INKPLATE_5:
369
+ clean_fast_(0, 1);
370
+ clean_fast_(1, 14);
371
+ clean_fast_(2, 1);
372
+ clean_fast_(0, 14);
373
+ clean_fast_(2, 1);
374
+ clean_fast_(1, 14);
375
+ clean_fast_(2, 1);
376
+ clean_fast_(0, 14);
377
+ clean_fast_(2, 1);
378
+ rep = 5;
379
+ break;
380
+ case INKPLATE_5_V2:
381
+ clean_fast_(0, 1);
382
+ clean_fast_(1, 11);
383
+ clean_fast_(2, 1);
384
+ clean_fast_(0, 11);
385
+ clean_fast_(2, 1);
386
+ clean_fast_(1, 11);
387
+ clean_fast_(2, 1);
388
+ clean_fast_(0, 11);
389
+ rep = 3;
390
+ break;
354
391
  }
355
392
 
356
393
  uint32_t clock = (1 << this->cl_pin_->get_pin());
357
394
  uint32_t data_mask = this->get_data_pin_mask_();
358
395
  ESP_LOGV(TAG, "Display1b start loops (%ums)", millis() - start_time);
359
396
 
360
- int rep = (this->model_ == INKPLATE_6_V2) ? 5 : 4;
361
-
362
- for (int k = 0; k < rep; k++) {
397
+ for (uint8_t k = 0; k < rep; k++) {
363
398
  buffer_ptr = &this->buffer_[this->get_buffer_length_() - 1];
364
399
  vscan_start_();
365
400
  for (int i = 0, im = this->get_height_internal(); i < im; i++) {
@@ -452,28 +487,75 @@ void Inkplate6::display1b_() {
452
487
  ESP_LOGV(TAG, "Display1b finished (%ums)", millis() - start_time);
453
488
  }
454
489
 
455
- void Inkplate6::display3b_() {
490
+ void Inkplate::display3b_() {
456
491
  ESP_LOGV(TAG, "Display3b called");
457
492
  uint32_t start_time = millis();
458
493
 
459
494
  eink_on_();
460
- if (this->model_ == INKPLATE_6_PLUS) {
461
- clean_fast_(0, 1);
462
- clean_fast_(1, 15);
463
- clean_fast_(2, 1);
464
- clean_fast_(0, 5);
465
- clean_fast_(2, 1);
466
- clean_fast_(1, 15);
467
- } else {
468
- clean_fast_(0, 1);
469
- clean_fast_(1, 21);
470
- clean_fast_(2, 1);
471
- clean_fast_(0, 12);
472
- clean_fast_(2, 1);
473
- clean_fast_(1, 21);
474
- clean_fast_(2, 1);
475
- clean_fast_(0, 12);
476
- clean_fast_(2, 1);
495
+
496
+ switch (this->model_) {
497
+ case INKPLATE_10:
498
+ if (this->custom_waveform_) {
499
+ clean_fast_(1, 1);
500
+ clean_fast_(0, 7);
501
+ clean_fast_(2, 1);
502
+ clean_fast_(1, 12);
503
+ clean_fast_(2, 1);
504
+ clean_fast_(0, 7);
505
+ clean_fast_(2, 1);
506
+ clean_fast_(1, 12);
507
+ } else {
508
+ clean_fast_(1, 1);
509
+ clean_fast_(0, 10);
510
+ clean_fast_(2, 1);
511
+ clean_fast_(1, 10);
512
+ clean_fast_(2, 1);
513
+ clean_fast_(0, 10);
514
+ clean_fast_(2, 1);
515
+ clean_fast_(1, 10);
516
+ }
517
+ break;
518
+ case INKPLATE_6_PLUS:
519
+ clean_fast_(0, 1);
520
+ clean_fast_(1, 15);
521
+ clean_fast_(2, 1);
522
+ clean_fast_(0, 5);
523
+ clean_fast_(2, 1);
524
+ clean_fast_(1, 15);
525
+ break;
526
+ case INKPLATE_6:
527
+ case INKPLATE_6_V2:
528
+ clean_fast_(0, 1);
529
+ clean_fast_(1, 18);
530
+ clean_fast_(2, 1);
531
+ clean_fast_(0, 18);
532
+ clean_fast_(2, 1);
533
+ clean_fast_(1, 18);
534
+ clean_fast_(2, 1);
535
+ clean_fast_(0, 18);
536
+ clean_fast_(2, 1);
537
+ break;
538
+ case INKPLATE_5:
539
+ clean_fast_(0, 1);
540
+ clean_fast_(1, 14);
541
+ clean_fast_(2, 1);
542
+ clean_fast_(0, 14);
543
+ clean_fast_(2, 1);
544
+ clean_fast_(1, 14);
545
+ clean_fast_(2, 1);
546
+ clean_fast_(0, 14);
547
+ clean_fast_(2, 1);
548
+ break;
549
+ case INKPLATE_5_V2:
550
+ clean_fast_(0, 1);
551
+ clean_fast_(1, 11);
552
+ clean_fast_(2, 1);
553
+ clean_fast_(0, 11);
554
+ clean_fast_(2, 1);
555
+ clean_fast_(1, 11);
556
+ clean_fast_(2, 1);
557
+ clean_fast_(0, 11);
558
+ break;
477
559
  }
478
560
 
479
561
  uint32_t clock = (1 << this->cl_pin_->get_pin());
@@ -518,7 +600,7 @@ void Inkplate6::display3b_() {
518
600
  ESP_LOGV(TAG, "Display3b finished (%ums)", millis() - start_time);
519
601
  }
520
602
 
521
- bool Inkplate6::partial_update_() {
603
+ bool Inkplate::partial_update_() {
522
604
  ESP_LOGV(TAG, "Partial update called");
523
605
  uint32_t start_time = millis();
524
606
  if (this->greyscale_)
@@ -560,7 +642,7 @@ bool Inkplate6::partial_update_() {
560
642
  GPIO.out_w1ts = this->pin_lut_[data] | clock;
561
643
  GPIO.out_w1tc = data_mask | clock;
562
644
  }
563
- // New Inkplate6 panel doesn't need last clock
645
+ // New Inkplate panel doesn't need last clock
564
646
  if (this->model_ != INKPLATE_6_V2) {
565
647
  GPIO.out_w1ts = clock;
566
648
  GPIO.out_w1tc = data_mask | clock;
@@ -580,7 +662,7 @@ bool Inkplate6::partial_update_() {
580
662
  return true;
581
663
  }
582
664
 
583
- void Inkplate6::vscan_start_() {
665
+ void Inkplate::vscan_start_() {
584
666
  this->ckv_pin_->digital_write(true);
585
667
  delayMicroseconds(7);
586
668
  this->spv_pin_->digital_write(false);
@@ -604,7 +686,7 @@ void Inkplate6::vscan_start_() {
604
686
  this->ckv_pin_->digital_write(true);
605
687
  }
606
688
 
607
- void Inkplate6::hscan_start_(uint32_t d) {
689
+ void Inkplate::hscan_start_(uint32_t d) {
608
690
  uint8_t clock = (1 << this->cl_pin_->get_pin());
609
691
  this->sph_pin_->digital_write(false);
610
692
  GPIO.out_w1ts = d | clock;
@@ -613,14 +695,14 @@ void Inkplate6::hscan_start_(uint32_t d) {
613
695
  this->ckv_pin_->digital_write(true);
614
696
  }
615
697
 
616
- void Inkplate6::vscan_end_() {
698
+ void Inkplate::vscan_end_() {
617
699
  this->ckv_pin_->digital_write(false);
618
700
  this->le_pin_->digital_write(true);
619
701
  this->le_pin_->digital_write(false);
620
702
  delayMicroseconds(0);
621
703
  }
622
704
 
623
- void Inkplate6::clean() {
705
+ void Inkplate::clean() {
624
706
  ESP_LOGV(TAG, "Clean called");
625
707
  uint32_t start_time = millis();
626
708
 
@@ -634,7 +716,7 @@ void Inkplate6::clean() {
634
716
  ESP_LOGV(TAG, "Clean finished (%ums)", millis() - start_time);
635
717
  }
636
718
 
637
- void Inkplate6::clean_fast_(uint8_t c, uint8_t rep) {
719
+ void Inkplate::clean_fast_(uint8_t c, uint8_t rep) {
638
720
  ESP_LOGV(TAG, "Clean fast called with: (%d, %d)", c, rep);
639
721
  uint32_t start_time = millis();
640
722
 
@@ -666,7 +748,7 @@ void Inkplate6::clean_fast_(uint8_t c, uint8_t rep) {
666
748
  GPIO.out_w1ts = clock;
667
749
  GPIO.out_w1tc = clock;
668
750
  }
669
- // New Inkplate6 panel doesn't need last clock
751
+ // New Inkplate panel doesn't need last clock
670
752
  if (this->model_ != INKPLATE_6_V2) {
671
753
  GPIO.out_w1ts = send | clock;
672
754
  GPIO.out_w1tc = clock;
@@ -679,7 +761,7 @@ void Inkplate6::clean_fast_(uint8_t c, uint8_t rep) {
679
761
  ESP_LOGV(TAG, "Clean fast finished (%ums)", millis() - start_time);
680
762
  }
681
763
 
682
- void Inkplate6::pins_z_state_() {
764
+ void Inkplate::pins_z_state_() {
683
765
  this->cl_pin_->pin_mode(gpio::FLAG_INPUT);
684
766
  this->le_pin_->pin_mode(gpio::FLAG_INPUT);
685
767
  this->ckv_pin_->pin_mode(gpio::FLAG_INPUT);
@@ -699,7 +781,7 @@ void Inkplate6::pins_z_state_() {
699
781
  this->display_data_7_pin_->pin_mode(gpio::FLAG_INPUT);
700
782
  }
701
783
 
702
- void Inkplate6::pins_as_outputs_() {
784
+ void Inkplate::pins_as_outputs_() {
703
785
  this->cl_pin_->pin_mode(gpio::FLAG_OUTPUT);
704
786
  this->le_pin_->pin_mode(gpio::FLAG_OUTPUT);
705
787
  this->ckv_pin_->pin_mode(gpio::FLAG_OUTPUT);
@@ -719,5 +801,5 @@ void Inkplate6::pins_as_outputs_() {
719
801
  this->display_data_7_pin_->pin_mode(gpio::FLAG_OUTPUT);
720
802
  }
721
803
 
722
- } // namespace inkplate6
804
+ } // namespace inkplate
723
805
  } // namespace esphome
@@ -5,8 +5,10 @@
5
5
  #include "esphome/core/component.h"
6
6
  #include "esphome/core/hal.h"
7
7
 
8
+ #include <array>
9
+
8
10
  namespace esphome {
9
- namespace inkplate6 {
11
+ namespace inkplate {
10
12
 
11
13
  enum InkplateModel : uint8_t {
12
14
  INKPLATE_6 = 0,
@@ -17,79 +19,35 @@ enum InkplateModel : uint8_t {
17
19
  INKPLATE_5_V2 = 5,
18
20
  };
19
21
 
20
- class Inkplate6 : public display::DisplayBuffer, public i2c::I2CDevice {
21
- public:
22
- const uint8_t LUT2[16] = {0xAA, 0xA9, 0xA6, 0xA5, 0x9A, 0x99, 0x96, 0x95,
23
- 0x6A, 0x69, 0x66, 0x65, 0x5A, 0x59, 0x56, 0x55};
24
- const uint8_t LUTW[16] = {0xFF, 0xFE, 0xFB, 0xFA, 0xEF, 0xEE, 0xEB, 0xEA,
25
- 0xBF, 0xBE, 0xBB, 0xBA, 0xAF, 0xAE, 0xAB, 0xAA};
26
- const uint8_t LUTB[16] = {0xFF, 0xFD, 0xF7, 0xF5, 0xDF, 0xDD, 0xD7, 0xD5,
27
- 0x7F, 0x7D, 0x77, 0x75, 0x5F, 0x5D, 0x57, 0x55};
28
-
29
- const uint8_t pixelMaskLUT[8] = {0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80};
30
- const uint8_t pixelMaskGLUT[2] = {0x0F, 0xF0};
31
-
32
- const uint8_t waveform3BitAll[6][8][9] = {// INKPLATE_6
33
- {{0, 1, 1, 0, 0, 1, 1, 0, 0},
34
- {0, 1, 2, 1, 1, 2, 1, 0, 0},
35
- {1, 1, 1, 2, 2, 1, 0, 0, 0},
36
- {0, 0, 0, 1, 1, 1, 2, 0, 0},
37
- {2, 1, 1, 1, 2, 1, 2, 0, 0},
38
- {2, 2, 1, 1, 2, 1, 2, 0, 0},
39
- {1, 1, 1, 2, 1, 2, 2, 0, 0},
40
- {0, 0, 0, 0, 0, 0, 2, 0, 0}},
41
- // INKPLATE_10
42
- {{0, 0, 0, 0, 0, 0, 0, 1, 0},
43
- {0, 0, 0, 2, 2, 2, 1, 1, 0},
44
- {0, 0, 2, 1, 1, 2, 2, 1, 0},
45
- {0, 1, 2, 2, 1, 2, 2, 1, 0},
46
- {0, 0, 2, 1, 2, 2, 2, 1, 0},
47
- {0, 2, 2, 2, 2, 2, 2, 1, 0},
48
- {0, 0, 0, 0, 0, 2, 1, 2, 0},
49
- {0, 0, 0, 2, 2, 2, 2, 2, 0}},
50
- // INKPLATE_6_PLUS
51
- {{0, 0, 0, 0, 0, 2, 1, 1, 0},
52
- {0, 0, 2, 1, 1, 1, 2, 1, 0},
53
- {0, 2, 2, 2, 1, 1, 2, 1, 0},
54
- {0, 0, 2, 2, 2, 1, 2, 1, 0},
55
- {0, 0, 0, 0, 2, 2, 2, 1, 0},
56
- {0, 0, 2, 1, 2, 1, 1, 2, 0},
57
- {0, 0, 2, 2, 2, 1, 1, 2, 0},
58
- {0, 0, 0, 0, 2, 2, 2, 2, 0}},
59
- // INKPLATE_6_V2
60
- {{1, 0, 1, 0, 1, 1, 1, 0, 0},
61
- {0, 0, 0, 1, 1, 1, 1, 0, 0},
62
- {1, 1, 1, 1, 0, 2, 1, 0, 0},
63
- {1, 1, 1, 2, 2, 1, 1, 0, 0},
64
- {1, 1, 1, 1, 2, 2, 1, 0, 0},
65
- {0, 1, 1, 1, 2, 2, 1, 0, 0},
66
- {0, 0, 0, 0, 1, 1, 2, 0, 0},
67
- {0, 0, 0, 0, 0, 1, 2, 0, 0}},
68
- // INKPLATE_5
69
- {{0, 0, 1, 1, 0, 1, 1, 1, 0},
70
- {0, 1, 1, 1, 1, 2, 0, 1, 0},
71
- {1, 2, 2, 0, 2, 1, 1, 1, 0},
72
- {1, 1, 1, 2, 0, 1, 1, 2, 0},
73
- {0, 1, 1, 1, 2, 0, 1, 2, 0},
74
- {0, 0, 0, 1, 1, 2, 1, 2, 0},
75
- {1, 1, 1, 2, 0, 2, 1, 2, 0},
76
- {0, 0, 0, 0, 0, 0, 0, 0, 0}},
77
- // INKPLATE_5_V2
78
- {{0, 0, 1, 1, 2, 1, 1, 1, 0},
79
- {1, 1, 2, 2, 1, 2, 1, 1, 0},
80
- {0, 1, 2, 2, 1, 1, 2, 1, 0},
81
- {0, 0, 1, 1, 1, 1, 1, 2, 0},
82
- {1, 2, 1, 2, 1, 1, 1, 2, 0},
83
- {0, 1, 1, 1, 2, 0, 1, 2, 0},
84
- {1, 1, 1, 2, 2, 2, 1, 2, 0},
85
- {0, 0, 0, 0, 0, 0, 0, 0, 0}}};
22
+ static constexpr uint8_t GLUT_SIZE = 9;
23
+ static constexpr uint8_t GLUT_COUNT = 8;
24
+
25
+ static constexpr uint8_t LUT2[16] = {0xAA, 0xA9, 0xA6, 0xA5, 0x9A, 0x99, 0x96, 0x95,
26
+ 0x6A, 0x69, 0x66, 0x65, 0x5A, 0x59, 0x56, 0x55};
27
+ static constexpr uint8_t LUTW[16] = {0xFF, 0xFE, 0xFB, 0xFA, 0xEF, 0xEE, 0xEB, 0xEA,
28
+ 0xBF, 0xBE, 0xBB, 0xBA, 0xAF, 0xAE, 0xAB, 0xAA};
29
+ static constexpr uint8_t LUTB[16] = {0xFF, 0xFD, 0xF7, 0xF5, 0xDF, 0xDD, 0xD7, 0xD5,
30
+ 0x7F, 0x7D, 0x77, 0x75, 0x5F, 0x5D, 0x57, 0x55};
31
+
32
+ static constexpr uint8_t PIXEL_MASK_LUT[8] = {0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80};
33
+ static constexpr uint8_t PIXEL_MASK_GLUT[2] = {0x0F, 0xF0};
86
34
 
35
+ class Inkplate : public display::DisplayBuffer, public i2c::I2CDevice {
36
+ public:
87
37
  void set_greyscale(bool greyscale) {
88
38
  this->greyscale_ = greyscale;
89
39
  this->block_partial_ = true;
90
40
  if (this->is_ready())
91
41
  this->initialize_();
92
42
  }
43
+
44
+ void set_waveform(const std::array<uint8_t, GLUT_COUNT * GLUT_SIZE> &waveform, bool is_custom) {
45
+ static_assert(sizeof(this->waveform_) == sizeof(uint8_t) * GLUT_COUNT * GLUT_SIZE,
46
+ "waveform_ buffer size must match input waveform array size");
47
+ memmove(this->waveform_, waveform.data(), sizeof(this->waveform_));
48
+ this->custom_waveform_ = is_custom;
49
+ }
50
+
93
51
  void set_mirror_y(bool mirror_y) { this->mirror_y_ = mirror_y; }
94
52
  void set_mirror_x(bool mirror_x) { this->mirror_x_ = mirror_x; }
95
53
 
@@ -225,6 +183,8 @@ class Inkplate6 : public display::DisplayBuffer, public i2c::I2CDevice {
225
183
  bool mirror_y_{false};
226
184
  bool mirror_x_{false};
227
185
  bool partial_updating_;
186
+ bool custom_waveform_{false};
187
+ uint8_t waveform_[GLUT_COUNT][GLUT_SIZE];
228
188
 
229
189
  InkplateModel model_;
230
190
 
@@ -250,5 +210,5 @@ class Inkplate6 : public display::DisplayBuffer, public i2c::I2CDevice {
250
210
  GPIOPin *wakeup_pin_;
251
211
  };
252
212
 
253
- } // namespace inkplate6
213
+ } // namespace inkplate
254
214
  } // namespace esphome
@@ -1 +0,0 @@
1
- CODEOWNERS = ["@jesserockz"]