esphome 2024.6.6__py3-none-any.whl → 2024.7.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 (102) hide show
  1. esphome/components/aht10/aht10.cpp +4 -2
  2. esphome/components/climate/climate.cpp +10 -6
  3. esphome/components/climate/climate_traits.h +3 -3
  4. esphome/components/cover/cover.h +2 -2
  5. esphome/components/esp32_camera/__init__.py +6 -3
  6. esphome/components/esp32_can/canbus.py +3 -0
  7. esphome/components/ethernet/ethernet_component.cpp +8 -3
  8. esphome/components/font/__init__.py +2 -28
  9. esphome/components/gree/climate.py +1 -0
  10. esphome/components/gree/gree.cpp +11 -3
  11. esphome/components/gree/gree.h +5 -1
  12. esphome/components/haier/binary_sensor/__init__.py +4 -4
  13. esphome/components/haier/button/__init__.py +1 -1
  14. esphome/components/haier/climate.py +43 -9
  15. esphome/components/haier/haier_base.cpp +4 -0
  16. esphome/components/haier/haier_base.h +11 -1
  17. esphome/components/haier/hon_climate.cpp +109 -55
  18. esphome/components/haier/hon_climate.h +7 -1
  19. esphome/components/haier/hon_packet.h +5 -0
  20. esphome/components/haier/sensor/__init__.py +5 -5
  21. esphome/components/haier/smartair2_climate.cpp +1 -0
  22. esphome/components/haier/text_sensor/__init__.py +4 -4
  23. esphome/components/heatpumpir/climate.py +12 -5
  24. esphome/components/heatpumpir/heatpumpir.cpp +11 -0
  25. esphome/components/heatpumpir/heatpumpir.h +11 -0
  26. esphome/components/http_request/http_request_arduino.cpp +7 -2
  27. esphome/components/http_request/update/http_request_update.cpp +6 -7
  28. esphome/components/http_request/update/http_request_update.h +0 -3
  29. esphome/components/i2s_audio/__init__.py +10 -0
  30. esphome/components/i2s_audio/microphone/__init__.py +7 -0
  31. esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp +2 -3
  32. esphome/components/i2s_audio/microphone/i2s_audio_microphone.h +3 -0
  33. esphome/components/image/__init__.py +2 -29
  34. esphome/components/improv_serial/improv_serial_component.cpp +9 -8
  35. esphome/components/ltr390/ltr390.cpp +44 -29
  36. esphome/components/ltr390/ltr390.h +9 -5
  37. esphome/components/ltr390/sensor.py +35 -5
  38. esphome/components/mdns/__init__.py +3 -3
  39. esphome/components/mdns/mdns_component.cpp +3 -1
  40. esphome/components/mdns/mdns_component.h +3 -1
  41. esphome/components/mdns/mdns_esp32.cpp +2 -1
  42. esphome/components/mdns/mdns_esp8266.cpp +2 -1
  43. esphome/components/mdns/mdns_host.cpp +2 -1
  44. esphome/components/mdns/mdns_libretiny.cpp +2 -1
  45. esphome/components/mdns/mdns_rp2040.cpp +2 -1
  46. esphome/components/micro_wake_word/__init__.py +205 -56
  47. esphome/components/micro_wake_word/micro_wake_word.cpp +225 -275
  48. esphome/components/micro_wake_word/micro_wake_word.h +77 -107
  49. esphome/components/micro_wake_word/preprocessor_settings.h +20 -0
  50. esphome/components/micro_wake_word/streaming_model.cpp +189 -0
  51. esphome/components/micro_wake_word/streaming_model.h +84 -0
  52. esphome/components/mitsubishi/mitsubishi.cpp +1 -0
  53. esphome/components/modbus_controller/text_sensor/__init__.py +2 -1
  54. esphome/components/modbus_controller/text_sensor/modbus_textsensor.cpp +4 -1
  55. esphome/components/modbus_controller/text_sensor/modbus_textsensor.h +1 -1
  56. esphome/components/number/__init__.py +2 -0
  57. esphome/components/ota/ota_backend_arduino_esp32.cpp +22 -7
  58. esphome/components/ota/ota_backend_arduino_esp8266.cpp +23 -8
  59. esphome/components/ota/ota_backend_arduino_libretiny.cpp +22 -7
  60. esphome/components/ota/ota_backend_arduino_rp2040.cpp +22 -7
  61. esphome/components/pmsa003i/pmsa003i.cpp +9 -0
  62. esphome/components/qspi_amoled/display.py +16 -4
  63. esphome/components/qspi_amoled/qspi_amoled.cpp +16 -0
  64. esphome/components/qspi_amoled/qspi_amoled.h +0 -3
  65. esphome/components/remote_base/dooya_protocol.cpp +4 -4
  66. esphome/components/remote_base/rc_switch_protocol.cpp +1 -1
  67. esphome/components/restart/button/__init__.py +2 -0
  68. esphome/components/script/__init__.py +1 -1
  69. esphome/components/sensor/__init__.py +2 -0
  70. esphome/components/tuya/tuya.cpp +8 -2
  71. esphome/components/tuya/tuya.h +3 -1
  72. esphome/components/uart/__init__.py +72 -9
  73. esphome/components/uart/uart_component_esp32_arduino.cpp +18 -4
  74. esphome/components/uart/uart_component_esp_idf.cpp +22 -2
  75. esphome/components/uart/uart_component_host.cpp +295 -0
  76. esphome/components/uart/uart_component_host.h +38 -0
  77. esphome/components/uptime/sensor.py +44 -11
  78. esphome/components/uptime/{uptime_sensor.cpp → uptime_seconds_sensor.cpp} +11 -7
  79. esphome/components/uptime/{uptime_sensor.h → uptime_seconds_sensor.h} +2 -2
  80. esphome/components/uptime/uptime_timestamp_sensor.cpp +39 -0
  81. esphome/components/uptime/uptime_timestamp_sensor.h +30 -0
  82. esphome/components/veml7700/veml7700.cpp +1 -1
  83. esphome/components/veml7700/veml7700.h +5 -5
  84. esphome/components/voice_assistant/voice_assistant.cpp +4 -2
  85. esphome/components/web_server/server_index_v2.h +42 -41
  86. esphome/components/web_server/server_index_v3.h +368 -367
  87. esphome/components/wifi/wifi_component_esp_idf.cpp +1 -1
  88. esphome/components/wifi/wifi_component_pico_w.cpp +18 -2
  89. esphome/components/wireguard/__init__.py +1 -1
  90. esphome/components/x9c/output.py +7 -1
  91. esphome/const.py +2 -1
  92. esphome/core/defines.h +1 -0
  93. esphome/core/helpers.cpp +2 -2
  94. esphome/core/helpers.h +1 -1
  95. esphome/external_files.py +26 -0
  96. {esphome-2024.6.6.dist-info → esphome-2024.7.0.dist-info}/METADATA +1 -1
  97. {esphome-2024.6.6.dist-info → esphome-2024.7.0.dist-info}/RECORD +101 -95
  98. esphome/components/micro_wake_word/audio_preprocessor_int8_model_data.h +0 -493
  99. {esphome-2024.6.6.dist-info → esphome-2024.7.0.dist-info}/LICENSE +0 -0
  100. {esphome-2024.6.6.dist-info → esphome-2024.7.0.dist-info}/WHEEL +0 -0
  101. {esphome-2024.6.6.dist-info → esphome-2024.7.0.dist-info}/entry_points.txt +0 -0
  102. {esphome-2024.6.6.dist-info → esphome-2024.7.0.dist-info}/top_level.txt +0 -0
