خودکارسازی‌های دستگاه چندبخشی در iOS

خودکارسازی ممکن است به دستگاه‌های چندبخشی به‌طور مشابه با خودکارسازی‌ای که از دستگاه‌های چندبخشی استفاده نمی‌کند ارجاع دهد.

ابتدا، بخش(های) مؤلفه را همان‌طور که معمولاً انجام می‌دهید دریافت کنید. برای نحوه کار با دستگاه‌های چندبخشی، دستگاه‌های چندبخشی را ببینید.

سپس، برای هر بخشی که می‌خواهید در خودکارسازی‌تان استفاده کنید، 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 علاوه‌بر ارجاع دستگاه قطعه‌ای، ارجاعی به نوع دستگاه نیز دارد.

برای مثال، در «میانای برنامه‌سازی کاربردی خودکارسازی»، ممکن است نوع دستگاه 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)
  }
}