Entender o YAML
YAML é uma linguagem conhecida usada para especificar a configuração de software. Ele fornece uma maneira clara e legível por humanos de representar informações estruturadas. Confira alguns conceitos básicos sobre o YAML antes de criar sua primeira automação com script. Para saber mais sobre o YAML em geral, consulte a especificação da versão 1.1.
Pares de chave-valor
Os documentos YAML são basicamente uma coleção de pares de chave-valor. No exemplo a seguir, a chave é name e o valor é TV on lights off. A chave e o valor
são delimitados por dois-pontos seguidos de um espaço. Ambos os caracteres são necessários para
um YAML bem formado.
name: TV on lights off
Valores
O valor associado a uma chave pode ser tão básico quanto uma string, um número ou uma data, ou tão complexo quanto outra coleção de pares de chave-valor.
Strings
Se um valor de string começar com um dos seguintes caracteres: [, {, ",
' ou #, ou se a string tiver : (dois-pontos seguidos por espaços), ela precisará ser
colocada entre aspas.
Aspas simples e duplas são aceitas, mas as aspas de fechamento precisam corresponder às de abertura.
Citação correta:
name: 'TV on lights off'
name: "TV on lights off"
Citação incorreta (aspas incompatíveis):
name: 'TV on lights off"
As aspas são opcionais para todos os outros tipos de strings.
Se você precisar de uma string de várias linhas, consulte a seção de especificação YAML sobre escalares de várias linhas.
name: "[1] TV"
name: '{1} TV'
name: '#TV'
name: '"1" TV'
name: "'1' TV"
name: "\"1\" TV"
name: "TV: bedroom"
Pares de chave-valor aninhados
Aqui, o valor da chave metadata é uma lista de dois pares de chave-valor (name
e description):
metadata:
name: TV on lights off
description: Turn off lights when TV turns on
Recuo
O YAML usa recuo para indicar a estrutura. No exemplo anterior, name e
description são recuados (por dois espaços) para indicar que são filhos
da chave metadata.
A indentação é rigorosa no YAML. Uma estrutura filha precisa ter um recuo mais profundo do que o pai, e os pares de chave-valor do mesmo nível precisam ter o mesmo recuo.
metadata:
name:
en: TV on lights off
description:
en: Turn off lights when TV turns on
Vários valores
Se uma determinada chave tiver vários valores, cada um deles será listado em uma nova linha, e cada linha começará com um traço e um espaço. No exemplo a seguir, há duas listas:
- Uma automação pode ter várias
starters. Por isso, a primeira ativação começa com um traço e um espaço. weekdaypode ter vários valores e, portanto, cada valor é recuado e começa com um traço e um espaço.
starters:
- type: time.schedule
at: SUNSET
weekday:
- MONDAY
- THURSDAY
state: on
Comentários
Qualquer texto após um # é considerado um comentário e é ignorado
pelo mecanismo de automação.
Uma linha que começa com # é um comentário.
Um comentário pode aparecer na mesma linha que o conteúdo do script, mas o # precisa ser
precedido por um espaço.
# This is a comment. It will be ignored.
name: chromecast #This is a TV.
Script de automação
A especificação da sintaxe do script de automações é chamada de esquema.
O esquema de automações define algumas estruturas de dados:
- Um único par de chave-valor é chamado de campo.
- Uma coleção de campos definidos pelo esquema é chamada de Struct.
Struct
A linguagem de script de automação define vários "blocos" ou estruturas de dados padrão, chamados de Structs.
Confira a Struct automation, que define quatro campos:
| Key | Tipo | Descrição |
|---|---|---|
|
|
Opcional. Nome da automação. Ele não é mostrado aos usuários, serve apenas como referência para o desenvolvedor. |
|
|
|
[Starter] |
Obrigatório. Uma lista de ativações. |
|
|
Opcional. Condição. |
|
|
|
[Ação] |
Obrigatório. Uma lista de ações. |
A seção Referência fornece definições de esquema para todas as Structs disponíveis.
Os nomes das chaves são exclusivos em um determinado Struct e diferenciam maiúsculas de minúsculas.
Os tipos de valor possíveis são:
- Um tipo primitivo: bool, número, string, hora e assim por diante.
- Um tipo Struct: uma coleção de campos.
- Uma matriz do tipo de dados. A matriz é indicada por
[]. Por exemplo,[string]é uma matriz de strings, e[Starter]é uma matriz de structs iniciais. - Outros tipos especiais: Entity, FieldPath.
A descrição de cada campo contém informações importantes, incluindo:
- Obrigatório x opcional, indicando se o campo é obrigatório ou se pode ser ignorado.
- Dependência de campo. Somente os campos opcionais têm dependências. Descreve as verificações adicionais ao usar esse campo, como Usar o Campo B somente se o Campo A estiver definido ou Quando o Campo A for usado, não definir o Campo B ou o Campo C.
- Valores possíveis. Por exemplo, o conjunto de valores limitado de um campo de tipo enumerado do tipo string ou um intervalo de números que pode ser usado em um campo do tipo número.
Struct com tipo especificado
Algumas Structs podem representar ativações com base em uma programação ou em uma mudança de estado do dispositivo. Cada tipo de starter precisa fornecer um conjunto distinto de campos.
# A time schedule starter.
starter:
type: time.schedule
at: 10:00
# A device state change starter.
starter:
type: device.state.OnOff
device: TV - Living Room
state: on
is: true
Um starter é um Struct tipado, que é estendido por outros Structs filhos no campo type, como time.schedule ou device.state.OnOff, para fornecer funções diferentes. Os Structs condition e action também são tipados.
Os campos adicionais na Struct precisam seguir a especificação da Struct filha (type). Por exemplo, ao usar device.state.OnOff como type, somente
os
campos especificados para esse
tipo
são válidos nessa
starter Struct.
Matriz
Em YAML, uma matriz de valores começa com - (um traço seguido por um espaço). A matriz pode conter vários valores de Struct ou vários valores de Primitive. No entanto, os valores na matriz precisam ser do mesmo tipo.
Quando a matriz contém um único item, é possível omitir o traço e o espaço:
# The starters field accepts an array of Starter Structs.
# This is the standard format.
starters:
- type: time.schedule
at: sunset
- type: time.schedule
at: sunrise
# The dash can be omitted if the array only has one item.
# This is also valid.
starters:
type: time.schedule
at: sunset
Matrizes multidimensionais, como
[[1, 2], [3, 4]], não são compatíveis com scripts de automação. O
analisador de linguagem vai nivelar automaticamente uma matriz multidimensional em uma
matriz unidimensional, neste caso, [1, 2, 3, 4].
# INVALID: multi-dimensional array
- - 1
- 2
- - 3
- 4
Primário
Os seguintes tipos de dados primitivos são compatíveis com o esquema de script de automações:
|
Booleano |
|
|
Número |
Número inteiro ou decimal. |
|
String |
Texto simples As strings não precisam ser colocadas entre aspas, exceto em casos específicos. |
|
Data |
É o mês e o dia. O formato é MM-DD ou MM/DD.
|
|
Tempo |
Hora do dia. Pode ser o horário do relógio ou o horário solar.
Para o horário, ele pode usar o formato AM/PM ou 24H. Os segundos
são opcionais.
Para o horário solar,
|
|
DateTime |
É o ano, o mês, o dia e a hora. É necessário um espaço em branco entre a parte da data e a parte da hora. O formato da data é AAAA-MM-DD ou AAAA/MM/DD. O formato de hora é o mesmo que [Hora](#time). Não há suporte para fusos horários.
|
|
Dia da semana |
|
|
Duração |
Um período de tempo.
|
| ColorHex |
Um código hexadecimal de seis dígitos que representa uma cor. Não há
|
| Temperatura | Dados de temperatura normais. Sempre adicione
|
| ColorTemperature |
Temperatura da cor em Kelvin.
|
| Usuário |
É o endereço de e-mail do usuário. |
Cor
As cores podem ser especificadas de três maneiras: usando os tipos primitivos ColorHex ou ColorTemperature ou o tipo composto SpectrumHSV.
SpectrumHSV
O tipo SpectrumHSV especifica uma cor usando três campos numéricos:
- Matiz corresponde ao comprimento de onda da cor.
- Saturação indica a intensidade da cor.
- Value indica a claridade ou escuridão relativa da cor.
Dinâmico
Às vezes, o tipo de dados de uma chave não é fixo. Pode ser um dos tipos primitivos, com base nos valores de outros campos.
Um exemplo de campo de tipo de dados dinâmico é is. O tipo real é determinado pelos valores dos campos type e state.
# The 'is' field accepts a number type.
type: device.state.Volume
device: My TV - Living Room
state: currentVolume
is: 1
# The 'is' field accepts a boolean type.
type: device.state.OnOff
device: My TV - Living Room
state: on
is: false
Entidade
Um formato de string especial para identificar de forma exclusiva uma entidade de propriedade do usuário, como um dispositivo ou ambiente.
O dispositivo é a entidade mais comum usada em automações. O formato de string da entidade
é device name - room name.
# The device field accepts a Device Entity type.
type: device.state.Volume
device: My TV - Living Room
state: currentVolume
is: 1
FieldPath
Um formato de string especial usado para localizar um dado em um payload de dados. No
exemplo a seguir, currentVolume é o FieldPath do campo state.
# The state field accepts a FieldPath type.
starters:
type: device.state.Volume
device: My TV - Living Room
state: currentVolume
is: 5
Outros FieldPaths podem exigir vários níveis para chegar ao item necessário, e o formato varia entre acionador e ação.
As iniciais usam uma notação de ponto, com todo o caminho no mesmo campo. Isso é
feito principalmente para fins de comparação na lógica inicial. Por exemplo, para usar
a temperatura da cor como ativação, use color.colorTemperature para o
estado:
starters:
- type: device.state.ColorSetting
device: My Device - Room Name
state: color.colorTemperature
is: 2000K
No entanto, as ações usam campos aninhados. Para mudar a cor de uma lâmpada para azul,
em vez de color.name e is: blue, faça o seguinte:
actions:
- type: device.command.ColorAbsolute
devices: My Device - Room Name
color:
name: blue