esphome 2024.9.1__py3-none-any.whl → 2024.10.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 (196) hide show
  1. esphome/components/aic3204/__init__.py +0 -0
  2. esphome/components/aic3204/aic3204.cpp +173 -0
  3. esphome/components/aic3204/aic3204.h +88 -0
  4. esphome/components/aic3204/audio_dac.py +52 -0
  5. esphome/components/aic3204/automation.h +23 -0
  6. esphome/components/alarm_control_panel/__init__.py +3 -4
  7. esphome/components/animation/__init__.py +16 -12
  8. esphome/components/api/api_connection.cpp +2 -0
  9. esphome/components/api/api_connection.h +3 -1
  10. esphome/components/api/api_frame_helper.cpp +2 -1
  11. esphome/components/api/api_frame_helper.h +2 -1
  12. esphome/components/api/api_server.cpp +2 -0
  13. esphome/components/api/api_server.h +3 -1
  14. esphome/components/api/custom_api_device.h +3 -2
  15. esphome/components/api/homeassistant_service.h +4 -3
  16. esphome/components/api/list_entities.cpp +2 -0
  17. esphome/components/api/list_entities.h +3 -2
  18. esphome/components/api/subscribe_state.cpp +2 -0
  19. esphome/components/api/subscribe_state.h +3 -2
  20. esphome/components/audio_dac/__init__.py +57 -0
  21. esphome/components/audio_dac/audio_dac.h +23 -0
  22. esphome/components/audio_dac/automation.h +43 -0
  23. esphome/components/bang_bang/bang_bang_climate.cpp +5 -2
  24. esphome/components/bedjet/bedjet_codec.cpp +4 -2
  25. esphome/components/binary_sensor/__init__.py +3 -4
  26. esphome/components/bl0906/sensor.py +3 -2
  27. esphome/components/button/__init__.py +3 -4
  28. esphome/components/ch422g/__init__.py +26 -17
  29. esphome/components/ch422g/ch422g.cpp +66 -49
  30. esphome/components/ch422g/ch422g.h +17 -19
  31. esphome/components/climate/__init__.py +3 -4
  32. esphome/components/cover/__init__.py +4 -5
  33. esphome/components/cse7766/cse7766.cpp +12 -1
  34. esphome/components/cse7766/cse7766.h +4 -0
  35. esphome/components/cse7766/sensor.py +13 -1
  36. esphome/components/cst816/touchscreen/__init__.py +7 -4
  37. esphome/components/cst816/touchscreen/cst816_touchscreen.cpp +20 -19
  38. esphome/components/cst816/touchscreen/cst816_touchscreen.h +2 -0
  39. esphome/components/datetime/__init__.py +21 -14
  40. esphome/components/datetime/datetime_base.h +8 -1
  41. esphome/components/datetime/datetime_entity.cpp +2 -0
  42. esphome/components/datetime/datetime_entity.h +2 -0
  43. esphome/components/datetime/time_entity.cpp +2 -0
  44. esphome/components/datetime/time_entity.h +2 -0
  45. esphome/components/esp32/__init__.py +20 -4
  46. esphome/components/esp32_improv/__init__.py +82 -1
  47. esphome/components/esp32_improv/automation.h +72 -0
  48. esphome/components/esp32_improv/esp32_improv_component.cpp +13 -5
  49. esphome/components/esp32_improv/esp32_improv_component.h +15 -0
  50. esphome/components/ethernet/__init__.py +5 -0
  51. esphome/components/ethernet/ethernet_component.cpp +13 -0
  52. esphome/components/ethernet/ethernet_component.h +1 -0
  53. esphome/components/event/__init__.py +20 -12
  54. esphome/components/fan/__init__.py +3 -4
  55. esphome/components/gp2y1010au0f/__init__.py +0 -0
  56. esphome/components/gp2y1010au0f/gp2y1010au0f.cpp +67 -0
  57. esphome/components/gp2y1010au0f/gp2y1010au0f.h +52 -0
  58. esphome/components/gp2y1010au0f/sensor.py +61 -0
  59. esphome/components/gpio_expander/__init__.py +0 -0
  60. esphome/components/gpio_expander/cached_gpio.h +38 -0
  61. esphome/components/grove_gas_mc_v2/__init__.py +0 -0
  62. esphome/components/grove_gas_mc_v2/grove_gas_mc_v2.cpp +88 -0
  63. esphome/components/grove_gas_mc_v2/grove_gas_mc_v2.h +39 -0
  64. esphome/components/grove_gas_mc_v2/sensor.py +77 -0
  65. esphome/components/haier/climate.py +4 -3
  66. esphome/components/haier/haier_base.cpp +63 -8
  67. esphome/components/haier/haier_base.h +29 -3
  68. esphome/components/haier/hon_climate.cpp +122 -65
  69. esphome/components/haier/hon_climate.h +18 -2
  70. esphome/components/haier/smartair2_climate.cpp +21 -21
  71. esphome/components/haier/switch/__init__.py +91 -0
  72. esphome/components/haier/switch/beeper.cpp +14 -0
  73. esphome/components/haier/switch/beeper.h +18 -0
  74. esphome/components/haier/switch/display.cpp +14 -0
  75. esphome/components/haier/switch/display.h +18 -0
  76. esphome/components/haier/switch/health_mode.cpp +14 -0
  77. esphome/components/haier/switch/health_mode.h +18 -0
  78. esphome/components/haier/switch/quiet_mode.cpp +14 -0
  79. esphome/components/haier/switch/quiet_mode.h +18 -0
  80. esphome/components/hmac_md5/hmac_md5.cpp +2 -0
  81. esphome/components/hmac_md5/hmac_md5.h +2 -1
  82. esphome/components/i2s_audio/speaker/__init__.py +19 -0
  83. esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +1 -1
  84. esphome/components/i2s_audio/speaker/i2s_audio_speaker.h +2 -0
  85. esphome/components/ili9xxx/ili9xxx_display.h +1 -0
  86. esphome/components/image/__init__.py +12 -12
  87. esphome/components/image/image.cpp +44 -0
  88. esphome/components/image/image.h +17 -2
  89. esphome/components/inkplate6/display.py +2 -0
  90. esphome/components/inkplate6/inkplate.h +30 -2
  91. esphome/components/light/__init__.py +3 -4
  92. esphome/components/lock/__init__.py +3 -4
  93. esphome/components/lvgl/__init__.py +16 -5
  94. esphome/components/lvgl/defines.py +1 -0
  95. esphome/components/lvgl/hello_world.py +64 -0
  96. esphome/components/lvgl/lv_validation.py +159 -3
  97. esphome/components/lvgl/lvgl_esphome.cpp +0 -43
  98. esphome/components/lvgl/lvgl_esphome.h +0 -4
  99. esphome/components/lvgl/styles.py +3 -2
  100. esphome/components/lvgl/text/__init__.py +3 -3
  101. esphome/components/lvgl/widgets/__init__.py +2 -0
  102. esphome/components/lvgl/widgets/animimg.py +3 -4
  103. esphome/components/lvgl/widgets/dropdown.py +5 -1
  104. esphome/components/lvgl/widgets/meter.py +16 -11
  105. esphome/components/md5/__init__.py +6 -0
  106. esphome/components/md5/md5.cpp +2 -0
  107. esphome/components/md5/md5.h +2 -0
  108. esphome/components/micro_wake_word/__init__.py +7 -0
  109. esphome/components/mics_4514/sensor.py +11 -26
  110. esphome/components/modbus_controller/__init__.py +7 -5
  111. esphome/components/modbus_controller/binary_sensor/__init__.py +6 -6
  112. esphome/components/modbus_controller/number/__init__.py +5 -6
  113. esphome/components/modbus_controller/output/__init__.py +10 -14
  114. esphome/components/modbus_controller/select/__init__.py +1 -1
  115. esphome/components/modbus_controller/sensor/__init__.py +7 -7
  116. esphome/components/modbus_controller/switch/__init__.py +6 -7
  117. esphome/components/modbus_controller/text_sensor/__init__.py +8 -9
  118. esphome/components/mqtt/__init__.py +3 -0
  119. esphome/components/mqtt/mqtt_client.cpp +2 -0
  120. esphome/components/mqtt/mqtt_client.h +2 -0
  121. esphome/components/nau7802/__init__.py +0 -0
  122. esphome/components/nau7802/nau7802.cpp +323 -0
  123. esphome/components/nau7802/nau7802.h +121 -0
  124. esphome/components/nau7802/sensor.py +134 -0
  125. esphome/components/nextion/base_component.py +1 -0
  126. esphome/components/nextion/display.py +4 -0
  127. esphome/components/nextion/nextion.cpp +19 -4
  128. esphome/components/nextion/nextion.h +16 -0
  129. esphome/components/npi19/__init__.py +0 -0
  130. esphome/components/npi19/npi19.cpp +111 -0
  131. esphome/components/npi19/npi19.h +30 -0
  132. esphome/components/npi19/sensor.py +52 -0
  133. esphome/components/number/__init__.py +3 -5
  134. esphome/components/online_image/__init__.py +1 -1
  135. esphome/components/online_image/online_image.h +1 -2
  136. esphome/components/opentherm/__init__.py +57 -0
  137. esphome/components/opentherm/hub.cpp +277 -0
  138. esphome/components/opentherm/hub.h +110 -0
  139. esphome/components/opentherm/opentherm.cpp +568 -0
  140. esphome/components/opentherm/opentherm.h +347 -0
  141. esphome/components/pulse_counter/pulse_counter_sensor.cpp +8 -1
  142. esphome/components/pulse_counter/pulse_counter_sensor.h +1 -0
  143. esphome/components/radon_eye_ble/radon_eye_listener.cpp +10 -3
  144. esphome/components/remote_transmitter/__init__.py +18 -2
  145. esphome/components/remote_transmitter/remote_transmitter.h +6 -0
  146. esphome/components/remote_transmitter/remote_transmitter_esp32.cpp +2 -0
  147. esphome/components/remote_transmitter/remote_transmitter_esp8266.cpp +2 -0
  148. esphome/components/remote_transmitter/remote_transmitter_libretiny.cpp +2 -0
  149. esphome/components/rp2040/__init__.py +13 -14
  150. esphome/components/select/__init__.py +3 -4
  151. esphome/components/sensor/__init__.py +3 -4
  152. esphome/components/shelly_dimmer/shelly_dimmer.cpp +32 -32
  153. esphome/components/shelly_dimmer/shelly_dimmer.h +2 -0
  154. esphome/components/st7701s/st7701s.cpp +21 -8
  155. esphome/components/st7701s/st7701s.h +2 -0
  156. esphome/components/switch/__init__.py +3 -4
  157. esphome/components/tca9555/__init__.py +72 -0
  158. esphome/components/tca9555/tca9555.cpp +140 -0
  159. esphome/components/tca9555/tca9555.h +64 -0
  160. esphome/components/tcs34725/tcs34725.cpp +62 -64
  161. esphome/components/tem3200/__init__.py +0 -0
  162. esphome/components/tem3200/sensor.py +55 -0
  163. esphome/components/tem3200/tem3200.cpp +151 -0
  164. esphome/components/tem3200/tem3200.h +30 -0
  165. esphome/components/template/binary_sensor/__init__.py +19 -6
  166. esphome/components/text/__init__.py +3 -4
  167. esphome/components/text_sensor/__init__.py +3 -4
  168. esphome/components/thermostat/climate.py +11 -9
  169. esphome/components/thermostat/thermostat_climate.cpp +21 -15
  170. esphome/components/tm1638/binary_sensor/__init__.py +3 -2
  171. esphome/components/tm1638/display.py +5 -5
  172. esphome/components/tm1638/output/__init__.py +3 -2
  173. esphome/components/tm1638/switch/__init__.py +3 -2
  174. esphome/components/touchscreen/touchscreen.cpp +2 -2
  175. esphome/components/update/__init__.py +3 -4
  176. esphome/components/valve/__init__.py +3 -4
  177. esphome/components/web_server/__init__.py +78 -22
  178. esphome/components/web_server/server_index_v3.h +3989 -3979
  179. esphome/components/web_server/web_server.cpp +219 -34
  180. esphome/components/web_server/web_server.h +10 -1
  181. esphome/components/wifi/wifi_component_esp_idf.cpp +4 -5
  182. esphome/config_validation.py +1 -0
  183. esphome/const.py +12 -2
  184. esphome/core/defines.h +4 -2
  185. esphome/core/helpers.cpp +46 -10
  186. esphome/core/helpers.h +8 -0
  187. esphome/core/ring_buffer.cpp +12 -2
  188. esphome/core/ring_buffer.h +3 -0
  189. esphome/voluptuous_schema.py +3 -1
  190. esphome/wizard.py +0 -3
  191. {esphome-2024.9.1.dist-info → esphome-2024.10.0.dist-info}/METADATA +5 -3
  192. {esphome-2024.9.1.dist-info → esphome-2024.10.0.dist-info}/RECORD +196 -147
  193. {esphome-2024.9.1.dist-info → esphome-2024.10.0.dist-info}/LICENSE +0 -0
  194. {esphome-2024.9.1.dist-info → esphome-2024.10.0.dist-info}/WHEEL +0 -0
  195. {esphome-2024.9.1.dist-info → esphome-2024.10.0.dist-info}/entry_points.txt +0 -0
  196. {esphome-2024.9.1.dist-info → esphome-2024.10.0.dist-info}/top_level.txt +0 -0
