راهنمای دستگاه زنگ در برای iOS

نوع دستگاه «زنگ در» بااستفاده از سه مشخصه پیاده‌سازی می‌شود: PushAvStreamTransportTrait، که انتقال جاری‌سازی صوتی و ویدیویی را بااستفاده از پروتکل‌های مبتنی بر ارسال مدیریت می‌کند، WebRtcLiveViewTrait، که امکان کنترل جاری‌سازی‌های زنده و TalkBack را فراهم می‌کند، و CameraSnapshotTrait، که عکس‌های آنی پیش‌نمایش ذخیره‌شده در حافظه نهان و عکس‌های آنی زنده را ارائه می‌دهد.

همیشه قبل‌از استفاده از هر ویژگی یا تلاش برای به‌روزرسانی مشخصه‌ها، پشتیبانی از مشخصه و فرمان را برای دستگاه بررسی کنید. برای اطلاعات بیشتر، به کنترل دستگاه‌ها در iOS مراجعه کنید.

نوع دستگاه Home APIs ویژگی‌ها برنامه نمونه Swift مورد استفاده

زنگ در

GoogleDoorbellDeviceType

home.matter.6006.types.0113

دستگاهی که با دکمه‌ای در بیرون در فعال می‌شود و سیگنال شنیداری و/یا دیداری ایجاد می‌کند و برای جلب توجه فردی که در جایی در آن سوی در است استفاده می‌شود. زنگ‌های در ممکن است دارای جاری‌سازی زنده دردسترس، مکالمه دوطرفه، یا رویدادهای تشخیص باشند.

ویژگی‌های الزامی
     google PushAvStreamTransportTrait
     google WebRtcLiveViewTrait

زنگ در

دریافت اطلاعات پایه درباره دستگاه

   در برنامه نمونه برای iOS پیاده‌سازی شده است   

ویژگی BasicInformation شامل اطلاعاتی مثل نام فروشنده، شناسه فروشنده، شناسه محصول، نام محصول (شامل اطلاعات مدل)، و نسخه نرم‌افزار دستگاه است:

let vendorName = basicInfoTrait.attributes.vendorName!
let vendorID = basicInfoTrait.attributes.vendorID!
let productID = basicInfoTrait.attributes.productID!
let productName = basicInfoTrait.attributes.productName!
let softwareVersion = basicInfoTrait.attributes.softwareVersion!

دریافت شماره سریال

   در برنامه نمونه برای iOS پیاده‌سازی شده است   

برای دریافت شماره سریال دستگاه، از فرمان GetSerialNumber در مشخصه ExtendedBasicInformation استفاده کنید. مثال زیر ذخیره کردن شماره سریال را در متغیری به‌نام serialNumber نشان می‌دهد:

// Assuming extendedBasicInformationTrait: Google.ExtendedBasicInformationTrait
let response = try await extendedBasicInformationTrait.getSerialNumber()
let serialNumber = response.serialNumber

پاسخ‌های سریع

ویژگی «پاسخ‌های سریع» به کاربر امکان می‌دهد پیام ازپیش تعریف‌شده‌ای را به دستگاه زنگ در ارسال کند.

این ویژگی فقط در دستگاه‌های زنگ در دردسترس است. فهرست پیام‌های ازپیش تعریف‌شده برای برنامه شریک دردسترس است و ممکن است آن‌ها را برای انتخاب به کاربر ارائه دهد. پیام‌های ازپیش‌تعریف‌شده توسط کاربر قابل‌ویرایش نیستند.

«پاسخ‌های سریع» ازطریق ویژگی PresetMessage پیاده‌سازی می‌شود.

پخش پیام ازپیش تنظیم‌شده

برای پخش پیام ازپیش‌تنظیم‌شده، روش playPresetMessage را فراخوانی کنید و یکی از مقادیر رشته‌ای موجود در ویژگی availablePhraseTypes را به آن منتقل کنید.


import GoogleHomeSDK
import GoogleHomeTypes

func playDoorbellPresetMessage(device: HomeDevice, phraseTypeString: String) async {
    // 1. Retrieve the GoogleDoorbellDeviceType helper on the device
    guard let doorbellDeviceType = await device.types.get(GoogleDoorbellDeviceType.self) else {
        print("This device is not a Google Doorbell or is currently uninitialized.")
        return
    }

    // 2. Extract the Google.PresetMessageTrait
    guard let presetMessageTrait = doorbellDeviceType.traits[Google.PresetMessageTrait.self] else {
        print("PresetMessageTrait is not supported on this device.")
        return
    }

    // 3. (Optional) Check available phrase types supported by the device
    if let availablePhrases = presetMessageTrait.attributes.availablePhraseTypes {
        let phraseTypeNames = availablePhrases.map { $0.phraseType }
        print("Supported quick response phrases: \(phraseTypeNames)")
    }

    // 4. Send the playPresetMessage command asynchronously
    do {
        try await presetMessageTrait.playPresetMessage(phraseType: phraseTypeString)
        print("Preset message successfully requested.")
    } catch {
        print("SDK error occurred playing preset message: \(error)")
    }
}

تنظیم زبان گفتار

تنظیم زبان گفتار

زبان گفتاری فعال دستگاه را بااستفاده از روش setActiveLocale از ویژگی LocalizationConfiguration روی منطقه خاصی (برای مثال، «en_US») تنظیم کنید.

// Setting the active language
// Assuming localizationConfigurationTrait: Matter.LocalizationConfigurationTrait
let selectedLocale = "en_US"
try await localizationConfigurationTrait.update {
    $0.setActiveLocale(selectedLocale)
}

دریافت آخرین زمان تماس ابری دستگاه

برای پیدا کردن آخرین باری که دستگاه با فضای ابری تماس داشته است، از مشخصه lastContactTimestamp ویژگی ExtendedGeneralDiagnostics استفاده کنید:

if let lastContactTimeStamp = extendedGeneralDiagnosticsTrait.attributes.lastContactTimestamp {
  self.lastContactTime = Date(timeIntervalSince1970: Double(lastConnectedTimeStamp))
}

تنظیمات نوع پایه دوربین

مشخصه Mount حاوی تنظیمات پایه دوربین و اطلاعات وضعیت است. می‌توانید مشخصه‌هایی مثل وضعیت نصب، نوع تشخیص، و نام نوع نصب را بخوانید. علاوه‌براین، می‌توانید از ویژگی Mount برای لغو پیکربندی پیش‌فرض نوع سوار کردن استفاده کنید.

// 1. Get the Mount trait
guard let mountTrait = deviceType.traits[Google.MountTrait.self] else {
  print("Mount trait not supported or configured on this device.")
  return
}

// 2. Read the current mount state, detection type, and type name
let mountState         = mountTrait.attributes.mountState         // Type: Google.MountTrait.MountStateEnum?
let mountDetectionType = mountTrait.attributes.mountDetectionType // Type: Google.MountTrait.MountDetectionTypeEnum?
let mountTypeName      = mountTrait.attributes.mountTypeName      // Type: String?

// 3. Update the mount type override
try await mountTrait.update { mutableTrait in
  mutableTrait.setMountTypeOverride(.official)
}

بررسی اتصال‌پذیری دستگاه

