Руководство по использованию устройства Chime на устройстве iOS

Основной тип устройства Chime может быть реализован с помощью стандартного признака Matter Matter.ChimeTrait или собственной версии признака от Google Google.ChimeTrait, которая, помимо возможностей, указанных в стандарте Matter, поддерживает внешние звонки. Устройство с сигналом также может реализовывать интерфейс Matter.IdentifyTrait, который позволяет идентифицировать устройство с сигналом по внешнему виду или звуку.

Перед использованием функций или попыткой обновить атрибуты всегда проверяйте, поддерживаются ли они устройством. Подробнее о том, как управлять устройствами на сайтеiOS…

Тип устройства для Home API Функции Пример приложения на языке Swift История успеха

Звонок

ChimeDeviceType

home.matter.0000.types.0146

Устройство, которое может воспроизводить различные предустановленные звуки и обычно используется с дверным звонком, аудиодомофоном или видеодомофоном.

Обязательные черты
     matter ChimeTrait

Необязательные черты
     matter IdentifyTrait
Дверной звонок

Как получить основную информацию об устройстве

   Реализовано в примере приложения для 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!

Поддержка многочастных сообщений

Звонок может состоять из нескольких типов устройств, включая звонок и, при необходимости, колонку. Кроме того, некоторые колокольчики оснащены Thread Border Router (TBR). Чтобы обеспечить максимально широкую поддержку, приложения, использующие API Home и управляющие звонками, должны быть написаны с учетом многокомпонентных устройств. Подробнее об устройствах, состоящих из нескольких частей…

Каждое устройство с многочастным звонком должно быть представлено в приложении одной карточкой. Устройство Chime должно быть основным, а колонка Child Speaker – частью Chime.

Громкость динамика должна быть основной настройкой устройства Chime.

Сопоставление OnOff

Для звонка с типами устройств "Звонок" и "Колонка" кнопка "Вкл./Выкл." в управляющем приложении должна быть сопоставлена с атрибутом Enabled звонка.

Согласно Matter спецификации библиотеки устройств, если задать для атрибута Enabled признака Chime значение False, то, помимо отключения звукового сигнала, будет подавлен звук и визуальные индикаторы.

Поддержка автоматизации

Как уже было сказано, поскольку у ChimeDeviceType может быть несколько частей, разработчикам рекомендуется считать все звонки многокомпонентными устройствами. Это также относится к автоматизации, в которой используются звонки.

Звуки могут использоваться в качестве триггеров и действий для автоматизации.

Любое устройство, входящее в состав родительского устройства Chime и используемое в автоматизации, должно быть указано с помощью AutomationPartPath.

В примере ниже показано, как создать автоматизацию с многочастным звуковым сигналом, который реализует черту Chime, а также Speaker. Автоматизация запускается, когда открывается входная дверь:

import GoogleHomeSDK
import GoogleHomeTypes

typealias ChimeTrait = Matter.ChimeTrait
typealias OpenCloseTrait = Google.OpenCloseTrait

// Fetch devices using the multipart device model.
let multipartDevices = try await home.devices(enableMultipartDevices: true).list()

guard let chimeParentDevice = multipartDevices.first(where: {
  $0.types.contains(ChimeDeviceType.self)
}) else { return }

guard let doorDevice = multipartDevices.first(where: {
  $0.types.contains(GoogleDoorDeviceType.self)
}) else { return }

// Extract the AutomationPartPath for the specific Chime part
guard let chimeType = await chimeParentDevice.types.get(ChimeDeviceType.self),
  let chimePartPath = chimeParentDevice.automationPart(chimeType) else {
  return
}

let starterNode = starter(doorDevice, GoogleDoorDeviceType.self, OpenCloseTrait.self)

let doorOpenClose = stateReader(doorDevice, GoogleDoorDeviceType.self, OpenCloseTrait.self)

// Build the automation
let chimeAutomation = automation(
  name: "Multipart Chime Demo",
  description: "Activate the chime when the door is opened"
) {
starterNode
condition {
  starterNode.openPercent.unwrapOptional().greaterThan(0)
}
  // Action: Play a chime sound
  action(chimePartPath) {
    ChimeTrait.playChimeSound()
  }
}

Дополнительную информацию об автоматизации с использованием многокомпонентных устройств можно найти в разделе Автоматизация с использованием многокомпонентных устройств.

Как проверить подключение устройства

На самом деле подключение устройства проверяется на уровне типа устройства, поскольку некоторые устройства поддерживают несколько типов. Возвращаемое состояние представляет собой сочетание состояний подключения для всех характеристик устройства.

let lightConnectivity =
  dimmableLightDeviceType.metadata.sourceConnectivity
  .connectivityState

Статус partiallyOnline может наблюдаться при использовании устройств разных типов, если нет подключения к интернету. Matter стандартные функции могут быть доступны онлайн благодаря локальной маршрутизации, но облачные функции будут недоступны.

Как узнать IP-адрес устройства

Чтобы найти IP-адрес устройства, используйте атрибут networkInterfaces элемента GeneralDiagnosticsTrait. Адреса возвращаются в виде объектов Data, которые можно отформатировать в стандартные строки IPv4 или IPv6 с помощью фреймворка Network:

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
}