คู่มือ DSL ของ iOS

ใช้คำแนะนำต่อไปนี้เพื่อทำความเข้าใจวิธีใช้โหนด DSL การทำงานอัตโนมัติต่างๆ ในการสร้างการทำงานอัตโนมัติ

DSL การทำงานอัตโนมัติทั้งหมดจะอยู่ในautomationโหนดเดียว automation โหนดเป็นขอบเขตระหว่างบริบทภาษา Swift ด้านนอกกับบริบท DSL ที่ฝังอยู่

โฟลว์แบบลำดับ

โฟลว์แบบลำดับเป็นประเภทโฟลว์การทำงานอัตโนมัติเริ่มต้น

ตัวอย่าง DSL แบบลำดับ

ต่อไปนี้คือเทมเพลต DSL ของการทำงานอัตโนมัติพื้นฐานมากที่ใช้โฟลว์ตามลำดับ ซึ่งประกอบด้วยเงื่อนไขเริ่มต้น เงื่อนไข และการดำเนินการ

import GoogleHomeSDK
import GoogleHomeTypes

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

คุณปรับแต่งได้โดยการเพิ่มโหนดเพิ่มเติม

Starter

โหนดเงื่อนไขเริ่มต้นจะกำหนดสถานการณ์เริ่มต้นที่เปิดใช้งานการทำงานอัตโนมัติ เช่น การเปลี่ยนแปลงสถานะหรือค่า การทำงานอัตโนมัติต้องมีตัวเริ่มต้นอย่างน้อย 1 รายการ ไม่เช่นนั้นการตรวจสอบจะไม่สำเร็จ หากต้องการเพิ่มทริกเกอร์มากกว่า 1 รายการในการทำงานอัตโนมัติ คุณต้องใช้โหนด select

การจัดอันดับเริ่มต้นตามแอตทริบิวต์ลักษณะ

เมื่อประกาศโหนดเริ่มต้นที่อิงตามแอตทริบิวต์ลักษณะ ให้ระบุข้อมูลต่อไปนี้

  • อุปกรณ์
  • ประเภทอุปกรณ์ที่ลักษณะเป็นของ
  • ลักษณะ
starter(
  thermostat,
  Matter.TemperatureSensorDeviceType.self,
  Matter.TemperatureMeasurementTrait.self
)

ต้องระบุพารามิเตอร์ประเภทอุปกรณ์เนื่องจากจะช่วยให้คุณระบุประเภทอุปกรณ์ภายในอุปกรณ์ที่การทำงานอัตโนมัติจะกำหนดเป้าหมายได้ เช่น อุปกรณ์อาจประกอบด้วย FanDeviceType และ HeatingCoolingUnitDeviceType ซึ่งทั้ง 2 อย่างมีลักษณะ OnOffTrait การระบุประเภทอุปกรณ์จะช่วยให้ไม่เกิดความคลุมเครือเกี่ยวกับส่วนใดของ อุปกรณ์ที่ทริกเกอร์การทำงานอัตโนมัติ

เงื่อนไขเริ่มต้นตามเหตุการณ์

เมื่อประกาศโหนดเริ่มต้นที่อิงตามเหตุการณ์ ให้ระบุข้อมูลต่อไปนี้

  • อุปกรณ์
  • ประเภทอุปกรณ์ที่ลักษณะเป็นของ
  • กิจกรรม
starter(
  doorbell,
  Google.GoogleDoorbellDeviceType.self,
  Google.DoorbellPressTrait.DoorbellPressedEvent
)

เริ่มต้นโดยอิงตามโครงสร้างและเหตุการณ์ที่มีพารามิเตอร์

เหตุการณ์บางอย่างอาจมีพารามิเตอร์ ดังนั้นคุณจึงต้องรวมพารามิเตอร์เหล่านี้ไว้ในตัวเริ่มต้นด้วย

ตัวอย่างเช่น เงื่อนไขเริ่มต้นนี้ใช้ TimeTraitของ ScheduledEvent เพื่อเปิดใช้งานการทำงานอัตโนมัติที่เวลา 07:00 น.

typealias TimeTrait = Google.TimeTrait

let earlyMorning = starter(
  structure,
  TimeTrait.ScheduledEvent.self
) {
  TimeTrait.ScheduledEvent.clockTime(TimeOfDay(hours: 7, minutes: 0))
}

Manual starter

การเริ่มต้นด้วยตนเองคือการเริ่มต้นประเภทพิเศษที่ช่วยให้ผู้ใช้เรียกใช้การทำงานอัตโนมัติด้วยตนเองได้

เมื่อประกาศตัวแปรเริ่มต้นด้วยตนเอง

  • อย่าระบุลักษณะหรือประเภทอุปกรณ์
  • ระบุองค์ประกอบ UI ที่เรียกใช้ Automation.execute()

เมื่อวางทริกเกอร์ที่กำหนดเองในselectโฟลว์พร้อมกับทริกเกอร์อื่น ทริกเกอร์ที่กำหนดเองจะลบล้างทริกเกอร์อื่น

select {
  manualStarter()
  starter(
    thermostat,
    Matter.TemperatureSensorDeviceType.self,
    Matter.TemperatureMeasurementTrait.self
  )
}

โปรดทราบว่าระบบจะประเมินconditionโหนดที่ตามหลังตัวเริ่มต้นที่กำหนดเอง และอาจบล็อกการดำเนินการของระบบอัตโนมัติ ทั้งนี้ขึ้นอยู่กับcondition นิพจน์