اتصال‌پذیری دستگاه درواقع در سطح نوع دستگاه بررسی می‌شود زیرا برخی‌از دستگاه‌ها از چندین نوع دستگاه پشتیبانی می‌کنند. وضعیت برگردانده‌شده ترکیبی از وضعیت‌های اتصال‌پذیری برای همه ویژگی‌های آن دستگاه است.

let doorbellConnectivity = doorbellDeviceType.metadata.sourceConnectivity.connectivityState

درصورت وجود انواع دستگاه‌های ترکیبی، ممکن است وضعیت partiallyOnline مشاهده شود وقتی اتصال اینترنت وجود ندارد. ممکن است ویژگی‌های استاندارد Matter به‌دلیل مسیریابی محلی همچنان آنلاین باشند، اما ویژگی‌های مبتنی بر ابر آفلاین خواهند بود.

دریافت نشانی IP دستگاه

برای پیدا کردن نشانی IP دستگاه، از مشخصه networkInterfaces GeneralDiagnosticsTrait استفاده کنید. نشانی‌ها به‌عنوان اشیاء Data برگردانده می‌شوند که می‌توانید آن‌ها را بااستفاده از چارچوب Network به رشته‌های استاندارد IPv4 یا IPv6 قالب‌بندی کنید:

func getIpAddresses(trait: Matter.GeneralDiagnosticsTrait) -> [String] {
  let interfaces = trait.attributes.networkInterfaces ?? []
  var ipAddresses: [String] = []

  for interface in interfaces {
    for data in interface.iPv4Addresses {
      if let ipv4 = IPv4Address(data) {
        ipAddresses.append(String(describing: ipv4))
      }
    }
    for data in interface.iPv6Addresses {
      if let ipv6 = IPv6Address(data) {
        ipAddresses.append(String(describing: ipv6))
      }
    }
  }

  return ipAddresses
}

شروع کردن جاری‌سازی زنده

   در برنامه نمونه برای iOS پیاده‌سازی شده است   

برای شروع جاری‌سازی زنده، رشته «پروتکل شرح جلسه» (SDP) را به روش startLiveView(offerSdp:) مشخصه WebRtcLiveViewTrait ارسال کنید که سه مقدار را برمی‌گرداند:

  • «پروتکل شرح جلسه» برای جلسه.
  • مدت جلسه برحسب ثانیه.
  • شناسه جلسه که ممکن است برای تمدید یا پایان دادن به جلسه استفاده شود.
public func sendOffer(offerSdp: String) async throws
-> (answerSdp: String, mediaSessionId: String, liveViewDuration: TimeInterval)
{
  do {
    // Sending StartLiveView command
    let response = try await liveViewTrait.startLiveView(
      offerSdp: offerSdp
    )
    // Received StartLiveView response
    return (
      answerSdp: response.answerSdp,
      mediaSessionId: response.mediaSessionId,
      liveViewDuration: TimeInterval(response.liveSessionDurationSeconds)
    )
  } catch {
    // Failed to send StartLiveView command
    throw error
  }
}

تمدید کردن جاری‌سازی زنده

   در برنامه نمونه برای iOS پیاده‌سازی شده است   

جاری‌سازی‌های زنده مدت زمان ازپیش تعیین‌شده‌ای دارند که پس‌از آن منقضی می‌شوند. برای طولانی‌تر کردن مدت جاری‌سازی فعال، بااستفاده از روش extendLiveView(mediaSessionId:optionalArgsProvider:) درخواست تمدید ارسال کنید:

public func extendLiveView(mediaSessionId: String) async throws {
  do {
    // Extending live view
    let extendedDuration = try await liveViewTrait.extendLiveView(mediaSessionId: mediaSessionId)
  } catch {
    // Failed to extend live view
    throw error
  }
}

شروع و توقف TalkBack

   در برنامه نمونه برای iOS پیاده‌سازی شده است   

برای شروع TalkBack، روش startTalkback(mediaSessionId:optionalArgsProvider:) مشخصه WebRtcLiveViewTrait را فراخوانی کنید. برای توقف، از stopTalkback(mediaSessionId:) استفاده کنید.

public func toggleTwoWayTalk(isOn: Bool, mediaSessionId: String) async throws {
  do {
    if isOn {
      try await liveViewTrait.startTalkback(mediaSessionId: mediaSessionId)
    } else {
      try await liveViewTrait.stopTalkback(mediaSessionId: mediaSessionId)
    }
  } catch {
    throw HomeError.commandFailed("Failed to toggle twoWayTalk: \(error)")
  }
}

مدیریت جاری‌سازی زنده

   در برنامه نمونه برای iOS پیاده‌سازی شده است   

تنظیم کیفیت جاری‌سازی زنده برای بهینه‌سازی استفاده از پهنای باند براساس بافتار مشاهده مشتری مفید است (برای مثال، جابه‌جایی به وضوح پایین‌تر هنگام نمایش کاشی پیش‌نمایش کوچک‌تر، نمای جدولی، یا حالت تصویردرتصویر).

تغییر پویای کیفیت بااستفاده از ویژگی WebRtcLiveView به‌طور خاص وضوح جلسه جاری‌سازی زنده فعال را در یک کارخواه خاص مدیریت می‌کند. این تنظیمات با پیکربندی تنظیمات استفاده از پهنای باند در سراسر دستگاه به‌طور مستقیم در دستگاه یکسان نیست، که بر همه بینندگان هم‌زمان و کیفیت ضبط‌های ویدیویی تاریخی ذخیره‌شده در فضای ابری تأثیر می‌گذارد.

مثال زیر نحوه بازیابی و به‌روزرسانی کیفیت جاری‌سازی زنده را برای دستگاه نشان می‌دهد:

  • بازیابی گزینه‌های کیفیت پشتیبانی‌شده: دریافت وضوح‌های جاری‌سازی دردسترس که دستگاه از آن‌ها پشتیبانی می‌کند. کد، ویژگی WebRtcLiveView را جستجو می‌کند تا کیفیت‌های جاری‌سازی پشتیبانی‌شده را به‌عنوان فهرستی از مقادیر QualityHint (مانند .sd، .hd، .fhd، .qhd، یا .uhd) بااستفاده از ویژگی supportedQualityHints نمایش دهد.

  • تغییر کیفیت جاری‌سازی زنده: برای تغییر وضوح جاری‌سازی زنده فعال، QualityHint انتخاب‌شده را اعمال کنید (برای مثال، تغییر از «وضوح استاندارد» به «وضوح بالا»). تابع updateQualityHint از روش changeLiveViewQuality ویژگی WebRtcLiveView برای اعمال پیکربندی QualityHint انتخاب‌شده به جلسه رسانه فعال استفاده می‌کند.

public var supportedQualityHints: [Google.WebRtcLiveViewTrait.QualityHint] {
  return liveViewTrait?.attributes.supportedQualityHints ?? []
}

public func updateQualityHint(
  liveViewTrait: Google.WebRtcLiveViewTrait,
  hint: Google.WebRtcLiveViewTrait.QualityHint,
  mediaSessionId: String
) async {
  do {
    _ = try await liveViewTrait.changeLiveViewQuality(
      mediaSessionId: mediaSessionId,
      qualityHint: hint
    )
  } catch {
    // error
  }
}

فعال و غیرفعال کردن قابلیت ضبط

