Karmaşık otomasyonlar için iOS DSL kılavuzu

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

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

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:

  • condition düğümü: İfade false ise 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şul false ise yürütme bir sonraki elseIf dalına, orElse yedek 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:

  1. action düğümü içinde bir update düğümü oluşturun ve ilgili özelliği update düğümüne bağımsız değişken olarak ekleyin:
    action(deviceReference, deviceType) {
      update(trait) {
    
      }
    }
    
  2. update düğü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:
    1. Özellik adını büyük harfle yazın.
    2. Önüne set kelimesini ekleyin.
    Örneğin, defaultMoveRate adlı bir özelliği güncellemek için setDefaultMoveRate adlı 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)
  }
}