iOS এর জন্য ডিভাইস এবং ডিভাইস মেটাডেটা অ্যাক্সেস করুন

iOS-এর জন্য হোম API-এর মাধ্যমে ডিভাইস APIগুলি অ্যাক্সেস করা যেতে পারে। আপনার অ্যাপে নিম্নলিখিত প্যাকেজগুলি আমদানি করুন:

import GoogleHomeSDK
import GoogleHomeTypes

আরও তথ্যের জন্য, iOS-এ ডেটা মডেল দেখুন।

ত্রুটি হ্যান্ডলিং

Home API-এর কিছু পদ্ধতি একটি HomeError নিক্ষেপ করে, তাই আমরা সুপারিশ করি যে আপনি সেই কলগুলিতে HomeError ধরতে একটি do-catch ব্লক ব্যবহার করুন।

HomeError পরিচালনা করার সময়, কী ভুল হয়েছে তা জানতে এর code এবং message ক্ষেত্রগুলি পরীক্ষা করুন৷

যে কোনো অনিয়ন্ত্রিত ত্রুটির ফলে আপনার অ্যাপ ক্র্যাশ হয়ে যাবে।

আরও তথ্যের জন্য, ত্রুটি পরিচালনা দেখুন।

একটি উদাহরণের জন্য একটি ডিভাইসে একটি কমান্ড পাঠান দেখুন।

নমুনা কল

ডিভাইসের একটি তালিকা পান

Home অবজেক্টের রেফারেন্স সহ, অ্যাক্সেসযোগ্য ডিভাইসগুলির একটি Query পেতে devices() আহ্বান করুন। Query batched() পদ্ধতিতে কল করুন, যা প্রতিটি ডিভাইসের মেটাডেটা পরিবর্তনের সাথে হোমের বর্তমান অবস্থা প্রতিফলিত করে একটি সেট নির্গত করে। অথবা উপলব্ধ ডিভাইসগুলির একটি স্ন্যাপশট পেতে Query.list() এ কল করুন। এটি একটি সুবিধার পদ্ধতি যা batched() স্ট্রীমে সাবস্ক্রাইব করে এবং প্রথম নির্গত মান প্রদান করে। Query.stream() একটি স্ট্রীম তৈরি করে যা ডিভাইসের মেটাডেটা পরিবর্তন যেমন এর নাম, রুম বা কাঠামোতে নতুন মান নির্গত করে। অভ্যন্তরীণভাবে, এটি batched() ব্যবহার করে এবং শুধুমাত্র পরিবর্তিত বৈশিষ্ট্য নির্গত করে।

// Get a list of all devices accessible to the user
let homeDevices = try await self.home.devices().list()

সেখান থেকে, প্রতিটি ডিভাইসের জন্য রাজ্যগুলি অ্যাক্সেসযোগ্য, এবং সমর্থিত কমান্ডগুলি ডিভাইসে পাঠানো যেতে পারে।

ডিভাইসের প্রকারগুলি পান

একটি ডিভাইসের সাথে যুক্ত ডিভাইসের প্রকারগুলি পেতে, ডিভাইসের types বৈশিষ্ট্য পড়ুন, যা একটি DeviceTypeController প্রদান করে।

একটি নির্দিষ্ট ডিভাইস প্রকারের আপডেটের সদস্যতা নিতে DeviceTypeController.subscribe(_:) এ কল করুন:

let devices = try await self.home.devices().list()
if let device = devices.first(where: { $0.id == myDeviceId }) {
  var receivedUpdate1 = false
  var receivedUpdate2 = false
  device.types.subscribe(OnOffLightDeviceType.self)
    .assertNoFailure()
    .sink { device in
      if !receivedUpdate1 {
        receivedUpdate1 = true
        Task {
          try await device.matterTraits.onOffTrait?.on()
        }
        return
      }
      if !receivedUpdate2 {
        receivedUpdate2 = true
        return
      }
      fatalError("Received unexpected update")
    }
}

যদি ডিভাইসটি নির্দিষ্ট ডিভাইসের প্রকারকে সমর্থন না করে, তাহলে এটি একটি Empty Publisher প্রদান করে যা অবিলম্বে সম্পূর্ণ হয়।

