Android용 초인종 기기 가이드

기본 차임벨 기기 유형은 표준 Matter 기반 트레이트 com.google.home.matter.standard.Chime 또는 Google의 자체 맞춤 버전의 트레이트 com.google.home.google.Chime을 사용하여 구현할 수 있습니다. 이 트레이트는 Matter 표준에 지정된 기능 외에도 외부 차임벨을 지원합니다. 차임벨 기기는 Identify 트레이트를 구현할 수도 있습니다. 이 트레이트는 시각이나 소리로 차임벨 기기를 식별하는 수단을 제공합니다.

기능을 사용하거나 속성을 업데이트하기 전에 항상 기기의 속성 및 명령어 지원을 확인하세요. 자세한 내용은 Android에서 기기 제어하기를 참고하세요.

Home API 기기 유형 특성 Kotlin 샘플 앱 사용 사례

차임벨

ChimeDevice

home.matter.0000.types.0146

다양한 사전 설치된 소리를 재생할 수 있으며 일반적으로 초인종, 오디오 초인종 또는 비디오 초인종과 함께 사용되는 기기입니다.

필수 특성
     matter 차임벨

선택적 특성
     matter 식별
초인종

기기에 관한 기본 정보 가져오기

   Android용 샘플 앱에 구현됨   

BasicInformation 특성에는 공급업체 이름, 공급업체 ID, 제품 ID, 제품 이름 (모델 정보 포함), 기기의 소프트웨어 버전과 같은 정보가 포함됩니다.

// Get device basic information. All general information traits are on the RootNodeDevice type.
    device.type(RootNodeDevice).first().standardTraits.basicInformation?.let { basicInformation ->
        println("vendorName ${basicInformation.vendorName}")
        println("vendorId ${basicInformation.vendorId}")
        println("productId ${basicInformation.productId}")
        println("productName ${basicInformation.productName}")
        println("softwareVersion ${basicInformation.softwareVersion}")
    }

멀티파트 지원

차임벨은 차임벨과 선택적으로 스피커를 비롯한 여러 기기 유형으로 구성될 수 있습니다. 또한 일부 차임벨에는 Thread Border Router (TBR)가 포함되어 있습니다. 가장 광범위한 지원을 보장하려면 차임벨을 제어하는 Home API 앱은 멀티파트 차임벨 기기를 수용하도록 작성해야 합니다. 자세한 내용은 멀티파트 기기를 참고하세요.

각 멀티파트 차임벨 기기는 앱에서 단일 타일로 표시되어야 합니다. 차임벨 기기가 기본 기기여야 하며, 하위 스피커는 차임벨 아래의 부분이어야 합니다.

스피커 볼륨이 차임벨 기기의 기본 설정으로 표시되어야 합니다.

OnOff 매핑

차임벨과 스피커 기기 유형이 모두 있는 차임벨의 경우 제어 앱의 OnOff 버튼은 차임벨의 Enabled 속성에 매핑되어야 합니다.

Matter 기기 라이브러리 사양에 따라 차임벨 특성의 Enabled 속성을 False로 설정하면 차임벨을 사용 중지하는 것 외에도 모든 청각 및 시각적 표시기를 억제하는 전역 무음 스위치처럼 작동할 수 있습니다.

자동화 지원

앞서 언급한 것처럼 ChimeDevice에는 여러 부분이 있을 수 있으므로 개발자는 모든 차임을 멀티파트 기기로 취급하는 것이 좋습니다. 이는 차임을 사용하는 자동화의 경우에도 마찬가지입니다.

차임벨은 자동화 시작 조건 및 작업에 사용할 수 있습니다.

자동화에 사용되는 상위 차임벨 기기 아래의 구성요소 기기는 AutomationPartPath를 사용하여 참조해야 합니다.

다음 자동화는 차임벨 트레이트와 스피커를 모두 구현하는 멀티파트 차임벨로 자동화를 만드는 방법을 보여줍니다. 현관문이 열리면 자동화가 트리거됩니다.

import com.google.home.automation.automation
import com.google.home.automation.greaterThan
import com.google.home.google.GoogleDoorDevice
import com.google.home.google.OpenClose
import com.google.home.matter.standard.ChimeDevice
import com.google.home.matter.standard.Chime
// ...

// Fetch devices
val devices = homeManager.devices()

// Fetch devices using the multipart device model.
val multipartDevices = homeManager.devices(enableMultipartDevices = true)

val doorDevice = devices.first() {
  it.has(GoogleDoorDevice) &&
  it.has(OpenClose)
}

// Obtain a reference to the chime device.
val chime = multipartDevices.first() {
  it.has(ChimeDevice) &&
  it.has(Chime)
}

// Extract the AutomationPartPath for the specific Chime part
val chimePartPath = chime.automationPart(chime.part(ChimeDevice).first())!!

// Build the automation
val chimeAutomation = automation {
  sequential {
    val doorOpenClose = stateReader<_>(doorDevice, GoogleDoorDevice, OpenClose)
    // Starter: When the door state changes
    val starterNode = starter<_>(doorDevice, GoogleDoorDevice, OpenClose)
    condition {
     expression = doorOpenClose.openPercent greaterThan(0)
    }
    // Action: Play a chime sound
    action(chimePartPath) {
      command(Chime.playChimeSound())
    }
  }
}

멀티파트 기기를 사용하는 자동화에 관한 자세한 내용은 멀티파트 기기 자동화를 참고하세요.

기기의 연결 확인

일부 기기는 여러 기기 유형을 지원하므로 기기의 연결은 실제로 기기 유형 수준에서 확인됩니다. 반환된 상태는 해당 기기의 모든 특성에 대한 연결 상태의 조합입니다.

   Android용 샘플 앱에 구현됨   
val lightConnectivity = dimmableLightDevice.metadata.sourceConnectivity.connectivityState

인터넷 연결이 없는 경우 혼합 기기 유형에서 PARTIALLY_ONLINE 상태가 관찰될 수 있습니다. Matter 표준 특성은 로컬 라우팅으로 인해 온라인 상태일 수 있지만 클라우드 기반 특성은 오프라인 상태가 됩니다.

기기의 IP 주소 가져오기

기기의 IP 주소를 찾으려면 GeneralDiagnostics 트레이트의 networkInterfaces 속성을 사용합니다. 주소는 바이트 배열로 반환되며, 이를 표준 IPv4 또는 IPv6 문자열로 형식화할 수 있습니다.

val ipAddresses =
  trait.networkInterfaces?.flatMap { networkInterface ->
    (networkInterface.ipv4Addresses + networkInterface.ipv6Addresses).mapNotNull { bytes ->
      try {
        java.net.InetAddress.getByAddress(bytes).hostAddress
      } catch (e: java.net.UnknownHostException) {
        null
      }
    }
  } ?: emptyList()