Hướng dẫn về thiết bị chuông cửa cho Android

Bạn có thể triển khai loại thiết bị Chime cơ bản bằng cách sử dụng đặc điểm dựa trên Matter tiêu chuẩn com.google.home.matter.standard.Chime hoặc phiên bản tuỳ chỉnh của riêng Google cho đặc điểm này, com.google.home.google.Chime. Ngoài các chức năng được chỉ định trong tiêu chuẩn Matter, phiên bản này còn hỗ trợ chuông báo bên ngoài. Thiết bị chuông cửa cũng có thể triển khai đặc điểm Identify, giúp xác định thiết bị chuông cửa bằng thị giác hoặc âm thanh.

Luôn kiểm tra xem thiết bị có hỗ trợ thuộc tính và lệnh hay không trước khi sử dụng bất kỳ tính năng nào hoặc cố gắng cập nhật thuộc tính. Hãy xem bài viết Điều khiển thiết bị trênAndroid để biết thêm thông tin.

Loại thiết bị Home API Đặc điểm Ứng dụng mẫu Kotlin Trường hợp sử dụng

Chuông vang

ChimeDevice

home.matter.0000.types.0146

Một thiết bị có thể phát nhiều âm thanh được cài đặt sẵn và thường được dùng với chuông cửa, chuông cửa âm thanh hoặc chuông cửa có camera.

Đặc điểm bắt buộc
     matter Chime

Đặc điểm không bắt buộc
     matter Xác định
Chuông cửa

Nhận thông tin cơ bản về một thiết bị

   Được triển khai trong Ứng dụng mẫu cho Android   

Đặc điểm BasicInformation bao gồm các thông tin như tên nhà cung cấp, mã nhận dạng nhà cung cấp, mã nhận dạng sản phẩm, tên sản phẩm (bao gồm cả thông tin về kiểu máy) và phiên bản phần mềm của thiết bị:

// 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}")
    }

Hỗ trợ nhiều phần

Chuông báo có thể bao gồm nhiều loại thiết bị, bao gồm cả Chuông báo và có thể có cả Loa. Ngoài ra, một số chuông còn có Thread Border Router (TBR). Để đảm bảo hỗ trợ rộng rãi nhất, các ứng dụng Home API kiểm soát chuông báo phải được viết để phù hợp với các thiết bị chuông báo nhiều phần. Hãy xem phần Thiết bị nhiều phần để biết thêm thông tin.

Mỗi thiết bị chuông nhiều phần phải được biểu thị trong ứng dụng bằng một ô duy nhất. Thiết bị Chime phải là thiết bị chính và một Loa con phải là một phần của Chime.

Âm lượng của loa sẽ xuất hiện dưới dạng chế độ cài đặt chính của thiết bị Chime.

Ánh xạ OnOff

Đối với chuông cửa có cả loại thiết bị Chuông cửa và Loa, nút Bật/tắt trong ứng dụng điều khiển phải được liên kết với thuộc tính Enabled của Chuông cửa.

Theo quy cách Thư viện thiết bị Matter, việc đặt thuộc tính Enabled của đặc điểm Chuông thành False có thể, ngoài việc tắt Chuông, còn hoạt động như một công tắc tắt tiếng chung ngăn tất cả các chỉ báo âm thanh và hình ảnh.

Hỗ trợ tự động hoá

Như đã nêu trước đó, vì ChimeDevice có thể có nhiều phần, nên nhà phát triển nên coi tất cả chuông là thiết bị nhiều phần và điều này vẫn đúng trong trường hợp các quy trình tự động hoá sử dụng chuông.

Bạn có thể dùng chuông báo trong các điều kiện khởi động và hành động của quy trình tự động hoá.

Mọi thiết bị thành phần thuộc thiết bị Chime mẹ được dùng trong quy trình tự động hoá đều phải được tham chiếu bằng AutomationPartPath.

Quy trình tự động hoá sau đây minh hoạ cách tạo một quy trình tự động hoá có chuông nhiều phần triển khai đặc điểm Chime cũng như một Loa. Quy tắc tự động hoá sẽ được kích hoạt khi cửa trước mở:

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())
    }
  }
}

Hãy xem bài viết Quy trình tự động hoá trên nhiều thiết bị để biết thêm thông tin về quy trình tự động hoá sử dụng nhiều thiết bị.

Kiểm tra khả năng kết nối của thiết bị

Khả năng kết nối của một thiết bị thực sự được kiểm tra ở cấp loại thiết bị vì một số thiết bị hỗ trợ nhiều loại thiết bị. Trạng thái được trả về là sự kết hợp của các trạng thái kết nối cho tất cả các đặc điểm trên thiết bị đó.

   Được triển khai trong Ứng dụng mẫu cho Android   
val lightConnectivity = dimmableLightDevice.metadata.sourceConnectivity.connectivityState

Bạn có thể thấy trạng thái PARTIALLY_ONLINE trong trường hợp có nhiều loại thiết bị khi không có kết nối Internet. Các đặc điểm Matter tiêu chuẩn vẫn có thể ở chế độ trực tuyến do định tuyến cục bộ, nhưng các đặc điểm dựa trên đám mây sẽ ở chế độ ngoại tuyến.

Lấy địa chỉ IP của thiết bị

Để tìm địa chỉ IP của thiết bị, hãy sử dụng thuộc tính networkInterfaces của đặc điểm GeneralDiagnostics. Các địa chỉ được trả về dưới dạng mảng byte mà bạn có thể định dạng thành các chuỗi IPv4 hoặc IPv6 tiêu chuẩn:

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()