การแยกทริกเกอร์ที่กำหนดเองออกจากทริกเกอร์แบบมีเงื่อนไข

วิธีหนึ่งในการจัดโครงสร้างการทำงานอัตโนมัติเพื่อให้โหนด condition ไม่บล็อกการทำงานอัตโนมัติที่เปิดใช้งานด้วยเงื่อนไขเริ่มต้นด้วยตนเองคือการใส่เงื่อนไขเริ่มต้นอื่นๆ ในโฟลว์ตามลำดับที่แยกต่างหากพร้อมกับ condition ของโฟลว์นั้น

import GoogleHomeSDK
import GoogleHomeTypes

automation (
...
) {

  select {
    sequential {
      starter(...)
      condition {...}
    }
    sequential {
      manualStarter()
    }
  }
  action {...}

}

อ้างอิงค่าของแอตทริบิวต์

หากต้องการใช้ค่าของแอตทริบิวต์ในนิพจน์ ให้ใช้ไวยากรณ์ต่อไปนี้

หากใช้ stateReader ให้ทำดังนี้

typealias TimeTrait = Google.TimeTrait

let time = stateReader(structure, TimeTrait.self)
time
let currTime = time.currentTime

หากใช้ starter ให้ทำดังนี้

typealias LaundryWasherDeviceType = Matter.LaundryWasherDeviceType
typealias OnOffTrait = Google.OnOffTrait

let starterNode = starter(device1, LaundryWasherDeviceType.self, OnOffTrait.self)
starterNode
condition {
  starterNode.onOff.equals(true)
}

โหนดและนิพจน์เงื่อนไข

โหนดเงื่อนไขแสดงถึงจุดตัดสินใจที่กำหนดว่าการทำงานอัตโนมัติจะดำเนินต่อไปหรือไม่ การทำงานอัตโนมัติมีโหนด condition ได้หลายรายการ หากนิพจน์ของโหนด condition ใดก็ตามประเมินเป็น false การดำเนินการของ การทำงานอัตโนมัติทั้งหมดจะสิ้นสุดลง

ภายในโหนด condition คุณสามารถรวมเกณฑ์เงื่อนไขหลายรายการได้โดยใช้ตัวดำเนินการต่างๆ ตราบใดที่นิพจน์ประเมินเป็นค่าบูลีนเดียว หากค่าที่ได้เป็น true แสดงว่าตรงตามเงื่อนไขและระบบจะดำเนินการอัตโนมัติกับโหนดถัดไป ต่อไป หากเป็น false ระบบจะหยุดการดำเนินการอัตโนมัติ ณ จุดนั้น

นิพจน์จะสร้างขึ้นในลักษณะเดียวกับนิพจน์ใน Swift และอาจมี ค่าดั้งเดิม เช่น ตัวเลข อักขระ สตริง และบูลีน รวมถึง ค่า Enum การจัดกลุ่มนิพจน์ย่อยด้วยวงเล็บช่วยให้คุณควบคุม ลำดับการประเมินนิพจน์ย่อยได้

ต่อไปนี้คือตัวอย่างของ condition ซึ่งรวมนิพจน์ย่อยหลายรายการไว้ในนิพจน์เดียว

condition {
  let exp1 = starterNode.lockState.equals(.unlocked)
  let exp2 = stateReaderNode.lockState.equals(true)
  let exp3 = occupancySensingDevice.occupied.notEquals(0)
  (exp1.and(exp2)).or(exp3)
}

คุณอาจอ้างอิงค่าของลักษณะที่เข้าถึงผ่านเงื่อนไขเริ่มต้นได้

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

อีกวิธีในการอ้างอิงค่าแอตทริบิวต์ลักษณะในโหนด condition คือใช้โหนด stateReader

โดยให้บันทึกค่าแอตทริบิวต์ลักษณะในโหนด stateReader ก่อน stateReader ใช้ structure และลักษณะเป็นอาร์กิวเมนต์

typealias ActivatedCarbonFilterMonitoringTrait = Matter.ActivatedCarbonFilterMonitoringTrait

let filterMonitoringState = stateReader(structure, ActivatedCarbonFilterMonitoringTrait.self)

จากนั้นอ้างอิง stateReader ในโหนด condition ดังนี้

condition {
filterMonitoringState.changeIndication.equals(.warning)
}

การใช้โอเปอเรเตอร์เปรียบเทียบ และ โอเปอเรเตอร์เชิงตรรกะ สามารถใช้ stateReaders หลายรายการในโหนด 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)
}

ระยะเวลาของเงื่อนไข

นอกเหนือจากนิพจน์บูลีนในเงื่อนไขแล้ว คุณยังระบุกรอบเวลา ที่นิพจน์ต้องเป็นจริงเพื่อเรียกใช้การทำงานอัตโนมัติได้ด้วย ตัวอย่างเช่น คุณกำหนดเงื่อนไขให้ทำงานได้ก็ต่อเมื่อไฟเปิดอยู่เป็นเวลา 10 นาที

condition(for: .seconds(600)) {
lightStateReader.onOff.equals(true)
}

ระยะเวลาอาจอยู่ในช่วง 1-30 นาที

โหนดการดำเนินการ

โหนดการดำเนินการคือที่ที่การทำงานของการทำงานอัตโนมัติเกิดขึ้น ในตัวอย่างนี้ การดำเนินการจะเรียกใช้คำสั่ง AssistantBroadcastTrait's broadcast()

action(speaker, SpeakerDeviceType.self) {
  Google.AssistantBroadcastTrait.broadcast(msg: "Oven Cycle Complete")
}