เข้าถึงอุปกรณ์และข้อมูลเมตาของอุปกรณ์สำหรับ 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() จะแสดงผลลัพธ์เป็นโฟลว์ของอุปกรณ์ที่เข้าถึงได้จากโครงสร้างนั้น

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

ดูข้อมูลเพิ่มเติมเกี่ยวกับฟังก์ชันการไหลของ Kotlin ได้ที่ distinctUntilChanged

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

อินเทอร์เฟซ 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 primaryType = types.first { it.metadata.isPrimaryType }

ตรวจสอบว่าลักษณะมีให้บริการทางออนไลน์หรือไม่

ใช้เมธอด connectivityState() เพื่อตรวจสอบการเชื่อมต่อของแทร็ก

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

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

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

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

val lightConnectivity = dimmableLightDevice.metadata.sourceConnectivity.connectivityState

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

ตรวจสอบการกำหนดเส้นทางเครือข่ายของแทร็ก

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

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

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

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

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

val lightLocality = dimmableLightDevice.metadata.sourceConnectivity.dataSourceLocality

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

รายการ 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() ดูรายการประเภททั้งหมดที่ใช้ได้บนอุปกรณ์