Oto przegląd podstawowych pojęć związanych z Automation DSL.
Komponenty automatyzacji
Automatyzacja składa się z tych podstawowych komponentów, które są zwykle oceniane w tym porządku:
- Starter – określa warunki początkowe, które aktywują automatyzację, na przykład zmianę cechy. Automatyzacja musi mieć element uruchamiający.
- Warunek – wszelkie dodatkowe ograniczenia do oceny po włączeniu automatyzacji. Aby działania automatyzacji mogły się odbywać, wyrażenie w warunku musi zwracać wartość
true
. - Działanie – polecenia lub aktualizacje stanu wykonywane po spełnieniu wszystkich warunków.
Możesz na przykład mieć automatyzację, która przyciemnia światła w pokoju, gdy telewizor w tym pokoju jest włączony między zachodem a wschodem słońca. W tym przykładzie:
- Starter – telewizor został włączony, co oznacza zmianę stanu atrybutu telewizora.
- Warunek – oceniany jest aktualny czas w miejscu, w którym znajduje się telewizor.
- Działanie: światła w tym samym pomieszczeniu co telewizor są przyciemnione.
Automatyzacja zostanie uruchomiona po włączeniu telewizora w pokoju, ale tylko wtedy, gdy warunek „czas między zachodem a wschodem słońca” zostanie spełniony.
Oprócz podstawowej struktury automatyzacje w interfejsach API Home zawierają też metadane, takie jak nazwa i opis, które mogą służyć do identyfikacji automatyzacji przez programistów i użytkowników.
Węzły
W interfejsach API Home struktura logiczna automatyzacji składa się z nodes. Węzły to abstrakcyjne jednostki do wielokrotnego użytku, które reprezentują zachowania lub przepływy wykonania elementów. Każdy węzeł może mieć zmienne wejściowe, a także zmienne wyjściowe, które mogą być wykorzystywane przez inne węzły.
Węzeł | Typ węzła | Implementacja w Kotlinie | Opis |
---|---|---|---|
Starter | Zachowanie |
StarterNodeDsl
|
Uruchamia automatyzację po zmianie stanu cechy (dowolnego atrybutu). |
StateReader | Zachowanie |
StateReaderNodeDsl
|
Odczytuje atrybut cechy i pozwala przechwycić jego wartość na potrzeby węzłów warunków. |
Działanie | Zachowanie |
ActionNodeDsl
|
Wywołuje polecenia atrybutów. |
Sekwencyjna | Proces wykonywania |
SequentialFlow
|
Wykonuje zagnieżdżone węzły działania w kolejności. Jest to domyślne zachowanie podczas wykonywania. |
Równoległe | Proces wykonywania |
ParallelFlow
|
równolegle wykonuje zagnieżdżone węzły działań; |
Warunek | Proces wykonywania |
ConditionNodeDsl
|
Zmień warunkowo przepływ wykonania na podstawie oceny wyrażeń logicznych. Warunki mogą być powiązane z początkiem (specyficzne warunki dotyczące początku) lub globalne (dotyczące wszystkich początków). |
Wybierz | Proces wykonywania |
SelectFlow
|
Umożliwia aktywowanie automatyzacji za pomocą więcej niż 1 elementu inicjującego. |
Wyraz | Wartość |
Expression
|
Może być wartością atrybutu cechy, stałą lub wartością dosłowną. Musi być interpretowane jako lista, liczba, wartość logiczna lub ciąg znaków. |
Węzły behawioralne
Węzły takie jak startery i akcje to węzły behawioralne. Startery aktywują automatyzację na podstawie zmian atrybutów urządzenia. Działania wysyłają polecenia do urządzenia lub aktualizują atrybuty.
Węzły behawioralne są zwykle powiązane z właściwościami urządzenia i stanem właściwości wyjściowej, aby służyć jako dane wejściowe w innych węzłach.
Węzły przepływu wykonania
Niektóre węzły reprezentują przepływy wykonania, np. sekwencyjne i równoległe. Każdy z tych węzłów zawiera węzły behawioralne, które definiują automatyzację.
Na przykład sekwencyjny przepływ może zawierać węzły, które są wykonywane w kolejności. Zwykle są to polecenia inicjujące, warunki i działania.
Równoległy przepływ może zawierać wiele węzłów działania wykonywanych jednocześnie, na przykład włączanie wielu świateł jednocześnie. Węzły, które wykonują ścieżkę równoległą, nie będą się wykonywać, dopóki nie zakończą się wszystkie gałęzie ścieżki równoległej.
Innym typem przepływu wykonania jest przepływ warunku, który może zmienić przepływ wykonania na podstawie oceny wyrażenia.
Możesz na przykład mieć automatyzację, która wykonuje działanie zależnie od tego, czy jest noc. Węzeł warunku sprawdza porę dnia, a następnie na podstawie tej oceny wybiera odpowiednią ścieżkę wykonania.
Wybrany przepływ danych jest przydatny, gdy chcesz mieć więcej niż 1 element startowy, który może aktywować automatyzację. Jeśli w przepływie select
umieścisz co najmniej 2 polecenia inicjujące, automatyzację może aktywować dowolne z nich.
Możesz na przykład utworzyć automatyzację, która opuszczała będzie rolety o zachodem słońca, jeśli temperatura wzrośnie powyżej określonego progu lub jeśli jasność przekroczy określony próg. Każdy z tych scenariuszy obsługują 3 osobne startery, które są ujęte w ramy przepływu select
.
Zagnieżdżone przepływy
W złożonych automatyzacjach węzły przepływu wykonania mogą być również zagnieżdżone. Możesz na przykład mieć sekwencyjny przepływ danych, który wykonuje przepływ danych równoległy.
Węzły DSL można zagnieżdżać i łączyć na różne sposoby, aby spełniać określone potrzeby zgodnie z ograniczeniami opisanymi w tabeli poniżej. Kolumna Builder zawiera linki do dokumentacji konstruktora z bezpieczną kontrolą typu w języku Kotlin, która zawiera szczegółowe informacje o tym, co jest dozwolone w przypadku każdego typu węzła.
Węzeł | Monter | Może zawierać te typy i dane węzła | Musi być jednym z tych typów węzłów: |
---|---|---|---|
Starter |
AutomationBuilder
|
Wyrażenie | Wybieranie, Sekwencyjne |
ManualStarter |
AutomationBuilder
|
Wybieranie, Sekwencyjne | |
StateReader |
AutomationBuilder
|
wyrażenie (zazwyczaj składające się z wartości atrybutu cechy); | Działanie, Warunek |
Działanie |
ActionBuilder
|
Polecenie, Element, Wyrażenie | równoległe, wybrane, sekwencyjne. |
Sekwencyjna |
SequentialFlowBuilder
|
równoległe, wybrane, sekwencyjne. | |
Równoległe |
ParallelFlowBuilder
|
Działanie | Sekwencyjne |
Warunek | ConditionBuilder |
Wyrażenie | równoległe, sekwencyjne; |
Wybierz |
AutomationBuilder
|
Warunek, Sekwencyjny, Starter, ManualStarter | Sekwencyjny, musi być pierwszym węzłem w przepływie |
Automatyzacja DSL
W interfejsach API Home automatyzacje są definiowane za pomocą języka Automation DSL (Domain-Specific Language). Automatyczny język programowania jest implementowany jako język Kotlin DSL (język do zastosowań w danej domenie), korzystający z bezpiecznych konstruktorów Kotlina. Jest on przeznaczony do definiowania szablonów automatyzacji.
Podczas kompilowania automatyzacji konstruktory Kotlina zapewniające bezpieczeństwo typów generują klasy danych Kotlina, które są następnie serializowane do bufora protokołu JSON. Jest on używany do wywoływania usług automatyzacji Google.
Automatyczny język programowania upraszcza i usprawnia proces tworzenia automatyzacji. Domyślnie korzysta z tego samego modelu danych, który obejmuje standardowe atrybuty Matter i atrybuty smart home dostępne w interfejsie Device API.
Automatyka DSL definiuje też logikę automatyzacji w ujęciu abstrakcyjnych typów urządzeń, a nie konkretnych instancji urządzeń znajdujących się w domu użytkownika. Umożliwia deweloperowi podanie parametrów wejściowych, które mogą być używane w czasie wykonywania, do określania rzeczywistych instancji urządzenia, a także innych ważnych wartości parametrów.
Składnia DSL jest podobna do składni Kotlinu i także zapewnia bezpieczeństwo typów, ale automatyzacja napisana w Automation DSL jest prostsza i bardziej zwięzła niż ta sama automatyzacja napisana w czystym Kotlinie.
Przykład
Poniżej znajduje się przykład automatyzacji, która włącza urządzenie. Została ona napisana za pomocą Automation DSL:
val automation = automation {
name = "MyFirstAutomation"
description = "If light1 is on, turn on light2."
isActive = true
sequential {
val onOffTrait = starter<_>(device1, OnOffLightDevice, OnOff)
condition() { expression = onOffTrait.onOff equals true }
action(device2, OnOffLightDevice) { command(OnOff.on()) }
}
}
Ta automatyzacja jest bardzo podstawowa: gdy device1
, czyli światło, włączy się (atrybut onOff
zmieni się na true
), wysyła polecenie on()
, aby włączyć device2
.
Automatyzacja używa węzła sequential
, co oznacza, że jego węzły będą działać w kolejności.
W węźle sequential
znajdują się węzły behawioralne, takie jak starter
, condition
i action
. Wyjście węzła starter
jest przypisywane do zmiennej na potrzeby użycia w węźle condition
.