@@ -17,13 +17,14 @@ from esphome.const import (
17
17
  CONF_JS_URL,
18
18
  CONF_LOCAL,
19
19
  CONF_LOG,
20
+ CONF_NAME,
20
21
  CONF_OTA,
21
22
  CONF_PASSWORD,
22
23
  CONF_PORT,
23
24
  CONF_USERNAME,
24
25
  CONF_VERSION,
26
+ CONF_WEB_SERVER,
25
27
  CONF_WEB_SERVER_ID,
26
- CONF_WEB_SERVER_SORTING_WEIGHT,
27
28
  PLATFORM_BK72XX,
28
29
  PLATFORM_ESP32,
29
30
  PLATFORM_ESP8266,
@@ -34,9 +35,15 @@ import esphome.final_validate as fv
34
35
 
35
36
  AUTO_LOAD = ["json", "web_server_base"]
36
37
 
38
+ CONF_SORTING_GROUP_ID = "sorting_group_id"
39
+ CONF_SORTING_GROUPS = "sorting_groups"
40
+ CONF_SORTING_WEIGHT = "sorting_weight"
41
+
37
42
  web_server_ns = cg.esphome_ns.namespace("web_server")
38
43
  WebServer = web_server_ns.class_("WebServer", cg.Component, cg.Controller)
39
44
 
45
+ sorting_groups = {}
46
+
40
47
 
41
48
  def default_url(config):
42
49
  config = config.copy()
@@ -70,42 +77,74 @@ def validate_ota(config):
70
77
  return config
71
78
 
72
79
 
73
- def _validate_no_sorting_weight(
74
- webserver_version: int, config: dict, path: list[str] | None = None
80
+ def validate_sorting_groups(config):
81
+ if CONF_SORTING_GROUPS in config and config[CONF_VERSION] != 3:
82
+ raise cv.Invalid(
83
+ f"'{CONF_SORTING_GROUPS}' is only supported in 'web_server' version 3"
84
+ )
85
+ return config
86
+
87
+
88
+ def _validate_no_sorting_component(
89
+ sorting_component: str,
90
+ webserver_version: int,
91
+ config: dict,
92
+ path: list[str] | None = None,
75
93
  ) -> None:
76
94
  if path is None:
77
95
  path = []
78
- if CONF_WEB_SERVER_SORTING_WEIGHT in config:
96
+ if CONF_WEB_SERVER in config and sorting_component in config[CONF_WEB_SERVER]:
79
97
  raise cv.FinalExternalInvalid(
80
- f"Sorting weight on entities is not supported in web_server version {webserver_version}",
81
- path=path + [CONF_WEB_SERVER_SORTING_WEIGHT],
98
+ f"{sorting_component} on entities is not supported in web_server version {webserver_version}",
99
+ path=path + [sorting_component],
82
100
  )
83
101
  for p, value in config.items():
84
102
  if isinstance(value, dict):
85
- _validate_no_sorting_weight(webserver_version, value, path + [p])
103
+ _validate_no_sorting_component(
104
+ sorting_component, webserver_version, value, path + [p]
105
+ )
86
106
  elif isinstance(value, list):
87
107
  for i, item in enumerate(value):
88
108
  if isinstance(item, dict):
89
- _validate_no_sorting_weight(webserver_version, item, path + [p, i])
109
+ _validate_no_sorting_component(
110
+ sorting_component, webserver_version, item, path + [p, i]
111
+ )
90
112
 
91
113
 
92
- def _final_validate_sorting_weight(config):
114
+ def _final_validate_sorting(config):
93
115
  if (webserver_version := config.get(CONF_VERSION)) != 3:
94
- _validate_no_sorting_weight(webserver_version, fv.full_config.get())
95
-
116
+ _validate_no_sorting_component(
117
+ CONF_SORTING_WEIGHT, webserver_version, fv.full_config.get()
118
+ )
119
+ _validate_no_sorting_component(
120
+ CONF_SORTING_GROUP_ID, webserver_version, fv.full_config.get()
121
+ )
96
122
  return config
97
123
 
98
124
 
99
- FINAL_VALIDATE_SCHEMA = _final_validate_sorting_weight
125
+ FINAL_VALIDATE_SCHEMA = _final_validate_sorting
100
126
 
127
+ sorting_group = {
128
+ cv.Required(CONF_ID): cv.declare_id(cg.int_),
129
+ cv.Required(CONF_NAME): cv.string,
130
+ cv.Optional(CONF_SORTING_WEIGHT): cv.float_,
131
+ }
101
132
 
102
133
  WEBSERVER_SORTING_SCHEMA = cv.Schema(
103
134
  {
104
- cv.OnlyWith(CONF_WEB_SERVER_ID, "web_server"): cv.use_id(WebServer),
105
- cv.Optional(CONF_WEB_SERVER_SORTING_WEIGHT): cv.All(
106
- cv.requires_component("web_server"),
107
- cv.float_,
108
- ),
135
+ cv.Optional(CONF_WEB_SERVER): cv.Schema(
136
+ {
137
+ cv.OnlyWith(CONF_WEB_SERVER_ID, "web_server"): cv.use_id(WebServer),
138
+ cv.Optional(CONF_SORTING_WEIGHT): cv.All(
139
+ cv.requires_component("web_server"),
140
+ cv.float_,
141
+ ),
142
+ cv.Optional(CONF_SORTING_GROUP_ID): cv.All(
143
+ cv.requires_component("web_server"),
144
+ cv.use_id(cg.int_),
145
+ ),
146
+ }
147
+ )
109
148
  }
110
149
  )
111
150
 
@@ -145,24 +184,38 @@ CONFIG_SCHEMA = cv.All(
145
184
  ): cv.boolean,
146
185
  cv.Optional(CONF_LOG, default=True): cv.boolean,
147
186
  cv.Optional(CONF_LOCAL): cv.boolean,
187
+ cv.Optional(CONF_SORTING_GROUPS): cv.ensure_list(sorting_group),
148
188
  }
149
189
  ).extend(cv.COMPONENT_SCHEMA),
