esphome 2025.6.3__py3-none-any.whl → 2025.7.0b2__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 (606) hide show
  1. esphome/__main__.py +1 -3
  2. esphome/codegen.py +2 -0
  3. esphome/components/ac_dimmer/ac_dimmer.cpp +6 -6
  4. esphome/components/adc/__init__.py +25 -1
  5. esphome/components/adc/adc_sensor.h +11 -11
  6. esphome/components/adc/adc_sensor_common.cpp +1 -1
  7. esphome/components/adc/adc_sensor_esp32.cpp +16 -8
  8. esphome/components/ade7880/ade7880.h +0 -2
  9. esphome/components/ads1115/ads1115.h +0 -1
  10. esphome/components/ads1118/ads1118.h +0 -1
  11. esphome/components/ags10/ags10.h +0 -2
  12. esphome/components/aic3204/aic3204.h +0 -1
  13. esphome/components/alarm_control_panel/__init__.py +5 -2
  14. esphome/components/alpha3/alpha3.h +0 -1
  15. esphome/components/am43/cover/am43_cover.h +0 -1
  16. esphome/components/am43/sensor/am43_sensor.h +0 -1
  17. esphome/components/analog_threshold/analog_threshold_binary_sensor.h +0 -2
  18. esphome/components/anova/anova.cpp +5 -1
  19. esphome/components/anova/anova.h +0 -1
  20. esphome/components/apds9960/apds9960.cpp +1 -1
  21. esphome/components/api/__init__.py +57 -21
  22. esphome/components/api/api_connection.cpp +344 -539
  23. esphome/components/api/api_connection.h +224 -141
  24. esphome/components/api/api_frame_helper.cpp +91 -127
  25. esphome/components/api/api_frame_helper.h +64 -54
  26. esphome/components/api/api_pb2.cpp +1837 -9044
  27. esphome/components/api/api_pb2.h +532 -685
  28. esphome/components/api/api_pb2_dump.cpp +4432 -0
  29. esphome/components/api/api_pb2_service.cpp +184 -425
  30. esphome/components/api/api_pb2_service.h +13 -6
  31. esphome/components/api/api_server.cpp +131 -167
  32. esphome/components/api/api_server.h +38 -10
  33. esphome/components/api/client.py +8 -2
  34. esphome/components/api/custom_api_device.h +8 -0
  35. esphome/components/api/list_entities.cpp +37 -104
  36. esphome/components/api/list_entities.h +33 -23
  37. esphome/components/api/proto.h +532 -26
  38. esphome/components/api/subscribe_state.cpp +23 -29
  39. esphome/components/api/subscribe_state.h +26 -19
  40. esphome/components/api/user_services.h +2 -0
  41. esphome/components/as5600/as5600.h +0 -1
  42. esphome/components/async_tcp/__init__.py +14 -5
  43. esphome/components/atc_mithermometer/atc_mithermometer.h +0 -1
  44. esphome/components/atm90e32/atm90e32.cpp +2 -1
  45. esphome/components/audio/audio_decoder.cpp +1 -1
  46. esphome/components/audio/audio_transfer_buffer.cpp +2 -2
  47. esphome/components/b_parasite/b_parasite.h +0 -1
  48. esphome/components/bedjet/bedjet_hub.cpp +5 -1
  49. esphome/components/bedjet/climate/bedjet_climate.cpp +5 -1
  50. esphome/components/beken_spi_led_strip/led_strip.cpp +4 -2
  51. esphome/components/bh1750/bh1750.cpp +5 -5
  52. esphome/components/binary_sensor/__init__.py +82 -5
  53. esphome/components/binary_sensor/automation.h +19 -1
  54. esphome/components/binary_sensor/binary_sensor.cpp +12 -30
  55. esphome/components/binary_sensor/binary_sensor.h +11 -25
  56. esphome/components/binary_sensor/filter.cpp +29 -24
  57. esphome/components/binary_sensor/filter.h +20 -10
  58. esphome/components/ble_client/output/ble_binary_output.h +0 -1
  59. esphome/components/ble_client/sensor/ble_rssi_sensor.cpp +5 -1
  60. esphome/components/ble_client/sensor/ble_rssi_sensor.h +0 -1
  61. esphome/components/ble_client/sensor/ble_sensor.cpp +5 -1
  62. esphome/components/ble_client/sensor/ble_sensor.h +0 -1
  63. esphome/components/ble_client/switch/ble_switch.h +0 -1
  64. esphome/components/ble_client/text_sensor/ble_text_sensor.cpp +5 -1
  65. esphome/components/ble_client/text_sensor/ble_text_sensor.h +0 -1
  66. esphome/components/ble_presence/ble_presence_device.h +0 -1
  67. esphome/components/ble_rssi/ble_rssi_sensor.h +0 -1
  68. esphome/components/ble_scanner/ble_scanner.h +0 -1
  69. esphome/components/bluetooth_proxy/bluetooth_connection.h +9 -2
  70. esphome/components/bluetooth_proxy/bluetooth_proxy.cpp +16 -6
  71. esphome/components/bluetooth_proxy/bluetooth_proxy.h +8 -2
  72. esphome/components/bme680/sensor.py +1 -1
  73. esphome/components/bmp581/bmp581.h +0 -2
  74. esphome/components/button/__init__.py +5 -2
  75. esphome/components/camera/__init__.py +1 -0
  76. esphome/components/camera/camera.cpp +22 -0
  77. esphome/components/camera/camera.h +80 -0
  78. esphome/components/canbus/__init__.py +1 -0
  79. esphome/components/cap1188/cap1188.h +0 -1
  80. esphome/components/captive_portal/__init__.py +12 -2
  81. esphome/components/captive_portal/captive_portal.cpp +12 -2
  82. esphome/components/captive_portal/captive_portal.h +5 -2
  83. esphome/components/ccs811/ccs811.h +0 -2
  84. esphome/components/climate/__init__.py +5 -2
  85. esphome/components/cm1106/sensor.py +2 -2
  86. esphome/components/const/__init__.py +2 -0
  87. esphome/components/copy/binary_sensor/copy_binary_sensor.h +0 -1
  88. esphome/components/copy/button/copy_button.h +0 -1
  89. esphome/components/copy/cover/copy_cover.h +0 -1
  90. esphome/components/copy/fan/copy_fan.h +0 -1
  91. esphome/components/copy/lock/copy_lock.h +0 -1
  92. esphome/components/copy/number/copy_number.h +0 -1
  93. esphome/components/copy/select/copy_select.h +0 -1
  94. esphome/components/copy/sensor/copy_sensor.h +0 -1
  95. esphome/components/copy/switch/copy_switch.h +0 -1
  96. esphome/components/copy/text/copy_text.h +0 -1
  97. esphome/components/copy/text_sensor/copy_text_sensor.h +0 -1
  98. esphome/components/cover/__init__.py +5 -2
  99. esphome/components/cs5460a/cs5460a.h +0 -1
  100. esphome/components/datetime/__init__.py +4 -2
  101. esphome/components/debug/__init__.py +20 -0
  102. esphome/components/debug/debug_esp32.cpp +2 -0
  103. esphome/components/deep_sleep/__init__.py +43 -9
  104. esphome/components/demo/__init__.py +2 -2
  105. esphome/components/display/display.cpp +4 -3
  106. esphome/components/display/display.h +0 -2
  107. esphome/components/display/display_buffer.cpp +1 -1
  108. esphome/components/ds2484/__init__.py +1 -0
  109. esphome/components/ds2484/ds2484.cpp +209 -0
  110. esphome/components/ds2484/ds2484.h +43 -0
  111. esphome/components/ds2484/one_wire.py +37 -0
  112. esphome/components/duty_time/duty_time_sensor.h +0 -1
  113. esphome/components/ens160_base/ens160_base.h +0 -1
  114. esphome/components/es7210/es7210.h +0 -1
  115. esphome/components/es7243e/es7243e.h +0 -1
  116. esphome/components/es8156/es8156.h +0 -1
  117. esphome/components/es8311/es8311.h +0 -1
  118. esphome/components/es8388/es8388.h +0 -1
  119. esphome/components/esp32/__init__.py +103 -135
  120. esphome/components/esp32/core.cpp +0 -4
  121. esphome/components/esp32/gpio.h +1 -1
  122. esphome/components/esp32/helpers.cpp +69 -0
  123. esphome/components/esp32_ble/ble.cpp +5 -6
  124. esphome/components/esp32_ble/ble.h +29 -14
  125. esphome/components/esp32_ble/ble_event.h +6 -6
  126. esphome/components/esp32_ble_client/ble_client_base.cpp +21 -6
  127. esphome/components/esp32_ble_client/ble_client_base.h +24 -9
  128. esphome/components/esp32_ble_tracker/__init__.py +2 -8
  129. esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +5 -5
  130. esphome/components/esp32_ble_tracker/esp32_ble_tracker.h +11 -7
  131. esphome/components/esp32_camera/__init__.py +112 -98
  132. esphome/components/esp32_camera/esp32_camera.cpp +41 -31
  133. esphome/components/esp32_camera/esp32_camera.h +35 -30
  134. esphome/components/esp32_camera_web_server/__init__.py +2 -1
  135. esphome/components/esp32_camera_web_server/camera_web_server.cpp +8 -8
  136. esphome/components/esp32_camera_web_server/camera_web_server.h +3 -3
  137. esphome/components/esp32_hall/sensor.py +2 -21
  138. esphome/components/esp32_hosted/__init__.py +101 -0
  139. esphome/components/esp32_hosted/esp32_hosted.py.script +12 -0
  140. esphome/components/esp32_improv/esp32_improv_component.cpp +3 -0
  141. esphome/components/esp32_rmt/__init__.py +0 -58
  142. esphome/components/esp32_rmt_led_strip/led_strip.cpp +77 -63
  143. esphome/components/esp32_rmt_led_strip/led_strip.h +11 -17
  144. esphome/components/esp32_rmt_led_strip/light.py +14 -76
  145. esphome/components/esp32_touch/esp32_touch.h +174 -28
  146. esphome/components/esp32_touch/esp32_touch_common.cpp +162 -0
  147. esphome/components/esp32_touch/esp32_touch_v1.cpp +240 -0
  148. esphome/components/esp32_touch/esp32_touch_v2.cpp +397 -0
  149. esphome/components/esp8266/__init__.py +2 -0
  150. esphome/components/esp8266/gpio.cpp +10 -10
  151. esphome/components/esp8266/helpers.cpp +31 -0
  152. esphome/components/esphome/ota/__init__.py +1 -0
  153. esphome/components/esphome/ota/ota_esphome.cpp +24 -19
  154. esphome/components/ethernet/__init__.py +42 -23
  155. esphome/components/ethernet/esp_eth_phy_jl1101.c +0 -16
  156. esphome/components/ethernet/ethernet_component.cpp +69 -29
  157. esphome/components/ethernet/ethernet_component.h +18 -10
  158. esphome/components/event/__init__.py +5 -2
  159. esphome/components/ezo/ezo.h +0 -1
  160. esphome/components/ezo_pmp/ezo_pmp.h +0 -1
  161. esphome/components/fan/__init__.py +5 -2
  162. esphome/components/feedback/feedback_cover.h +0 -1
  163. esphome/components/font/__init__.py +92 -82
  164. esphome/components/font/font.cpp +9 -2
  165. esphome/components/font/font.h +20 -5
  166. esphome/components/fs3000/fs3000.h +0 -1
  167. esphome/components/gcja5/gcja5.h +0 -1
  168. esphome/components/gl_r01_i2c/__init__.py +0 -0
  169. esphome/components/gl_r01_i2c/gl_r01_i2c.cpp +68 -0
  170. esphome/components/gl_r01_i2c/gl_r01_i2c.h +22 -0
  171. esphome/components/gl_r01_i2c/sensor.py +36 -0
  172. esphome/components/gp8403/gp8403.h +0 -1
  173. esphome/components/gpio/binary_sensor/__init__.py +17 -0
  174. esphome/components/gpio/binary_sensor/gpio_binary_sensor.cpp +77 -3
  175. esphome/components/gpio/binary_sensor/gpio_binary_sensor.h +40 -0
  176. esphome/components/grove_gas_mc_v2/grove_gas_mc_v2.h +0 -2
  177. esphome/components/he60r/he60r.h +0 -1
  178. esphome/components/heatpumpir/climate.py +2 -1
  179. esphome/components/heatpumpir/heatpumpir.cpp +1 -0
  180. esphome/components/heatpumpir/heatpumpir.h +1 -0
  181. esphome/components/honeywellabp2_i2c/honeywellabp2.h +0 -1
  182. esphome/components/host/__init__.py +3 -1
  183. esphome/components/host/helpers.cpp +57 -0
  184. esphome/components/http_request/__init__.py +19 -1
  185. esphome/components/http_request/http_request.h +1 -1
  186. esphome/components/http_request/http_request_arduino.h +1 -0
  187. esphome/components/http_request/ota/ota_http_request.cpp +1 -1
  188. esphome/components/http_request/update/http_request_update.cpp +28 -9
  189. esphome/components/hydreon_rgxx/hydreon_rgxx.cpp +3 -9
  190. esphome/components/hydreon_rgxx/sensor.py +1 -1
  191. esphome/components/i2c/__init__.py +23 -11
  192. esphome/components/i2c/i2c_bus.h +8 -1
  193. esphome/components/i2c/i2c_bus_arduino.cpp +4 -3
  194. esphome/components/i2c/i2c_bus_arduino.h +6 -3
  195. esphome/components/i2c/i2c_bus_esp_idf.h +5 -3
  196. esphome/components/i2c_device/i2c_device.h +0 -1
  197. esphome/components/i2s_audio/__init__.py +2 -10
  198. esphome/components/i2s_audio/i2s_audio.cpp +1 -5
  199. esphome/components/i2s_audio/media_player/__init__.py +2 -2
  200. esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +2 -2
  201. esphome/components/iaqcore/iaqcore.h +0 -2
  202. esphome/components/image/__init__.py +123 -24
  203. esphome/components/improv_serial/improv_serial_component.cpp +0 -4
  204. esphome/components/ina219/ina219.cpp +7 -0
  205. esphome/components/ina219/ina219.h +1 -0
  206. esphome/components/ina260/ina260.h +0 -2
  207. esphome/components/inkbird_ibsth1_mini/inkbird_ibsth1_mini.h +0 -1
  208. esphome/components/inkplate6/display.py +15 -0
  209. esphome/components/inkplate6/inkplate.cpp +2 -2
  210. esphome/components/integration/integration_sensor.h +0 -1
  211. esphome/components/internal_temperature/internal_temperature.cpp +8 -27
  212. esphome/components/internal_temperature/sensor.py +0 -26
  213. esphome/components/interval/interval.h +0 -2
  214. esphome/components/ld2410/button/__init__.py +3 -3
  215. esphome/components/ld2410/button/factory_reset_button.cpp +9 -0
  216. esphome/components/ld2410/button/{reset_button.h → factory_reset_button.h} +2 -2
  217. esphome/components/ld2410/ld2410.cpp +421 -268
  218. esphome/components/ld2410/ld2410.h +44 -146
  219. esphome/components/ld2410/number/__init__.py +2 -2
  220. esphome/components/ld2410/sensor.py +1 -1
  221. esphome/components/ld2410/switch/__init__.py +1 -1
  222. esphome/components/ld2420/ld2420.cpp +196 -100
  223. esphome/components/ld2420/ld2420.h +46 -118
  224. esphome/components/ld2420/number/__init__.py +2 -2
  225. esphome/components/ld2420/sensor/__init__.py +6 -2
  226. esphome/components/ld2420/sensor/ld2420_sensor.h +1 -1
  227. esphome/components/ld2450/button/__init__.py +3 -3
  228. esphome/components/ld2450/button/factory_reset_button.cpp +9 -0
  229. esphome/components/ld2450/button/{reset_button.h → factory_reset_button.h} +2 -2
  230. esphome/components/ld2450/ld2450.cpp +384 -232
  231. esphome/components/ld2450/ld2450.h +60 -69
  232. esphome/components/ld2450/switch/__init__.py +1 -1
  233. esphome/components/ledc/ledc_output.cpp +1 -63
  234. esphome/components/libretiny/__init__.py +5 -3
  235. esphome/components/libretiny/const.py +5 -0
  236. esphome/components/libretiny/generate_components.py +1 -0
  237. esphome/components/libretiny/helpers.cpp +35 -0
  238. esphome/components/libretiny/lt_component.cpp +5 -3
  239. esphome/components/light/__init__.py +4 -2
  240. esphome/components/light/addressable_light.h +3 -3
  241. esphome/components/light/light_call.cpp +180 -243
  242. esphome/components/light/light_call.h +72 -20
  243. esphome/components/light/light_color_values.h +14 -14
  244. esphome/components/light/light_state.h +15 -13
  245. esphome/components/light/transformers.h +2 -2
  246. esphome/components/ln882x/__init__.py +52 -0
  247. esphome/components/ln882x/boards.py +285 -0
  248. esphome/components/lock/__init__.py +5 -2
  249. esphome/components/logger/__init__.py +40 -3
  250. esphome/components/logger/logger.cpp +47 -12
  251. esphome/components/logger/logger.h +80 -49
  252. esphome/components/logger/logger_esp32.cpp +3 -3
  253. esphome/components/lps22/__init__.py +0 -0
  254. esphome/components/lps22/lps22.cpp +75 -0
  255. esphome/components/lps22/lps22.h +27 -0
  256. esphome/components/lps22/sensor.py +58 -0
  257. esphome/components/ltr390/ltr390.h +0 -1
  258. esphome/components/ltr501/ltr501.h +0 -1
  259. esphome/components/ltr_als_ps/ltr_als_ps.h +0 -1
  260. esphome/components/lvgl/__init__.py +1 -1
  261. esphome/components/lvgl/schemas.py +66 -6
  262. esphome/components/lvgl/styles.py +24 -16
  263. esphome/components/lvgl/widgets/__init__.py +12 -2
  264. esphome/components/lvgl/widgets/lv_bar.py +40 -19
  265. esphome/components/m5stack_8angle/light/m5stack_8angle_light.cpp +1 -1
  266. esphome/components/max9611/max9611.h +0 -1
  267. esphome/components/mcp23016/__init__.py +1 -1
  268. esphome/components/mcp23xxx_base/__init__.py +1 -1
  269. esphome/components/mcp4461/__init__.py +1 -1
  270. esphome/components/mcp4461/output/__init__.py +3 -2
  271. esphome/components/mcp9600/mcp9600.h +0 -2
  272. esphome/components/md5/md5.cpp +3 -3
  273. esphome/components/md5/md5.h +1 -6
  274. esphome/components/mdns/__init__.py +22 -11
  275. esphome/components/media_player/__init__.py +4 -3
  276. esphome/components/micro_wake_word/__init__.py +1 -5
  277. esphome/components/micro_wake_word/streaming_model.cpp +2 -2
  278. esphome/components/microphone/microphone.cpp +7 -9
  279. esphome/components/microphone/microphone.h +0 -2
  280. esphome/components/mipi_spi/display.py +1 -0
  281. esphome/components/mmc5603/mmc5603.cpp +1 -1
  282. esphome/components/modbus/modbus.cpp +33 -15
  283. esphome/components/modbus/modbus.h +9 -0
  284. esphome/components/modbus_controller/__init__.py +42 -10
  285. esphome/components/modbus_controller/modbus_controller.cpp +92 -11
  286. esphome/components/modbus_controller/modbus_controller.h +61 -7
  287. esphome/components/mopeka_pro_check/mopeka_pro_check.h +0 -1
  288. esphome/components/mopeka_std_check/mopeka_std_check.h +0 -1
  289. esphome/components/mpl3115a2/mpl3115a2.h +0 -2
  290. esphome/components/mqtt/__init__.py +16 -0
  291. esphome/components/mqtt/mqtt_backend.h +2 -1
  292. esphome/components/mqtt/mqtt_backend_esp32.cpp +132 -47
  293. esphome/components/mqtt/mqtt_backend_esp32.h +106 -4
  294. esphome/components/mqtt/mqtt_client.cpp +15 -9
  295. esphome/components/mqtt/mqtt_client.h +8 -3
  296. esphome/components/ms8607/ms8607.h +0 -1
  297. esphome/components/neopixelbus/light.py +4 -1
  298. esphome/components/neopixelbus/neopixelbus_light.h +1 -1
  299. esphome/components/network/__init__.py +4 -1
  300. esphome/components/network/ip_address.h +1 -0
  301. esphome/components/nextion/__init__.py +16 -0
  302. esphome/components/nextion/base_component.py +1 -0
  303. esphome/components/nextion/binary_sensor/nextion_binarysensor.cpp +1 -1
  304. esphome/components/nextion/display.py +14 -4
  305. esphome/components/nextion/nextion.cpp +166 -101
  306. esphome/components/nextion/nextion.h +84 -53
  307. esphome/components/nextion/nextion_commands.cpp +11 -10
  308. esphome/components/nextion/nextion_component.cpp +28 -28
  309. esphome/components/nextion/nextion_component.h +53 -18
  310. esphome/components/nextion/nextion_component_base.h +3 -0
  311. esphome/components/nextion/nextion_upload.cpp +36 -0
  312. esphome/components/nextion/nextion_upload_arduino.cpp +10 -35
  313. esphome/components/nextion/nextion_upload_idf.cpp +9 -33
  314. esphome/components/nextion/sensor/nextion_sensor.cpp +1 -1
  315. esphome/components/nextion/switch/nextion_switch.cpp +1 -1
  316. esphome/components/nextion/text_sensor/nextion_textsensor.cpp +1 -1
  317. esphome/components/nfc/nfc.cpp +3 -22
  318. esphome/components/nfc/nfc.h +3 -3
  319. esphome/components/number/__init__.py +5 -2
  320. esphome/components/online_image/__init__.py +5 -0
  321. esphome/components/online_image/online_image.cpp +6 -2
  322. esphome/components/online_image/online_image.h +4 -1
  323. esphome/components/opentherm/opentherm.cpp +7 -12
  324. esphome/components/openthread/__init__.py +47 -40
  325. esphome/components/openthread/const.py +1 -0
  326. esphome/components/openthread/openthread_esp.cpp +27 -5
  327. esphome/components/opt3001/__init__.py +0 -0
  328. esphome/components/opt3001/opt3001.cpp +122 -0
  329. esphome/components/opt3001/opt3001.h +27 -0
  330. esphome/components/opt3001/sensor.py +35 -0
  331. esphome/components/ota/__init__.py +17 -0
  332. esphome/components/ota/ota_backend.h +27 -1
  333. esphome/components/ota/ota_backend_arduino_esp32.cpp +12 -2
  334. esphome/components/ota/ota_backend_arduino_esp32.h +3 -0
  335. esphome/components/ota/ota_backend_arduino_esp8266.cpp +18 -4
  336. esphome/components/ota/ota_backend_arduino_esp8266.h +3 -0
  337. esphome/components/ota/ota_backend_arduino_libretiny.cpp +12 -2
  338. esphome/components/ota/ota_backend_arduino_libretiny.h +3 -0
  339. esphome/components/ota/ota_backend_arduino_rp2040.cpp +9 -2
  340. esphome/components/ota/ota_backend_arduino_rp2040.h +3 -0
  341. esphome/components/ota/ota_backend_esp_idf.cpp +10 -16
  342. esphome/components/ota/ota_backend_esp_idf.h +1 -0
  343. esphome/components/packages/__init__.py +5 -2
  344. esphome/components/packet_transport/binary_sensor.py +61 -4
  345. esphome/components/packet_transport/packet_transport.cpp +34 -1
  346. esphome/components/packet_transport/packet_transport.h +11 -5
  347. esphome/components/pcf8574/__init__.py +1 -1
  348. esphome/components/pi4ioe5v6408/__init__.py +84 -0
  349. esphome/components/pi4ioe5v6408/pi4ioe5v6408.cpp +171 -0
  350. esphome/components/pi4ioe5v6408/pi4ioe5v6408.h +70 -0
  351. esphome/components/pmsa003i/pmsa003i.h +0 -1
  352. esphome/components/pmsx003/pmsx003.h +0 -1
  353. esphome/components/pn7150/pn7150.cpp +7 -7
  354. esphome/components/pn7150/pn7150.h +0 -1
  355. esphome/components/pn7160/pn7160.cpp +7 -7
  356. esphome/components/pn7160/pn7160.h +0 -1
  357. esphome/components/preferences/syncer.h +2 -0
  358. esphome/components/prometheus/prometheus_handler.h +1 -1
  359. esphome/components/psram/psram.cpp +0 -20
  360. esphome/components/pulse_counter/pulse_counter_sensor.h +0 -1
  361. esphome/components/pulse_meter/pulse_meter_sensor.cpp +8 -4
  362. esphome/components/pulse_width/pulse_width.h +0 -1
  363. esphome/components/pvvx_mithermometer/display/pvvx_display.cpp +0 -4
  364. esphome/components/pvvx_mithermometer/display/pvvx_display.h +0 -2
  365. esphome/components/pvvx_mithermometer/pvvx_mithermometer.h +0 -1
  366. esphome/components/qr_code/__init__.py +13 -10
  367. esphome/components/qwiic_pir/qwiic_pir.h +0 -1
  368. esphome/components/radon_eye_ble/radon_eye_listener.cpp +1 -1
  369. esphome/components/rc522/rc522.h +0 -1
  370. esphome/components/rdm6300/rdm6300.h +0 -2
  371. esphome/components/remote_base/__init__.py +7 -5
  372. esphome/components/remote_base/remote_base.cpp +24 -21
  373. esphome/components/remote_base/remote_base.h +3 -26
  374. esphome/components/remote_receiver/__init__.py +40 -46
  375. esphome/components/remote_receiver/remote_receiver.h +4 -18
  376. esphome/components/remote_receiver/remote_receiver_esp32.cpp +0 -87
  377. esphome/components/remote_receiver/remote_receiver_esp8266.cpp +1 -1
  378. esphome/components/remote_transmitter/__init__.py +42 -43
  379. esphome/components/remote_transmitter/remote_transmitter.h +2 -14
  380. esphome/components/remote_transmitter/remote_transmitter_esp32.cpp +0 -77
  381. esphome/components/resistance/resistance_sensor.h +0 -1
  382. esphome/components/rp2040/__init__.py +2 -0
  383. esphome/components/rp2040/helpers.cpp +55 -0
  384. esphome/components/rp2040_pio_led_strip/led_strip.cpp +2 -2
  385. esphome/components/rpi_dpi_rgb/rpi_dpi_rgb.cpp +0 -4
  386. esphome/components/rtttl/__init__.py +4 -4
  387. esphome/components/rtttl/rtttl.cpp +10 -1
  388. esphome/components/ruuvitag/ruuvitag.h +0 -1
  389. esphome/components/safe_mode/safe_mode.cpp +2 -0
  390. esphome/components/safe_mode/safe_mode.h +4 -1
  391. esphome/components/scd30/scd30.h +0 -1
  392. esphome/components/scd30/sensor.py +2 -2
  393. esphome/components/scd4x/scd4x.cpp +61 -54
  394. esphome/components/scd4x/scd4x.h +17 -15
  395. esphome/components/scd4x/sensor.py +4 -4
  396. esphome/components/script/script.h +0 -2
  397. esphome/components/sdp3x/sensor.py +1 -1
  398. esphome/components/select/__init__.py +5 -2
  399. esphome/components/sen5x/sen5x.h +0 -1
  400. esphome/components/senseair/senseair.h +0 -1
  401. esphome/components/sensor/__init__.py +4 -2
  402. esphome/components/sensor/filter.cpp +1 -1
  403. esphome/components/sensor/sensor.cpp +12 -6
  404. esphome/components/sensor/sensor.h +13 -5
  405. esphome/components/servo/servo.h +0 -1
  406. esphome/components/sfa30/sfa30.h +0 -1
  407. esphome/components/sgp30/sgp30.h +0 -1
  408. esphome/components/sgp4x/sgp4x.h +0 -1
  409. esphome/components/shelly_dimmer/stm32flash.cpp +1 -2
  410. esphome/components/sht4x/sht4x.h +0 -1
  411. esphome/components/sm300d2/sm300d2.h +0 -2
  412. esphome/components/smt100/sensor.py +8 -4
  413. esphome/components/smt100/smt100.cpp +5 -5
  414. esphome/components/smt100/smt100.h +3 -3
  415. esphome/components/sn74hc595/__init__.py +1 -1
  416. esphome/components/sn74hc595/sn74hc595.cpp +5 -4
  417. esphome/components/sntp/sntp_component.cpp +9 -3
  418. esphome/components/sntp/time.py +2 -0
  419. esphome/components/socket/__init__.py +17 -0
  420. esphome/components/spi/__init__.py +27 -6
  421. esphome/components/spi/spi.cpp +3 -2
  422. esphome/components/spi/spi.h +9 -3
  423. esphome/components/spi/spi_arduino.cpp +3 -5
  424. esphome/components/spi/spi_esp_idf.cpp +40 -21
  425. esphome/components/spi_led_strip/spi_led_strip.cpp +1 -1
  426. esphome/components/sps30/sps30.h +0 -1
  427. esphome/components/ssd1306_base/ssd1306_base.cpp +1 -1
  428. esphome/components/st7701s/st7701s.cpp +0 -4
  429. esphome/components/status/status_binary_sensor.h +0 -2
  430. esphome/components/substitutions/__init__.py +76 -19
  431. esphome/components/substitutions/jinja.py +99 -0
  432. esphome/components/sun/sun.cpp +3 -4
  433. esphome/components/switch/__init__.py +5 -2
  434. esphome/components/switch/binary_sensor/switch_binary_sensor.h +0 -1
  435. esphome/components/sx126x/__init__.py +317 -0
  436. esphome/components/sx126x/automation.h +62 -0
  437. esphome/components/sx126x/packet_transport/__init__.py +26 -0
  438. esphome/components/sx126x/packet_transport/sx126x_transport.cpp +26 -0
  439. esphome/components/sx126x/packet_transport/sx126x_transport.h +25 -0
  440. esphome/components/sx126x/sx126x.cpp +523 -0
  441. esphome/components/sx126x/sx126x.h +140 -0
  442. esphome/components/sx126x/sx126x_reg.h +163 -0
  443. esphome/components/sx127x/__init__.py +325 -0
  444. esphome/components/sx127x/automation.h +62 -0
  445. esphome/components/sx127x/packet_transport/__init__.py +26 -0
  446. esphome/components/sx127x/packet_transport/sx127x_transport.cpp +26 -0
  447. esphome/components/sx127x/packet_transport/sx127x_transport.h +25 -0
  448. esphome/components/sx127x/sx127x.cpp +498 -0
  449. esphome/components/sx127x/sx127x.h +128 -0
  450. esphome/components/sx127x/sx127x_reg.h +295 -0
  451. esphome/components/syslog/esphome_syslog.cpp +5 -3
  452. esphome/components/syslog/esphome_syslog.h +1 -1
  453. esphome/components/tca9555/__init__.py +1 -1
  454. esphome/components/template/binary_sensor/template_binary_sensor.cpp +1 -9
  455. esphome/components/text/__init__.py +5 -2
  456. esphome/components/text_sensor/__init__.py +5 -2
  457. esphome/components/thermostat/thermostat_climate.cpp +34 -31
  458. esphome/components/thermostat/thermostat_climate.h +43 -39
  459. esphome/components/time/__init__.py +16 -2
  460. esphome/components/time/real_time_clock.cpp +4 -0
  461. esphome/components/time/real_time_clock.h +5 -1
  462. esphome/components/tlc5971/tlc5971.cpp +4 -1
  463. esphome/components/tmp1075/tmp1075.h +0 -2
  464. esphome/components/tof10120/tof10120_sensor.h +0 -1
  465. esphome/components/tormatic/tormatic_cover.h +0 -1
  466. esphome/components/total_daily_energy/total_daily_energy.h +0 -1
  467. esphome/components/tsl2591/tsl2591.cpp +1 -1
  468. esphome/components/ttp229_bsf/ttp229_bsf.h +0 -1
  469. esphome/components/ttp229_lsf/ttp229_lsf.h +0 -1
  470. esphome/components/tx20/tx20.cpp +2 -2
  471. esphome/components/uart/__init__.py +18 -0
  472. esphome/components/uart/uart_component_esp_idf.cpp +0 -4
  473. esphome/components/update/__init__.py +5 -2
  474. esphome/components/update/update_entity.h +8 -0
  475. esphome/components/usb_host/__init__.py +5 -2
  476. esphome/components/usb_host/usb_host_client.cpp +10 -10
  477. esphome/components/usb_uart/cp210x.cpp +1 -1
  478. esphome/components/usb_uart/usb_uart.cpp +41 -44
  479. esphome/components/usb_uart/usb_uart.h +4 -3
  480. esphome/components/valve/__init__.py +5 -2
  481. esphome/components/vbus/vbus.h +0 -1
  482. esphome/components/veml3235/veml3235.h +0 -1
  483. esphome/components/veml7700/veml7700.h +0 -1
  484. esphome/components/vl53l0x/vl53l0x_sensor.h +0 -1
  485. esphome/components/voice_assistant/voice_assistant.cpp +4 -4
  486. esphome/components/watchdog/watchdog.cpp +0 -4
  487. esphome/components/waveshare_epaper/waveshare_epaper.cpp +6 -6
  488. esphome/components/web_server/__init__.py +34 -19
  489. esphome/components/web_server/ota/__init__.py +32 -0
  490. esphome/components/web_server/ota/ota_web_server.cpp +210 -0
  491. esphome/components/web_server/ota/ota_web_server.h +26 -0
  492. esphome/components/web_server/web_server.cpp +305 -427
  493. esphome/components/web_server/web_server.h +33 -23
  494. esphome/components/web_server/web_server_v1.cpp +4 -5
  495. esphome/components/web_server_base/__init__.py +5 -2
  496. esphome/components/web_server_base/web_server_base.cpp +2 -94
  497. esphome/components/web_server_base/web_server_base.h +5 -25
  498. esphome/components/web_server_idf/multipart.cpp +254 -0
  499. esphome/components/web_server_idf/multipart.h +86 -0
  500. esphome/components/web_server_idf/utils.cpp +32 -0
  501. esphome/components/web_server_idf/utils.h +10 -0
  502. esphome/components/web_server_idf/web_server_idf.cpp +162 -16
  503. esphome/components/web_server_idf/web_server_idf.h +11 -10
  504. esphome/components/wiegand/wiegand.cpp +2 -2
  505. esphome/components/wifi/__init__.py +18 -0
  506. esphome/components/wifi/wifi_component.cpp +17 -22
  507. esphome/components/wifi/wifi_component.h +27 -23
  508. esphome/components/wifi/wifi_component_esp32_arduino.cpp +52 -59
  509. esphome/components/wifi/wifi_component_esp8266.cpp +46 -46
  510. esphome/components/wifi/wifi_component_esp_idf.cpp +35 -36
  511. esphome/components/wifi/wifi_component_libretiny.cpp +26 -27
  512. esphome/components/wifi/wifi_component_pico_w.cpp +3 -3
  513. esphome/components/wifi_info/wifi_info_text_sensor.cpp +6 -6
  514. esphome/components/wireguard/__init__.py +2 -11
  515. esphome/components/xiaomi_ble/xiaomi_ble.cpp +13 -1
  516. esphome/components/xiaomi_ble/xiaomi_ble.h +1 -0
  517. esphome/components/xiaomi_cgd1/xiaomi_cgd1.h +0 -1
  518. esphome/components/xiaomi_cgdk2/xiaomi_cgdk2.h +0 -1
  519. esphome/components/xiaomi_cgg1/xiaomi_cgg1.h +0 -1
  520. esphome/components/xiaomi_cgpr1/xiaomi_cgpr1.h +0 -1
  521. esphome/components/xiaomi_gcls002/xiaomi_gcls002.h +0 -1
  522. esphome/components/xiaomi_hhccjcy01/xiaomi_hhccjcy01.h +0 -1
  523. esphome/components/xiaomi_hhccjcy10/xiaomi_hhccjcy10.h +0 -1
  524. esphome/components/xiaomi_hhccpot002/xiaomi_hhccpot002.h +0 -1
  525. esphome/components/xiaomi_jqjcy01ym/xiaomi_jqjcy01ym.h +0 -1
  526. esphome/components/xiaomi_lywsd02/xiaomi_lywsd02.h +0 -1
  527. esphome/components/xiaomi_lywsd02mmc/xiaomi_lywsd02mmc.h +0 -1
  528. esphome/components/xiaomi_lywsd03mmc/xiaomi_lywsd03mmc.h +0 -1
  529. esphome/components/xiaomi_lywsdcgq/xiaomi_lywsdcgq.h +0 -1
  530. esphome/components/xiaomi_mhoc303/xiaomi_mhoc303.h +0 -1
  531. esphome/components/xiaomi_mhoc401/xiaomi_mhoc401.h +0 -1
  532. esphome/components/xiaomi_miscale/xiaomi_miscale.h +0 -1
  533. esphome/components/xiaomi_mjyd02yla/xiaomi_mjyd02yla.h +0 -1
  534. esphome/components/xiaomi_mue4094rt/xiaomi_mue4094rt.h +0 -1
  535. esphome/components/xiaomi_rtcgq02lm/xiaomi_rtcgq02lm.h +0 -1
  536. esphome/components/xiaomi_wx08zm/xiaomi_wx08zm.h +0 -1
  537. esphome/components/xiaomi_xmwsdj04mmc/__init__.py +0 -0
  538. esphome/components/xiaomi_xmwsdj04mmc/sensor.py +77 -0
  539. esphome/components/xiaomi_xmwsdj04mmc/xiaomi_xmwsdj04mmc.cpp +77 -0
  540. esphome/components/xiaomi_xmwsdj04mmc/xiaomi_xmwsdj04mmc.h +36 -0
  541. esphome/components/zio_ultrasonic/zio_ultrasonic.h +0 -2
  542. esphome/components/zyaura/zyaura.h +0 -1
  543. esphome/config.py +88 -22
  544. esphome/config_helpers.py +74 -1
  545. esphome/config_validation.py +12 -1
  546. esphome/const.py +65 -10
  547. esphome/core/__init__.py +18 -2
  548. esphome/core/application.cpp +163 -10
  549. esphome/core/application.h +145 -165
  550. esphome/core/area.h +19 -0
  551. esphome/core/automation.h +58 -9
  552. esphome/core/color.cpp +3 -5
  553. esphome/core/color.h +16 -16
  554. esphome/core/component.cpp +151 -18
  555. esphome/core/component.h +98 -4
  556. esphome/core/component_iterator.cpp +11 -9
  557. esphome/core/component_iterator.h +12 -10
  558. esphome/core/config.py +155 -6
  559. esphome/core/controller.cpp +4 -2
  560. esphome/core/controller.h +1 -1
  561. esphome/core/datatypes.h +2 -2
  562. esphome/core/defines.h +17 -2
  563. esphome/core/device.h +20 -0
  564. esphome/core/entity_base.cpp +20 -15
  565. esphome/core/entity_base.h +76 -0
  566. esphome/core/entity_helpers.py +168 -1
  567. esphome/core/event_pool.h +81 -0
  568. esphome/core/helpers.cpp +75 -230
  569. esphome/core/helpers.h +164 -104
  570. esphome/core/lock_free_queue.h +151 -0
  571. esphome/core/log.cpp +2 -2
  572. esphome/core/log.h +2 -0
  573. esphome/core/optional.h +5 -0
  574. esphome/core/ring_buffer.cpp +2 -2
  575. esphome/core/scheduler.cpp +275 -103
  576. esphome/core/scheduler.h +154 -17
  577. esphome/core/time.cpp +5 -5
  578. esphome/core/time.h +5 -5
  579. esphome/cpp_generator.py +17 -0
  580. esphome/cpp_helpers.py +0 -22
  581. esphome/cpp_types.py +3 -1
  582. esphome/dashboard/entries.py +1 -1
  583. esphome/dashboard/util/text.py +5 -21
  584. esphome/dashboard/web_server.py +9 -1
  585. esphome/helpers.py +47 -0
  586. esphome/loader.py +15 -1
  587. esphome/pins.py +14 -8
  588. esphome/wizard.py +17 -4
  589. esphome/writer.py +21 -3
  590. esphome/yaml_util.py +0 -2
  591. {esphome-2025.6.3.dist-info → esphome-2025.7.0b2.dist-info}/METADATA +10 -9
  592. {esphome-2025.6.3.dist-info → esphome-2025.7.0b2.dist-info}/RECORD +597 -538
  593. esphome/components/api/api_pb2_size.h +0 -361
  594. esphome/components/esp32_ble/ble_event_pool.h +0 -72
  595. esphome/components/esp32_ble/queue.h +0 -85
  596. esphome/components/esp32_hall/esp32_hall.cpp +0 -25
  597. esphome/components/esp32_hall/esp32_hall.h +0 -23
  598. esphome/components/esp32_touch/esp32_touch.cpp +0 -355
  599. esphome/components/ld2410/button/reset_button.cpp +0 -9
  600. esphome/components/ld2450/button/reset_button.cpp +0 -9
  601. esphome/components/openthread/tlv.py +0 -65
  602. /esphome/{dashboard/enum.py → enum.py} +0 -0
  603. {esphome-2025.6.3.dist-info → esphome-2025.7.0b2.dist-info}/WHEEL +0 -0
  604. {esphome-2025.6.3.dist-info → esphome-2025.7.0b2.dist-info}/entry_points.txt +0 -0
  605. {esphome-2025.6.3.dist-info → esphome-2025.7.0b2.dist-info}/licenses/LICENSE +0 -0
  606. {esphome-2025.6.3.dist-info → esphome-2025.7.0b2.dist-info}/top_level.txt +0 -0
