Panduan DSL iOS untuk otomatisasi yang kompleks

DSL Otomatisasi dapat digunakan untuk membuat otomatisasi yang lebih kompleks daripada yang dibahas dalam Panduan DSL - otomatisasi dasar di iOS.

Berurutan dengan beberapa tindakan

Berurutan dengan beberapa tindakan

Otomatisasi dapat melakukan lebih dari satu hal. Misalnya, sebagai pengganti node action tunggal, Anda dapat memiliki beberapa node action, yang berjalan dalam urutan berurutan:

import GoogleHomeSDK
import GoogleHomeTypes

automation (
...
) {

  starter(...)
  condition {...}
  action {...}
  action {...}
  action {...}

}

Berurutan dengan beberapa tindakan paralel

Berurutan dengan beberapa tindakan paralel

Jika Anda menempatkan beberapa node action dalam node parallel, tindakan akan dieksekusi secara bersamaan.

import GoogleHomeSDK
import GoogleHomeTypes

automation (
...
) {

  starter(...)
  condition {...}
  parallel {
    action {...}
    action {...}
    action {...}
  }

}

Jika ada node action di node sequential yang muncul setelah node parallel, node tersebut akan menunggu untuk dieksekusi hingga semua node dalam node parallel selesai dieksekusi.

Keterlambatan

Anda dapat memperkenalkan jeda dalam otomatisasi menggunakan metode delay(for:), yang menggunakan argumen Duration yang merepresentasikan durasi jeda sebelum melanjutkan eksekusi. Durasi jeda dapat sesingkat lima detik atau selama 24 jam.

Misalnya, untuk mengalihkan lampu empat kali dengan jeda lima detik di antara setiap pengalihan:

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() }
}

Peredaman pemicu

Penekanan pemicu adalah kemampuan yang memungkinkan otomatisasi Anda mengabaikan starter selama jangka waktu tertentu setelah peristiwa pemicu awal. Misalnya, jika otomatisasi memiliki starter yang dipicu oleh deteksi gerakan, dan jika Anda menentukan durasi penekanan pemicu selama lima menit, maka saat starter dipicu, starter tidak akan dipicu lagi selama lima menit berikutnya. Hal ini mencegah otomatisasi dipicu berulang kali dengan cepat.

Untuk menerapkan penekanan pemicu ke otomatisasi, gunakan kata kunci suppress(for:) dengan argumen Duration yang menunjukkan berapa lama harus menunggu sebelum merespons pemicu berikutnya. Durasi peniadaan dapat berkisar dari lima detik hingga 24 jam.

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() }
}

Perhatikan bahwa penekanan pemicu memengaruhi semua starters dalam otomatisasi yang mendahului Suppression.

Menetapkan atribut sifat dalam tindakan

Untuk menetapkan nilai atribut ciri:

  1. Buat node update dalam node action, termasuk trait yang relevan sebagai argumen ke node update:
    action(deviceReference, deviceType) {
      update(trait) {
    
      }
    }
    
  2. Dalam node update, untuk setiap atribut yang akan diubah, gunakan fungsi mutator, dan teruskan nilai baru. Untuk membentuk nama fungsi mutator:
    1. Menggunakan huruf kapital pada nama atribut
    2. Awali dengan kata set.
    Misalnya, untuk memperbarui atribut yang disebut defaultMoveRate, Anda akan menggunakan fungsi mutator yang disebut setDefaultMoveRate.

Perhatikan bahwa node update dapat memiliki beberapa fungsi mutator. Berikut contoh saat dua atribut diperbarui:

typealias FanDeviceType = Matter.FanDeviceType
typealias FanControlTrait = Matter.FanControlTrait

action(fan, FanDeviceType.self) {
  update(FanControlTrait.self) {
    $0.setFanMode(.on)
  }
}