เข้าถึงอุปกรณ์และข้อมูลเมตาของอุปกรณ์สำหรับ Android

คุณเข้าถึง Device API ได้ผ่าน Home API สำหรับ Android นำเข้าแพ็กเกจต่อไปนี้ลงในแอป

import com.google.home.Home
import com.google.home.HomeDevice
import com.google.home.Id

หากต้องการใช้อุปกรณ์หรือลักษณะเฉพาะบางอย่างกับ Device API คุณต้องนำเข้าอุปกรณ์หรือลักษณะเฉพาะเหล่านั้นทีละรายการ

ตัวอย่างเช่น หากต้องการใช้Matterลักษณะเปิด/ปิดและประเภทอุปกรณ์ปลั๊กอินเปิด/ปิด ให้นำเข้าแพ็กเกจต่อไปนี้ลงในแอปพลิเคชัน

import com.google.home.matter.standard.OnOff
import com.google.home.matter.standard.OnOffPluginUnitDevice

ดูข้อมูลเพิ่มเติมได้ที่โมเดลข้อมูลใน Android

การจัดการข้อผิดพลาด

เมธอดใดก็ตามใน Home API สามารถส่ง HomeException ได้ ดังนั้นเราขอแนะนำให้คุณใช้บล็อก try-catch เพื่อตรวจหา HomeException ในการเรียกใช้ทั้งหมด

เมื่อจัดการ HomeException ให้ตรวจสอบฟิลด์ code และ message เพื่อดูว่าเกิดข้อผิดพลาดใด

ข้อยกเว้นที่ไม่ได้จัดการจะทำให้แอปขัดข้อง

ดูข้อมูลเพิ่มเติมได้ที่ การจัดการข้อผิดพลาด

ดูตัวอย่างได้ที่ส่งคำสั่งไปยังอุปกรณ์

ตัวอย่างการเรียก

รับรายการอุปกรณ์

เมื่อมีโครงสร้าง devices() การเรียกจะแสดงผล Flow ของอุปกรณ์ ที่คุณเข้าถึงได้จากโครงสร้างนั้น

// Get a flow of all devices accessible to the user
val allDevicesFlow: HomeObjectsFlow<HomeDevice> = home.devices()

// Calling list() on a HomeObjectsFlow returns the first Set of elements.
val allDevices: Set<HomeDevice> = allDevicesFlow.list()

จากนั้นคุณจะเข้าถึงสถานะของอุปกรณ์แต่ละเครื่องและส่งคำสั่งที่รองรับไปยังอุปกรณ์ได้

อ่านสถานะอุปกรณ์

มาดูตัวอย่างการตรวจสอบแอตทริบิวต์ OnOff จากลักษณะเปิด/ปิดของอุปกรณ์กัน เมื่อใช้โมเดลข้อมูลลักษณะของ Home API ซึ่งระบุลักษณะนี้เป็น OnOff คุณจะเรียกข้อมูลลักษณะผ่านคลาส standardTraits ของประเภทอุปกรณ์ได้

// Assuming we have a device.
val deviceFlow = home.devices().itemFlow(myDeviceId)

val device = deviceFlow.first()

// Get a flow of a standard trait on the type. distinctUntilChanged() is needed to only trigger
// on the specific trait changes and not the whole type.
val onOffTraitFlow: Flow<OnOff?> =
  device.type(DimmableLightDevice).map { it.standardTraits.onOff }.distinctUntilChanged()

val onOffTrait: OnOff = onOffTraitFlow.first()!!

ดู distinctUntilChanged เพื่อดูข้อมูลเพิ่มเติมเกี่ยวกับฟังก์ชันโฟลว์ของ Kotlin

ทำให้สถานะในการติดตามลักษณะไม่ถูกต้อง

TraitStateInvalidationอินเทอร์เฟซ ช่วยให้คุณยกเลิกสถานะที่ดึงข้อมูลผ่านการสมัครใช้บริการ ไปยังอุปกรณ์เป้าหมายได้ในกรณีที่ระบบรายงานสถานะไม่ถูกต้อง ตัวอย่างกรณีที่อาจมีการรายงานสถานะไม่ถูกต้อง ได้แก่ การใช้แอตทริบิวต์ในMatterลักษณะที่มีคุณภาพ "C" หรือเนื่องจากการติดตั้งใช้งานอุปกรณ์ที่ทำให้เกิดปัญหาโดยไม่คาดคิด

