Podstawowe informacje o języku

Interpretowanie pliku YAML

YAML to popularny język używany do określania konfiguracji oprogramowania. Zapewnia on przejrzysty i zrozumiały sposób przedstawiania informacji ustrukturyzowanych. Zanim utworzysz pierwszą automatyzację z wykorzystaniem skryptu, zapoznaj się z kilkoma podstawowymi informacjami o YAML. Więcej informacji o YAML znajdziesz w specyfikacji wersji 1.1.

Pary klucz-wartość

Dokumenty YAML to w podstawie zbiór par klucz-wartość. W tym przykładzie klucz to name, a wartość to TV on lights off. Klucz i wartość są rozdzielane dwukropkiem i spacją. Aby format YAML był poprawny, oba znaki są wymagane.

name: TV on lights off

Wartości

Wartość powiązana z kluczem może być tak podstawowa jak ciąg znaków, liczba lub data, albo tak złożona jak inna kolekcja par klucz-wartość.

Strings

Jeśli wartość ciągu zaczyna się jednym z tych znaków: [, {, ", ' lub #, albo zawiera znak : (dwukropka z następującymi spacjami), musi być ujęta w cudne znaki.

Dopuszczalne są cudzysłowe proste i podwójne, ale cudzysłowie zamykające musi być zgodne z cudzysłowem otwierającym.

Prawidłowe cytowanie:

name: 'TV on lights off'

name: "TV on lights off"

Nieprawidłowe cudzysłowe (niepasujące cudzysłowy):

name: 'TV on lights off"

Cudzysłowe jest opcjonalne w przypadku wszystkich innych typów ciągów znaków.

Jeśli potrzebujesz ciągu wielowierszowego, zapoznaj się z sekcją specyfikacji YAML na temat skalarów wielowierszowych.

name: "[1] TV"
name: '{1} TV'
name: '#TV'
name: '"1" TV'
name: "'1' TV"
name: "\"1\" TV"
name: "TV: bedroom"

Zagnieżdżone pary klucz-wartość

Tutaj wartość klucza metadata to lista 2 par klucz-wartość (namedescription):

metadata:
  name: TV on lights off
  description: Turn off lights when TV turns on

wcięcie,

Plik YAML używa wcięć do oznaczania struktury. W poprzednim przykładzie elementy namedescription są wcięte (o 2 spacje), aby wskazać, że są elementami podrzędnymi klucza metadata.

W formacie YAML wcięcia są rygorystyczne. Struktura podrzędna musi mieć większą wcięcie niż struktura nadrzędna, a pary klucz-wartość na tym samym poziomie muszą mieć takie samo wcięcie.

metadata:
  name:
    en: TV on lights off
  description:
    en: Turn off lights when TV turns on

Wiele wartości

Jeśli dany klucz ma wiele wartości, każda z nich jest podana w nowym wierszu, a poprzedza ją myślnik i spacja. W tym przykładzie są 2 listy:

  1. Automatyzacja może mieć wiele elementów starters, dlatego pierwszy element uruchamiający zaczyna się od myślnika i spacji.
  2. weekday może mieć wiele wartości, dlatego każda z nich jest wcięciem i zaczyna się od myślnika i spacji.
starters:
- type: time.schedule
  at: SUNSET
  weekday:
  - MONDAY
  - THURSDAY
  state: on

Komentarze

Każdy tekst po znaku # jest uważany za komentarz i ignorowany przez mechanizm automatyzacji.

Wiersz rozpoczynający się od # to komentarz.

Komentarz może pojawić się na tym samym wierszu co zawartość skryptu, ale # musi być poprzedzony spacjami.

# This is a comment. It will be ignored.
name: chromecast #This is a TV.

Skrypt automatyzacji

Specyfikacja składni skryptu automatyzacji to schemat.

Schemat automatyzacji definiuje kilka struktur danych:

  • Pojedyncza para klucz-wartość jest nazywana polem.
  • Zbiór pól zdefiniowanych przez schemat to struktura.

Struct

Język skryptów automatyzacji definiuje kilka standardowych „bloków” lub struktur danych, zwanych strukturami.

Zwróć uwagę na strukturę automation, która definiuje 4 pola:

Klucz Typ Opis

name

Ciąg znaków

Opcjonalnie:

Nazwa automatyzacji.

Ta nazwa nie jest widoczna dla użytkowników. Jest przeznaczona tylko dla deweloperów.

starters

[Starter]

Wymagane.

Lista starterów.

condition

Warunek

Opcjonalnie:

Warunek.

actions

[Działanie]

Wymagane.

Lista działań.

Informacje sekcja zawiera definicje schematów wszystkich dostępnych struktur.

Nazwy kluczy są unikalne w danym typie struktury i uwzględniają wielkość liter.

Możliwe typy wartości:

  • Typ prymitywny: bool, liczba, ciąg znaków, czas itp.
  • Typ struktury: zbiór pól.
  • Tablica typu danych. Tablica jest oznaczona symbolem []. Na przykład [string] jest tablicą ciągów tekstowych, a [Starter] jest tablicą struktur startowych.
  • Inne typy specjalne: Entity, FieldPath.

Opis każdego pola zawiera ważne informacje, w tym:

  • Wymagane lub Opcjonalne, co wskazuje, czy pole jest wymagane, czy można je pominąć.
  • Zależność pola. zależności mają tylko pola opcjonalne. Opisuje on dodatkowe kontrole podczas używania tego pola, takie jak Użyj pola B tylko wtedy, gdy pole A jest ustawione lub Jeśli używane jest pole A, nie ustawiaj pól B ani C.
  • Możliwe wartości Na przykład ograniczony zbiór wartości pola Enum typu string lub zakres liczb, które mogą być używane w polu typu number.

Typowany struct

Niektóre struktury mogą reprezentować elementy początkowe na podstawie harmonogramu lub zmiany stanu urządzenia. Każdy typ starter musi zawierać odrębny zestaw pól.

# 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

starter to typowany element strukturalny, który jest rozszerzany przez inne podrzędne elementy strukturalne w polu type, takie jak time.schedule lub device.state.OnOff, aby zapewniać różne funkcje. Struktury conditionaction są też typowane.

Dodatkowe pola w typie struct muszą być zgodne ze specyfikacją podrzędnego typu struct (type). Jeśli na przykład użyjesz typu device.state.OnOff jako type, w strukturze starter będą prawidłowe tylko polaokreślone dla tego typu .

Tablica

W formacie YAML tablica wartości zaczyna się od - (kreska, a potem spacja). Tablica może zawierać wiele wartości typu Struct lub wiele wartości typu Primitive. Wartości w tablicy muszą być jednak tego samego typu.

Gdy tablica zawiera tylko 1 element, możesz pominąć myślnik i spację:

# 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

Tablice wielowymiarowe, takie jak [[1, 2], [3, 4]], nie są obsługiwane w skryptach automatyzacji. Parsujący język parser automatycznie spłaszczy macierz wielowymiarową do macierzy jednowymiarowej, w tym przypadku [1, 2, 3, 4].

# INVALID: multi-dimensional array
- - 1
  - 2
- - 3
  - 4

Primitive

Schemat skryptu automatyzacji obsługuje te proste typy danych:

Wartość logiczna

  • true
  • false

Liczba

Liczba całkowita lub dziesiętna

Ciąg znaków

Zwykły tekst

Ciągów nie trzeba otaczać cudzysłowami, chyba że w określonych przypadkach.

Data

Miesiąc i dzień. Format to DD-MM lub DD/MM.

  • 09/01
  • 09-01

Godzina

Pora dnia. Może to być czas zegarowy lub słoneczny. Czas może być podany w formacie AM/PM lub 24-godzinnym. Sekundy są opcjonalne. W przypadku czasu słonecznego sunrise i sunset to słowa kluczowe, za którymi może występować przesunięcie (w warunkach Duration).

  • 12:30 am
  • 13:00:01
  • sunrise/sunset
  • sunset+30min/sunset-1hour

DateTime

Rok, miesiąc, dzień i porę dnia. Pomiędzy częścią dotyczącą daty a częścią dotyczącą czasu musi być spacja. Format daty to RRRR-MM-DD lub RRRR/MM/DD. Format czasu jest taki sam jak w przypadku atrybutu [Time](#time). Strefa czasowa nie jest obsługiwana.

  • 2022/01/01 14:00
  • 2022-12-31 sunrise+30min

Dzień tygodnia

  • MONDAY (lub MON)
  • TUESDAY (lub TUE)
  • WEDNESDAY (lub WED)
  • THURSDAY (lub THU)
  • FRIDAY (lub FRI)
  • SATURDAY (lub SAT)
  • SUNDAY (lub SUN)

Czas trwania

Okres czasu.

  • 30min
  • 1hour
  • 20sec
  • 1hour10min20sec

ColorHex

Sześciocyfrowy kod szesnastkowy reprezentujący kolor.

Brak # wiodącego.

  • FFFFFF
  • B5D2A1
  • DFA100

Temperatura

Dane o normalnej temperaturze. Zawsze dodawaj 'C' lub 'F' do wartości, aby oznaczyć pomiar temperatury.

  • 20.5C
  • 90F

ColorTemperature

Temperatura barwowa w kelwinach.

  • 5000K

Kolor

Kolory można określić na 3 sposoby: za pomocą typu prymitywnego ColorHex lub ColorTemperature albo typu złożonego SpectrumHSV.

SpectrumHSV

Typ SpectrumHSV określa kolor za pomocą 3 polów liczbowych:

  • Odcień odpowiada długości fali koloru.
  • Nasycenie określa intensywność koloru.
  • Wartość wskazuje względną jasność lub ciemność koloru.

Dynamiczna

Czasami typ danych klucza nie jest stały. Może to być jeden z pierwotnych typów danych, na podstawie wartości z innych pól.

Przykładem pola dynamicznego typu danych jest is. Rzeczywisty typ jest określany przez wartości pól type i 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

Jednostka

Specjalny format ciągu znaków służący do jednoznacznego identyfikowania elementów należących do użytkownika, takich jak urządzenie lub sala.

Urządzenie to najczęściej używany typ w automatyzacjach. Format ciągu znaków elementu to 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

Specjalny format ciągu znaków służący do znajdowania danych w danych ładunku. W tym przykładzie currentVolume to ścieżka do pola state.

# The state field accepts a FieldPath type.
starters:
  type: device.state.Volume
  device: My TV - Living Room
  state: currentVolume
  is: 5

Inne ścieżki pól mogą wymagać kilku poziomów, aby dotrzeć do wymaganego elementu, a format różni się w zależności od tego, czy jest to działanie czy element startowy.

W przypadku starterów jest używana notacja kropkowa, a cała ścieżka znajduje się w tym samym polu. Robi się tak głównie w celu porównywania w ramach logiki podstawowej. Aby na przykład użyć temperatury barwowej jako wartości początkowej, użyj wartości color.colorTemperature dla stanu:

starters:
- type: device.state.ColorSetting
  device: My Device - Room Name
  state: color.colorTemperature
  is: 2000K

Działania używają jednak pól zagnieżdżonych. Aby zmienić kolor żarówki na niebieski zamiast color.name i is: blue, wykonaj te czynności:

actions:
- type: device.command.ColorAbsolute
  devices: My Device - Room Name
  color:
    name: blue