@@ -32,14 +32,14 @@ bool WiFiComponent::wifi_mode_(optional<bool> sta, optional<bool> ap) {
32
32
  return true;
33
33
 
34
34
  if (enable_sta && !current_sta) {
35
- ESP_LOGV(TAG, "Enabling STA.");
35
+ ESP_LOGV(TAG, "Enabling STA");
36
36
  } else if (!enable_sta && current_sta) {
37
- ESP_LOGV(TAG, "Disabling STA.");
37
+ ESP_LOGV(TAG, "Disabling STA");
38
38
  }
39
39
  if (enable_ap && !current_ap) {
40
- ESP_LOGV(TAG, "Enabling AP.");
40
+ ESP_LOGV(TAG, "Enabling AP");
41
41
  } else if (!enable_ap && current_ap) {
42
- ESP_LOGV(TAG, "Disabling AP.");
42
+ ESP_LOGV(TAG, "Disabling AP");
43
43
  }
44
44
 
45
45
  uint8_t mode = 0;
@@ -124,7 +124,7 @@ bool WiFiComponent::wifi_sta_connect_(const WiFiAP &ap) {
124
124
  ap.get_channel().has_value() ? *ap.get_channel() : 0,
125
125
  ap.get_bssid().has_value() ? ap.get_bssid()->data() : NULL);
126
126
  if (status != WL_CONNECTED) {
127
- ESP_LOGW(TAG, "esp_wifi_connect failed! %d", status);
127
+ ESP_LOGW(TAG, "esp_wifi_connect failed: %d", status);
128
128
  return false;
129
129
  }
130
130
 
@@ -256,23 +256,23 @@ using esphome_wifi_event_info_t = arduino_event_info_t;
256
256
  void WiFiComponent::wifi_event_callback_(esphome_wifi_event_id_t event, esphome_wifi_event_info_t info) {
257
257
  switch (event) {
258
258
  case ESPHOME_EVENT_ID_WIFI_READY: {
259
- ESP_LOGV(TAG, "Event: WiFi ready");
259
+ ESP_LOGV(TAG, "Ready");
260
260
  break;
261
261
  }
262
262
  case ESPHOME_EVENT_ID_WIFI_SCAN_DONE: {
263
263
  auto it = info.wifi_scan_done;
264
- ESP_LOGV(TAG, "Event: WiFi Scan Done status=%u number=%u scan_id=%u", it.status, it.number, it.scan_id);
264
+ ESP_LOGV(TAG, "Scan done: status=%u number=%u scan_id=%u", it.status, it.number, it.scan_id);
265
265
 
266
266
  this->wifi_scan_done_callback_();
267
267
  break;
268
268
  }
269
269
  case ESPHOME_EVENT_ID_WIFI_STA_START: {
270
- ESP_LOGV(TAG, "Event: WiFi STA start");
270
+ ESP_LOGV(TAG, "STA start");
271
271
  WiFi.setHostname(App.get_name().c_str());
272
272
  break;
273
273
  }
274
274
  case ESPHOME_EVENT_ID_WIFI_STA_STOP: {
275
- ESP_LOGV(TAG, "Event: WiFi STA stop");
275
+ ESP_LOGV(TAG, "STA stop");
276
276
  break;
277
277
  }
278
278
  case ESPHOME_EVENT_ID_WIFI_STA_CONNECTED: {
@@ -280,8 +280,8 @@ void WiFiComponent::wifi_event_callback_(esphome_wifi_event_id_t event, esphome_
280
280
  char buf[33];
281
281
  memcpy(buf, it.ssid, it.ssid_len);
282
282
  buf[it.ssid_len] = '\0';
283
- ESP_LOGV(TAG, "Event: Connected ssid='%s' bssid=" LOG_SECRET("%s") " channel=%u, authmode=%s", buf,
284
- format_mac_addr(it.bssid).c_str(), it.channel, get_auth_mode_str(it.authmode));
283
+ ESP_LOGV(TAG, "Connected ssid='%s' bssid=" LOG_SECRET("%s") " channel=%u, authmode=%s", buf,
284
+ format_mac_address_pretty(it.bssid).c_str(), it.channel, get_auth_mode_str(it.authmode));
285
285
 
286
286
  break;
287
287
  }
@@ -291,10 +291,10 @@ void WiFiComponent::wifi_event_callback_(esphome_wifi_event_id_t event, esphome_
291
291
  memcpy(buf, it.ssid, it.ssid_len);
292
292
  buf[it.ssid_len] = '\0';
293
293
  if (it.reason == WIFI_REASON_NO_AP_FOUND) {
294
- ESP_LOGW(TAG, "Event: Disconnected ssid='%s' reason='Probe Request Unsuccessful'", buf);
294
+ ESP_LOGW(TAG, "Disconnected ssid='%s' reason='Probe Request Unsuccessful'", buf);
295
295
  } else {
296
- ESP_LOGW(TAG, "Event: Disconnected ssid='%s' bssid=" LOG_SECRET("%s") " reason='%s'", buf,
297
- format_mac_addr(it.bssid).c_str(), get_disconnect_reason_str(it.reason));
296
+ ESP_LOGW(TAG, "Disconnected ssid='%s' bssid=" LOG_SECRET("%s") " reason='%s'", buf,
297
+ format_mac_address_pretty(it.bssid).c_str(), get_disconnect_reason_str(it.reason));
298
298
  }
299
299
 
300
300
  uint8_t reason = it.reason;
@@ -310,8 +310,7 @@ void WiFiComponent::wifi_event_callback_(esphome_wifi_event_id_t event, esphome_
310
310
  }
311
311
  case ESPHOME_EVENT_ID_WIFI_STA_AUTHMODE_CHANGE: {
312
312
  auto it = info.wifi_sta_authmode_change;
313
- ESP_LOGV(TAG, "Event: Authmode Change old=%s new=%s", get_auth_mode_str(it.old_mode),
314
- get_auth_mode_str(it.new_mode));
313
+ ESP_LOGV(TAG, "Authmode Change old=%s new=%s", get_auth_mode_str(it.old_mode), get_auth_mode_str(it.new_mode));
315
314
  // Mitigate CVE-2020-12638
316
315
  // https://lbsfilm.at/blog/wpa2-authenticationmode-downgrade-in-espressif-microprocessors
317
316
  if (it.old_mode != WIFI_AUTH_OPEN && it.new_mode == WIFI_AUTH_OPEN) {
@@ -325,47 +324,47 @@ void WiFiComponent::wifi_event_callback_(esphome_wifi_event_id_t event, esphome_
325
324
  }
326
325
  case ESPHOME_EVENT_ID_WIFI_STA_GOT_IP: {
327
326
  // auto it = info.got_ip.ip_info;
328
- ESP_LOGV(TAG, "Event: Got IP static_ip=%s gateway=%s", format_ip4_addr(WiFi.localIP()).c_str(),
327
+ ESP_LOGV(TAG, "static_ip=%s gateway=%s", format_ip4_addr(WiFi.localIP()).c_str(),
329
328
  format_ip4_addr(WiFi.gatewayIP()).c_str());
330
329
  s_sta_connecting = false;
331
330
  break;
332
331
  }
333
332
  case ESPHOME_EVENT_ID_WIFI_STA_GOT_IP6: {
334
333
  // auto it = info.got_ip.ip_info;
335
- ESP_LOGV(TAG, "Event: Got IPv6");
334
+ ESP_LOGV(TAG, "Got IPv6");
336
335
  break;
337
336
  }
338
337
  case ESPHOME_EVENT_ID_WIFI_STA_LOST_IP: {
339
- ESP_LOGV(TAG, "Event: Lost IP");
338
+ ESP_LOGV(TAG, "Lost IP");
340
339
  break;
341
340
  }
342
341
  case ESPHOME_EVENT_ID_WIFI_AP_START: {
343
- ESP_LOGV(TAG, "Event: WiFi AP start");
342
+ ESP_LOGV(TAG, "AP start");
344
343
  break;
345
344
  }
346
345
  case ESPHOME_EVENT_ID_WIFI_AP_STOP: {
347
- ESP_LOGV(TAG, "Event: WiFi AP stop");
346
+ ESP_LOGV(TAG, "AP stop");
348
347
  break;
349
348
  }
350
349
  case ESPHOME_EVENT_ID_WIFI_AP_STACONNECTED: {
351
350
  auto it = info.wifi_sta_connected;
352
351
  auto &mac = it.bssid;
353
- ESP_LOGV(TAG, "Event: AP client connected MAC=%s", format_mac_addr(mac).c_str());
352
+ ESP_LOGV(TAG, "AP client connected MAC=%s", format_mac_address_pretty(mac).c_str());
354
353
  break;
355
354
  }
356
355
  case ESPHOME_EVENT_ID_WIFI_AP_STADISCONNECTED: {
357
356
  auto it = info.wifi_sta_disconnected;
358
357
  auto &mac = it.bssid;
359
- ESP_LOGV(TAG, "Event: AP client disconnected MAC=%s", format_mac_addr(mac).c_str());
358
+ ESP_LOGV(TAG, "AP client disconnected MAC=%s", format_mac_address_pretty(mac).c_str());
360
359
  break;
361
360
  }
362
361
  case ESPHOME_EVENT_ID_WIFI_AP_STAIPASSIGNED: {
363
- ESP_LOGV(TAG, "Event: AP client assigned IP");
362
+ ESP_LOGV(TAG, "AP client assigned IP");
364
363
  break;
365
364
  }
366
365
  case ESPHOME_EVENT_ID_WIFI_AP_PROBEREQRECVED: {
367
366
  auto it = info.wifi_ap_probereqrecved;
368
- ESP_LOGVV(TAG, "Event: AP receive Probe Request MAC=%s RSSI=%d", format_mac_addr(it.mac).c_str(), it.rssi);
367
+ ESP_LOGVV(TAG, "AP receive Probe Request MAC=%s RSSI=%d", format_mac_address_pretty(it.mac).c_str(), it.rssi);
369
368
  break;
370
369
  }
371
370
  default:
@@ -399,7 +398,7 @@ bool WiFiComponent::wifi_scan_start_(bool passive) {
399
398
  // need to use WiFi because of WiFiScanClass allocations :(
400
399
  int16_t err = WiFi.scanNetworks(true, true, passive, 200);
401
400
  if (err != WIFI_SCAN_RUNNING) {
402
- ESP_LOGV(TAG, "WiFi.scanNetworks failed! %d", err);
401
+ ESP_LOGV(TAG, "WiFi.scanNetworks failed: %d", err);
403
402
  return false;
404
403
  }
405
404
 
@@ -447,7 +446,7 @@ bool WiFiComponent::wifi_start_ap_(const WiFiAP &ap) {
447
446
  return false;
448
447
 
449
448
  if (!this->wifi_ap_ip_config_(ap.get_manual_ip())) {
450
- ESP_LOGV(TAG, "wifi_ap_ip_config_ failed!");
449
+ ESP_LOGV(TAG, "wifi_ap_ip_config_ failed");
451
450
  return false;
452
451
  }
453
452
 
@@ -134,7 +134,7 @@ bool WiFiComponent::wifi_scan_start_(bool passive) {
134
134
  scan_options.scan_type = passive ? 1 : 0;
135
135
  int err = cyw43_wifi_scan(&cyw43_state, &scan_options, nullptr, &s_wifi_scan_result);
136
136
  if (err) {
137
- ESP_LOGV(TAG, "cyw43_wifi_scan failed!");
137
+ ESP_LOGV(TAG, "cyw43_wifi_scan failed");
138
138
  }
139
139
  return err == 0;
140
140
  return true;
@@ -162,7 +162,7 @@ bool WiFiComponent::wifi_start_ap_(const WiFiAP &ap) {
162
162
  if (!this->wifi_mode_({}, true))
163
163
  return false;
164
164
  if (!this->wifi_ap_ip_config_(ap.get_manual_ip())) {
165
- ESP_LOGV(TAG, "wifi_ap_ip_config_ failed!");
165
+ ESP_LOGV(TAG, "wifi_ap_ip_config_ failed");
166
166
  return false;
167
167
  }
168
168
 
@@ -209,7 +209,7 @@ network::IPAddress WiFiComponent::wifi_dns_ip_(int num) {
209
209
  void WiFiComponent::wifi_loop_() {
210
210
  if (this->state_ == WIFI_COMPONENT_STATE_STA_SCANNING && !cyw43_wifi_scan_active(&cyw43_state)) {
211
211
  this->scan_done_ = true;
212
- ESP_LOGV(TAG, "Scan done!");
212
+ ESP_LOGV(TAG, "Scan done");
213
213
  }
214
214
  }
215
215
 
@@ -7,12 +7,12 @@ namespace wifi_info {
7
7
 
8
8
  static const char *const TAG = "wifi_info";
9
9
 
10
- void IPAddressWiFiInfo::dump_config() { LOG_TEXT_SENSOR("", "WifiInfo IPAddress", this); }
11
- void ScanResultsWiFiInfo::dump_config() { LOG_TEXT_SENSOR("", "WifiInfo Scan Results", this); }
12
- void SSIDWiFiInfo::dump_config() { LOG_TEXT_SENSOR("", "WifiInfo SSID", this); }
13
- void BSSIDWiFiInfo::dump_config() { LOG_TEXT_SENSOR("", "WifiInfo BSSID", this); }
14
- void MacAddressWifiInfo::dump_config() { LOG_TEXT_SENSOR("", "WifiInfo Mac Address", this); }
15
- void DNSAddressWifiInfo::dump_config() { LOG_TEXT_SENSOR("", "WifiInfo DNS Address", this); }
10
+ void IPAddressWiFiInfo::dump_config() { LOG_TEXT_SENSOR("", "IP Address", this); }
11
+ void ScanResultsWiFiInfo::dump_config() { LOG_TEXT_SENSOR("", "Scan Results", this); }
12
+ void SSIDWiFiInfo::dump_config() { LOG_TEXT_SENSOR("", "SSID", this); }
13
+ void BSSIDWiFiInfo::dump_config() { LOG_TEXT_SENSOR("", "BSSID", this); }
14
+ void MacAddressWifiInfo::dump_config() { LOG_TEXT_SENSOR("", "MAC Address", this); }
15
+ void DNSAddressWifiInfo::dump_config() { LOG_TEXT_SENSOR("", "DNS Address", this); }
16
16
 
17
17
  } // namespace wifi_info
18
18
  } // namespace esphome
@@ -6,14 +6,7 @@ import esphome.codegen as cg
6
6
  from esphome.components import time
7
7
  from esphome.components.esp32 import CORE, add_idf_sdkconfig_option
8
8
  import esphome.config_validation as cv
9
- from esphome.const import (
10
- CONF_ADDRESS,
11
- CONF_ID,
12
- CONF_REBOOT_TIMEOUT,
13
- CONF_TIME_ID,
14
- KEY_CORE,
15
- KEY_FRAMEWORK_VERSION,
16
- )
9
+ from esphome.const import CONF_ADDRESS, CONF_ID, CONF_REBOOT_TIMEOUT, CONF_TIME_ID
17
10
  from esphome.core import TimePeriod
18
11
 
19
12
  CONF_NETMASK = "netmask"
@@ -125,9 +118,7 @@ async def to_code(config):
125
118
 
126
119
  # Workaround for crash on IDF 5+
127
120
  # See https://github.com/trombik/esp_wireguard/issues/33#issuecomment-1568503651
128
- if CORE.using_esp_idf and CORE.data[KEY_CORE][KEY_FRAMEWORK_VERSION] >= cv.Version(
129
- 5, 0, 0
130
- ):
121
+ if CORE.using_esp_idf:
131
122
  add_idf_sdkconfig_option("CONFIG_LWIP_PPP_SUPPORT", True)
132
123
 
133
124
  # This flag is added here because the esp_wireguard library statically
@@ -91,6 +91,13 @@ bool parse_xiaomi_value(uint16_t value_type, const uint8_t *data, uint8_t value_
91
91
  // MiaoMiaoce humidity, 1 byte, 8-bit unsigned integer, 1 %
92
92
  else if ((value_type == 0x4C02) && (value_length == 1)) {
93
93
  result.humidity = data[0];
94
+ }
95
+ // XMWSDJ04MMC humidity, 4 bytes, float, 0.1 °C
96
+ else if ((value_type == 0x4C08) && (value_length == 4)) {
97
+ const uint32_t int_number = encode_uint32(data[3], data[2], data[1], data[0]);
98
+ float humidity;
99
+ std::memcpy(&humidity, &int_number, sizeof(humidity));
100
+ result.humidity = humidity;
94
101
  } else {
95
102
  return false;
96
103
  }
@@ -219,6 +226,11 @@ optional<XiaomiParseResult> parse_xiaomi_header(const esp32_ble_tracker::Service
219
226
  } else if (device_uuid == 0x055b) { // small square body, segment LCD, encrypted
220
227
  result.type = XiaomiParseResult::TYPE_LYWSD03MMC;
221
228
  result.name = "LYWSD03MMC";
229
+ } else if (device_uuid == 0x1203) { // small square body, e-ink display, encrypted
230
+ result.type = XiaomiParseResult::TYPE_XMWSDJ04MMC;
231
+ result.name = "XMWSDJ04MMC";
232
+ if (raw.size() == 19)
233
+ result.raw_offset -= 6;
222
234
  } else if (device_uuid == 0x07f6) { // Xiaomi-Yeelight BLE nightlight
223
235
  result.type = XiaomiParseResult::TYPE_MJYD02YLA;
224
236
  result.name = "MJYD02YLA";
@@ -308,7 +320,7 @@ bool decrypt_xiaomi_payload(std::vector<uint8_t> &raw, const uint8_t *bindkey, c
308
320
  memcpy(mac_address + 4, mac_reverse + 1, 1);
309
321
  memcpy(mac_address + 5, mac_reverse, 1);
310
322
  ESP_LOGVV(TAG, "decrypt_xiaomi_payload(): authenticated decryption failed.");
311
- ESP_LOGVV(TAG, " MAC address : %s", format_hex_pretty(mac_address, 6).c_str());
323
+ ESP_LOGVV(TAG, " MAC address : %s", format_mac_address_pretty(mac_address).c_str());
312
324
  ESP_LOGVV(TAG, " Packet : %s", format_hex_pretty(raw.data(), raw.size()).c_str());
313
325
  ESP_LOGVV(TAG, " Key : %s", format_hex_pretty(vector.key, vector.keysize).c_str());
314
326
  ESP_LOGVV(TAG, " Iv : %s", format_hex_pretty(vector.iv, vector.ivsize).c_str());
@@ -20,6 +20,7 @@ struct XiaomiParseResult {
20
20
  TYPE_LYWSD02MMC,
21
21
  TYPE_CGG1,
22
22
  TYPE_LYWSD03MMC,
23
+ TYPE_XMWSDJ04MMC,
23
24
  TYPE_CGD1,
24
25
  TYPE_CGDK2,
25
26
  TYPE_JQJCY01YM,
@@ -17,7 +17,6 @@ class XiaomiCGD1 : public Component, public esp32_ble_tracker::ESPBTDeviceListen
17
17
 
18
18
  bool parse_device(const esp32_ble_tracker::ESPBTDevice &device) override;
19
19
  void dump_config() override;
20
- float get_setup_priority() const override { return setup_priority::DATA; }
21
20
  void set_temperature(sensor::Sensor *temperature) { temperature_ = temperature; }
22
21
  void set_humidity(sensor::Sensor *humidity) { humidity_ = humidity; }
23
22
  void set_battery_level(sensor::Sensor *battery_level) { battery_level_ = battery_level; }
@@ -17,7 +17,6 @@ class XiaomiCGDK2 : public Component, public esp32_ble_tracker::ESPBTDeviceListe
17
17
 
18
18
  bool parse_device(const esp32_ble_tracker::ESPBTDevice &device) override;
19
19
  void dump_config() override;
20
- float get_setup_priority() const override { return setup_priority::DATA; }
21
20
  void set_temperature(sensor::Sensor *temperature) { temperature_ = temperature; }
22
21
  void set_humidity(sensor::Sensor *humidity) { humidity_ = humidity; }
23
22
  void set_battery_level(sensor::Sensor *battery_level) { battery_level_ = battery_level; }
@@ -18,7 +18,6 @@ class XiaomiCGG1 : public Component, public esp32_ble_tracker::ESPBTDeviceListen
18
18
  bool parse_device(const esp32_ble_tracker::ESPBTDevice &device) override;
19
19
 
20
20
  void dump_config() override;
21
- float get_setup_priority() const override { return setup_priority::DATA; }
22
21
  void set_temperature(sensor::Sensor *temperature) { temperature_ = temperature; }
23
22
  void set_humidity(sensor::Sensor *humidity) { humidity_ = humidity; }
24
23
  void set_battery_level(sensor::Sensor *battery_level) { battery_level_ = battery_level; }
@@ -21,7 +21,6 @@ class XiaomiCGPR1 : public Component,
21
21
  bool parse_device(const esp32_ble_tracker::ESPBTDevice &device) override;
22
22
 
23
23
  void dump_config() override;
24
- float get_setup_priority() const override { return setup_priority::DATA; }
25
24
  void set_battery_level(sensor::Sensor *battery_level) { battery_level_ = battery_level; }
26
25
  void set_illuminance(sensor::Sensor *illuminance) { illuminance_ = illuminance; }
27
26
  void set_idle_time(sensor::Sensor *idle_time) { idle_time_ = idle_time; }
@@ -17,7 +17,6 @@ class XiaomiGCLS002 : public Component, public esp32_ble_tracker::ESPBTDeviceLis
17
17
  bool parse_device(const esp32_ble_tracker::ESPBTDevice &device) override;
18
18
 
19
19
  void dump_config() override;
20
- float get_setup_priority() const override { return setup_priority::DATA; }
21
20
  void set_temperature(sensor::Sensor *temperature) { temperature_ = temperature; }
22
21
  void set_moisture(sensor::Sensor *moisture) { moisture_ = moisture; }
23
22
  void set_conductivity(sensor::Sensor *conductivity) { conductivity_ = conductivity; }
@@ -17,7 +17,6 @@ class XiaomiHHCCJCY01 : public Component, public esp32_ble_tracker::ESPBTDeviceL
17
17
  bool parse_device(const esp32_ble_tracker::ESPBTDevice &device) override;
18
18
 
19
19
  void dump_config() override;
20
- float get_setup_priority() const override { return setup_priority::DATA; }
21
20
  void set_temperature(sensor::Sensor *temperature) { temperature_ = temperature; }
22
21
  void set_moisture(sensor::Sensor *moisture) { moisture_ = moisture; }
23
22
  void set_conductivity(sensor::Sensor *conductivity) { conductivity_ = conductivity; }
@@ -16,7 +16,6 @@ class XiaomiHHCCJCY10 : public Component, public esp32_ble_tracker::ESPBTDeviceL
16
16
  bool parse_device(const esp32_ble_tracker::ESPBTDevice &device) override;
17
17
 
18
18
  void dump_config() override;
19
- float get_setup_priority() const override { return setup_priority::DATA; }
20
19
  void set_temperature(sensor::Sensor *temperature) { this->temperature_ = temperature; }
21
20
  void set_moisture(sensor::Sensor *moisture) { this->moisture_ = moisture; }
22
21
  void set_conductivity(sensor::Sensor *conductivity) { this->conductivity_ = conductivity; }
@@ -17,7 +17,6 @@ class XiaomiHHCCPOT002 : public Component, public esp32_ble_tracker::ESPBTDevice
17
17
  bool parse_device(const esp32_ble_tracker::ESPBTDevice &device) override;
18
18
 
19
19
  void dump_config() override;
20
- float get_setup_priority() const override { return setup_priority::DATA; }
21
20
  void set_moisture(sensor::Sensor *moisture) { moisture_ = moisture; }
22
21
  void set_conductivity(sensor::Sensor *conductivity) { conductivity_ = conductivity; }
23
22
 
@@ -17,7 +17,6 @@ class XiaomiJQJCY01YM : public Component, public esp32_ble_tracker::ESPBTDeviceL
17
17
  bool parse_device(const esp32_ble_tracker::ESPBTDevice &device) override;
18
18
 
19
19
  void dump_config() override;
20
- float get_setup_priority() const override { return setup_priority::DATA; }
21
20
  void set_temperature(sensor::Sensor *temperature) { temperature_ = temperature; }
22
21
  void set_humidity(sensor::Sensor *humidity) { humidity_ = humidity; }
23
22
  void set_formaldehyde(sensor::Sensor *formaldehyde) { formaldehyde_ = formaldehyde; }
@@ -17,7 +17,6 @@ class XiaomiLYWSD02 : public Component, public esp32_ble_tracker::ESPBTDeviceLis
17
17
  bool parse_device(const esp32_ble_tracker::ESPBTDevice &device) override;
18
18
 
19
19
  void dump_config() override;
20
- float get_setup_priority() const override { return setup_priority::DATA; }
21
20
  void set_temperature(sensor::Sensor *temperature) { temperature_ = temperature; }
22
21
  void set_humidity(sensor::Sensor *humidity) { humidity_ = humidity; }
23
22
  void set_battery_level(sensor::Sensor *battery_level) { battery_level_ = battery_level; }
@@ -18,7 +18,6 @@ class XiaomiLYWSD02MMC : public Component, public esp32_ble_tracker::ESPBTDevice
18
18
  bool parse_device(const esp32_ble_tracker::ESPBTDevice &device) override;
19
19
 
20
20
  void dump_config() override;
21
- float get_setup_priority() const override { return setup_priority::DATA; }
22
21
  void set_temperature(sensor::Sensor *temperature) { this->temperature_ = temperature; }
23
22
  void set_humidity(sensor::Sensor *humidity) { this->humidity_ = humidity; }
24
23
  void set_battery_level(sensor::Sensor *battery_level) { this->battery_level_ = battery_level; }
@@ -17,7 +17,6 @@ class XiaomiLYWSD03MMC : public Component, public esp32_ble_tracker::ESPBTDevice
17
17
 
18
18
  bool parse_device(const esp32_ble_tracker::ESPBTDevice &device) override;
19
19
  void dump_config() override;
20
- float get_setup_priority() const override { return setup_priority::DATA; }
21
20
  void set_temperature(sensor::Sensor *temperature) { temperature_ = temperature; }
22
21
  void set_humidity(sensor::Sensor *humidity) { humidity_ = humidity; }
23
22
  void set_battery_level(sensor::Sensor *battery_level) { battery_level_ = battery_level; }
@@ -17,7 +17,6 @@ class XiaomiLYWSDCGQ : public Component, public esp32_ble_tracker::ESPBTDeviceLi
17
17
  bool parse_device(const esp32_ble_tracker::ESPBTDevice &device) override;
18
18
 
19
19
  void dump_config() override;
20
- float get_setup_priority() const override { return setup_priority::DATA; }
21
20
  void set_temperature(sensor::Sensor *temperature) { temperature_ = temperature; }
22
21
  void set_humidity(sensor::Sensor *humidity) { humidity_ = humidity; }
23
22
  void set_battery_level(sensor::Sensor *battery_level) { battery_level_ = battery_level; }
@@ -17,7 +17,6 @@ class XiaomiMHOC303 : public Component, public esp32_ble_tracker::ESPBTDeviceLis
17
17
  bool parse_device(const esp32_ble_tracker::ESPBTDevice &device) override;
18
18
 
19
19
  void dump_config() override;
20
- float get_setup_priority() const override { return setup_priority::DATA; }
21
20
  void set_temperature(sensor::Sensor *temperature) { temperature_ = temperature; }
22
21
  void set_humidity(sensor::Sensor *humidity) { humidity_ = humidity; }
23
22
  void set_battery_level(sensor::Sensor *battery_level) { battery_level_ = battery_level; }
@@ -17,7 +17,6 @@ class XiaomiMHOC401 : public Component, public esp32_ble_tracker::ESPBTDeviceLis
17
17
 
18
18
  bool parse_device(const esp32_ble_tracker::ESPBTDevice &device) override;
19
19
  void dump_config() override;
20
- float get_setup_priority() const override { return setup_priority::DATA; }
21
20
  void set_temperature(sensor::Sensor *temperature) { temperature_ = temperature; }
22
21
  void set_humidity(sensor::Sensor *humidity) { humidity_ = humidity; }
23
22
  void set_battery_level(sensor::Sensor *battery_level) { battery_level_ = battery_level; }
@@ -23,7 +23,6 @@ class XiaomiMiscale : public Component, public esp32_ble_tracker::ESPBTDeviceLis
23
23
 
24
24
  bool parse_device(const esp32_ble_tracker::ESPBTDevice &device) override;
25
25
  void dump_config() override;
26
- float get_setup_priority() const override { return setup_priority::DATA; }
27
26
  void set_weight(sensor::Sensor *weight) { weight_ = weight; }
28
27
  void set_impedance(sensor::Sensor *impedance) { impedance_ = impedance; }
29
28
  void set_clear_impedance(bool clear_impedance) { clear_impedance_ = clear_impedance; }
@@ -21,7 +21,6 @@ class XiaomiMJYD02YLA : public Component,
21
21
  bool parse_device(const esp32_ble_tracker::ESPBTDevice &device) override;
22
22
 
23
23
  void dump_config() override;
24
- float get_setup_priority() const override { return setup_priority::DATA; }
25
24
  void set_idle_time(sensor::Sensor *idle_time) { idle_time_ = idle_time; }
26
25
  void set_battery_level(sensor::Sensor *battery_level) { battery_level_ = battery_level; }
27
26
  void set_illuminance(sensor::Sensor *illuminance) { illuminance_ = illuminance; }
@@ -19,7 +19,6 @@ class XiaomiMUE4094RT : public Component,
19
19
  bool parse_device(const esp32_ble_tracker::ESPBTDevice &device) override;
20
20
 
21
21
  void dump_config() override;
22
- float get_setup_priority() const override { return setup_priority::DATA; }
23
22
  void set_time(uint16_t timeout) { timeout_ = timeout; }
24
23
 
25
24
  protected:
@@ -23,7 +23,6 @@ class XiaomiRTCGQ02LM : public Component, public esp32_ble_tracker::ESPBTDeviceL
23
23
 
24
24
  bool parse_device(const esp32_ble_tracker::ESPBTDevice &device) override;
25
25
  void dump_config() override;
26
- float get_setup_priority() const override { return setup_priority::DATA; }
27
26
 
28
27
  #ifdef USE_BINARY_SENSOR
29
28
  void set_motion(binary_sensor::BinarySensor *motion) { this->motion_ = motion; }
@@ -20,7 +20,6 @@ class XiaomiWX08ZM : public Component,
20
20
  bool parse_device(const esp32_ble_tracker::ESPBTDevice &device) override;
21
21
 
22
22
  void dump_config() override;
23
- float get_setup_priority() const override { return setup_priority::DATA; }
24
23
  void set_tablet(sensor::Sensor *tablet) { tablet_ = tablet; }
25
24
  void set_battery_level(sensor::Sensor *battery_level) { battery_level_ = battery_level; }
26
25
 
File without changes
@@ -0,0 +1,77 @@
1
+ import esphome.codegen as cg
2
+ from esphome.components import esp32_ble_tracker, sensor
3
+ import esphome.config_validation as cv
4
+ from esphome.const import (
5
+ CONF_BATTERY_LEVEL,
6
+ CONF_BINDKEY,
7
+ CONF_HUMIDITY,
8
+ CONF_ID,
9
+ CONF_MAC_ADDRESS,
10
+ CONF_TEMPERATURE,
11
+ DEVICE_CLASS_BATTERY,
12
+ DEVICE_CLASS_HUMIDITY,
13
+ DEVICE_CLASS_TEMPERATURE,
14
+ ENTITY_CATEGORY_DIAGNOSTIC,
15
+ STATE_CLASS_MEASUREMENT,
16
+ UNIT_CELSIUS,
17
+ UNIT_PERCENT,
18
+ )
19
+
20
+ AUTO_LOAD = ["xiaomi_ble"]
21
+ CODEOWNERS = ["@medusalix"]
22
+ DEPENDENCIES = ["esp32_ble_tracker"]
23
+
24
+ xiaomi_xmwsdj04mmc_ns = cg.esphome_ns.namespace("xiaomi_xmwsdj04mmc")
25
+ XiaomiXMWSDJ04MMC = xiaomi_xmwsdj04mmc_ns.class_(
26
+ "XiaomiXMWSDJ04MMC", esp32_ble_tracker.ESPBTDeviceListener, cg.Component
27
+ )
28
+
29
+ CONFIG_SCHEMA = (
30
+ cv.Schema(
31
+ {
32
+ cv.GenerateID(): cv.declare_id(XiaomiXMWSDJ04MMC),
33
+ cv.Required(CONF_BINDKEY): cv.bind_key,
34
+ cv.Required(CONF_MAC_ADDRESS): cv.mac_address,
35
+ cv.Optional(CONF_TEMPERATURE): sensor.sensor_schema(
36
+ unit_of_measurement=UNIT_CELSIUS,
37
+ accuracy_decimals=1,
38
+ device_class=DEVICE_CLASS_TEMPERATURE,
39
+ state_class=STATE_CLASS_MEASUREMENT,
40
+ ),
41
+ cv.Optional(CONF_HUMIDITY): sensor.sensor_schema(
42
+ unit_of_measurement=UNIT_PERCENT,
43
+ accuracy_decimals=0,
44
+ device_class=DEVICE_CLASS_HUMIDITY,
45
+ state_class=STATE_CLASS_MEASUREMENT,
46
+ ),
47
+ cv.Optional(CONF_BATTERY_LEVEL): sensor.sensor_schema(
48
+ unit_of_measurement=UNIT_PERCENT,
49
+ accuracy_decimals=0,
50
+ device_class=DEVICE_CLASS_BATTERY,
51
+ state_class=STATE_CLASS_MEASUREMENT,
52
+ entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
53
+ ),
54
+ }
55
+ )
56
+ .extend(esp32_ble_tracker.ESP_BLE_DEVICE_SCHEMA)
57
+ .extend(cv.COMPONENT_SCHEMA)
58
+ )
59
+
60
+
61
+ async def to_code(config):
62
+ var = cg.new_Pvariable(config[CONF_ID])
63
+ await cg.register_component(var, config)
64
+ await esp32_ble_tracker.register_ble_device(var, config)
65
+
66
+ cg.add(var.set_address(config[CONF_MAC_ADDRESS].as_hex))
67
+ cg.add(var.set_bindkey(config[CONF_BINDKEY]))
68
+
69
+ if temperature_config := config.get(CONF_TEMPERATURE):
70
+ sens = await sensor.new_sensor(temperature_config)
71
+ cg.add(var.set_temperature(sens))
72
+ if humidity_config := config.get(CONF_HUMIDITY):
73
+ sens = await sensor.new_sensor(humidity_config)
74
+ cg.add(var.set_humidity(sens))
75
+ if battery_level_config := config.get(CONF_BATTERY_LEVEL):
76
+ sens = await sensor.new_sensor(battery_level_config)
77
+ cg.add(var.set_battery_level(sens))
@@ -0,0 +1,77 @@
1
+ #include "xiaomi_xmwsdj04mmc.h"
2
+ #include "esphome/core/log.h"
3
+
4
+ #ifdef USE_ESP32
5
+
6
+ namespace esphome {
7
+ namespace xiaomi_xmwsdj04mmc {
8
+
9
+ static const char *const TAG = "xiaomi_xmwsdj04mmc";
10
+
11
+ void XiaomiXMWSDJ04MMC::dump_config() {
12
+ ESP_LOGCONFIG(TAG, "Xiaomi XMWSDJ04MMC");
13
+ ESP_LOGCONFIG(TAG, " Bindkey: %s", format_hex_pretty(this->bindkey_, 16).c_str());
14
+ LOG_SENSOR(" ", "Temperature", this->temperature_);
15
+ LOG_SENSOR(" ", "Humidity", this->humidity_);
16
+ LOG_SENSOR(" ", "Battery Level", this->battery_level_);
17
+ }
18
+
19
+ bool XiaomiXMWSDJ04MMC::parse_device(const esp32_ble_tracker::ESPBTDevice &device) {
20
+ if (device.address_uint64() != this->address_) {
21
+ ESP_LOGVV(TAG, "parse_device(): unknown MAC address.");
22
+ return false;
23
+ }
24
+ ESP_LOGVV(TAG, "parse_device(): MAC address %s found.", device.address_str().c_str());
25
+
26
+ bool success = false;
27
+ for (auto &service_data : device.get_service_datas()) {
28
+ auto res = xiaomi_ble::parse_xiaomi_header(service_data);
29
+ if (!res.has_value()) {
30
+ continue;
31
+ }
32
+ if (res->is_duplicate) {
33
+ continue;
34
+ }
35
+ if (res->has_encryption &&
36
+ (!(xiaomi_ble::decrypt_xiaomi_payload(const_cast<std::vector<uint8_t> &>(service_data.data), this->bindkey_,
37
+ this->address_)))) {
38
+ continue;
39
+ }
40
+ if (!(xiaomi_ble::parse_xiaomi_message(service_data.data, *res))) {
41
+ continue;
42
+ }
43
+ if (res->humidity.has_value() && this->humidity_ != nullptr) {
44
+ // see https://github.com/custom-components/sensor.mitemp_bt/issues/7#issuecomment-595948254
45
+ *res->humidity = trunc(*res->humidity);
46
+ }
47
+ if (!(xiaomi_ble::report_xiaomi_results(res, device.address_str()))) {
48
+ continue;
49
+ }
50
+ if (res->temperature.has_value() && this->temperature_ != nullptr)
51
+ this->temperature_->publish_state(*res->temperature);
52
+ if (res->humidity.has_value() && this->humidity_ != nullptr)
53
+ this->humidity_->publish_state(*res->humidity);
54
+ if (res->battery_level.has_value() && this->battery_level_ != nullptr)
55
+ this->battery_level_->publish_state(*res->battery_level);
56
+ success = true;
57
+ }
58
+
59
+ return success;
60
+ }
61
+
62
+ void XiaomiXMWSDJ04MMC::set_bindkey(const std::string &bindkey) {
63
+ memset(this->bindkey_, 0, 16);
64
+ if (bindkey.size() != 32) {
65
+ return;
66
+ }
67
+ char temp[3] = {0};
68
+ for (int i = 0; i < 16; i++) {
69
+ strncpy(temp, &(bindkey.c_str()[i * 2]), 2);
70
+ this->bindkey_[i] = std::strtoul(temp, nullptr, 16);
71
+ }
72
+ }
73
+
74
+ } // namespace xiaomi_xmwsdj04mmc
75
+ } // namespace esphome
76
+
77
+ #endif