API นี้จะออกคำสั่งให้อ่านสถานะลักษณะปัจจุบันและแสดงผลลัพธ์ ผ่านขั้นตอนลักษณะที่มีอยู่

รับลักษณะ จากนั้นเรียกใช้ forceRead ในลักษณะ

val generalDiagnosticsTrait = device.trait(GeneralDiagnostics).first()
generalDiagnosticsTrait.forceRead()

ดูรายการลักษณะของประเภทอุปกรณ์

ควรใช้ประเภทอุปกรณ์เป็นจุดเริ่มต้นในการอ่านลักษณะ เนื่องจากประเภทอุปกรณ์จะ แยกอุปกรณ์ออกเป็นชิ้นส่วนที่ใช้งานได้ (เช่น ปลายทางใน Matter)

นอกจากนี้ยังพิจารณาถึงการชนกันของลักษณะในกรณีที่อุปกรณ์มีอุปกรณ์ 2 ประเภท ซึ่งทั้ง 2 ประเภทอาจมีลักษณะเดียวกัน เช่น หากอุปกรณ์เป็นทั้งลำโพงและหลอดไฟที่หรี่แสงได้ อุปกรณ์จะมีลักษณะเปิด/ปิด 2 รายการและลักษณะการควบคุมระดับ 2 รายการ

วิธีดูรายการลักษณะที่ใช้ได้สำหรับประเภทอุปกรณ์ไฟหรี่ได้

// Get all types available on this device. Requires the types to be part of the registry during
// SDK initialization.
val typesFlow: Flow<Set<DeviceType>> = device.types()

// Get a snapshot of all types.
val types: Set<DeviceType> = typesFlow.first()

// Get the DimmableLightDevice instance from the set of types.
val dimmableLightDevice = types.filterIsInstance<DimmableLightDevice>().firstOrNull()

// Get all traits in the type + traits registered
val allTraits: Set<Trait> = dimmableLightDevice!!.traits()

การชนกันของลักษณะอีกประเภทอาจเกิดขึ้นเมื่ออุปกรณ์มีลักษณะ 2 อย่างที่มีชื่อเดียวกัน เช่น onOff อาจอ้างอิงถึงอินสแตนซ์ของลักษณะมาตรฐาน OnOff หรืออาจอ้างอิงถึงอินสแตนซ์ของลักษณะที่ผู้ผลิตกำหนด OnOff เพื่อขจัดความคลุมเครือที่อาจเกิดขึ้นเกี่ยวกับลักษณะที่ต้องการ อินสแตนซ์ Trait ที่อ้างอิงผ่านอุปกรณ์ควรนำหน้าด้วย เนมสเปซที่ผ่านการรับรอง สำหรับลักษณะมาตรฐาน ซึ่งก็คือลักษณะที่คล้ายกับMatterคลัสเตอร์มาตรฐาน ให้ใช้ standardTraits สำหรับลักษณะของ Google ให้ใช้ googleTraits ดังนี้

// Accessing standard traits on the type.
val onOffTrait: OnOff? = dimmableLightDevice.standardTraits.onOff
val levelControlTrait: LevelControl? = dimmableLightDevice.standardTraits.levelControl

หากต้องการเข้าถึงลักษณะเฉพาะของผู้ผลิต ให้อ้างอิงลักษณะดังกล่าวโดยตรง

// Accessing a custom trait on the type.
val customTrait = dimmableLightDevice.trait(MyCustomTrait)

ดูรายการอุปกรณ์ที่มีลักษณะเฉพาะ

คุณใช้ฟังก์ชัน filter ใน Kotlin เพื่อปรับแต่งการเรียก API เพิ่มเติมได้ ตัวอย่างเช่น หากต้องการดูรายการอุปกรณ์ในบ้านที่มีลักษณะเปิด/ปิดทั้งหมด ให้ทำดังนี้

// Get all devices that support OnOff
val onOffDevices: Flow<List<HomeDevice>> =
  home.devices().map { devices -> devices.filter { it.has(OnOff) } }

ดูรายการลักษณะทั้งหมดที่มีใน Home API ได้ที่Traitอินเทอร์เฟซ

ดูรายการอุปกรณ์ที่มีประเภทอุปกรณ์คล้ายกัน

หากต้องการดูรายการอุปกรณ์ที่แสดงไฟทั้งหมดในบ้าน ให้ทำดังนี้

