به دستگاه‌ها و فراداده‌های دستگاه دسترسی داشته باشید

APIهای دستگاه ممکن است از طریق APIهای Home قابل دسترسی باشند. این بسته ها را به برنامه خود وارد کنید:

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

برای استفاده از انواع یا ویژگی‌های خاص دستگاه با APIهای دستگاه، باید به صورت جداگانه وارد شوند.

به عنوان مثال، برای استفاده از ویژگی Matter On/Off و نوع دستگاه Plug-in On/Off، بسته های زیر را در برنامه خود وارد کنید:

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

برای اطلاعات بیشتر، مدل داده را ببینید.

رسیدگی به خطا

هر روشی در APIهای Home می‌تواند یک 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 از ویژگی On/Off دستگاه نگاه کنیم. با استفاده از مدل داده ویژگی Home APIs، که در آن این ویژگی به عنوان 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 ).

آنها همچنین برای برخوردهای صفت در صورتی که یک دستگاه دارای دو نوع دستگاه باشد، که هر دو ممکن است دارای یک ویژگی باشند، حساب می کنند. به عنوان مثال، اگر دستگاهی هم اسپیکر و هم نور کم نور باشد، دو ویژگی روشن/خاموش و دو ویژگی کنترل سطح دارد.

برای دریافت لیستی از ویژگی های موجود برای نوع دستگاه نور کم نور:

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

نوع دیگری از برخورد صفت زمانی رخ می دهد که یک دستگاه دارای دو ویژگی با نام یکسان باشد. برای مثال، onOff می‌تواند به نمونه‌ای از ویژگی استاندارد OnOff اشاره کند، یا می‌تواند به نمونه‌ای از ویژگی OnOff تعریف‌شده توسط سازنده اشاره کند. برای از بین بردن هرگونه ابهام احتمالی در مورد اینکه کدام ویژگی مورد نظر است، یک نمونه Trait که از طریق یک دستگاه ارجاع داده می شود باید قبل از یک فضای نام واجد شرایط باشد. برای صفات استاندارد، یعنی آنهایی که مشابه خوشه‌های استاندارد Matter هستند، از standardTraits استفاده کنید. برای ویژگی های گوگل، از 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)
    }
  }

چندین نوع دستگاه در APIهای Home وجود دارد که می تواند یک نوع دستگاه اصلی را نشان دهد. به عنوان مثال، نوع دستگاه "Light" وجود ندارد. در عوض، چهار نوع دستگاه مختلف وجود دارد که می توانند نور را نشان دهند، همانطور که در مثال قبل نشان داده شده است. به این ترتیب، برای به دست آوردن یک دید جامع از نوع دستگاه سطح بالاتر در یک خانه، چندین نوع دستگاه باید در جریان های فیلتر شده گنجانده شود.

برای مشاهده لیست کامل انواع دستگاه های موجود در 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 آن‌ها قرار دهید:

  • اتحادیه استانداردهای اتصال (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 دارای ابرداده‌های مرتبط با آن‌ها هستند که می‌تواند به مدیریت تجربه کاربر در یک برنامه کمک کند.

هر ویژگی در APIهای Home حاوی یک ویژگی sourceConnectivity است که اطلاعاتی در مورد وضعیت آنلاین و موقعیت یک صفت (مسیریابی محلی یا راه دور) دارد.

نوع اولیه یک دستگاه را دریافت کنید

برخی از دستگاه‌ها ممکن است چندین نوع دستگاه را از طریق APIهای Home ارائه دهند. برای اطمینان از اینکه گزینه‌های مناسب در یک برنامه (مانند کنترل دستگاه و اتوماسیون‌های پیشنهادی) برای دستگاه‌هایشان به کاربران ارائه می‌شود، بررسی نوع دستگاه اصلی برای یک دستگاه مفید است.

ابتدا نوع(های) دستگاه را با استفاده از 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 ممکن است در مورد انواع دستگاه های مختلط که اتصال اینترنت وجود ندارد مشاهده شود. ممکن است به دلیل مسیریابی محلی، ویژگی‌های استاندارد ماده همچنان آنلاین باشند، اما ویژگی‌های مبتنی بر ابر آفلاین خواهند بود.

مسیریابی شبکه یک صفت را بررسی کنید

محل برای یک صفت نیز در APIهای Home موجود است. dataSourceLocality نشان می دهد که آیا این ویژگی از راه دور (از طریق ابر)، به صورت محلی (از طریق یک هاب محلی)، یا همتا به همتا (مستقیم از دستگاهی به دستگاه دیگر، بدون هاب) هدایت می شود.

برای مثال زمانی که یک برنامه در حال بوت شدن است و هنوز به هاب یا سروری برای اتصال دستگاه نرسیده است، مقدار محلی ناشناخته UNSPECIFIED امکان پذیر است. این دستگاه‌ها قابل دسترسی نیستند و درخواست‌های تعامل از سوی فرمان‌ها یا رویدادها را انجام نمی‌دهند. این به مشتری بستگی دارد که نحوه کار با چنین دستگاه هایی را تعیین کند.

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

مسیریابی شبکه را برای یک دستگاه بررسی کنید

مانند اتصال، محل در سطح نوع دستگاه بررسی می شود. حالت برگردانده شده ترکیبی از محلی برای همه صفات در آن دستگاه است.

val lightLocality = dimmableLightDevice.metadata.sourceConnectivity.dataSourceLocality

حالت MIXED ممکن است در سناریویی مشابه با اتصال PARTIALLY_ONLINE مشاهده شود: برخی از ویژگی ها مبتنی بر ابر هستند در حالی که برخی دیگر محلی هستند.

لیست API

هنگامی که یک نمونه از Home ایجاد می شود، 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() لیستی از انواع موجود در دستگاه دریافت کنید.