যদি ডিভাইসটি একটি নির্দিষ্ট ডিভাইস টাইপ সমর্থন করে, get() কল করে আপনি সেই ধরনের একটি হ্যান্ডেল পেতে পারেন :

if let device = devices.first(where: { $0.id == myDeviceId }) {
  let deviceType = await device.types.get(OnOffLightDeviceType.self)
}

ডিভাইসটি নির্দিষ্ট টাইপ সমর্থন না করলে, এটি nil ফেরত দেয়।

DeviceTypeController.subscribeAll() DeviceTypeCollection এর Publisher পেতে কল করুন। এই ক্লাসটি আপনাকে ডিভাইসটিতে একটি নির্দিষ্ট ডিভাইসের ধরন আছে কিনা তা দেখতে দেয়:

if let device = devices.first(where: { $0.id == myDeviceId }) {
  device.types.subscribeAll()
    .assertNoFailure()
    .sink { types in
      let lightDeviceType = types[OnOffLightDeviceType.self]
      let fanDeviceType = types[FanDeviceType.self]
    }
}

একটি ডিভাইস টাইপ বৈশিষ্ট্য পান

ডিভাইসের ধরনগুলি বৈশিষ্ট্যগুলি পড়ার জন্য এন্ট্রি পয়েন্ট, কারণ তারা একটি ডিভাইসকে তার কার্যকরী টুকরোগুলিতে পচিয়ে দেয় (যেমন Matter শেষ পয়েন্টগুলি)।

একটি ডিভাইসে দুটি ধরনের ডিভাইসের বৈশিষ্ট্য থাকা অবস্থায় তারা বৈশিষ্ট্য সংঘর্ষের জন্যও দায়ী, উভয়েরই একই বৈশিষ্ট্য থাকতে পারে। উদাহরণস্বরূপ, যদি একটি ডিভাইস একটি স্পিকার এবং ডিমেবল লাইট উভয়ই হয়, তবে এতে দুটি অন/অফ এবং দুটি স্তর নিয়ন্ত্রণ বৈশিষ্ট্য থাকবে।

অন্য ধরনের বৈশিষ্ট্য সংঘর্ষ ঘটতে পারে যখন একটি ডিভাইসে একই নামের দুটি বৈশিষ্ট্য থাকে। উদাহরণস্বরূপ, onOff স্ট্যান্ডার্ড OnOff বৈশিষ্ট্যের একটি উদাহরণ উল্লেখ করতে পারে, বা এটি একটি প্রস্তুতকারক-সংজ্ঞায়িত OnOff বৈশিষ্ট্যের একটি উদাহরণ উল্লেখ করতে পারে। কোন বৈশিষ্টের উদ্দেশ্যে কোন সম্ভাব্য অস্পষ্টতা দূর করতে, প্রতিটি ডিভাইসের প্রকারে দুটি বৈশিষ্ট্য সংগ্রহের একটির মাধ্যমে একটি বৈশিষ্ট্য উল্লেখ করুন।

স্ট্যান্ডার্ড বৈশিষ্ট্যের জন্য, অর্থাৎ যেগুলি Matter স্ট্যান্ডার্ড ক্লাস্টারের সাথে সাদৃশ্যপূর্ণ, তারা matterTraits ব্যবহার করে। উদাহরণস্বরূপ, Dimmable Light ডিভাইসের প্রকারের জন্য একটি নির্দিষ্ট বৈশিষ্ট্য পেতে:

if let dimmableLightDeviceType =
  await device.types.get(DimmableLightDeviceType.self)
{
  // Accessing standard trait on the type.
  let levelControlTrait =
    dimmableLightDeviceType.matterTraits.levelControlTrait.self
}

Google বৈশিষ্ট্যের জন্য, googleTraits ব্যবহার করুন:

if let doorbellDeviceType = await device.types.get(GoogleDoorbellDeviceType.self) {
  // Accessing Google trait on the type.
  let doorbellPressTrait =
    doorbellDeviceType.googleTraits.doorbellPressTrait.self
}

একটি প্রস্তুতকারক-নির্দিষ্ট বৈশিষ্ট্য অ্যাক্সেস করতে, traits বৈশিষ্ট্যের মাধ্যমে এটি উল্লেখ করুন, তবে প্রস্তুতকারকের প্যাকেজ নামের সাথে এটির মুখবন্ধ করুন:

