אוטומציה יכולה להפנות למכשירים עם כמה חלקים באופן דומה לאוטומציה שלא משתמשת במכשירים עם כמה חלקים.
קודם כל, משיגים את החלקים הרלוונטיים כמו שעושים בדרך כלל. במאמר מכשירים עם כמה חלקים מוסבר איך לעבוד עם מכשירים כאלה.
אחר כך, לכל חלק שרוצים להשתמש בו באוטומציה, יוצרים AutomationPartPath, שמאפשר להפנות לחלק בגורמים להפעלת האוטומציה, בתנאים ובפעולות.
// Obtain a reference to the device:
let multipartDevices = try await self.home.devices(enableMultipartDevices: true).list()
let light = multipartDevices.first(where: {
$0.parts.contains(OnOffLightDeviceType.self) && $0.structureID == structure.id
})
let lightDeviceType = await light.parts.get(OnOffLightDeviceType.self)
let lightPartPath = light.automationPart(lightDeviceType)
עוד דבר שחשוב לדעת הוא שפעולות אוטומציה בדרך כלל מקבלות מכשיר וסוג מכשיר כפרמטרים. לעומת זאת, פעולת אוטומציה שמפנה למכשיר שהוא רכיב (שוב, באמצעות AutomationPartPath) צריכה רק את ה-AutomationPartPath, כי ה-AutomationPartPath כבר מכיל הפניה לסוג המכשיר בנוסף להפניה למכשיר שהוא רכיב.
לדוגמה, ב-Automation API, יכול להיות שסוג המכשיר Refrigerator יוגדר כמכשיר עם כמה חלקים. הוא מורכב מיחידת בסיס RefrigeratorDevice שיכולה להכיל כמה ארונות משנה, כמו מקפיאים או ארונות רגילים מסוג TemperatureControlledCabinetDevice.
כדי ליצור פעולות אוטומטיות למקרר, משתמשים בעיקר בשתי תכונות סטנדרטיות של Matter:
-
RefrigeratorAlarm: חושף התראות על מצב הדלת באמצעות המאפייןdoorOpenשל השדהstate. -
RefrigeratorAndTemperatureControlledCabinetMode: מאפשר מצבי קריאה ופקודות. לדוגמה, הרצת פקודות כמוchangeToModeכדי לעבור למצבים כמוLowEnergy,RapidCoolאוLowNoise.
הפעולה האוטומטית הזו מופעלת כשדלת המקרר נפתחת. אם הדלת נשארת פתוחה יותר משתי דקות, התרחיש האוטומטי משדר התראה קולית ברמקולים החכמים, מהבהב את האורות במטבח ושולח התראה. חשוב לדעת שהאוטומציה הזו משפיעה רק על תא המקרר במכשיר, ומתעלמת מתא המקפיא (אם יש כזה):
import GoogleHomeSDK
import GoogleHomeTypes
typealias RefrigeratorAlarmTrait = Matter.RefrigeratorAlarmTrait
typealias OnOffTrait = Matter.OnOffTrait
// Fetch devices using the multipart device model.
let multipartDevices = try await self.home.devices(enableMultipartDevices: true).list()
// Obtain a reference to the refrigerator device.
guard let refrigeratorDevice = multipartDevices.first {
$0.types.contains(TemperatureControlledCabinetDeviceType.self) &&
$0.traits.contains(Matter.RefrigeratorAndTemperatureControlledCabinetModeTrait.self) &&
$0.traits.contains(Matter.RefrigeratorAlarmTrait.self)
}
let refrigeratorDeviceType = await refrigeratorDevice.parts.get(RefrigeratorDeviceType.self).first
// Get all temperature-controlled cabinet parts of the refrigerator
let cabinets = refrigeratorDeviceType.parts(type: TemperatureControlledCabinetDeviceType.self)
// Find the cabinet part with the 'refrigerator' semantic tag
let refrigeratorCabinet = cabinets.first {
$0.metadata.tags.contains(SemanticTag.Refrigerator.refrigerator)
}
var cabinetPartPath = refrigeratorDevice.automationPart(refrigeratorCabinet)
let structure = home.structures().list().first
let speaker = multipartDevices.first(where: {
$0.types.contains(SpeakerDeviceType.self) && $0.structureID == structure.id
})
let refrigeratorDoorAlert = automation(
name: "Refrigerator Door Open Alert",
description: "Warn when the refrigerator door has been open for over 2 min."
) {
// 1. Starter: Monitor the refrigerator door alarm trait
let alarmStarter = starter(
cabinetPartPath,
RefrigeratorAlarmTrait.self
)
alarmStarter
// 2. Condition: Ensure the 'doorOpen' alarm remains active for 120 seconds
condition(for: .seconds(120)) {
alarmStarter.state.doorOpen.equals(true)
}
// 3. Actions: Execute parallel reactions
parallel {
// Broadcast warning to household speakers
action(speaker, SpeakerDeviceType.self) {
Google.AssistantBroadcastTrait.broadcast(msg: "The refrigerator door has been left open!")
}
// Push a notification alerts to home members' mobile devices
action(structure) {
Google.NotificationTrait.sendNotifications(
title: "Fridge Alert",
body: "The refrigerator door has been open for over 2 min.",
optInMemberEmailsArray: ["222larabrown@gmail.com"]
)
}
}
}
בדוגמה הבאה, המקרר עובר למצב חיסכון באנרגיה כשהוא מזהה שאין אף אחד בבית.
import GoogleHomeSDK
import GoogleHomeTypes
typealias AreaPresenceStateTrait = Google.AreaPresenceStateTrait
typealias RefrigeratorAndTemperatureControlledCabinetModeTrait = Matter.RefrigeratorAndTemperatureControlledCabinetModeTrait
let structure = home.structures().list().first()
// Fetch devices using the multipart device model.
let devices = try await self.home.devices(enableMultipartDevices: true).list()
// Obtain a reference to the refrigerator device.
guard let refrigeratorDevice = multipartDevices.first {
$0.types.contains(TemperatureControlledCabinetDeviceType.self) &&
$0.traits.contains(Matter.RefrigeratorAndTemperatureControlledCabinetModeTrait.self) &&
$0.traits.contains(Matter.RefrigeratorAlarmTrait.self)
}
let refrigeratorDeviceType = await refrigeratorDevice.parts.get(RefrigeratorDeviceType.self)
// Get all temperature-controlled cabinet parts of the refrigerator
let cabinets = refrigeratorDeviceType.parts(type: TemperatureControlledCabinetDeviceType.self)
// Find the cabinet part with the 'refrigerator' semantic tag
let refrigeratorCabinet = cabinets.first {
$0.metadata.tags.contains(SemanticTag.Refrigerator.refrigerator)
}
let cabinetPartPath = refrigeratorDevice.automationPart(refrigeratorCabinet)
let refrigeratorEcoMode = automation(
name: "Refrigerator Eco Mode",
description: "Automatically changes refrigerator to low energy mode when house is vacant."
) {
// 1. Starter: Monitor household presence changes
let presenceStarter = starter(structure, AreaPresenceStateTrait.self)
presenceStarter
// 2. Condition: Verify presence state transitions to vacant
condition {
presenceStarter.presenceState.equals(.presenceStateVacant)
}
// 3. Action: Set refrigerator cabinet Mode to 'Low Energy' (commonly option index 1)
action(cabinetPartPath) {
RefrigeratorAndTemperatureControlledCabinetModeTrait.changeToMode(newMode: 1)
}
}