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

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

import GoogleHomeSDK
import GoogleHomeTypes

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

ত্রুটি পরিচালনা

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

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

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

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

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

নমুনা কল

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

Home অবজেক্টের রেফারেন্স সহ, অ্যাক্সেসযোগ্য ডিভাইসের একটি Query পেতে devices() ইনভোক করুন। Query এর batched() পদ্ধতিতে কল করুন, যা প্রতিটি ডিভাইসের মেটাডেটা পরিবর্তনের সাথে Home এর বর্তমান অবস্থা প্রতিফলিত করে একটি Set নির্গত করে। অথবা উপলব্ধ ডিভাইসের একটি স্ন্যাপশট পেতে 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 _ = await device.types.get(OnOffLightDeviceType.self)
}

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

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

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
}

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

if let doorbellDeviceType = await device.types.get(GoogleDoorbellDeviceType.self) {
  // Accessing Google trait on the type.
  let doorbellPressTrait =
    doorbellDeviceType.traits[Google.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
}

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

ডিভাইসের On/Off বৈশিষ্ট্য থেকে 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] = []
let 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)
    }
  }
}

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

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

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

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

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

হোম এপিআই-তে উপলব্ধ ডিভাইসের ধরণ এবং তাদের বৈশিষ্ট্যগুলির সম্পূর্ণ তালিকার জন্য 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 ডিভাইস তৈরি করেন, তাহলে BasicInformation বৈশিষ্ট্যের মাধ্যমে আপনার Cloud-to-cloud ডিভাইসগুলি সনাক্ত করার জন্য, আপনি তাদের 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 বৈশিষ্ট্য থাকে, যার মধ্যে একটি বৈশিষ্ট্যের অনলাইন অবস্থা এবং স্থানীয়তা (স্থানীয় বা দূরবর্তী রাউটিং) সম্পর্কে তথ্য থাকে।

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

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

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

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

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

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

let lightConnectivity =
  dimmableLightDeviceType.metadata.sourceConnectivity
  .connectivityState

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

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

হোম এপিআই-তেও একটি বৈশিষ্ট্যের লোক্যালিটি পাওয়া যায়। 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 কাঠামোটি একই থাকে এবং পরিবর্তনটি আপডেট হওয়া HomeDevice অবজেক্টে প্রতিফলিত হয়।

৬০ ইউনিকোড কোড পয়েন্ট (অক্ষর) সীমা অতিক্রম করলে নামগুলি ছোট করে ফেলা হবে এবং কোনও ত্রুটি করা হবে না। ডেভেলপাররা দীর্ঘ নাম পরিচালনা করার জন্য দায়ী এবং উদাহরণস্বরূপ, তারা সিদ্ধান্ত নিতে পারে যে তারা ব্যবহারকারীদের নাম ছোট করে ফেলা হবে কিনা তা জানাতে চায় কিনা।

API তালিকা

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

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

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

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