برای فعال کردن قابلیت ضبط دوربین، TransportStatusEnum.Active را به روش setTransportStatus(transportStatus:optionalArgsProvider:) ویژگی PushAvStreamTransportTrait منتقل کنید. برای غیرفعال کردن قابلیت ضبط، آن را TransportStatusEnum.Inactive کنید. در مثال زیر، این فراخوانی‌ها را در یک فراخوانی واحد قرار می‌دهیم که از Boolean برای روشن/خاموش کردن قابلیت ضبط استفاده می‌کند:

public func toggleIsRecording(isOn: Bool) {
  self.uiState = .loading

  guard let pushAvStreamTransportTrait else {
    // PushAvStreamTransportTrait not found.
    return
  }
  Task {
    do {
      try await pushAvStreamTransportTrait.setTransportStatus(
        transportStatus: isOn ? .active : .inactive)
      if isOn {
        do {
          self.player = try self.createWebRtcPlayer()
        } catch {
          // Failed to initialize WebRtcPlayer
          self.uiState = .disconnected
          return
        }
        await self.player?.initialize()
        self.uiState = .live
      } else {
        self.player = nil
        self.uiState = .off
      }
    } catch {
      // Failed to toggle onOff
    }
  }
}

فعال یا غیرفعال کردن قابلیت ضبط دوربین مانند روشن یا خاموش کردن ویدیو دوربین است. وقتی ویدیو دوربین روشن است، درحال ضبط کردن است (برای اهداف رویدادها و کلیپ‌های مرتبط).

وقتی قابلیت ضبط غیرفعال است (ویدیو دوربین خاموش است):

  • دوربین همچنان می‌تواند طبق connectivityState نوع دستگاه به‌عنوان آنلاین نشان داده شود.
  • جاری‌سازی زنده دردسترس نیست و دوربین هیچ رویداد ابری را شناسایی نمی‌کند.

بررسی کنید که آیا قابلیت ضبط فعال است یا نه

برای تعیین اینکه آیا قابلیت ضبط دوربین فعال است یا نه، بررسی کنید که آیا اتصالی فعال است یا نه. مثال زیر دو تابع را برای انجام این کار تعریف می‌کند:

public func isDeviceRecording() -> Bool {
  guard let pushAvStreamTransportTrait else {
    // PushAvStreamTransportTrait not found.
    return false
  }
  guard
    let hasActiveConnection =
      pushAvStreamTransportTrait
      .attributes
      .currentConnections?
      .contains(where: { $0.transportStatus == .active })
  else {
    return false
  }
  return hasActiveConnection
}

بازیابی عکس‌های آنی دوربین

   در برنامه نمونه برای iOS پیاده‌سازی شده است   

از ویژگی CameraSnapshot برای بازیابی عکس‌های آنی تصویر ثابت از دوربین استفاده کنید. این عکس‌های آنی برای چندین سناریو مفید هستند:

  • به‌عنوان کاشی جای‌بان در میانای کاربر درحین بار شدن جاری‌سازی زنده WebRTC.
  • به‌عنوان تصویر پیش‌نمایش ثابت که با تعامل کاربر به جاری‌سازی زنده ارتقا می‌یابد.
  • به‌عنوان بوم پس‌زمینه برای ترسیم و پیکربندی مناطق فعالیت سفارشی.

ویژگی CameraSnapshot دو روش برای واکشی عکس‌های آنی ارائه می‌دهد، بسته به اینکه آیا برای رندر سریع به عکس آنی ذخیره‌شده در حافظه نهان نیاز دارید یا به عکس آنی زنده درخواستی.

دریافت عکس آنی پیش‌نمایش ذخیره‌شده در حافظه نهان

عکس آنی پیش‌نمایش تصویری ذخیره‌شده در حافظه نهان است که کیت توسعه نرم‌افزار می‌تواند بدون فعال کردن دوربین آن را بازیابی کند. این سریع‌ترین روش برای واکشی تصویر ثابت است و برای صفحه‌های نمای کلی دوربین یا شبکه‌های داشبورد ایده‌آل است.

برای دریافت عکس آنی پیش‌نمایش، مشخصه ویژگی preview_image_url را بخوانید:

guard let cameraSnapshotTrait = deviceType.traits[
  Google.CameraSnapshotTrait.self
] else {
  print("CameraSnapshot trait not supported on this device.")
  return
}

if let previewImageUrlString = cameraSnapshotTrait
  .attributes.preview_image_url,
   let url = URL(string: previewImageUrlString) {
  // Load the preview image from the URL
}

بسته به پیکربندی و فعالیت دوربین، نشانی وب پیش‌نمایش به تصویر ذخینه‌شده‌ای اشاره می‌کند که از فیلم ویدیویی اخیر (اولین قاب I از آخرین قطعه ویدیو) یا عکس آنی‌ای که به‌طور دوره‌ای توسط دوربین بارگذاری شده است تولید شده است.

برای نشان دادن تازگی تصویر، فضای ابری Google Home یک سرصفحه X-Home-Image-Captured-At را در تصویر JPEG/PNG ارائه‌شده جاسازی می‌کند که در قالب UTC است. می‌توانید این سرصفحه را در سمت کارخواه تجزیه کنید تا سن عکس آنی را در برنامه نمایش دهید.

دریافت عکس آنی زنده درخواستی

برای مسیرهای کاربر که به نمای زنده فعلی دوربین نیاز دارند (مثلاً راه‌اندازی «مناطق فعالیت»)، می‌توانید عکس آنی زنده درخواست کنید. راه‌اندازی عکس آنی زنده به دوربین دستور می‌دهد که بیدار شود، قاب جدیدی را ضبط کند، و آن را در فضای ابری بارگذاری کند.

برای درخواست عکس آنی زنده، از فرمان getLiveSnapshot() استفاده کنید:

do {
  let response = try await cameraSnapshotTrait.getLiveSnapshot()
  let snapshotUrlString = response.snapshot_url

  if let url = URL(string: snapshotUrlString) {
    // Load the live snapshot image from the URL
  }
} catch {
  print("Failed to get live snapshot: \(error)")
}

اصالت‌سنجی کردن درخواست‌های عکس آنی

   در برنامه نمونه برای iOS پیاده‌سازی شده است   

همه نشانی‌های وب عکس آنی به رسانه ایمن اشاره می‌کنند و به کد OAuth 2.0 برای دامنه Home APIs v2 نیاز دارند. برای بارگیری و ارائه تصاویر، کد OAuth باید به‌عنوان کد «دارنده» در سرصفحه Authorization درخواست HTTP شما تزریق شود.

مثال زیر نحوه پیکربندی درخواست شبکه امن برای بارگیری عکس آنی را نشان می‌دهد:

import UIKit

func loadSnapshotImage(from url: URL, home: Home) async -> UIImage? {
  do {
    // 1. Retrieve the OAuth access token from the Home APIs SDK
    let (accessToken, _) = try await home.permissions.authorization()

    // 2. Configure the HTTP GET request with the Bearer token
    var request = URLRequest(url: url)
    request.setValue(
      "Bearer \(accessToken)",
      forHTTPHeaderField: "Authorization"
    )

    // 3. Fetch the image data
    let (data, _) = try await URLSession.shared.data(for: request)
    return UIImage(data: data)
  } catch {
    print("Error loading snapshot image: \(error)")
    return nil
  }
}

