A partir de la versión 1.10.0, ESPHome tiene una nueva y poderosa forma de reducir la repetición en los archivos de configuración: Sustituciones. Con las sustituciones, puede tener un único archivo fuente genérico para todos los nodos de un tipo y sustituir expresiones en él.
substitutions:
devicename: livingroom
upper_devicename: Livingroom
esphome:
name: $devicename
# ...
sensor:
- platform: dht
# ...
temperature:
name: ${upper_devicename} Temperature
humidity:
name: ${upper_devicename} Humidity
En la sección de nivel superior substitutions
, puede colocar tantos pares clave-valor como desee. Antes de validar su configuración, ESPHome reemplazará automáticamente todas las ocurrencias de sustituciones por su valor. La sintaxis de una sustitución se basa en bash y distingue entre mayúsculas y minúsculas: $substitution_key
o ${substitution_key}
(igual).
Además, puede usar la sintaxis YAML << para crear un único archivo YAML del que heredan varios nodos:
# In common.yaml
esphome:
name: $devicename
# ...
sensor:
- platform: dht
# ...
temperature:
name: ${upper_devicename} Temperature
humidity:
name: ${upper_devicename} Humidity
# In nodemcu1.yaml
substitutions:
devicename: nodemcu1
upper_devicename: NodeMCU 1
<<: !include common.yaml
Consejo:
Para ocultar estos archivos base del tablero, puede
- Colóquelos en un subdirectorio (el tablero solo muestra archivos en el directorio de nivel superior)
- Anteponga un punto al nombre del archivo, como
.base.yaml
Sustituciones de línea de comando
Puede definir o anular sustituciones desde la línea de comando agregando, por ejemplo, que anula la CLAVE de sustitución y le da valor VALOR. Esto se puede emitir varias veces, por ejemplo, con el siguiente archivo:-s KEY VALUE example.yaml
substitutions:
name: default
platform: ESP8266
esphome:
name: $name
platform: $platform
board: $board
y el siguiente comando:
esphome -s name device01 -s board esp01_1m example.yaml config
Obtendrá algo como el siguiente resultado (tenga en cuenta las sustituciones sin cambios platform
, agregadas board
y anuladas ):name
substitutions:
name: device01
platform: ESP8266
board: esp01_1m
esphome:
name: device01
platform: ESP8266
board: esp01_1m
includes: []
libraries: []
esp8266_restore_from_flash: false
build_path: device01
platformio_options: {}
arduino_version: espressif8266@2.2.3
Podemos observar aquí que las sustituciones de la línea de comandos tienen prioridad sobre las de su archivo de configuración. Esto se puede usar para crear archivos de configuración de ‘plantilla’ genéricos (como el example.yaml
anterior) que se pueden usar para múltiples dispositivos, usando sustituciones que se proporcionan en la línea de comando.
CAPÍTULOS DEL VÍDEO
- 0:28 Introducción
- 2:52 Sustitución de código
- 7:42 Integrar archivos
- 12:20 Wifi
- 17:15 Device name
- 20:00 Sensores
- 22:15 Borrar Nodo en Home Assistant
- 22:40 Instalar por cable
- 24:48 Unificar archivos secrets
- 26:09 Conclusión
Sustituciones en paquetes
Otra forma de modularizar y reutilizar su configuración es usar paquetes. Esta característica le permite poner piezas comunes de configuración en archivos separados y mantener solo piezas únicas de su configuración en el archivo yaml principal. Todas las definiciones de los paquetes se fusionarán con su configuración principal de forma no destructiva para que siempre pueda anular algunas partes de la configuración del paquete.
Paquetes locales
Considere el siguiente ejemplo donde el autor colocó piezas comunes de configuración como WiFi e I²C en archivos base y las amplía con algunas configuraciones específicas del dispositivo en la configuración principal.
Observe cómo la pieza de configuración que describe el componente api
device_base.yaml
se fusiona con las definiciones de servicios del archivo de configuración principal.
# en config.yaml
substitutions:
node_name: mydevice
device_verbose_name: "My Device"
packages:
wifi: !include common/wifi.yaml
device_base: !include common/device_base.yaml
api:
services:
- service: start_laundry
then:
- switch.turn_on: relay
- delay: 3h
- switch.turn_off: relay
sensor:
- platform: mhz19
co2:
name: "CO2"
temperature:
name: "Temperature"
update_interval: 60s
automatic_baseline_calibration: false
# en wifi.yaml
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
domain: .yourdomain.lan
fast_connect: true
# en device_base.yaml
esphome:
name: ${node_name}
platform: ESP32
board: wemos_d1_mini32
build_path: ./build/${node_name}
# I²C Bus
i2c:
sda: GPIO21
scl: GPIO22
scan: true
frequency: 100kHz
# Enable logging
logger:
level: ${log_level}
api:
encryption:
key: !secret api_encryption_key
reboot_timeout: 1h
sensor:
- <<: !include common/sensor/uptime.config.yaml
- <<: !include common/sensor/wifi_signal.config.yaml
binary_sensor:
- <<: !include common/binary_sensor/connection_status.config.yaml
switch:
- <<: !include common/switch/restart_switch.config.yaml
Paquetes remotos/git
Los paquetes también se pueden cargar desde un repositorio git utilizando la sintaxis de configuración correcta. Las sustituciones se pueden usar dentro de los paquetes remotos, lo que permite a los usuarios anularlos localmente con su propio valor de sustitución.
Nota:
Los paquetes remotos no pueden tener búsquedas secret
en ellos. En su lugar, deberían hacer uso de sustituciones con un valor predeterminado opcional en el paquete YAML, que el dispositivo local YAML puede configurar usando valores de los secretos locales.
packages:
# Git repo examples
remote_package:
url: https://github.com/esphome/non-existant-repo
ref: main # optional
files: [file1.yml, file2.yml]
refresh: 1d # optional
# A single file can be expressed using `file` or `files` as a string
remote_package_two:
url: https://github.com/esphome/non-existant-repo
file: file1.yml # cannot be combined with `files`
# files: file1.yml
# shorthand form github://username/repository/[folder/]file-path.yml[@branch-or-tag]
remote_package_three: github://esphome/non-existant-repo/file1.yml@main
¿Cómo uso mi Home Assistant secrets.yaml?
Si desea mantener todos sus secretos en un solo lugar, cree un archivo secrets.yaml
en el directorio esphome con este contenido (para que extraiga el contenido de su archivo secrets.yaml
principal de Home Assistant desde un directorio superior):
<<: !include ../secrets.yaml