ใช้คำแนะนำต่อไปนี้เพื่อทำความเข้าใจวิธีใช้โหนด DSL ของการทำงานอัตโนมัติแบบต่างๆ เพื่อสร้างการทำงานอัตโนมัติ
DSL ของการทำงานอัตโนมัติทั้งหมดจะอยู่ในโหนด automation เดียว โหนด automation จะสร้างขอบเขตระหว่างบริบทภาษา Swift ภายนอกกับบริบท 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
)
เงื่อนไขเริ่มต้นที่อิงตามโครงสร้างและเหตุการณ์ พร้อมพารามิเตอร์
บางเหตุการณ์อาจมีพารามิเตอร์ ดังนั้นจึงต้องรวมพารามิเตอร์เหล่านี้ไว้ในเงื่อนไขเริ่มต้นด้วย
ตัวอย่างเช่น เงื่อนไขเริ่มต้นนี้ใช้ ScheduledEvent ของ TimeTrait เพื่อเปิดใช้งานการทำงานอัตโนมัติเวลา 07:00 น.
typealias TimeTrait = Google.TimeTrait
let earlyMorning = starter(
structure,
TimeTrait.ScheduledEvent.self
) {
TimeTrait.ScheduledEvent.clockTime(TimeOfDay(hours: 7, minutes: 0))
}
เงื่อนไขเริ่มต้นตามสภาพอากาศ
คุณสามารถระบุสภาพอากาศปัจจุบันหรือที่คาดการณ์ไว้ในเงื่อนไขเริ่มต้นได้โดยใช้ลักษณะสภาพอากาศดังนี้
let weatherState = starter<_>(structure, trait = Weather)
ดูปิดม่านหากมีแนวโน้มว่าฝนจะตกในหน้าตัวอย่างการทำงานอัตโนมัติ
เงื่อนไขเริ่มต้นด้วยตนเอง
เงื่อนไขเริ่มต้นด้วยตนเองเป็นเงื่อนไขเริ่มต้นประเภทพิเศษที่ช่วยให้ผู้ใช้เรียกใช้การทำงานอัตโนมัติด้วยตนเองได้
เมื่อประกาศเงื่อนไขเริ่มต้นด้วยตนเอง ให้ทำดังนี้
- อย่าระบุลักษณะหรือประเภทอุปกรณ์
- ระบุองค์ประกอบ 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 นาที
โหนดการดำเนินการ
โหนดการดำเนินการคือตำแหน่งที่การทำงานอัตโนมัติเกิดขึ้น
ในตัวอย่างนี้ การดำเนินการจะเรียกใช้คำสั่ง broadcast() ของ AssistantBroadcastTrait ดังนี้
action(speaker, SpeakerDeviceType.self) {
Google.AssistantBroadcastTrait.broadcast(msg: "Oven Cycle Complete")
}