let deviceType = await device1?.types.get(OnOffLightDeviceType.self)
// Accessing custom trait on the type.
if let spinnerTrait = deviceType?.traits[ExampleOrganization.SpinnerTrait.self] {
  let rpmVal = spinnerTrait.attributes.rpm
}

একটি ডিভাইসের অবস্থা পড়ুন

ডিভাইসের অন/অফ বৈশিষ্ট্য থেকে OnOff অ্যাট্রিবিউট চেক করার এই উদাহরণটি দেখুন:

let lightDevices = devices.filter {
  $0.types.contains(OnOffLightDeviceType.self)
}
let light1 = lightDevices.first
let lightDeviceTypeOptional = await light1?.types.get(OnOffLightDeviceType.self)
if let onOffTrait = lightDeviceTypeOptional?.matterTraits.onOffTrait {
  let onOffVal = onOffTrait.attributes.onOff
}

একটি নির্দিষ্ট বৈশিষ্ট্য সহ ডিভাইসগুলির একটি তালিকা পান

একটি নির্দিষ্ট বৈশিষ্ট্য আছে এমন ডিভাইসগুলির একটি তালিকা পেতে, আপনাকে ডিভাইসগুলি, প্রতিটি ডিভাইসের ডিভাইসের ধরন এবং প্রতিটি ডিভাইসের প্রকারের বৈশিষ্ট্যগুলির উপর পুনরাবৃত্তি করতে হবে। উদাহরণস্বরূপ, বাড়ির সমস্ত ডিভাইসের একটি তালিকা পেতে যা চালু/বন্ধ বৈশিষ্ট্য রয়েছে:

// Get all light devices that support levelControl
var levelControlDevices: [HomeDevice] = []
var allDevices = try await home.devices().list()
for device in allDevices {
  if let deviceType = await device.types.get(OnOffLightDeviceType.self) {
    if deviceType.traits.contains(Matter.LevelControlTrait.self) {
      levelControlDevices.append(device)
    }
  }
}

হোম API-এ উপলব্ধ বৈশিষ্ট্যের সম্পূর্ণ তালিকার জন্য iOS-এ বৈশিষ্ট্য সূচক দেখুন।

একই ধরনের ডিভাইসের সাথে ডিভাইসের একটি তালিকা পান

একটি বাড়ির সমস্ত আলোর প্রতিনিধিত্ব করে এমন ডিভাইসগুলির একটি তালিকা পেতে:

// Get a list of devices with similar device types (lights)
let lightDevices =
  try await self.home.devices().list().compactMap {
    $0.types.contains(DimmableLightDeviceType.self)
      || $0.types.contains(OnOffLightDeviceType.self)
      || $0.types.contains(ColorTemperatureLightDeviceType.self)
      || $0.types.contains(ExtendedColorLightDeviceType.self)
  }

হোম API-এ একাধিক ডিভাইসের ধরন রয়েছে যা একটি মূল ডিভাইসের ধরণকে উপস্থাপন করতে পারে। উদাহরণস্বরূপ, কোন "হালকা" ডিভাইস প্রকার নেই। পরিবর্তে, চারটি ভিন্ন ধরনের ডিভাইস রয়েছে যা একটি আলোকে উপস্থাপন করতে পারে, যেমনটি পূর্ববর্তী উদাহরণে দেখানো হয়েছে। যেমন, একটি বাড়িতে উচ্চ-স্তরের ডিভাইসের একটি বিস্তৃত দৃশ্য পেতে, একাধিক ডিভাইসের ধরন অন্তর্ভুক্ত করতে হবে।

হোম API-এ উপলব্ধ ডিভাইসের প্রকার এবং তাদের বৈশিষ্ট্যগুলির সম্পূর্ণ তালিকার জন্য iOS-এ সমর্থিত ডিভাইসের ধরনগুলি দেখুন।

একটি ডিভাইসের জন্য বিক্রেতার নাম, বিক্রেতার আইডি বা পণ্য আইডি পান

BasicInformationTrait ট্র্যাইট বৈশিষ্ট্যে বিক্রেতা আইডি, পণ্যের আইডি, পণ্যের নাম এবং একটি ডিভাইসের সিরিয়াল নম্বরের মতো তথ্য অন্তর্ভুক্ত রয়েছে:

guard
  let vendorName =
    basicInfoTrait.attributes.vendorName
else {
  fatalError("Failed to get vendorName")
}
guard
  let vendorID =
    basicInfoTrait.attributes.vendorID
else {
  fatalError("Failed to get vendorID")
}
guard
  let productID =
    basicInfoTrait.attributes.productID
else {
  fatalError("Failed to get 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 ডকুমেন্টেশন দেখুন।

ডিভাইস এবং বৈশিষ্ট্য মেটাডেটা

হোম এপিআই-এর ডিভাইস এবং বৈশিষ্ট্যগুলির সাথে মেটাডেটা যুক্ত থাকে, যা একটি অ্যাপে ব্যবহারকারীর অভিজ্ঞতা পরিচালনা করতে সাহায্য করতে পারে।

হোম এপিআই-এর প্রতিটি বৈশিষ্ট্যে একটি sourceConnectivity বৈশিষ্ট্য রয়েছে, যেটিতে একটি বৈশিষ্ট্যের অনলাইন স্থিতি এবং স্থানীয়তা (স্থানীয় বা দূরবর্তী রাউটিং) সম্পর্কে তথ্য রয়েছে।

একটি ডিভাইসের প্রাথমিক ধরনের পান

কিছু ডিভাইস হোম API-এর মাধ্যমে একাধিক ডিভাইস প্রকার উপস্থাপন করতে পারে। ব্যবহারকারীরা তাদের ডিভাইসের জন্য একটি অ্যাপে (যেমন ডিভাইস নিয়ন্ত্রণ এবং প্রস্তাবিত অটোমেশন) উপযুক্ত বিকল্পের সাথে উপস্থাপিত হয়েছে তা নিশ্চিত করতে, ডিভাইসের ধরনটি ডিভাইসের প্রাথমিক প্রকার কিনা তা পরীক্ষা করা কার্যকর।

if let deviceType =
  await device?.types.get(HumiditySensorDeviceType.self)
{
  if deviceType.metadata.isPrimaryType {
    print("Humidity Sensor is the primary type on this device.")
  } else {
    print("Humidity Sensor isn't the primary type on this device.")
  }
}

একটি বৈশিষ্ট্য অনলাইন আছে কিনা চেক করুন

একটি বৈশিষ্ট্যের সংযোগ পরীক্ষা করতে connectivityState সম্পত্তি পড়ুন:

let levelControlConnectivity =
  levelControlTrait.metadata.sourceConnectivity
  .connectivityState

ডিভাইসে ইন্টারনেট সংযোগ না থাকলে কিছু বৈশিষ্ট্য, সাধারণত Google smart home বৈশিষ্ট্য, অফলাইনে দেখাতে পারে। কারণ এই বৈশিষ্ট্যগুলি ক্লাউড-ভিত্তিক এবং স্থানীয় রাউটিং নেই৷

একটি ডিভাইসের জন্য সংযোগ পরীক্ষা করুন

একটি ডিভাইসের জন্য সংযোগ আসলে ডিভাইস প্রকার স্তরে চেক করা হয় কারণ কিছু ডিভাইস একাধিক ডিভাইস প্রকার সমর্থন করে। যে স্থিতি ফেরত দেওয়া হয়েছে সেটি হল সেই ডিভাইসের সমস্ত বৈশিষ্ট্যের জন্য সংযোগের অবস্থার সংমিশ্রণ।

let lightConnectivity =
  dimmableLightDeviceType.metadata.sourceConnectivity
  .connectivityState

ইন্টারনেট সংযোগ না থাকলে মিশ্র ডিভাইসের ক্ষেত্রে partiallyOnline অবস্থা লক্ষ্য করা যেতে পারে। স্থানীয় রাউটিংয়ের কারণে Matter স্ট্যান্ডার্ড বৈশিষ্ট্যগুলি এখনও অনলাইনে থাকতে পারে, তবে ক্লাউড-ভিত্তিক বৈশিষ্ট্যগুলি অফলাইন হবে৷

একটি বৈশিষ্ট্যের নেটওয়ার্ক রাউটিং পরীক্ষা করুন

হোম API-এ একটি বৈশিষ্ট্যের জন্য স্থানীয়তাও পাওয়া যায়। dataSourceLocality নির্দেশ করে যে বৈশিষ্ট্যটি দূরবর্তীভাবে (ক্লাউডের মাধ্যমে), স্থানীয়ভাবে (স্থানীয় হাবের মাধ্যমে), বা পিয়ার-টু-পিয়ার (সরাসরি ডিভাইস থেকে ডিভাইসে, হাব নয়)।

অজানা স্থানীয় মান unspecified সম্ভব, উদাহরণস্বরূপ, যখন একটি অ্যাপ বুট হচ্ছে এবং ডিভাইস সংযোগের জন্য এখনও হাব বা সার্ভারে পৌঁছায়নি। এই ডিভাইসগুলি পৌঁছানো যায় না এবং কমান্ড বা ইভেন্ট থেকে মিথস্ক্রিয়া অনুরোধ ব্যর্থ হবে। এই জাতীয় ডিভাইসগুলি কীভাবে পরিচালনা করবেন তা নির্ধারণ করা ক্লায়েন্টের উপর নির্ভর করে।

let levelControlLocality =
  levelControlTrait.metadata.sourceConnectivity
  .dataSourceLocality

একটি ডিভাইসের জন্য নেটওয়ার্ক রাউটিং পরীক্ষা করুন

সংযোগের মতো, স্থানীয়তা একটি ডিভাইসের প্রকার স্তরে পরীক্ষা করা হয়। ফিরে আসা রাজ্য হল সেই ডিভাইসের সমস্ত বৈশিষ্ট্যের জন্য স্থানীয়তার সংমিশ্রণ।

let lightLocality =
  dimmableLightDeviceType.metadata.sourceConnectivity.dataSourceLocality

partiallyOnline অনলাইন সংযোগের মতো একই পরিস্থিতিতে mixed অবস্থা পরিলক্ষিত হতে পারে: কিছু বৈশিষ্ট্য ক্লাউড-ভিত্তিক এবং অন্যগুলি স্থানীয়।

একটি ডিভাইসের নাম পরিবর্তন করুন

একটি ডিভাইসের নাম পরিবর্তন করতে setName(_:) পদ্ধতিতে কল করুন:

let updatedDevice = try await theDevice.setName("new device name")

একটি ডিভাইসের নাম পরিবর্তন করার সময়, মূল HomeDevice struct একই থাকে এবং পরিবর্তনটি ফিরে আসা আপডেট করা HomeDevice অবজেক্টে প্রতিফলিত হয়।

API তালিকা

একবার Home একটি উদাহরণ তৈরি হয়ে গেলে, নিম্নলিখিত ডিভাইস APIগুলি এটির মাধ্যমে অ্যাক্সেসযোগ্য:

API বর্ণনা
device(id:) নির্দিষ্ট ডিভাইসের জন্য একটি Publisher প্রদান করে যা ডিভাইসের অবস্থা যখনই পরিবর্তিত হয় তখন নির্গত করে।
devices() Google অ্যাকাউন্টে সমস্ত কাঠামোর সমস্ত ডিভাইস পান৷ একটি Query<HomeDevice> যা আরও পুনরুদ্ধার এবং ফিল্টারিং বিকল্প প্রদান করে।

একবার আপনার একটি HomeDevice হয়ে গেলে, নিম্নলিখিত APIগুলি এটির মাধ্যমে অ্যাক্সেসযোগ্য:

API বর্ণনা
id ডিভাইসের অনন্য সিস্টেম আইডি।
name ডিভাইসের ব্যবহারকারীর দেওয়া নাম।
structureID ডিভাইসটি যে কাঠামোর জন্য বরাদ্দ করা হয়েছে তার আইডি। একটি String? .
roomID ডিভাইসটি যে রুমে বরাদ্দ করা হয়েছে তার আইডি। একটি String? .
types ডিভাইসে একটি নির্দিষ্ট প্রকার বা সমস্ত উপলব্ধ প্রকার পান।
isMatterDevice যদি ডিভাইসটি Matter দ্বারা সমর্থিত হয়।
sourceConnectivity ডিভাইসের সোর্স কানেক্টিভিটি, ডিভাইসের বৈশিষ্ট্যের সমষ্টিগত কানেক্টিভিটি অবস্থা এবং নেটওয়ার্ক লোকেলিটি প্রতিনিধিত্ব করে।