Otomasyon DSL'si, DSL kılavuzu - iOS'te temel otomasyonlar bölümünde ele alınanlardan daha karmaşık otomasyonlar oluşturmak için kullanılabilir.
Birden fazla işlem içeren sıralı işlemler
Bir otomasyon birden fazla işlem yapabilir. Örneğin, tek bir action düğümü yerine, sırayla çalışan birden fazla action düğümünüz olabilir:
import GoogleHomeSDK
import GoogleHomeTypes
automation (
...
) {
starter(...)
condition {...}
action {...}
action {...}
action {...}
}
Birden fazla paralel işlem içeren sıralı işlemler
Bir parallel düğümüne birden fazla action düğümü yerleştirirseniz işlemler eşzamanlı olarak yürütülür.
import GoogleHomeSDK
import GoogleHomeTypes
automation (
...
) {
starter(...)
condition {...}
parallel {
action {...}
action {...}
action {...}
}
}
sequential düğümünde parallel düğümünden sonra gelen action düğümleri varsa bu düğümler, parallel düğümündeki tüm düğümlerin yürütülmesi tamamlanana kadar yürütülmeyi bekler.
Koşullu yürütme
Varsayılan olarak otomasyonlar, düğümleri sırayla veya paralel olarak yürütür. Çalışma zamanı koşullarına göre farklı işlemler veya yollar yürütmek için koşullu dallanma mantığına ihtiyacınız varsa koşullu kontrol akışı DSL blokları kullanılarak oluşturulan if-then-else ifadelerini kullanın:
ifThen,
elseIf,
ve
orElse.
Standart bir condition düğümü tüm otomasyonu kısıtlarken (koşul false olarak değerlendirilirse otomasyon yürütmeyi hemen sonlandırır) ifThen blokları, dallanma kontrol akışını etkinleştirir:
conditiondüğümü: İfadefalseise otomasyonun tamamının (veya mevcut yürütme yolunun) yürütülmesini durdurur.ifThen/elseIf/orElse: Koşulları sırayla değerlendirir. Bir koşulfalseise yürütme bir sonrakielseIfdalına,orElseyedek dalına geçer veya hiçbir koşul karşılanmazsa otomasyondaki sonraki düğümlere devam eder.
Bir koşula göre işlem yürütme
ifThen bloğu, koşullu bir ifadeyi değerlendirir. İfade true olarak değerlendirilirse blok içinde iç içe yerleştirilmiş DSL işlemleri veya düğümleri yürütülür. false olarak değerlendirilirse işlemler atlanır ve otomasyon, sıralı akıştaki sonraki düğümlere devam eder.
Otomasyondaki sonraki düğümleri engellemeden veya sonlandırmadan yalnızca koşullu olarak bir işlem gerçekleştirmek istediğinizde bağımsız bir ifThen bloğu kullanabilirsiniz:
// When a door opens, turn on the light only if it is off,
// and always broadcast an announcement.
typealias ContactSensorDevice = Matter.ContactSensorDeviceType
typealias BooleanStateTrait = Matter.BooleanStateTrait
typealias DimmableLightDevice = Matter.DimmableLightDeviceType
typealias OnOffTrait = Matter.OnOffTrait
automation {
let contactState = starter(
contactSensor,
ContactSensorDevice.self,
BooleanStateTrait.self
)
let lightState = stateReader(
light,
DimmableLightDevice.self,
OnOffTrait.self
)
contactState
lightState
condition {
// Door opened (contact sensor open)
contactState.stateValue.equals(false)
}
// Conditionally turn on the light if it's off
ifThen(lightState.onOff.equals(false)) {
action(light, DimmableLightDevice.self) {
OnOffTrait.on()
}
}
// Continue executing subsequent actions in the sequential flow
action(structure) {
Google.AssistantBroadcastTrait.broadcast(msg: "The door was opened.")
}
}
Bir koşula göre farklı işlemler yürütme
Bir koşul doğru olduğunda bir işlem grubunu, yanlış olduğunda ise alternatif bir işlem grubunu yürütmek için isteğe bağlı .orElse { ... } bloğunu ifThen(...) { ... } bloğundan sonra zincirleyin:
// When the door is unlocked, turn on the entryway light if it is off;
// otherwise, broadcast a welcome message.
typealias DoorLockDevice = Matter.DoorLockDeviceType
typealias DoorLockTrait = Matter.DoorLockTrait
typealias DimmableLightDevice = Matter.DimmableLightDeviceType
typealias OnOffTrait = Matter.OnOffTrait
automation {
let doorLockEvent = starter(
doorLock,
DoorLockDevice.self,
DoorLockTrait.LockOperationEvent.self
)
let lightState = stateReader(
light,
DimmableLightDevice.self,
OnOffTrait.self
)
doorLockEvent
lightState
condition {
doorLockEvent.lockOperationType.equals(.unlock)
}
ifThen(lightState.onOff.equals(false)) {
action(light, DimmableLightDevice.self) {
OnOffTrait.on()
}
}.orElse {
action(structure) {
Google.AssistantBroadcastTrait.broadcast(msg: "Welcome home!")
}
}
}
Birden fazla koşulu sırayla zincirleme
Birden fazla koşulu sırayla değerlendirmek için bir veya daha fazla isteğe bağlı .elseIf(...) { ... } bloğunu zincirleyebilirsiniz. Koşulu true olarak değerlendirilen ilk dal yürütülür ve kalan tüm dallar atlanır. Koşullardan hiçbiri true olarak değerlendirilmezse isteğe bağlı bir .orElse { ... } bloğu yürütülür (sağlanmışsa):
// Adjust climate controls based on room temperature changes.
typealias TemperatureSensorDeviceType = Matter.TemperatureSensorDeviceType
typealias TemperatureMeasurementTrait = Matter.TemperatureMeasurementTrait
typealias ThermostatDeviceType = Matter.ThermostatDeviceType
typealias SimplifiedThermostatTrait = Google.SimplifiedThermostatTrait
typealias FanDeviceType = Matter.FanDeviceType
typealias OnOffTrait = Matter.OnOffTrait
automation {
let tempStarter = starter(
tempSensor,
TemperatureSensorDeviceType.self,
TemperatureMeasurementTrait.self
)
tempStarter
// If temperature is high (>= 28°C / 2800 mC), switch thermostat to Cool mode
ifThen(tempStarter.measuredValue.greaterThanOrEquals(2800)) {
action(thermostat, ThermostatDeviceType.self) {
SimplifiedThermostatTrait.setSystemMode(systemMode: .cool)
}
}.elseIf(tempStarter.measuredValue.lessThan(1800)) {
// If temperature is low (< 18°C / 1800 mC), switch to Heat mode
action(thermostat, ThermostatDeviceType.self) {
SimplifiedThermostatTrait.setSystemMode(systemMode: .heat)
}
}.orElse {
// Otherwise, turn on the fan
action(fan, FanDeviceType.self) {
OnOffTrait.on()
}
}
}
İç içe yerleştirilmiş koşullu akışlar
Koşullu bloklar diğer ifThen, elseIf veya orElse bloklarının içine yerleştirilebilir ve parallel, delay(for:) ve stateReader düğümleriyle birleştirilebilir.
ifThen, elseIf ve orElse blokları, içeriklerini sıralı akışlar olarak yürütür. Her dalın içine action, stateReader, parallel, delay(for:) ve iç içe yerleştirilmiş ifThen blokları dahil olmak üzere sıralı düğümler yerleştirebilirsiniz.
Gecikmeler
Yürütmeye devam etmeden önce ne kadar süre duraklatılacağını temsil eden bir Duration bağımsız değişkeni alan delay(for:) yöntemini kullanarak otomasyonlarınıza duraklatma ekleyebilirsiniz. Duraklatma süresi beş saniye kadar kısa veya 24 saat kadar uzun olabilir.
Örneğin, bir ışığı her açma/kapatma arasında beş saniyelik bir duraklamayla dört kez açıp kapatmak için:
typealias OnOffLightDevice = Matter.OnOffLightDeviceType
typealias OnOffTrait = Matter.OnOffTrait
sequential {
action(light, OnOffLightDevice.self) { OnOffTrait.toggle() }
delay(for:.seconds(5))
action(light, OnOffLightDevice.self) { OnOffTrait.toggle() }
delay(for:.seconds(5))
action(light, OnOffLightDevice.self) { OnOffTrait.toggle() }
delay(for:.seconds(5))
action(light, OnOffLightDevice.self) { OnOffTrait.toggle() }
}
Tetikleyici engelleme
Tetikleyici engelleme, otomasyonunuzun ilk tetikleyici etkinlikten sonra belirli bir süre boyunca starter yok saymasını sağlayan bir özelliktir. Örneğin, otomasyonda hareket algılama tarafından tetiklenen bir starter varsa ve tetikleyici engelleme süresini beş dakika olarak belirlerseniz starter tetiklendiğinde sonraki beş dakika boyunca tekrar tetiklenmez. Bu, otomasyonun hızlı bir şekilde tekrar tekrar tetiklenmesini önler.
Otomasyonunuza tetikleyici engelleme uygulamak için
suppress(for:)
anahtar kelimesini, sonraki tetikleyicilere yanıt vermeden önce ne kadar bekleneceğini temsil eden bir
Duration
bağımsız değişkeniyle kullanın.
Engelleme süresi beş saniye kadar kısa veya 24 saat kadar uzun olabilir.
typealias OccupancySensorDevice = Matter.OccupancySensorDeviceType
typealias OnOffLightDevice = Matter.OnOffLightDeviceType
typealias MotionDetectionTrait = Google.MotionDetectionTrait
typealias OnOffTrait = Matter.OnOffTrait
automation {
let starterNode = starter(device, OccupancySensorDevice.self, MotionDetectionTrait.self)
starterNode
suppress(for: .seconds(30 * 60)) // 30 minutes
action(light, OnOffLightDevice.self) { OnOffTrait.toggle() }
}
Tetikleyici engellemenin, otomasyonda Suppression işleminden önce gelen tüm starters işlemlerini etkilediğini unutmayın.
Yürütme sayısını sınırlama
Bir otomasyonun çalıştırılmasına izin verilen sayıyı sınırlayabilirsiniz.
Örneğin, gün içinde evde olmadığınızda elektrikli süpürgeyi çalıştıran tek seferlik bir otomasyon ayarlayabilirsiniz.
Bunun için otomasyonun maxExecutionCount meta veri alanını ayarlayın.
Aşağıdaki örnek, yalnızca bir kez çalıştırılabilen bir otomasyondur:
import GoogleHomeSDK
import GoogleHomeTypes
typealias RoboticVacuumCleanerDevice = Matter.RoboticVacuumCleanerDeviceType
typealias RvcRunModeTrait = Matter.RvcRunModeTrait
typealias AreaPresenceStateTrait = Google.AreaPresenceStateTrait
let draftAutomation = automation(
name: "Vacuum home away",
description: "Run the vacuum once when everyone is away.",
maxExecutionCount: 1
) {
let homeAwayState = starter(structure, AreaPresenceStateTrait.self)
homeAwayState
condition {
homeAwayState.presenceState.equals(.presenceStateVacant)
}
action(vacuum, RoboticVacuumCleanerDevice.self) {
RvcRunModeTrait.changeToMode(newMode: 1)
}
}
Otomasyon, son kez çalıştırılıp maxExecutionCount değerine ulaşıldıktan sonra hemen silinir. Otomasyonun geçmiş girişi, automation_id dahil olmak üzere Google Home app (GHA) Etkinlik sekmesinde kalır.
Bir işlemde özellik niteliklerini ayarlama
Bir özellik niteliğinin değerini ayarlamak için:
actiondüğümü içinde birupdatedüğümü oluşturun ve ilgili özelliğiupdatedüğümüne bağımsız değişken olarak ekleyin:action(deviceReference, deviceType) { update(trait) { } }updatedüğümünde, değiştirilecek her özellik için bir mutator işlevi kullanın ve yeni değeri bu işleve iletin. Mutatör işlevinin adını oluşturmak için:- Özellik adını büyük harfle yazın.
- Önüne
setkelimesini ekleyin.
defaultMoveRateadlı bir özelliği güncellemek içinsetDefaultMoveRateadlı bir mutator işlevi kullanırsınız.
Bir update düğümünün birden fazla mutator işlevi olabileceğini unutmayın. İki özelliğin güncellendiği bir örnek aşağıda verilmiştir:
typealias FanDeviceType = Matter.FanDeviceType
typealias FanControlTrait = Matter.FanControlTrait
action(fan, FanDeviceType.self) {
update(FanControlTrait.self) {
$0.setFanMode(.on)
}
}