To jest przegląd podstawowych pojęć związanych z językiem DSL automatyzacji na Androidzie.
Komponenty automatyzacji
Automatyzacja składa się z tych podstawowych komponentów, które są zwykle oceniane w tej kolejności:
- Polecenie inicjujące – określa warunki początkowe, które aktywują automatyzację, np. zmianę cechy. Automatyzacja musi mieć element uruchamiający.
- Warunek – wszelkie dodatkowe ograniczenia, które należy ocenić po aktywowaniu automatyzacji. Aby działania automatyzacji mogły zostać wykonane, wyrażenie w warunku musi zwracać wartość
true. - Działanie – polecenia lub aktualizacje stanu, które są wykonywane po spełnieniu wszystkich warunków.
Możesz na przykład mieć automatyzację, która przyciemnia światła w pomieszczeniu, gdy telewizor w tym pomieszczeniu jest włączony między zachodem a wschodem słońca. W tym przykładzie:
- Starter – telewizor został włączony, co jest zmianą stanu cechy telewizora.
- Warunek – sprawdzany jest aktualny czas w domu, w którym znajduje się telewizor.
- Działanie – światła w pomieszczeniu, w którym znajduje się telewizor, zostaną przyciemnione.
Automatyzacja zostanie aktywowana po włączeniu telewizora w pomieszczeniu, ale zostanie wykonana tylko wtedy, gdy zostanie spełniony warunek „czas między zachodem a wschodem słońca”.
Oprócz podstawowej struktury automatyzacje w interfejsach Home API zawierają też metadane, takie jak nazwa i opis, które mogą być używane do identyfikowania ich przez deweloperów i użytkowników.
Węzły
W interfejsach Home API logiczna struktura automatyzacji składa się z węzłów. Węzły to abstrakcyjne jednostki wielokrotnego użytku, które reprezentują zachowania jednostek lub przepływy wykonania. Każdy węzeł może mieć zmienne wejściowe i wyjściowe, które mogą być używane przez inne węzły.
| Węzeł | Typ węzła | Implementacja w języku Kotlin | Opis |
|---|---|---|---|
| Starter | Behawioralne |
StarterNodeDsl
|
Uruchamia automatyzację, gdy zmieni się stan cechy (dowolny atrybut). |
| StateReader | Behawioralne |
StateReaderNodeDsl
|
Odczytuje atrybut cechy i umożliwia przechwytywanie jego wartości do użycia w węzłach warunków. |
| Działanie | Behawioralne |
ActionNodeDsl
|
Wywołuje polecenia atrybutów. |
| Sekwencyjna | Przebieg wykonania |
SequentialFlow
|
Wykonuje zagnieżdżone węzły działań po kolei. Jest to domyślne działanie. |
| Równoległe | Przebieg wykonania |
ParallelFlow
|
Wykonuje zagnieżdżone węzły działań równolegle. |
| Warunek | Przebieg wykonania |
ConditionNodeDsl
|
Warunkowo zmieniaj przepływ wykonania na podstawie oceny wyrażeń logicznych. Warunki mogą być powiązane z początkiem rutyny (warunki specyficzne dla początku rutyny) lub być globalne (dotyczyć wszystkich początków rutyny). |
| Wybierz | Przebieg wykonania |
SelectFlow
|
Umożliwia aktywowanie automatyzacji przez więcej niż 1 element uruchamiający. |
| Wyrażenie | Wartość |
Expression
|
Może to być wartość atrybutu cechy, stała lub wartość literału i musi zwracać listę, liczbę, wartość logiczną lub ciąg znaków. |
Węzły behawioralne
Węzły takie jak polecenia inicjujące i działania to węzły behawioralne. Elementy uruchamiające 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 cechami urządzenia i stanem cechy wyjściowej, aby można było ich używać jako danych wejściowych w innych węzłach.
Węzły przepływu wykonania
Niektóre węzły reprezentują przepływy wykonywania, 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 przepływ sekwencyjny może zawierać węzły, które są wykonywane w kolejności sekwencyjnej. Zwykle są to polecenie inicjujące, warunek i działanie.
Przepływ równoległy może mieć wiele węzłów działań wykonywanych w tym samym czasie, np. włączanie wielu świateł jednocześnie. Węzły w przepływie równoległym nie zostaną wykonane, dopóki nie zostaną ukończone wszystkie gałęzie tego przepływu.
Innym typem przepływu wykonania jest przepływ warunkowy, który może zmieniać przepływ wykonania na podstawie oceny wyrażenia.
Możesz na przykład mieć automatyzację, która wykonuje działanie w zależności od tego, czy jest noc. Węzeł warunku sprawdza porę dnia, a następnie wybiera odpowiednią ścieżkę wykonania na podstawie tej oceny.
Przepływ wyboru przydaje się, gdy chcesz mieć więcej niż 1 element początkowy, który może aktywować automatyzację. Jeśli w select przepływie umieścisz co najmniej 2 inicjatory, dowolny z nich może aktywować automatyzację.
Możesz na przykład utworzyć automatyzację, która opuszcza rolety o zachodzie słońca, gdy temperatura wzrośnie powyżej określonego progu lub gdy jasność przekroczy określony próg. Każdy z tych scenariuszy jest obsługiwany przez 3 osobne moduły początkowe, a wszystkie 3 są zawarte w select.
Zagnieżdżone przepływy
W przypadku złożonych automatyzacji węzły przepływu wykonania mogą być też zagnieżdżone. Możesz na przykład mieć przepływ sekwencyjny, który wykonuje przepływ równoległy.
Węzły DSL można zagnieżdżać i łączyć na różne sposoby, aby dostosować je do konkretnych potrzeb, zgodnie z ograniczeniami podanymi w tabeli poniżej. Kolumna Builder zawiera link do dokumentacji bezpiecznego pod względem typów narzędzia do tworzenia w Kotlinie, w której znajdziesz szczegółowe informacje o tym, co można stosować w poszczególnych typach węzłów.
| Węzeł | Może zawierać te typy węzłów i dane: | Musi znajdować się w jednym z tych typów węzłów: |
|---|---|---|
| Starter | Wyrażenie | Wybierz opcję Sekwencyjne. |
| ManualStarter | Wybierz opcję Sekwencyjne. | |
| StateReader | Wyrażenie (zwykle składające się z wartości atrybutu cechy) | Działanie, Warunek |
| Działanie | Polecenie, element, wyrażenie | Równoległe, Wybierz, Sekwencyjne |
| Sekwencyjna | Równoległe, Wybierz, Sekwencyjne | |
| Równoległe | Działanie | Sekwencyjny |
| Warunek | Wyrażenie | Równoległe, sekwencyjne |
| Wybierz | Condition, Sequential, Starter, ManualStarter | Sekwencyjny i musi być pierwszym węzłem w procesie. |
DSL automatyzacji
W interfejsach Home API automatyzacje są definiowane za pomocą języka DSL (Domain-Specific Language) automatyzacji. DSL automatyzacji jest zaimplementowany jako Kotlin DSL (język specyficzny dla domeny) z użyciem bezpiecznych pod względem typów konstruktorów Kotlin i został zaprojektowany specjalnie do definiowania szablonów automatyzacji.
Gdy automatyzacja jest kompilowana, bezpieczne pod względem typów konstruktory Kotlin generują klasy danych Kotlin, które są następnie serializowane do JSON-a bufora protokołu używanego do wykonywania wywołań usług automatyzacji Google.
Język DSL automatyzacji upraszcza i usprawnia proces tworzenia automatyzacji. Korzysta on natywnie z tego samego modelu danych, który jest używany w interfejsie Device API w przypadku Matter standardowych cech i smart home cech.
Język DSL automatyzacji określa też logikę automatyzacji w kategoriach abstrakcyjnych typów urządzeń, a nie konkretnych instancji urządzeń znajdujących się w domu użytkownika. Umożliwia deweloperowi podawanie parametrów wejściowych, które mogą być używane w czasie działania programu do określania rzeczywistych instancji urządzeń, a także innych ważnych wartości parametrów.
Składnia DSL jest podobna do składni języka Kotlin i równie bezpieczna pod względem typów, ale automatyzacja napisana w języku DSL automatyzacji jest prostsza i bardziej zwięzła niż ta sama automatyzacja napisana w czystym języku Kotlin.
Przykład
Poniżej znajdziesz przykład automatyzacji, która włącza urządzenie. Jest ona napisana w języku DSL automatyzacji:
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 prosta: gdy włącza się device1, czyli lampa (atrybut onOff zmienia się na true), wysyła polecenie on(), aby włączyć device2.
Automatyzacja korzysta z węzła sequential, co oznacza, że węzły będą uruchamiane w kolejności sekwencyjnej.
W węźle sequential znajdują się węzły dotyczące zachowań, takie jak starter, condition i action. Dane wyjściowe węzła starter są przypisywane do zmiennej, która jest używana w węźle condition.