// Get a list of devices with similar device types (lights)
val lightDevices =
  home.devices().map { devices ->
    devices.filter {
      it.has(DimmableLightDevice) ||
        it.has(OnOffLightDevice) ||
        it.has(ColorTemperatureLightDevice) ||
        it.has(ExtendedColorLightDevice)
    }
  }

มีอุปกรณ์หลายประเภทใน Home API ที่อาจแสดงถึงประเภทอุปกรณ์หลัก เช่น ไม่มีประเภทอุปกรณ์ "หลอดไฟ" แต่จะมีอุปกรณ์ 4 ประเภทที่แตกต่างกันซึ่งอาจแสดงถึงหลอดไฟ ดังที่แสดงใน ตัวอย่างก่อนหน้า ดังนั้น หากต้องการดูภาพรวมที่ครอบคลุมของอุปกรณ์ประเภทระดับสูงในบ้าน คุณต้องรวมอุปกรณ์หลายประเภทไว้ในโฟลว์ที่กรองแล้ว

ดูรายการประเภทอุปกรณ์ทั้งหมดที่พร้อมใช้งานใน Home API ได้ที่DeviceTypeอินเทอร์เฟซ

ดูรหัสผู้ให้บริการหรือรหัสผลิตภัณฑ์สำหรับอุปกรณ์

ลักษณะBasicInformation ประกอบด้วยข้อมูล เช่น รหัสผู้ให้บริการ รหัสผลิตภัณฑ์ ชื่อผลิตภัณฑ์ และ หมายเลขซีเรียลของอุปกรณ์

// Get device basic information. All general information traits are on the RootNodeDevice type.
val basicInformation = device.type(RootNodeDevice).first().standardTraits.basicInformation!!
println("vendorName ${basicInformation.vendorName}")
println("vendorId ${basicInformation.vendorId}")
println("productId ${basicInformation.productId}")

การระบุอุปกรณ์แบบคลาวด์ต่อคลาวด์สำหรับผู้ผลิตอุปกรณ์

หากคุณเป็นผู้ผลิตอุปกรณ์และสร้างCloud-to-cloudอุปกรณ์ คุณสามารถระบุCloud-to-cloudอุปกรณ์ผ่านลักษณะBasicInformationได้โดยรวมฟิลด์สตริงเหล่านี้ไว้ในคำตอบSYNCของอุปกรณ์

  • Connectivity Standards Alliance (CSA) ออกรหัสผู้ให้บริการ: "matterOriginalVendorId": "0xfff1",

  • ตัวระบุผลิตภัณฑ์ที่ระบุผลิตภัณฑ์ของผู้ขายได้อย่างไม่ซ้ำกัน "matterOriginalProductId": "0x1234",

  • ตัวระบุที่ไม่ซ้ำกันสำหรับอุปกรณ์ ซึ่งสร้างขึ้นในลักษณะเฉพาะของผู้ผลิต "matterUniqueId": "matter-device-id",

เมื่อป้อนฟิลด์สตริงเหล่านี้ ให้ใช้Matter รหัสผู้ให้บริการและรหัสผลิตภัณฑ์หากมี หากคุณไม่ได้เป็นสมาชิก CSA และไม่ได้รับมอบหมายรหัสเหล่านี้ คุณสามารถเว้นช่อง matterOriginalVendorId และ matterOriginalProductId ว่างไว้ แล้วระบุ matterUniqueId เป็นตัวระบุได้

ตัวอย่างการตอบกลับ SYNC แสดงการใช้ฟิลด์ต่อไปนี้

{
  "requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf",
  "payload": {
    "agentUserId": "1836.15267389",
    "devices": [
      {
        "id": "456",
        "type": "action.devices.types.LIGHT",
        "traits": [
          "action.devices.traits.OnOff",
          "action.devices.traits.Brightness",
          "action.devices.traits.ColorSetting",
        ],
        "willReportState": true,
        "deviceInfo": { ... },
        "matterOriginalVendorId": "0xfff1",
        "matterOriginalProductId": "0x1234",
        "matterUniqueId": "matter-device-id",
        "otherDeviceIds": [
          {
            "deviceId": "local-device-id",
          }
        ]
      }
    ]
  }
}

ดูข้อมูลเพิ่มเติมได้ที่เอกสารประกอบของ Cloud-to-cloud SYNC

ข้อมูลเมตาของอุปกรณ์และลักษณะ

