ใช้คำแนะนำต่อไปนี้เพื่อทำความเข้าใจวิธีใช้โหนด Automation DSL ต่างๆ เพื่อสร้างการทำงานอัตโนมัติ
Automation DSL ทั้งหมดจะอยู่ในโหนด automation เดียว โหนด automation เป็นขอบเขตระหว่างบริบทภาษา Swift ภายนอกกับบริบท DSL ที่ฝังอยู่
โฟลว์ตามลำดับ
โฟลว์ตามลำดับเป็นประเภทโฟลว์การทำงานอัตโนมัติเริ่มต้น
ต่อไปนี้คือเทมเพลต Automation DSL พื้นฐานมากที่ใช้โฟลว์ตามลำดับซึ่งประกอบด้วยเงื่อนไขเริ่มต้น เงื่อนไข และการดำเนินการ
import GoogleHomeSDK
import GoogleHomeTypes
automation (
...
) {
starter(...)
condition {...}
action {...}
}
คุณปรับแต่งเทมเพลตนี้ได้โดยการเพิ่มโหนดเพิ่มเติม
Starter
โหนด Starter จะกำหนดสถานการณ์เริ่มต้นที่จะเปิดใช้งานการทำงานอัตโนมัติ เช่น การเปลี่ยนแปลงสถานะหรือค่า การทำงานอัตโนมัติต้องมี Starter อย่างน้อย 1 รายการ ไม่เช่นนั้นการตรวจสอบจะล้มเหลว หากต้องการเพิ่ม Starter มากกว่า 1 รายการในการทำงานอัตโนมัติ คุณต้องใช้โหนด select
Starter ที่อิงตามแอตทริบิวต์ลักษณะภาษา
เมื่อประกาศโหนด Starter ที่อิงตามแอตทริบิวต์ลักษณะภาษา ให้ระบุข้อมูลต่อไปนี้
- อุปกรณ์
- ประเภทอุปกรณ์ที่ลักษณะภาษาเป็นของ
- ลักษณะภาษา
starter(
thermostat,
Matter.TemperatureSensorDeviceType.self,
Matter.TemperatureMeasurementTrait.self
)
พารามิเตอร์ประเภทอุปกรณ์จำเป็นต้องระบุเนื่องจากช่วยให้คุณระบุประเภทอุปกรณ์ภายในอุปกรณ์ที่การทำงานอัตโนมัติจะจัดการได้ ตัวอย่างเช่น อุปกรณ์อาจ
ประกอบด้วย
FanDeviceType
และ
HeatingCoolingUnitDeviceType
ซึ่งทั้ง 2 ประเภทมีลักษณะภาษา
OnOffTrait
การระบุประเภทอุปกรณ์จะช่วยให้ทราบได้อย่างชัดเจนว่าส่วนใดของอุปกรณ์เป็นตัวทริกเกอร์การทำงานอัตโนมัติ
Starter ที่อิงตามเหตุการณ์
เมื่อประกาศโหนด Starter ที่อิงตามเหตุการณ์ ให้ระบุข้อมูลต่อไปนี้
- อุปกรณ์
- ประเภทอุปกรณ์ที่ลักษณะภาษาเป็นของ
- เหตุการณ์
starter(
doorbell,
Google.GoogleDoorbellDeviceType.self,
Google.DoorbellPressTrait.DoorbellPressedEvent
)
Starter ที่อิงตามโครงสร้างและเหตุการณ์ พร้อมพารามิเตอร์
เหตุการณ์บางรายการอาจมีพารามิเตอร์ ดังนั้นคุณจึงต้องรวมพารามิเตอร์เหล่านี้ไว้ใน Starter ด้วย
ตัวอย่างเช่น Starter นี้ใช้
TimeTrait's ScheduledEvent
เพื่อเปิดใช้งานการทำงานอัตโนมัติในเวลา 7:00 น.
typealias TimeTrait = Google.TimeTrait
let earlyMorning = starter(
structure,
TimeTrait.ScheduledEvent.self
) {
TimeTrait.ScheduledEvent.clockTime(TimeOfDay(hours: 7, minutes: 0))
}
Starter ที่อิงตามสภาพอากาศ
คุณระบุสภาพอากาศปัจจุบันหรือที่คาดการณ์ไว้ใน Starter ได้โดยใช้ลักษณะภาษา Weather
let weatherState = starter<_>(structure, trait = Weather)
ดูตัวอย่างการทำงานอัตโนมัติ ในหน้าปิดมู่ลี่หากมีแนวโน้มว่าฝนจะตก
Starter แบบกำหนดเอง
Starter แบบกำหนดเองเป็น Starter ประเภทพิเศษที่ช่วยให้ผู้ใช้เรียกใช้การทำงานอัตโนมัติด้วยตนเองได้
เมื่อประกาศ Starter แบบกำหนดเอง ให้ทำดังนี้
- อย่าระบุลักษณะภาษาหรือประเภทอุปกรณ์
- ระบุองค์ประกอบ UI ที่เรียก
Automation.execute()
เมื่อวาง Starter แบบกำหนดเองไว้ในโฟลว์ select พร้อมกับ Starter อื่น Starter แบบกำหนดเองจะลบล้าง Starter อื่น
select {
manualStarter()
starter(
thermostat,
Matter.TemperatureSensorDeviceType.self,
Matter.TemperatureMeasurementTrait.self
)
}
โปรดทราบว่าระบบจะประเมินโหนด condition ใดก็ตามที่อยู่หลัง Starter แบบกำหนดเอง และอาจบล็อกการดำเนินการของการทำงานอัตโนมัติ ทั้งนี้ขึ้นอยู่กับนิพจน์ condition
วิธีหนึ่งในการจัดโครงสร้างการทำงานอัตโนมัติเพื่อให้โหนด condition ไม่บล็อกการทำงานอัตโนมัติที่เปิดใช้งานด้วย Starter แบบกำหนดเองคือการวาง Starter อื่นไว้ในโฟลว์ตามลำดับแยกต่างหากพร้อมกับ condition ของ Starter นั้น
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)
}
คุณอาจอ้างอิงค่าของลักษณะภาษาที่เข้าถึงผ่าน Starter
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")
}