تنظیمات باتری

تنظیمات مختلف باتری را می‌توان ازطریق Home API کنترل کرد.

تنظیم اولویت مصرف باتری

تنظیم توازن انرژی به شما امکان می‌دهد توازن بین عمر باتری و عملکرد دستگاه را پیکربندی کنید. می‌توانید نمایه‌های باتری مختلفی مثل «طولانی»، «متعادل»، و «عملکرد» ایجاد کنید و بین آن‌ها جابه‌جا شوید.

این ویژگی با به‌روزرسانی مشخصه currentEnergyBalance در ویژگی EnergyPreference پیاده‌سازی می‌شود. این مشخصه نمایه عدد صحیحی را می‌پذیرد که با نمایه خاصی که در فهرست energyBalances دستگاه تعریف شده است مطابقت دارد (برای مثال، 0 برای EXTENDED، 1 برای BALANCED، و 2 برای PERFORMANCE).

مقدار null برای currentEnergyBalance نشان می‌دهد دستگاه از نمایه سفارشی استفاده می‌کند. این حالت فقط خواندنی است.

در زیر نمونه‌ای از ساختاری که مشخصه currentEnergyBalance استفاده خواهد کرد، و به‌دنبال آن تکه‌کد واقعی که از این مشخصه استفاده می‌کند نشان داده شده است.

// Example energyBalances list
{
  "energy_balances": [
    {
      "step": 0,
      "label": "EXTENDED"
    },
    {
      "step": 50,
      "label": "BALANCED"
    },
    {
      "step": 100,
      "label": "PERFORMANCE"
    }
  ]
}
private func setBatteryUsage(to option: UInt8) async throws {
  _ = try await energyPreferenceTrait.update {
    $0.setCurrentEnergyBalance(option)
  }
}

روشن کردن «بهینه‌سازی باتری» خودکار

   در برنامه نمونه برای iOS پیاده‌سازی شده است   

برای پیکربندی این ویژگی، مشخصه currentLowPowerModeSensitivity ویژگی EnergyPreference را به‌روز کنید. این مشخصه از نمایه‌ای برای انتخاب سطح حساسیت استفاده می‌کند، که در آن 0 معمولاً نشان‌دهنده Disabled است و 1 نشان‌دهنده Enabled یا Automatic است.

private func setAutoBatterySaver(to value: Bool) async throws {
  _ = try await energyPreferenceTrait.update {
    $0.setCurrentLowPowerModeSensitivity(value ? 1 : 0)
  }
}

دریافت وضعیت شارژ باتری

   در برنامه نمونه برای iOS پیاده‌سازی شده است   

برای دریافت وضعیت شارژ فعلی دستگاه (درحال شارژ، شارژ کامل، یا عدم شارژ)، از مشخصه batChargeState ویژگی PowerSource استفاده کنید.

self.chargingState = powerSourceTrait.attributes.batChargeState

var description: String
switch self.chargingState {
case .isCharging:
  description = "Charging"
case .isAtFullCharge:
  description = "Full"
case .isNotCharging:
  description = "Not Charging"
default:
  description = "Unknown"
}

دریافت سطح باتری

برای دریافت سطح باتری فعلی، از مشخصه batChargeLevel ویژگی PowerSource استفاده کنید. سطح آن OK، Warning (پایین)، یا Critical است.

self.batteryLevel = powerSourceTrait.attributes.batChargeLevel

var description: String
switch self.batteryLevel {
case .ok:
  description = "OK"
case .warning:
  description = "Warning"
case .critical:
  description = "Critical"
default:
  description = "Unknown"
}

دریافت منبع برق

برای تعیین منبع برقی که دستگاه استفاده می‌کند، از مشخصه‌های BatPresent و wiredPresent در ویژگی PowerSource استفاده کنید.

if powerSourceTrait.attributes.wiredPresent ?? false {
  self.powerSourceType = .wired
} else if powerSourceTrait.attributes.batPresent ?? false {
  self.powerSourceType = .battery
} else {
  self.powerSourceType = nil
}

بررسی کنید که آیا باتری نیاز به تعویض دارد یا نه

مشخصه batReplaceability نشان می‌دهد که باتری غیرقابل‌تعویض است، توسط کاربر قابل‌تعویض است، یا توسط کارخانه قابل‌تعویض است.

اگر باتری قابل‌تعویض باشد، batReplacementNeeded مشخصه PowerSource به شما می‌گوید که آیا باتری باید تعویض شود یا نه.

// Get the battery replacement status
var batteryStatus = powerSourceTrait.attributes.batReplacementNeeded

if batteryStatus {
  print("Replace the battery.")
}

وقتی باتری قابل‌تعویض توسط کاربر باشد، batReplacementDescription باتری را توصیف می‌کند، ازجمله اطلاعاتی مانند ضریب شکل، شیمی، و سازنده ترجیحی.

تنظیمات صوتی

تنظیمات صوتی مختلف را می‌توان ازطریق Home API کنترل کرد.

روشن یا خاموش کردن میکروفون

برای روشن یا خاموش کردن میکروفون دستگاه، مشخصه microphoneMuted ویژگی CameraAvStreamManagementTrait را بااستفاده از تابع داخلی setMicrophoneMuted به‌روز کنید:

// Turn the device's microphone on or off
func setMicrophone(on: Bool) async {
  do {
    _ = try await self.cameraAvStreamManagementTrait?.update {
      $0.setMicrophoneMuted(!on)
    }
  } catch {
    // Error
  }
}

روشن یا خاموش کردن ضبط صدا

برای روشن یا خاموش کردن ضبط صدا برای دستگاه، مشخصه recordingMicrophoneMuted ویژگی CameraAvStreamManagementTrait را بااستفاده از تابع داخلی setRecordingMicrophoneMuted به‌روز کنید:

// Turn audio recording on or off for the device
func setAudioRecording(on: Bool) async {
  do {
    _ = try await self.cameraAvStreamManagementTrait?.update {
      $0.setRecordingMicrophoneMuted(!on)
    }
  } catch {
    // Error
  }
}

تنظیم میزان صدای بلندگو

برای تنظیم میزان صدای بلندگو برای دستگاه، ویژگی speakerVolumeLevel مشخصه CameraAvStreamManagementTrait را بااستفاده از تابع داخلی setSpeakerVolumeLevel به‌روز کنید:

// Adjust the camera speaker volume
func setSpeakerVolume(to value: UInt8) async {
  do {
    _ = try await cameraAvStreamManagementTrait.update {
      $0.setSpeakerVolumeLevel(value)
    }
  } catch {
    // Error
  }
}

تنظیمات منطقه فعالیت

   در برنامه نمونه برای iOS پیاده‌سازی شده است   

ویژگی ZoneManagement واسطی برای مدیریت مناطق موردعلاقه سفارشی (مناطق فعالیت) در دستگاه‌های دوربین و زنگ در ارائه می‌دهد. از این مناطق برای فیلتر کردن تشخیص رویداد (مثل حرکت فرد یا خودرو) در مناطق خاصی در میدان دید دستگاه استفاده می‌شود.