อุปกรณ์และลักษณะใน Home API มีข้อมูลเมตาที่เชื่อมโยงอยู่ ซึ่งจะช่วยในการจัดการประสบการณ์ของผู้ใช้ในแอปได้

ลักษณะแต่ละอย่างใน Home API มีพร็อพเพอร์ตี้ sourceConnectivity ซึ่งมีข้อมูลเกี่ยวกับสถานะออนไลน์และสถานที่ตั้งของลักษณะ (การกำหนดเส้นทางในพื้นที่หรือระยะไกล)

รับประเภทหลักของอุปกรณ์

อุปกรณ์บางเครื่องอาจแสดงอุปกรณ์หลายประเภทผ่าน Home API หากต้องการให้ผู้ใช้เห็นตัวเลือกที่เหมาะสมใน แอป (เช่น การควบคุมอุปกรณ์และการทำงานอัตโนมัติที่แนะนำ) สำหรับอุปกรณ์ของตน คุณควรตรวจสอบประเภทอุปกรณ์หลักของอุปกรณ์

ก่อนอื่น ให้รับประเภทของอุปกรณ์โดยใช้ type() จากนั้นกำหนดประเภทหลัก

val types = device.types().first()
val primaryTypes = types.filter { it.metadata.isPrimaryType }

ตรวจสอบว่าลักษณะออนไลน์อยู่หรือไม่

ใช้วิธีconnectivityState()เพื่อตรวจสอบการเชื่อมต่อของลักษณะ

val onOffConnectivity = onOffTrait?.metadata?.sourceConnectivity?.connectivityState

ลักษณะบางอย่าง โดยปกติคือลักษณะของ Google smart home อาจแสดงเป็นออฟไลน์ หากอุปกรณ์ไม่มีการเชื่อมต่ออินเทอร์เน็ต เนื่องจาก ลักษณะเหล่านี้อยู่ในระบบคลาวด์และไม่มีการกำหนดเส้นทางในพื้นที่

ตรวจสอบการเชื่อมต่อของอุปกรณ์

ระบบจะตรวจสอบการเชื่อมต่อของอุปกรณ์ที่ระดับประเภทอุปกรณ์ เนื่องจากอุปกรณ์บางเครื่องรองรับอุปกรณ์หลายประเภท สถานะที่ส่งคืนคือ การรวมสถานะการเชื่อมต่อสำหรับลักษณะทั้งหมดในอุปกรณ์นั้น

val lightConnectivity = dimmableLightDevice.metadata.sourceConnectivity.connectivityState

สถานะ PARTIALLY_ONLINE อาจสังเกตได้ในกรณี ของอุปกรณ์ประเภทผสมเมื่อไม่มีการเชื่อมต่ออินเทอร์เน็ต Matter ลักษณะมาตรฐานอาจยังออนไลน์อยู่เนื่องจากการกำหนดเส้นทางในพื้นที่ แต่ลักษณะที่อิงตามระบบคลาวด์จะออฟไลน์

ตรวจสอบการกำหนดเส้นทางเครือข่ายของลักษณะ

นอกจากนี้ คุณยังดูสถานที่ตั้งของลักษณะได้ใน Home API dataSourceLocality จะระบุว่ามีการกำหนดเส้นทางลักษณะจากระยะไกล (ผ่านระบบคลาวด์) ในเครื่อง (ผ่านฮับในเครื่อง) หรือแบบเพียร์ทูเพียร์ (จากอุปกรณ์ไปยังอุปกรณ์โดยตรง ไม่ต้องใช้ฮับ)

ค่าสถานที่ที่ไม่รู้จัก UNSPECIFIED อาจเกิดขึ้นได้ เช่น ขณะที่แอป กำลังบูตและยังไม่ได้เชื่อมต่อกับฮับหรือเซิร์ฟเวอร์เพื่อเชื่อมต่ออุปกรณ์ อุปกรณ์เหล่านี้ไม่สามารถเข้าถึงได้และจะทำให้คำขอโต้ตอบจากคำสั่งหรือเหตุการณ์ล้มเหลว ทั้งนี้ขึ้นอยู่กับไคลเอ็นต์ที่จะกำหนดวิธีจัดการอุปกรณ์ดังกล่าว

val onOffLocality = onOffTrait?.metadata?.sourceConnectivity?.dataSourceLocality

ตรวจสอบการกำหนดเส้นทางเครือข่ายสำหรับอุปกรณ์

