Gunakan panduan berikut untuk memahami cara berbagai node DSL Otomatisasi dapat digunakan untuk membuat otomatisasi.
Semua DSL otomatisasi ditempatkan dalam satu node automation
. Node
automation
membentuk batas antara konteks bahasa Swift
luar dan konteks DSL tersemat.
Alur berurutan
Alur berurutan adalah jenis alur otomatisasi default.
Berikut adalah template DSL Otomatisasi yang sangat mendasar yang menggunakan alur berurutan yang terdiri dari pemicu, kondisi, dan tindakan:
import GoogleHomeSDK
import GoogleHomeTypes
automation (
...
) {
starter(...)
condition {...}
action {...}
}
Hal ini dapat ditingkatkan dengan menambahkan node tambahan.
Starter
Node pemicu menentukan keadaan awal yang mengaktifkan otomatisasi. Misalnya, perubahan status atau nilai. Otomatisasi harus memiliki setidaknya satu
pemicu, jika tidak, validasi akan gagal. Untuk menambahkan lebih dari satu
pemicu ke otomatisasi, Anda harus menggunakan node select
.
Pemicu berdasarkan atribut sifat
Saat mendeklarasikan node awal yang didasarkan pada atribut sifat, tentukan:
- perangkat
- jenis perangkat tempat sifat berada
- sifat
starter(
thermostat,
Matter.TemperatureSensorDeviceType.self,
Matter.TemperatureMeasurementTrait.self
)
Parameter jenis perangkat diperlukan karena memungkinkan Anda menentukan jenis
perangkat dalam perangkat yang dialamatkan otomatisasi. Misalnya, perangkat mungkin
terdiri dari
FanDeviceType
dan
HeatingCoolingUnitDeviceType
,
yang keduanya berisi
sifat
OnOffTrait
. Dengan menentukan jenis perangkat, tidak ada ambiguitas tentang bagian
perangkat mana yang memicu otomatisasi.
Pemicu berdasarkan peristiwa
Saat mendeklarasikan node awal yang didasarkan pada peristiwa, tentukan:
- perangkat
- jenis perangkat tempat sifat berada
- peristiwa
starter(
doorbell,
Google.GoogleDoorbellDeviceType.self,
Google.DoorbellPressTrait.DoorbellPressedEvent
)
Pemicu berdasarkan struktur dan peristiwa, dengan parameter
Beberapa peristiwa dapat memiliki parameter, sehingga parameter ini juga perlu disertakan dalam pemicu.
Misalnya, pemicu ini menggunakan
ScheduledEvent
TimeTrait
untuk mengaktifkan otomatisasi pada pukul 07.00:
typealias TimeTrait = Google.TimeTrait
let earlyMorning = starter(
structure,
TimeTrait.ScheduledEvent.self
) {
TimeTrait.ScheduledEvent.clockTime(TimeOfDay(hours: 7, minutes: 0))
}
Pemicu manual
Pemicu manual adalah jenis pemicu khusus yang memungkinkan pengguna menjalankan otomatisasi secara manual.
Saat mendeklarasikan pemicu manual:
- Jangan menentukan karakteristik atau jenis perangkat.
- Berikan elemen UI yang memanggil
Automation.execute()
.
Saat menempatkan pemicu manual dalam alur select
bersama dengan pemicu lain, pemicu manual akan menggantikan pemicu lain:
select {
manualStarter()
starter(
thermostat,
Matter.TemperatureSensorDeviceType.self,
Matter.TemperatureMeasurementTrait.self
)
}
Perhatikan bahwa setiap node condition
yang mengikuti pemicu manual akan dievaluasi,
dan dapat memblokir eksekusi otomatisasi, bergantung pada ekspresi
condition
.
Salah satu cara untuk menyusun otomatisasi agar node condition
tidak memblokir
otomatisasi yang diaktifkan dengan pemicu manual adalah dengan menempatkan pemicu lain
dalam alur berurutan terpisah beserta condition
-nya:
import GoogleHomeSDK
import GoogleHomeTypes
automation (
...
) {
select {
sequential {
starter(...)
condition {...}
}
sequential {
manualStarter()
}
}
action {...}
}
Mereferensikan nilai atribut
Untuk menggunakan nilai atribut dalam ekspresi, gunakan sintaksis berikut.
Dengan stateReader
:
typealias TimeTrait = Google.TimeTrait
let time = stateReader(structure, TimeTrait.self)
time
let currTime = time.currentTime
Dengan starter
:
typealias LaundryWasherDeviceType = Matter.LaundryWasherDeviceType
typealias OnOffTrait = Google.OnOffTrait
let starterNode = starter(device1, LaundryWasherDeviceType.self, OnOffTrait.self)
starterNode
condition {
starterNode.onOff.equals(true)
}
Node dan ekspresi kondisi
Node kondisi mewakili titik keputusan yang menentukan apakah
otomatisasi akan dilanjutkan atau tidak. Otomatisasi dapat memiliki beberapa node condition
.
Jika ekspresi node condition
dievaluasi menjadi false
, eksekusi seluruh otomatisasi akan berakhir.
Dalam node condition
, Anda dapat menggabungkan beberapa kriteria kondisi menggunakan
berbagai operator, selama
ekspresi dievaluasi menjadi satu nilai boolean. Jika nilai yang dihasilkan adalah
true
, kondisi terpenuhi dan otomatisasi akan melanjutkan eksekusi
node berikutnya. Jika false
, otomatisasi akan berhenti dieksekusi pada saat itu.
Ekspresi dibentuk mirip dengan ekspresi di Swift, dan dapat berisi nilai primitif seperti angka, karakter, string, dan boolean, serta nilai Enum. Mengelompokkan subekspresi dengan tanda kurung memungkinkan Anda mengontrol urutan evaluasinya.
Berikut adalah contoh condition
yang menggabungkan beberapa subekspresi menjadi
satu ekspresi:
condition {
let exp1 = starterNode.lockState.equals(.unlocked)
let exp2 = stateReaderNode.lockState.equals(true)
let exp3 = occupancySensingDevice.occupied.notEquals(0)
(exp1.and(exp2)).or(exp3)
}
Anda dapat mereferensikan nilai sifat yang diakses melalui pemicu:
typealias OnOffTrait = Matter.OnOffTrait
let starterNode = starter(device, OnOffTrait.self)
starterNode
condition {
starterNode.onOff.equals(true)
}
val starterNode = starter<_>(device, OnOff)
condition() { expression = starterNode.onOff equals true }
stateReader
Cara lain untuk mereferensikan nilai atribut sifat dalam node condition
adalah dengan
node stateReader
.
Untuk melakukannya, tangkap nilai atribut sifat terlebih dahulu di node stateReader
. stateReader
menggunakan structure
dan sifat sebagai argumen:
typealias ActivatedCarbonFilterMonitoringTrait = Matter.ActivatedCarbonFilterMonitoringTrait
let filterMonitoringState = stateReader(structure, ActivatedCarbonFilterMonitoringTrait.self)
Kemudian, referensikan stateReader
di node condition
:
condition {
filterMonitoringState.changeIndication.equals(.warning)
}
Dengan menggunakan perbandingan
dan
operator logis,
beberapa stateReaders
dapat digunakan di node condition
:
typealias ArmDisarm = Google.ArmDisarmTrait
typealias DoorLockDevice = Matter.DoorLockDeviceType
typealias DoorLock = Matter.DoorLockTrait
let armState = stateReader(doorLock, DoorLockDevice.self, ArmDisarm )
let doorLockState = stateReader(doorLock, DoorLockDevice.self, DoorLock)
armState
doorLockState
condition {
let exp1 = armState.armState
let exp2 = doorLockState.lockState
exp1.and(exp2)
}
Durasi kondisi
Selain ekspresi boolean dalam kondisi, Anda dapat menentukan jangka waktu saat ekspresi harus benar untuk menjalankan otomatisasi. Misalnya, Anda dapat menentukan kondisi yang hanya diaktifkan jika lampu telah menyala selama sepuluh menit.
condition(for: .seconds(600)) {
lightStateReader.onOff.equals(true)
}
Durasinya dapat berkisar dari satu hingga 30 menit.
Node tindakan
Node tindakan adalah tempat kerja otomatisasi berlangsung.
Dalam contoh ini, tindakan memanggil
perintah
broadcast()
AssistantBroadcastTrait
:
action(speaker, SpeakerDeviceType.self) {
Google.AssistantBroadcastTrait.broadcast(msg: "Oven Cycle Complete")
}