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

iOS-এর জন্য Home 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()

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

Home API-এর 1.8 রিলিজের সাথে, আপনার কাছে devices() পদ্ধতির enableMultipartDevices প্যারামিটার true-এ সেট করে প্রতিটি মাল্টিপার্ট ডিভাইসকে একটি একক ডিভাইস হিসেবে API-এর মাধ্যমে দেখানোর বিকল্প রয়েছে। আরও তথ্যের জন্য iOS-এ মাল্টিপার্ট ডিভাইস দেখুন।

ডিভাইসের ধরন পান

কোনও ডিভাইসের সাথে যুক্ত ডিভাইসের ধরন পেতে, ডিভাইসের 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 ব্যবহার করুন। যেমন, ডিম করা যায় এমন আলো ডিভাইসের ধরনের জন্য নির্দিষ্ট বৈশিষ্ট্য পেতে:

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.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
}

ডিভাইসের স্ট্যাটাস রিড করা

ডিভাইসের চালু/বন্ধ করার বৈশিষ্ট্য থেকে 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)
    }
  }
}

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

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

Home 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 ডিভাইস তৈরি করেন, তাহলে BasicInformation বৈশিষ্ট্যের মাধ্যমে আপনার Cloud-to-cloud ডিভাইস শনাক্ত করতে, আপনি তাদের SYNC উত্তরে এই স্ট্রিং ফিল্ডগুলি অন্তর্ভুক্ত করতে পারেন:

  • Connectivity Standards Alliance (Alliance)-এর ইস্যু করা ভেন্ডর আইডি: "matterOriginalVendorId": "0xfff1",

  • প্রোডাক্ট শনাক্তকারী যা কোনও বিক্রেতার প্রোডাক্টকে অনন্যভাবে শনাক্ত করে: "matterOriginalProductId": "0x1234",

  • ডিভাইসের জন্য একটি অনন্য শনাক্তকারী, যা প্রস্তুতকারক-নির্দিষ্ট পদ্ধতিতে তৈরি করা হয়: "matterUniqueId": "matter-device-id",

এই স্ট্রিং ফিল্ডগুলি লেখার সময়, আপনার Matter ভেন্ডর ও প্রোডাক্ট আইডি থাকলে তা ব্যবহার করুন। আপনি যদি Alliance-এর মেম্বার না হন এবং আপনাকে এইসব আইডি অ্যাসাইন করা না হয়ে থাকে, তাহলে আপনি 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-এর মাধ্যমে একাধিক ডিভাইসের ধরন দেখাতে পারে। ব্যবহারকারীদের ডিভাইসের জন্য কোনও অ্যাপে (যেমন ডিভাইস কন্ট্রোল এবং সাজেস্ট করা অটোমেশন) উপযুক্ত বিকল্প দেখানো হচ্ছে কিনা তা নিশ্চিত করতে, ডিভাইসের ধরনটি ডিভাইসের প্রাথমিক ধরন কিনা তা চেক করা উপযোগী।

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 স্ট্যান্ডার্ড ট্রেটস এখনও অনলাইন থাকতে পারে, তবে ক্লাউড-ভিত্তিক ট্রেটস অফলাইন থাকবে।

ডিভাইসের IP অ্যাড্রেস পান

ডিভাইসের IP অ্যাড্রেস খুঁজে পেতে, GeneralDiagnosticsTrait-এর networkInterfaces অ্যাট্রিবিউট ব্যবহার করুন। অ্যাড্রেসগুলি Data অবজেক্ট হিসাবে ফেরত দেওয়া হয়, যা আপনি Network ফ্রেমওয়ার্ক ব্যবহার করে স্ট্যান্ডার্ড IPv4 বা IPv6 স্ট্রিংয়ে ফর্ম্যাট করতে পারেন:

func getIpAddresses(trait: Matter.GeneralDiagnosticsTrait) -> [String] {
  let interfaces = trait.attributes.networkInterfaces ?? []
  var ipAddresses: [String] = []

  for interface in interfaces {
    for data in interface.iPv4Addresses {
      if let ipv4 = IPv4Address(data) {
        ipAddresses.append(String(describing: ipv4))
      }
    }
    for data in interface.iPv6Addresses {
      if let ipv6 = IPv6Address(data) {
        ipAddresses.append(String(describing: ipv6))
      }
    }
  }

  return ipAddresses
}

কোনও ট্রেইটের নেটওয়ার্ক রাউটিং চেক করুন

Home 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 স্ট্রাক্ট একই থাকে এবং পরিবর্তনটি রিটার্ন করা আপডেট হওয়া HomeDevice অবজেক্টে দেখা যায়।

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

কোনও ডিভাইসের জন্য গ্রুপ মেম্বারশিপ চেক করা

একটি ফিজিক্যাল ডিভাইস এক বা একাধিক ডিভাইস গ্রুপের অন্তর্গত হতে পারে। কোনও ডিভাইস কোন গ্রুপের অন্তর্গত তা দেখতে, ডিভাইসে GroupMembershipTrait চেক করুন:

if let trait = await device.traits.get(Google.GroupMembershipTrait.self) {
  for groupId in trait.attributes.groupObjectIdsArray {
    print("Device belongs to group: \(groupId)")
  }
}

DeviceGroup-এর মাধ্যমে কাজ করে এমন ডিভাইসের ধরন পরীক্ষা করতে এবং একটি এন্টিটি হিসেবে গ্রুপে কমান্ড পাঠাতে, ডিভাইস গ্রুপ কন্ট্রোল করুন দেখুন।