مناطق فعالیت توسط کاربر در برنامه شریک پیکربندی می‌شوند، و به آن‌ها اجازه می‌دهند تا مناطقی را روی نواحی خاصی در میدان دید دوربین ترسیم کنند. سپس این مناطق تعریف‌شده توسط کاربر به ساختارهای مورداستفاده این مشخصه ترجمه می‌شوند. برای اطلاعات بیشتر درباره نحوه عملکرد مناطق فعالیت، به راه‌اندازی و استفاده از «مناطق فعالیت» مراجعه کنید.

مناطق فعالیت معمولاً بااستفاده از مختصات دکارتی دوبعدی تعریف می‌شوند. این ویژگی TwoDCartesianVertexStruct را برای رئوس و TwoDCartesianZoneStruct را برای تعریف منطقه (نام، رئوس، رنگ، و کاربرد) ارائه می‌دهد.

بررسی مناطق فعالیت

برای نمایش مناطق فعالیت، مشخصه zones از ویژگی ZoneManagement را بررسی کنید.

let zoneManagementTrait: Google.ZoneManagementTrait

self.zones = zoneManagementTrait.attributes.zones ?? []

افزودن منطقه فعالیت

برای ایجاد منطقه جدید، از فرمان createTwoDCartesianZone استفاده کنید. این فرمان TwoDCartesianZoneStruct را می‌گیرد، که نام، رئوس، رنگ، و کاربرد منطقه را تعریف می‌کند.