เช่นเดียวกับการเชื่อมต่อ ระบบจะตรวจสอบสถานที่ที่ระดับประเภทอุปกรณ์ สถานะ ที่ส่งคืนคือการรวมกันของสถานที่ตั้งสำหรับลักษณะทั้งหมดในอุปกรณ์นั้น

val lightLocality = dimmableLightDevice.metadata.sourceConnectivity.dataSourceLocality

สถานะของ MIXED อาจสังเกตได้ในสถานการณ์ที่คล้ายกัน กับการเชื่อมต่อ PARTIALLY_ONLINE โดยลักษณะบางอย่างจะอยู่ในระบบคลาวด์ ขณะที่ลักษณะอื่นๆ จะอยู่ในเครื่อง

เปลี่ยนชื่ออุปกรณ์

เรียกใช้เมธอด setName() เพื่อเปลี่ยนชื่ออุปกรณ์

mixerDevice.setName("Grendel")

ระบบจะตัดชื่อหากเกินขีดจำกัด 60 Code Point ของ Unicode (อักขระ) และจะไม่มีข้อผิดพลาด นักพัฒนาแอปมีหน้าที่จัดการชื่อที่ยาว และสามารถตัดสินใจได้ว่าจะแจ้งให้ผู้ใช้ทราบว่าระบบจะตัดชื่อให้สั้นลงหรือไม่

รายการ API

เมื่อสร้างอินสแตนซ์ของ Home แล้ว คุณจะเข้าถึง Device API ต่อไปนี้ผ่านอินสแตนซ์ได้

API คำอธิบาย
devices() รับอุปกรณ์ทั้งหมดในโครงสร้างทั้งหมดในบัญชี Google แสดงผล HomeObjectsFlow ที่มีตัวเลือกการดึงข้อมูลและการกรองเพิ่มเติม

เมื่อมี HomeDevice แล้ว คุณจะเข้าถึง API ต่อไปนี้ได้

API คำอธิบาย
allCandidates() แสดงการดำเนินการอัตโนมัติที่เป็นไปได้ทั้งหมดสำหรับอุปกรณ์และอุปกรณ์ย่อย
candidates() แสดงการทำงานอัตโนมัติที่อาจเป็นไปได้ทั้งหมดสำหรับอุปกรณ์
connectivityStateChanged เวลาล่าสุดที่สถานะของอุปกรณ์มีการเปลี่ยนแปลง
events(event) รับโฟลว์ของเหตุการณ์ที่เฉพาะเจาะจง
events(trait) รับสตรีมของเหตุการณ์ทั้งหมดตามลักษณะนี้
events(traits) รับโฟลว์ของเหตุการณ์ทั้งหมดตามลักษณะเหล่านี้
getSourceConnectivity(trait) รับข้อมูลเมตาสำหรับลักษณะเฉพาะ แสดงผล SourceConnectivity
has(trait) ตรวจสอบว่าอุปกรณ์รองรับลักษณะที่ขอในปัจจุบันหรือไม่
has(type) หากอุปกรณ์รองรับประเภทที่ระบุ
id รหัสระบบที่ไม่ซ้ำกันของอุปกรณ์
isInRoom หากอุปกรณ์อยู่ในห้อง
isInStructure หากอุปกรณ์อยู่ในโครงสร้าง
isMatterDevice หากอุปกรณ์ได้รับการสนับสนุนจาก Matter
name ชื่ออุปกรณ์ที่ผู้ใช้ระบุ
room() ห้องที่กำหนดอุปกรณ์ให้ แสดงผล Room
roomId รหัสของห้องที่กำหนดอุปกรณ์ไว้ แสดงผล Id
sourceConnectivity การเชื่อมต่อแหล่งที่มาของอุปกรณ์ ซึ่งแสดงสถานะการเชื่อมต่อที่รวบรวมแล้วและตำแหน่งเครือข่ายของลักษณะของอุปกรณ์
structure() โครงสร้างที่กำหนดให้กับอุปกรณ์ แสดงผล Structure
structureId รหัสของโครงสร้างที่กำหนดให้กับอุปกรณ์ แสดงผล Id
type(type) รับคําจํากัดความของประเภทโดยมีลักษณะที่ป้อนไว้ (หากมี) เพื่อการเข้าถึงโดยตรง แสดงผลสแนปชอตของลักษณะที่อัปเดตล่าสุดเสมอ
types() รับรายการประเภททั้งหมดที่พร้อมใช้งานในอุปกรณ์