@@ -9,7 +9,7 @@ import requests
9
9
  import esphome.config_validation as cv
10
10
  import esphome.codegen as cg
11
11
 
12
- from esphome.core import CORE, HexInt, EsphomeError
12
+ from esphome.core import CORE, HexInt
13
13
 
14
14
  from esphome.components import esp32, microphone
15
15
  from esphome import automation, git, external_files
@@ -41,9 +41,15 @@ CODEOWNERS = ["@kahrendt", "@jesserockz"]
41
41
  DEPENDENCIES = ["microphone"]
42
42
  DOMAIN = "micro_wake_word"
43
43
 
44
+
45
+ CONF_FEATURE_STEP_SIZE = "feature_step_size"
46
+ CONF_MODELS = "models"
47
+ CONF_ON_WAKE_WORD_DETECTED = "on_wake_word_detected"
44
48
  CONF_PROBABILITY_CUTOFF = "probability_cutoff"
45
49
  CONF_SLIDING_WINDOW_AVERAGE_SIZE = "sliding_window_average_size"
46
- CONF_ON_WAKE_WORD_DETECTED = "on_wake_word_detected"
50
+ CONF_SLIDING_WINDOW_SIZE = "sliding_window_size"
51
+ CONF_TENSOR_ARENA_SIZE = "tensor_arena_size"
52
+ CONF_VAD = "vad"
47
53
 