مثال زیر نشان می‌دهد که چگونه منطقه‌ای به‌نام «ایوان جلو» با چهار رأس، رنگ سالمون (#F439A0)، و مورداستفاده برای تشخیص حرکت ایجاد کنید.

import GoogleHomeSDK
import GoogleHomeTypes

func createFrontPorchZone(trait: Google.ZoneManagementTrait) async {
  // 1. Define the vertices for the zone (2D Cartesian coordinates)
  // Values are UInt16, typically scaled to the device's twoDCartesianMax.
  let vertices = [
    Google.ZoneManagementTrait.TwoDCartesianVertexStruct(x = 260, y = 422),
    Google.ZoneManagementTrait.TwoDCartesianVertexStruct(x = 1049, y = 0),
    Google.ZoneManagementTrait.TwoDCartesianVertexStruct(x = 2048, y = 0),
    Google.ZoneManagementTrait.TwoDCartesianVertexStruct(x = 2048, y = 950),
    Google.ZoneManagementTrait.TwoDCartesianVertexStruct(x = 1630, y = 1349),
    Google.ZoneManagementTrait.TwoDCartesianVertexStruct(x = 880, y = 2048),
    Google.ZoneManagementTrait.TwoDCartesianVertexStruct(x = 0, y = 2048),
    Google.ZoneManagementTrait.TwoDCartesianVertexStruct(x = 638, y = 1090)
  ]

  // 2. Define the zone structure using the given SDK struct
  let newZone = Google.ZoneManagementTrait.TwoDCartesianZoneStruct(
    name: "Front Porch",
    use: [.motion], // ZoneUseEnum.motion
    vertices: vertices,
    // Color is a hex string (for example, Salmon/Pink)
    color: "#F439A0"
  )

  do {
    // 3. Execute the raw command to add the zone to the device
    // This returns the created zone's ID (UInt16).
    var newZoneID = try await trait.createTwoDCartesianZone(zone: newZone)
  } catch {
    // Error
  }
}

به‌روزرسانی منطقه فعالیت

برای به‌روزرسانی منطقه موجود، از فرمان updateTwoDCartesianZone استفاده کنید. این فرمان به zoneId و TwoDCartesianZoneStruct به‌روزشده نیاز دارد.

let zoneManagementTrait: Google.ZoneManagementTrait
let zoneID: UInt16
let zone: Google.ZoneManagementTrait.TwoDCartesianZoneStruct

do {
  _ = try await zoneManagementTrait.updateTwoDCartesianZone(
        zoneID: zoneID, zone: zone)
} catch {
  // Error
}

حذف منطقه فعالیت

برای برداشتن منطقه، از فرمان removeZone با zoneId خاص استفاده کنید.

let zoneManagementTrait: Google.ZoneManagementTrait
let zoneID: UInt16

do {
  _ = try await zoneManagementTrait.removeZone(zoneID: zoneID)
} catch {
  // Error
}

راه‌اندازهای رویداد صوتی

ویژگی AvStreamAnalysis میانایی برای مدیریت راه‌اندازهای تشخیص رویداد در دستگاه‌های دوربین و زنگ در ارائه می‌دهد. درحالی‌که راه‌اندازهای مبتنی بر بینایی (مانند افراد یا وسایل نقلیه) می‌توانند مختص منطقه باشند، راه‌اندازهای مرتبط با صدا معمولاً پیکربندی‌های سطح دستگاه هستند.

انواع راه‌اندازهای زیر برای تشخیص صدا با EventTriggerTypeEnum دردسترس است:

حالت مقدار Enum شرح
صدا Sound تشخیص صدای عمومی.
صحبت کردن یک شخص PersonTalking گفتار را تشخیص می‌دهد.
پارس سگ DogBark صدای سگ‌سانان را تشخیص می‌دهد.
شکستن شیشه GlassBreak صدای شکستن شیشه را تشخیص می‌دهد.
هشدار دود SmokeAlarm هشدار دود را تشخیص می‌دهد، که اغلب با الگوی شنیداری T3 (سه بوق کوتاه و سپس یک مکث) شناخته می‌شود.
هشدار مونوکسیدکربن CoAlarm هشدارهای کربن مونوکسید (CO) را تشخیص می‌دهد، معمولاً با الگوی شنیداری T4 (چهار بوق کوتاه و سپس مکث) تشخیص داده می‌شود.

بررسی وضعیت تشخیص صدا

برای نمایش وضعیت فعلی تشخیص صدا به کاربر، باید بررسی کنید دستگاه از چه چیزی پشتیبانی می‌کند و چه چیزی توسط سخت‌افزار دستگاه فعال شده است. دو مشخصه‌ای که باید بررسی شود عبارت‌اند از:

در توسعه iOS، معمولاً برای خواندن این مشخصه‌ها، به ویژگی AvStreamAnalysis از دستگاه دسترسی پیدا می‌کنید.

// Example struct to store event triggers
public struct EventTrigger: Equatable {
  public var id: Google.AvStreamAnalysisTrait.EventTriggerTypeEnum
  public var enabled: Bool
}

let avStreamAnalysisTrait: Google.AvStreamAnalysisTrait

let possibleEventTriggers = avStreamAnalysisTrait.attributes.supportedEventTriggers ?? []
let enabledEventTriggers = avStreamAnalysisTrait.attributes.enabledEventTriggers ?? []

let eventTriggers [EventTrigger] = []
for trigger in possibleEventTriggers {
  self.eventTriggers.append(
    EventTrigger(
      id: trigger,
      enabled: enabledEventTriggers.contains(trigger)
    )
  )
}

به‌روزرسانی مجموعه راه‌اندازهای فعال‌شده

برای به‌روزرسانی مجموعه راه‌اندازهای فعال‌شده، از فرمان SetOrUpdateEventDetectionTriggers استفاده کنید که فهرستی از ساختارهای EventTriggerEnablement را می‌گیرد.

// Example struct to store event triggers
public struct EventTrigger: Equatable {
  public var id: Google.AvStreamAnalysisTrait.EventTriggerTypeEnum
  public var enabled: Bool
}

let avStreamAnalysisTrait: Google.AvStreamAnalysisTrait
let eventTriggers: [EventTrigger]

let enabledEventTriggers = eventTriggers.map {
  Google.AvStreamAnalysisTrait.EventTriggerEnablement(
    eventTriggerType: $0.id,
    enablementStatus: $0.enabled ? .enabled : .disabled
  )
}

try await avStreamAnalysisTrait.setOrUpdateEventDetectionTriggers(
  eventTriggerEnablements: enabledEventTriggers
)

حالت‌های ضبط

   در برنامه نمونه برای iOS پیاده‌سازی شده است   

مشخصه RecordingMode میانایی برای مدیریت رفتار ضبط ویدیو و تصویر در دستگاه‌های دوربین و زنگ در ارائه می‌دهد. این ویژگی به کاربران امکان می‌دهد بین ضبط پیوسته، ضبط مبتنی بر رویداد، یا غیرفعال کردن کامل ضبط (فقط «نمای زنده») انتخاب کنند.

RecordingModeEnum استراتژی‌های ضبط دردسترس را تعریف می‌کند:

حالت مقدار Enum شرح
غیرفعال Disabled ضبط کاملاً غیرفعال است. عمدتاً توسط دستگاه‌های قدیمی استفاده می‌شود.
CVR (ضبط ویدیو پیوسته) Cvr ویدیو به‌صورت شبانه‌روزی ضبط می‌شود. به اشتراک نیاز دارد (برای مثال، Google Home Premium.
EBR (ضبط درصورت رویداد) Ebr ضبط با رویدادها (شخص، حرکت) راه‌اندازی می‌شود. طول ویدیو به مدت رویداد و اشتراک بستگی دارد.
ETR (ضبط با راه‌انداز رویداد) Etr ضبط پیش‌نمایش کوتاه (برای مثال، ۱۰ ثانیه) که با رویدادها راه‌اندازی می‌شود.
نمای زنده LiveView ضبط غیرفعال است، اما کاربران همچنان می‌توانند به جاری‌سازی زنده دسترسی داشته باشند.
تصاویر ثابت Images هنگام وقوع رویدادها، به‌جای ویدیو، عکس آنی ضبط می‌شود.

بررسی کردن حالت‌های ضبط

برای نمایش پیکربندی ضبط فعلی، مشخصه‌های ویژگی RecordingMode را بررسی کنید:

// Example struct to store recording modes.
public struct RecordingMode: Hashable {
  public let id: UInt8
  public let mode: Google.RecordingModeTrait.RecordingModeEnum
}

let recordingModeTrait: Google.RecordingModeTrait

if let availableRecordingModes = recordingModeTrait.attributes.availableRecordingModes,
   let supportedRecordingModes = recordingModeTrait.attributes.supportedRecordingModes,
   let selectedRecordingMode = recordingModeTrait.attributes.selectedRecordingMode {

  var recordingModes: [RecordingMode] = []

  for recordingModeId in availableRecordingModes {
    guard Int(recordingModeId) < supportedRecordingModes.count,
          Int(recordingModeId) >= 0 else {
      // Out of bounds error
    }

    recordingModes.append(
      RecordingMode(
        id: recordingModeId,
        mode: supportedRecordingModes[Int(recordingModeId)].recordingMode,
      )
    )
  }
}

تغییر دادن حالت ضبط

قبل‌از به‌روزرسانی، مطمئن شوید که نمایه انتخاب‌شده از مشخصه supportedRecordingModes در مشخصه availableRecordingModes وجود دارد.

برای به‌روزرسانی حالت انتخاب‌شده، از تابع setSelectedRecordingMode استفاده کنید و نمایه حالت انتخاب‌شده را ارسال کنید:

let recordingModeTrait: Google.RecordingModeTrait
let recordingModeID: UInt8

_ = try await recordingModeTrait.update {
  $0.setSelectedRecordingMode(recordingModeID)
}

سایر تنظیمات

تنظیمات مختلف دیگری را می‌توان ازطریق Home API کنترل کرد.

روشن یا خاموش کردن دید در شب

برای روشن یا خاموش کردن دید در شب برای دوربین، از TriStateAutoEnum استفاده کنید تا مشخصه nightVision از ویژگی CameraAvStreamManagementTrait را بااستفاده از تابع داخلی setNightVision به‌روز کنید:

// Turn night vision on or off
func setNightVision(
  to value: Google.CameraAvStreamManagementTrait.TriStateAutoEnum
) async {
  do {
    _ = try await cameraAvStreamManagementTrait.update {
      $0.setNightVision(value)
    }
  } catch {
    // Error
  }
}

تغییر روشنایی LED وضعیت

برای تغییر دادن روشنایی LED وضعیت، از ThreeLevelAutoEnum برای به‌روزرسانی ویژگی statusLightBrightness از مشخصه CameraAvStreamManagementTrait بااستفاده از تابع داخلی setStatusLightBrightness استفاده کنید:

// Set the LED brightness
func setStatusLightBrightness(
  to value: Google.CameraAvStreamManagementTrait.ThreeLevelAutoEnum
) async {
  do {
    _ = try await cameraAvStreamManagementTrait.update {
      $0.setStatusLightBrightness(value)
    }
  } catch {
    // Error
  }
}

تغییر دادن نمای دوربین

نمای دوربین همان ویژگی «بزرگ‌نمایی و برش» است که در مقاله پشتیبانی بزرگ‌نمایی و بهبود ویدیو دوربین Nest توضیح داده شده است.

نمای هدف در ViewportStruct تعریف می‌شود که شامل چهار مقدار است که به‌عنوان مختصات نمای هدف استفاده می‌شوند. مختصات به‌صورت زیر تعریف می‌شود:

(x1,y1) -- (x2,y1)
   |          |
(x1,y2) -- (x2,y2)

تعیین مقادیر برای ViewportStruct به رابط کاربری برنامه و پیاده‌سازی دوربین بستگی دارد. در سطح بسیار ابتدایی، برای تنظیم کردن نمای دوربین ویدیو، ویژگی viewport مشخصه CameraAvStreamManagementTrait را با ViewportStruct، بااستفاده از تابع داخلی setViewport به‌روز کنید.

func setCrop(x1: UInt16, y1: UInt16, x2: UInt16, y2: UInt16) {

  let viewport = Google.CameraAvStreamManagementTrait.ViewportStruct(
    x1: x1,
    y1: y1,
    x2: x2,
    y2: y2
  )

  Task {
    do {
      try await cameraAvStreamManagementTrait.update {
        $0.setViewport(viewport)
      }
    } catch {
      // Error
    }
  }

}

تولید TransportOptionsStruct

برخی‌از تنظیمات نیاز به اصلاح ویژگی‌ها در TransportOptionsStruct دارند، که سپس به گزینه‌های انتقال اتصال جاری‌سازی منتقل می‌شود. برای Swift، این ساختار باید قبل‌از به‌روزرسانی هر ویژگی تولید شود.

از این تابع کمکی برای تولید ساختار برای استفاده با تغییرات تنظیمات زیر استفاده کنید:

func getTransportOptions(
  transportOptions: Google.PushAvStreamTransportTrait.TransportOptionsStruct,
  wakeUpSensitivity: UInt8?,
  maxEventLength: UInt32?
) async throws
  -> Google.PushAvStreamTransportTrait.TransportOptionsStruct
{

  var newMotionTimeControl:
    Google.PushAvStreamTransportTrait.TransportMotionTriggerTimeControlStruct? = nil
  if let maxEventLength {
    guard let motionTimeControl = transportOptions.triggerOptions.motionTimeControl else {
      throw HomeError.failedPrecondition(
        // Error - cannot update max event length without motion time control
    }
    newMotionTimeControl =
      Google.PushAvStreamTransportTrait.TransportMotionTriggerTimeControlStruct(
        initialDuration: motionTimeControl.initialDuration,
        augmentationDuration: motionTimeControl.augmentationDuration,
        maxDuration: maxEventLength,
        blindDuration: motionTimeControl.blindDuration
      )
  }

  return Google.PushAvStreamTransportTrait.TransportOptionsStruct(
    streamUsage: .recording,
    videoStreamID: nil,
    audioStreamID: nil,
    tlsEndpointID: transportOptions.tlsEndpointID,
    url: transportOptions.url,
    triggerOptions: Google.PushAvStreamTransportTrait.TransportTriggerOptionsStruct(
      triggerType: .motion,
      motionZones: nil,
      motionSensitivity: wakeUpSensitivity,
      motionTimeControl: newMotionTimeControl,
      maxPreRollLen: nil
    ),
    ingestMethod: .cmafIngest,
    containerOptions: Google.PushAvStreamTransportTrait.ContainerOptionsStruct(
      containerType: .cmaf,
      cmafContainerOptions: nil
    ),
    expiryTime: nil
  )
}

private func getRecordingConnection() async throws
  -> Google.PushAvStreamTransportTrait.TransportConfigurationStruct?
{
  guard let pushAvStreamTransportTrait else {
    // Error - PushAvStreamTransport trait not available
    return nil
  }

  let connections = try await pushAvStreamTransportTrait.findTransport().transportConfigurations

  for connection in connections {
    guard let transportOptions = connection.transportOptions,
      transportOptions.streamUsage == .recording
    else {
      continue
    }

    return connection
  }

  return nil
}

فعال یا غیرفعال کردن Analytics

هر دستگاه می‌تواند به‌طور جداگانه برای ارسال داده‌های تحلیلی دقیق به فضای ابری Google Home موافقت کند (به پایش ابری برای Home APIs مراجعه کنید).

برای فعال کردن تجزیه‌وتحلیل برای دستگاه، ویژگی analyticsEnabled) ExtendedGeneralDiagnosticsTrait را روی true تنظیم کنید. وقتی analyticsEnabled را تنظیم می‌کنید، دارایی دیگری، logUploadEnabled، به‌طور خودکار روی true تنظیم می‌شود که اجازه می‌دهد فایل‌های گزارش تجزیه‌وتحلیل در فضای ابری Google Home بارگذاری شود.

// Enable analytics
_ = try await extendedGeneralDiagnosticsTrait.update {
  $0.setAnalyticsEnabled(true)
}

// Disable analytics
_ = try await extendedGeneralDiagnosticsTrait.update {
  $0.setAnalyticsEnabled(false)
}

پیکربندی‌های انتقال و ضبط

این بخش تنظیمات مربوط به کیفیت جاری‌سازی دوربین و راه‌اندازی رویداد را پوشش می‌دهد. این تنظیمات توسط ویژگی PushAvStreamTransport مدیریت می‌شود.

خواندن تنظیمات حمل‌ونقل

این بخش نشان می‌دهد که چگونه پیکربندی فعلی را از دستگاه زنگ در یا دوربین بازیابی کنید. این کد ویژگی PushAvStreamTransport را واکشی می‌کند، اتصال خاصی را که برای ضبط استفاده می‌شود پیدا می‌کند، و سپس مقادیر فعلی کیفیت پهنای باند، حساسیت تنظیمات بیدار شدن، و حداکثر طول رویداد را استخراج می‌کند.

// Assuming access to
// var pushAvStreamTransportTrait: Google.PushAvStreamTransportTrait
let connections = try await pushAvStreamTransportTrait.findTransport().transportConfigurations

// Locate the connection designated for recording
let recordingConnection = connections.first { connection in
    guard let transportOptions = connection.transportOptions else { return false }
    return transportOptions.streamUsage == .recording
}

let options = recordingConnection?.transportOptions

// 1. Bandwidth Quality (Video Stream ID)
let videoStreamId = options?.videoStreamID

// 2. Wake-up Sensitivity (Motion Sensitivity)
let wakeUpSensitivity = options?.triggerOptions.motionSensitivity

// 3. Max Event Length (Motion Trigger Time Control)
let maxEventLength = options?.triggerOptions.motionTimeControl?.maxDuration

به‌روزرسانی تنظیمات حمل‌ونقل

این بخش نحوه تغییر تنظیمات انتقال را نشان می‌دهد. این کد یک TransportOptionsStruct جدید حاوی مقادیر جدید ایجاد می‌کند و سپس از فرمان modifyPushTransport برای ارسال این تنظیمات به‌روزشده به دستگاه استفاده می‌کند و آن‌ها را روی اتصال ضبط که در مرحله قبل پیدا شده است اعمال می‌کند.

برای اصلاح این تنظیمات، از فرمان modifyPushTransport با TransportOptionsStruct استفاده کنید.

// Example: Updating to Max Quality and 30s duration
let currentOptions = recordingConnection!.transportOptions!
let newOptions = Google.PushAvStreamTransportTrait.TransportOptionsStruct(
    streamUsage: .recording,
    videoStreamID: 2, // Max Quality
    tlsEndpointID: currentOptions.tlsEndpointID,
    url: currentOptions.url,
    triggerOptions: Google.PushAvStreamTransportTrait.TransportTriggerOptionsStruct(
        triggerType: .motion,
        motionSensitivity: 5, // Medium
        motionTimeControl: Google.PushAvStreamTransportTrait.TransportMotionTriggerTimeControlStruct(
            initialDuration: currentOptions.triggerOptions.motionTimeControl?.initialDuration ?? 10,
            augmentationDuration: currentOptions.triggerOptions.motionTimeControl?.augmentationDuration ?? 5,
            maxDuration: 30,
            blindDuration: currentOptions.triggerOptions.motionTimeControl?.blindDuration ?? 0
        )
    ),
    ingestMethod: currentOptions.ingestMethod,
    containerOptions: currentOptions.containerOptions
)

try await pushAvStreamTransportTrait.modifyPushTransport(
    connectionID: recordingConnection!.connectionID,
    transportOptions: newOptions
)

تعیین کیفیت پهنای باند

مشخصه videoStreamId TransportOptionsStruct با پیکربندی خاصی از جاری‌سازی ویدیو مطابقت دارد.

برای دریافت جاری‌سازی‌های ویدیویی پشتیبانی‌شده، به مشخصه allocatedVideoStreams مراجعه کنید که فهرستی از VideoStreamStructs است. از ویژگی CameraAvStreamManagement برای دستگاه.

تنظیم حساسیت بیدار شدن دستگاه

ویژگی motionSensitivity TransportTriggerOptionsStruct با مقادیر زیر مطابقت دارد:

برچسب مقدار (UInt8)
پایین 1
متوسط 5
زیاد 10

تنظیم حداکثر طول رویداد

ویژگی maxDuration TransportMotionTriggerTimeControlStruct با مدت‌های UInt32 زیر (به ثانیه) مطابقت دارد:

  • ‫10، 15، 30، 60، 120، 180

تنظیمات زنگ اخبار

تنظیمات مختلف زنگ اخبار را می‌توان ازطریق Home API کنترل کرد.

تغییر صدای زنگ اخبار

برای تغییر صدای زنگ اخبار، ابتدا فهرست صداهای زنگ نصب‌شده در دستگاه را بااستفاده از مشخصه installedChimeSounds از ویژگی ChimeTrait دریافت کنید:

doorbellChimeTrait.attributes.installedChimeSounds?.compactMap { chimeSound in
  return chimeSound.chimeID, chimeSound.name
}

سپس، مشخصه selectedChime ویژگی ChimeTrait را بااستفاده از تابع داخلی setSelectedChime به‌روز کنید:

func setDoorbellChime(chimeID: UInt8) async {
  do {
    _ = try await doorbellChimeTrait.update {
      $0.setSelectedChime(chimeID)
    }
  } catch {
    // Error
  }
}

استفاده از زنگ اخبار خارجی

   در برنامه نمونه برای iOS پیاده‌سازی شده است   

زنگ در را می‌توان برای استفاده از زنگ اخبار خارجی، مثل زنگ مکانیکی نصب‌شده در داخل خانه، پیکربندی کرد. این تنظیم باید درطول نصب زنگ در پیکربندی شود تا از آسیب احتمالی به زنگ اخبار خارجی جلوگیری شود.

برای نشان دادن نوع زنگ خارجی نصب‌شده، از ExternalChimeType برای به‌روزرسانی مشخصه externalChime از ویژگی ChimeTrait بااستفاده از تابع داخلی setExternalChime استفاده کنید:

// Indicate the external chime is mechanical
func setExternalChime(to value: Google.ChimeTrait.ExternalChimeType) async {
  do {
    _ = try await doorbellChimeTrait.update {
      $0.setExternalChime(value)
    }
  } catch {
    // Error
  }
}

تغییر مدت زنگ اخبار خارجی

مدت‌زمان زنگ زدن زنگ اخبار خارجی (به ثانیه) را می‌توان ازطریق Home API پیکربندی کرد. اگر زنگ خارجی از مدت‌زمان زنگ پشتیبانی کند، ممکن است کاربر بخواهد این مورد را پیکربندی کند.

مقدار تنظیم‌شده در اینجا به مشخصات خود زنگ اخبار خارجی و مدت‌زمان توصیه‌شده برای زنگ اخبار بستگی دارد.

برای تغییر مدت‌زمان زنگ اخبار خارجی، مشخصه externalChimeDurationSeconds ویژگی ChimeTrait را بااستفاده از تابع توکار setExternalChimeDurationSeconds به‌روز کنید:

// Change the external chime duration
func setExternalChimeDuration(to value: UInt16) async {
  do {
    _ = try await doorbellChimeTrait.update {
      $0.setExternalChimeDuration(value)
    }
  } catch {
    // Error
  }
}

فعال کردن زمینه زنگ ساعت

   در برنامه نمونه برای iOS پیاده‌سازی شده است   

برخی‌از زنگ‌های در ممکن است زنگ اخباری داشته باشند که فقط برای مدت محدودی دردسترس کاربران باشد. برای مثال، زنگ‌های مخصوص تعطیلات. به این‌ها زمینه‌های زنگ می‌گویند.

برای دیدن اینکه کدام زمینه‌های زنگ برای کاربر دردسترس است، فیلتر جعبه زمان ایجاد کنید و از آن برای فیلتر کردن نتایج getAvailableThemes فرمان از ChimeThemes ویژگی استفاده کنید. این کار فهرستی از زمینه‌های دردسترس، ازجمله نام زمینه‌ها را برمی‌گرداند.

مثال زیر نحوه فیلتر کردن فهرست را نشان می‌دهد. اگر زمان فعلی بین زمان شروع و پایان طرح زمینه باشد (به‌ترتیب مقادیر startTimeSeconds و endTimeSeconds)، طرح زمینه فعال درنظر گرفته می‌شود. اگر زمان شروع تنظیم نشده باشد، از ابتدای زمان فعال درنظر گرفته می‌شود. اگر زمان پایانی تنظیم نشده باشد، برای مدت نامحدودی فعال می‌ماند. اگر هر دو وجود نداشته باشند، زمینه همیشه فعال است.

let chimeThemes = try await chimeThemeTrait.getAvailableThemes().themes

if !chimeThemes.isEmpty {
  var chimeThemeSettings = []
  for chimeTheme in chimeThemes {
    let currentDateTime = UInt64(Date().timeIntervalSince1970)

    // Only show chime themes that are active.
    if chimeTheme.startTimeSeconds ?? 0 &lt;= currentDateTime
      &amp;&amp; chimeTheme.endTimeSeconds ?? UInt64.max &gt;= currentDateTime
    {
      self.chimeThemeSettings.append(chimeTheme.name)
    }
  }
}

وقتی نام زمینه موردنظرتان را پیدا کردید، مثلاً Christmas، می‌توانید آن را بااستفاده از تابع setSelectedTimeboxedThemeName() در ویژگی ChimeThemes ChimeThemes انتخاب کنید.

private func setChimeTheme(to value: String) async throws {
  _ = try await chimeThemeTrait.update {
    $0.setSelectedTimeboxedThemeName(value)
  }
}

تنظیمات اعلام حضور مراجعه‌کننده

می‌توانید تنظیمات اعلام حضور مراجعه‌کننده را برای زنگ‌های در بااستفاده از ویژگی VisitorAnnouncement در Home API پُرسمان و مدیریت کنید. این مشخصه کنترل می‌کند که وقتی فردی زنگ در را به‌صدا درمی‌آورد، حضور مراجعه‌کننده در بلندگوها یا نمایشگرهای هوشمند Google اعلام شود یا نه.

مثال زیر نشان می‌دهد که چگونه بررسی کنید که آیا اعلام حضور مراجعه‌کننده فعال است یا نه، و چگونه این تنظیم را به‌روز کنید:

let visitorAnnouncementsEnabled: Bool = visitorAnnouncementTrait.attributes.visitorAnnouncementsEnabled

let value: Bool
_ = try await self.visitorAnnouncementTrait?.update {
  $0.setVisitorAnnouncementsEnabled(value)
}

ازکار انداختن دستگاه

برای برداشتن زنگ در از ساختمان، با device.decommission() تماس بگیرید. ازکارانداختن باعث می‌شود کاربر با صفحه تأیید مدیریت‌شده توسط Google مواجه شود که هشدار می‌دهد تمام سابقه ویدیویی ۲۴ساعته، سابقه رویداد، کلیپ‌ها، و داده‌های کتابخانه چهره آشنا در سراسر ساختار برای همیشه حذف خواهند شد.

برای دستورالعمل‌های دقیق و نمونه‌های کد، به برداشتن دستگاه مراجعه کنید.