150
190
  cv.only_on([PLATFORM_ESP32, PLATFORM_ESP8266, PLATFORM_BK72XX, PLATFORM_RTL87XX]),
151
191
  default_url,
152
192
  validate_local,
153
193
  validate_ota,
194
+ validate_sorting_groups,
154
195
  )
155
196
 
156
197
 
157
- def add_entity_to_sorting_list(web_server, entity, config):
158
- sorting_weight = 50
159
- if CONF_WEB_SERVER_SORTING_WEIGHT in config:
160
- sorting_weight = config[CONF_WEB_SERVER_SORTING_WEIGHT]
198
+ def add_sorting_groups(web_server_var, config):
199
+ for group in config:
200
+ sorting_groups[group[CONF_ID]] = group[CONF_NAME]
201
+ group_sorting_weight = group.get(CONF_SORTING_WEIGHT, 50)
202
+ cg.add(
203
+ web_server_var.add_sorting_group(
204
+ hash(group[CONF_ID]), group[CONF_NAME], group_sorting_weight
205
+ )
206
+ )
207
+
208
+
209
+ async def add_entity_config(entity, config):
210
+ web_server = await cg.get_variable(config[CONF_WEB_SERVER_ID])
211
+ sorting_weight = config.get(CONF_SORTING_WEIGHT, 50)
212
+ sorting_group_hash = hash(config.get(CONF_SORTING_GROUP_ID))
161
213
 
162
214
  cg.add(
163
- web_server.add_entity_to_sorting_list(
215
+ web_server.add_entity_config(
164
216
  entity,
165
217
  sorting_weight,
218
+ sorting_group_hash,
166
219
  )
167
220
  )
168
221
 
@@ -241,3 +294,6 @@ async def to_code(config):
241
294
  cg.add(var.set_include_internal(config[CONF_INCLUDE_INTERNAL]))
242
295
  if CONF_LOCAL in config and config[CONF_LOCAL]:
243
296
  cg.add_define("USE_WEBSERVER_LOCAL")
297
+
298
+ if (sorting_group_config := config.get(CONF_SORTING_GROUPS)) is not None:
299
+ add_sorting_groups(var, sorting_group_config)