48
54
  TYPE_HTTP = "http"
49
55
 
@@ -98,12 +104,14 @@ GIT_SCHEMA = cv.All(
98
104
  _process_git_source,
99
105
  )
100
106
 
101
- KEY_WAKE_WORD = "wake_word"
107
+
102
108
  KEY_AUTHOR = "author"
103
- KEY_WEBSITE = "website"
104
- KEY_VERSION = "version"
105
109
  KEY_MICRO = "micro"
106
110
  KEY_MINIMUM_ESPHOME_VERSION = "minimum_esphome_version"
111
+ KEY_TRAINED_LANGUAGES = "trained_languages"
112
+ KEY_VERSION = "version"
113
+ KEY_WAKE_WORD = "wake_word"
114
+ KEY_WEBSITE = "website"
107
115
 
108
116
  MANIFEST_SCHEMA_V1 = cv.Schema(
109
117
  {
@@ -125,6 +133,29 @@ MANIFEST_SCHEMA_V1 = cv.Schema(
125
133
  }
126
134
  )
127
135
 
136
+ MANIFEST_SCHEMA_V2 = cv.Schema(
137
+ {
138
+ cv.Required(CONF_TYPE): "micro",
139
+ cv.Required(CONF_MODEL): cv.string,
140
+ cv.Required(KEY_AUTHOR): cv.string,
141
+ cv.Required(KEY_VERSION): cv.All(cv.int_, 2),
142
+ cv.Required(KEY_WAKE_WORD): cv.string,
143
+ cv.Required(KEY_TRAINED_LANGUAGES): cv.ensure_list(cv.string),
144
+ cv.Optional(KEY_WEBSITE): cv.url,
145
+ cv.Required(KEY_MICRO): cv.Schema(
146
+ {
147
+ cv.Required(CONF_FEATURE_STEP_SIZE): cv.int_range(min=0, max=30),
148
+ cv.Required(CONF_TENSOR_ARENA_SIZE): cv.int_,
149
+ cv.Required(CONF_PROBABILITY_CUTOFF): cv.float_,
150
+ cv.Required(CONF_SLIDING_WINDOW_SIZE): cv.positive_int,
151
+ cv.Required(KEY_MINIMUM_ESPHOME_VERSION): cv.All(
152
+ cv.version_number, cv.validate_esphome_version
153
+ ),
154
+ }
155
+ ),
156
+ }
157
+ )
158
+
128
159
 
129
160
  def _compute_local_file_path(config: dict) -> Path:
130
161
  url = config[CONF_URL]
@@ -135,6 +166,24 @@ def _compute_local_file_path(config: dict) -> Path:
135
166
  return base_dir / key
136
167
 
137
168
 
169
+ def _convert_manifest_v1_to_v2(v1_manifest):
170
+ v2_manifest = v1_manifest.copy()
171
+
172
+ v2_manifest[KEY_VERSION] = 2
173
+ v2_manifest[KEY_MICRO][CONF_SLIDING_WINDOW_SIZE] = v1_manifest[KEY_MICRO][
174
+ CONF_SLIDING_WINDOW_AVERAGE_SIZE
175
+ ]
176
+ del v2_manifest[KEY_MICRO][CONF_SLIDING_WINDOW_AVERAGE_SIZE]
177
+ v2_manifest[KEY_MICRO][
178
+ CONF_TENSOR_ARENA_SIZE
179
+ ] = 45672 # Original Inception-based V1 manifest models require a minimum of 45672 bytes
180
+ v2_manifest[KEY_MICRO][
181
+ CONF_FEATURE_STEP_SIZE
182
+ ] = 20 # Original Inception-based V1 manifest models use a 20 ms feature step size
183
+
184
+ return v2_manifest
185
+
186
+
138
187
  def _download_file(url: str, path: Path) -> bytes:
139
188
  if not external_files.has_remote_file_changed(url, path):
140
189
  _LOGGER.debug("Remote file has not changed, skipping download")
@@ -155,6 +204,24 @@ def _download_file(url: str, path: Path) -> bytes:
155
204
  return req.content
156
205
 
157
206
 
207
+ def _validate_manifest_version(manifest_data):
208
+ if manifest_version := manifest_data.get(KEY_VERSION):
209
+ if manifest_version == 1:
210
+ try:
211
+ MANIFEST_SCHEMA_V1(manifest_data)
212
+ except cv.Invalid as e:
213
+ raise cv.Invalid(f"Invalid manifest file: {e}") from e
214
+ elif manifest_version == 2:
215
+ try:
216
+ MANIFEST_SCHEMA_V2(manifest_data)
217
+ except cv.Invalid as e:
218
+ raise cv.Invalid(f"Invalid manifest file: {e}") from e
219
+ else:
220
+ raise cv.Invalid("Invalid manifest version")
221
+ else:
222
+ raise cv.Invalid("Invalid manifest file, missing 'version' key.")
223
+
224
+
158
225
  def _process_http_source(config):
159
226
  url = config[CONF_URL]
160
227
  path = _compute_local_file_path(config)
@@ -167,11 +234,6 @@ def _process_http_source(config):
167
234
  if not isinstance(manifest_data, dict):
168
235
  raise cv.Invalid("Manifest file must contain a JSON object")
169
236
 
170
- try:
171
- MANIFEST_SCHEMA_V1(manifest_data)
172
- except cv.Invalid as e:
173
- raise cv.Invalid(f"Invalid manifest file: {e}") from e
174
-
175
237
  model = manifest_data[CONF_MODEL]
176
238
  model_url = urljoin(url, model)
177
239
 
@@ -206,7 +268,7 @@ def _validate_source_model_name(value):
206
268
  return MODEL_SOURCE_SCHEMA(
207
269
  {
208
270
  CONF_TYPE: TYPE_HTTP,
209
- CONF_URL: f"https://github.com/esphome/micro-wake-word-models/raw/main/models/{value}.json",
271
+ CONF_URL: f"https://github.com/esphome/micro-wake-word-models/raw/main/models/v2/{value}.json",
210
272
  }
211
273
  )
212
274
 
@@ -260,18 +322,57 @@ MODEL_SOURCE_SCHEMA = cv.Any(
260
322
  msg="Not a valid model name, local path, http(s) url, or github shorthand",
261
323
  )
262
324
 
325
+ MODEL_SCHEMA = cv.Schema(
326
+ {
327
+ cv.Optional(CONF_MODEL): MODEL_SOURCE_SCHEMA,
328
+ cv.Optional(CONF_PROBABILITY_CUTOFF): cv.percentage,
329
+ cv.Optional(CONF_SLIDING_WINDOW_SIZE): cv.positive_int,
330
+ cv.GenerateID(CONF_RAW_DATA_ID): cv.declare_id(cg.uint8),
331
+ }
332
+ )
333
+
334
+ # Provide a default VAD model that could be overridden
335
+ VAD_MODEL_SCHEMA = MODEL_SCHEMA.extend(
336
+ cv.Schema(
337
+ {
338
+ cv.Optional(
339
+ CONF_MODEL,
340
+ default="vad",
341
+ ): MODEL_SOURCE_SCHEMA,
342
+ }
343
+ )
344
+ )
345
+
346
+
347
+ def _maybe_empty_vad_schema(value):
348
+ # Idea borrowed from uart/__init__.py's ``maybe_empty_debug`` function. Accessed 2 July 2024.
349
+ # Loads a default VAD model without any parameters overridden.
350
+ if value is None:
351
+ value = {}
352
+ return VAD_MODEL_SCHEMA(value)
353
+
354
+
263
355
  CONFIG_SCHEMA = cv.All(
264
356
  cv.Schema(
265
357
  {
266
358
  cv.GenerateID(): cv.declare_id(MicroWakeWord),
267
359
  cv.GenerateID(CONF_MICROPHONE): cv.use_id(microphone.Microphone),
268
- cv.Optional(CONF_PROBABILITY_CUTOFF): cv.percentage,
269
- cv.Optional(CONF_SLIDING_WINDOW_AVERAGE_SIZE): cv.positive_int,
360
+ cv.Required(CONF_MODELS): cv.ensure_list(
361
+ cv.maybe_simple_value(MODEL_SCHEMA, key=CONF_MODEL)
362
+ ),
270
363
  cv.Optional(CONF_ON_WAKE_WORD_DETECTED): automation.validate_automation(
271
364
  single=True
272
365
  ),
273
- cv.Required(CONF_MODEL): MODEL_SOURCE_SCHEMA,
274
- cv.GenerateID(CONF_RAW_DATA_ID): cv.declare_id(cg.uint8),
366
+ cv.Optional(CONF_VAD): _maybe_empty_vad_schema,
367
+ cv.Optional(CONF_MODEL): cv.invalid(
368
+ f"The {CONF_MODEL} parameter has moved to be a list element under the {CONF_MODELS} parameter."
369
+ ),
370
+ cv.Optional(CONF_PROBABILITY_CUTOFF): cv.invalid(
371
+ f"The {CONF_PROBABILITY_CUTOFF} parameter has moved to be a list element under the {CONF_MODELS} parameter."
372
+ ),
373
+ cv.Optional(CONF_SLIDING_WINDOW_AVERAGE_SIZE): cv.invalid(
374
+ f"The {CONF_SLIDING_WINDOW_AVERAGE_SIZE} parameter has been renamed to {CONF_SLIDING_WINDOW_SIZE} and moved to be a list element under the {CONF_MODELS} parameter."
375
+ ),
275
376
  }
276
377
  ).extend(cv.COMPONENT_SCHEMA),
277
378
  cv.only_with_esp_idf,
@@ -282,19 +383,58 @@ def _load_model_data(manifest_path: Path):
282
383
  with open(manifest_path, encoding="utf-8") as f:
283
384
  manifest = json.load(f)
284
385
 
285
- try:
286
- MANIFEST_SCHEMA_V1(manifest)
287
- except cv.Invalid as e:
288
- raise EsphomeError(f"Invalid manifest file: {e}") from e
386
+ _validate_manifest_version(manifest)
289
387
 
290
388
  model_path = manifest_path.parent / manifest[CONF_MODEL]
291
389
 
292
390
  with open(model_path, "rb") as f:
293
391
  model = f.read()
294
392
 
393
+ if manifest.get(KEY_VERSION) == 1:
394
+ manifest = _convert_manifest_v1_to_v2(manifest)
395
+
295
396
  return manifest, model
296
397
 
297
398
 
399
+ def _model_config_to_manifest_data(model_config):
400
+ if model_config[CONF_TYPE] == TYPE_GIT:
401
+ # compute path to model file
402
+ key = f"{model_config[CONF_URL]}@{model_config.get(CONF_REF)}"
403
+ base_dir = Path(CORE.data_dir) / DOMAIN
404
+ h = hashlib.new("sha256")
405
+ h.update(key.encode())
406
+ file: Path = base_dir / h.hexdigest()[:8] / model_config[CONF_FILE]
407
+
408
+ elif model_config[CONF_TYPE] == TYPE_LOCAL:
409
+ file = Path(model_config[CONF_PATH])
410
+
411
+ elif model_config[CONF_TYPE] == TYPE_HTTP:
412
+ file = _compute_local_file_path(model_config) / "manifest.json"
413
+
414
+ else:
415
+ raise ValueError("Unsupported config type: {model_config[CONF_TYPE]}")
416
+
417
+ return _load_model_data(file)
418
+
419
+
420
+ def _feature_step_size_validate(config):
421
+ features_step_size = None
422
+
423
+ for model_parameters in config[CONF_MODELS]:
424
+ model_config = model_parameters.get(CONF_MODEL)
425
+ manifest, _ = _model_config_to_manifest_data(model_config)
426
+
427
+ model_step_size = manifest[KEY_MICRO][CONF_FEATURE_STEP_SIZE]
428
+
429
+ if features_step_size is None:
430
+ features_step_size = model_step_size
431
+ elif features_step_size != model_step_size:
432
+ raise cv.Invalid("Cannot load models with different features step sizes.")
433
+
434
+
435
+ FINAL_VALIDATE_SCHEMA = _feature_step_size_validate
436
+
437
+
298
438
  async def to_code(config):
299
439
  var = cg.new_Pvariable(config[CONF_ID])
300
440
  await cg.register_component(var, config)
@@ -302,58 +442,67 @@ async def to_code(config):
302
442
  mic = await cg.get_variable(config[CONF_MICROPHONE])
303
443
  cg.add(var.set_microphone(mic))
304
444
 
305
- if on_wake_word_detection_config := config.get(CONF_ON_WAKE_WORD_DETECTED):
306
- await automation.build_automation(
307
- var.get_wake_word_detected_trigger(),
308
- [(cg.std_string, "wake_word")],
309
- on_wake_word_detection_config,
310
- )
311
-
312
445
  esp32.add_idf_component(
313
446
  name="esp-tflite-micro",
314
447
  repo="https://github.com/espressif/esp-tflite-micro",
448
+ ref="v1.3.1",
315
449
  )
316
450
 
317
451
  cg.add_build_flag("-DTF_LITE_STATIC_MEMORY")
318
452
  cg.add_build_flag("-DTF_LITE_DISABLE_X86_NEON")
319
453
  cg.add_build_flag("-DESP_NN")
320
454
 
321
- model_config = config.get(CONF_MODEL)
322
- data = []
323
- if model_config[CONF_TYPE] == TYPE_GIT:
324
- # compute path to model file
325
- key = f"{model_config[CONF_URL]}@{model_config.get(CONF_REF)}"
326
- base_dir = Path(CORE.data_dir) / DOMAIN
327
- h = hashlib.new("sha256")
328
- h.update(key.encode())
329
- file: Path = base_dir / h.hexdigest()[:8] / model_config[CONF_FILE]
330
-
331
- elif model_config[CONF_TYPE] == TYPE_LOCAL:
332
- file = Path(model_config[CONF_PATH])
455
+ if on_wake_word_detection_config := config.get(CONF_ON_WAKE_WORD_DETECTED):
456
+ await automation.build_automation(
457
+ var.get_wake_word_detected_trigger(),
458
+ [(cg.std_string, "wake_word")],
459
+ on_wake_word_detection_config,
460
+ )
333
461
 
334
- elif model_config[CONF_TYPE] == TYPE_HTTP:
335
- file = _compute_local_file_path(model_config) / "manifest.json"
462
+ if vad_model := config.get(CONF_VAD):
463
+ cg.add_define("USE_MICRO_WAKE_WORD_VAD")
336
464
 
337
- else:
338
- raise ValueError("Unsupported config type: {model_config[CONF_TYPE]}")
465
+ # Use the general model loading code for the VAD codegen
466
+ config[CONF_MODELS].append(vad_model)
339
467
 
340
- manifest, data = _load_model_data(file)
468
+ for model_parameters in config[CONF_MODELS]:
469
+ model_config = model_parameters.get(CONF_MODEL)
470
+ data = []
471
+ manifest, data = _model_config_to_manifest_data(model_config)
341
472
 
342
- rhs = [HexInt(x) for x in data]
343
- prog_arr = cg.progmem_array(config[CONF_RAW_DATA_ID], rhs)
344
- cg.add(var.set_model_start(prog_arr))
473
+ rhs = [HexInt(x) for x in data]
474
+ prog_arr = cg.progmem_array(model_parameters[CONF_RAW_DATA_ID], rhs)
345
475
 
346
- probability_cutoff = config.get(
347
- CONF_PROBABILITY_CUTOFF, manifest[KEY_MICRO][CONF_PROBABILITY_CUTOFF]
348
- )
349
- cg.add(var.set_probability_cutoff(probability_cutoff))
350
- sliding_window_average_size = config.get(
351
- CONF_SLIDING_WINDOW_AVERAGE_SIZE,
352
- manifest[KEY_MICRO][CONF_SLIDING_WINDOW_AVERAGE_SIZE],
353
- )
354
- cg.add(var.set_sliding_window_average_size(sliding_window_average_size))
476
+ probability_cutoff = model_parameters.get(
477
+ CONF_PROBABILITY_CUTOFF, manifest[KEY_MICRO][CONF_PROBABILITY_CUTOFF]
478
+ )
479
+ sliding_window_size = model_parameters.get(
480
+ CONF_SLIDING_WINDOW_SIZE,
481
+ manifest[KEY_MICRO][CONF_SLIDING_WINDOW_SIZE],
482
+ )
355
483
 
356
- cg.add(var.set_wake_word(manifest[KEY_WAKE_WORD]))
484
+ if manifest[KEY_WAKE_WORD] == "vad":
485
+ cg.add(
486
+ var.add_vad_model(
487
+ prog_arr,
488
+ probability_cutoff,
489
+ sliding_window_size,
490
+ manifest[KEY_MICRO][CONF_TENSOR_ARENA_SIZE],
491
+ )
492
+ )
493
+ else:
494
+ cg.add(
495
+ var.add_wake_word_model(
496
+ prog_arr,
497
+ probability_cutoff,
498
+ sliding_window_size,
499
+ manifest[KEY_WAKE_WORD],
500
+ manifest[KEY_MICRO][CONF_TENSOR_ARENA_SIZE],
501
+ )
502
+ )
503
+
504
+ cg.add(var.set_features_step_size(manifest[KEY_MICRO][CONF_FEATURE_STEP_SIZE]))
505
+ cg.add_library("kahrendt/ESPMicroSpeechFeatures", "1.0.0")
357
506
 
358
507
 
359
508
  MICRO_WAKE_WORD_ACTION_SCHEMA = cv.Schema({cv.GenerateID(): cv.use_id(MicroWakeWord)})