iOS-এ স্ট্রাকচার API

আইওএসের জন্য হোম এপিআই-এর মাধ্যমে স্ট্রাকচার এপিআই অ্যাক্সেস করা যেতে পারে।

স্ট্রাকচার API-এর সাথে কাজ করতে, প্রথমে আপনার অ্যাপে GoogleHomeSDK প্যাকেজ আমদানি করুন:

import GoogleHomeSDK

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

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

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

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

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

স্ট্রাকচার API

Home হোম গ্রাফ প্রতিনিধিত্ব করে, এবং স্ট্রাকচার এপিআই-এর এন্ট্রি পয়েন্ট। এটি কাঠামো, কক্ষ এবং ডিভাইসের রেফারেন্স প্রদান করে।

Structure আপনার হোম গ্রাফে একটি কাঠামো উপস্থাপন করে। এটি কাঠামো মেটাডেটা যেমন id এবং name অ্যাক্সেস প্রদান করে।

আপনার অ্যাকাউন্টে সমস্ত কাঠামো পেতে structures() ব্যবহার করুন। কাঠামোগুলি একটি Query আকারে ফেরত দেওয়া হয়, যা এর ডেটা ব্যবহার করার উপায়গুলির একটি পছন্দ প্রস্তাব করে:

API বর্ণনা
stream() একটি Publisher ফেরত দেয় যা পরিবর্তনের সাথে সাথে প্রতিটি বস্তুকে পৃথকভাবে নির্গত করে।
batched() একটি Publisher প্রদান করে যা বস্তুর একটি Set হিসাবে বর্তমান ফলাফল নির্গত করে। প্রতিটি নির্গত Set বস্তুর গ্রাফের বর্তমান অবস্থার প্রতিনিধিত্ব করে।
list() বস্তুর একটি Set হিসাবে বর্তমান ফলাফল প্রদান করে।

structures().list() কল অবিলম্বে স্ট্রাকচারের একটি বৈধ সেট ফিরিয়ে দিতে পারে না। যদি আপনার অ্যাপ প্রতিক্রিয়াশীল হয় এবং UI চালাতে সমস্ত কাঠামো পরিবর্তনের সদস্যতা নিতে stream() কল করে, তাহলে কাঠামোর একটি বৈধ তালিকা শেষ পর্যন্ত ফেরত দেওয়া উচিত। এমন অন্যান্য পরিস্থিতি রয়েছে যেখানে একটি খালি কাঠামোর তালিকা ফেরত দেওয়া যেতে পারে, উদাহরণস্বরূপ যদি ব্যবহারকারীর ফোন সংযোগ হারায় বা ব্যবহারকারী আপনার অ্যাপের অনুমতি প্রত্যাহার করে থাকে। আপনার অ্যাপে এই কেসগুলি পরিচালনা করা নিশ্চিত হওয়া উচিত।

@Published public private(set) var structures: [Structure] = []
private var structuresCancellable: AnyCancellable?

  self.structuresCancellable = home
    .structures()
    .batched()
    .receive(on: DispatchQueue.main)
    .map { Array($0) }
    .catch {
      Logger.error("Failed to load structures: \($0)")
      return Just([Structure]())
    }
    .assign(to: \.structures, on: self)

নমুনা গঠন কল

কাঠামোর একটি সেট পান

একটি Query<Structure> -এ কলিং list() উপাদানগুলির সাম্প্রতিক সেট প্রদান করে:

// Get a stream of all structures accessible to the user
let allStructuresChanges = try await self.home.structures()
let allStructures = try? await allStructuresChanges.list()

একটি প্রতিক্রিয়াশীল অ্যাপ ডিজাইন করার সময়, আপনি list() এর পরিবর্তে batched() এবং stream() কল ব্যবহার করতে চাইবেন, কারণ হোম গ্রাফ পরিবর্তন হলে এগুলি স্বয়ংক্রিয়ভাবে ডেটা তৈরি করে।

গঠন বৈশিষ্ট্য পান

কাঠামোর তালিকা হাতে রেখে, আপনি তাদের জন্য বৈশিষ্ট্যগুলি অ্যাক্সেস করতে পারেন:

// Get a stream of changes taking place on a structure.
let structureChanges = try await home.structures().list().filter { $0.id == structureID }

// Get a snapshot of the structure.
let structure = try await structureChanges.first!

// Get structure properties
print("id \(structure.id) ")
print("name \(structure.name) ")

নাম অনুসারে একটি কাঠামো খুঁজুন

আপনি যদি একটি কাঠামোর নাম জানেন তবে আপনি name সম্পত্তি ব্যবহার করে এটি অ্যাক্সেস করতে পারেন:

do {
  structure1 = try await home.structures().list().first(where: { $0.name == "Main House" })
} catch let error as HomeError {
  // Code for handling the exception
}

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

একাধিক কাঠামোর সাথে কাজ করুন

একাধিক কাঠামো ব্যবহার করতে, প্রতিটি কাঠামোর জন্য একটি পৃথক রেফারেন্স পান:

var structure1: Structure!
var structure2: Structure!
do {
  structure1 = try await home.structures().list().first(where: { $0.name == "Main House" })
} catch let error as HomeError {
  // Code for handling the exception
}
do {
  structure2 = try await home.structures().list().first(where: { $0.name == "Guest Cottage" })
} catch let error as HomeError {
  // Code for handling the exception
}

রুম

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

অ্যাকাউন্টের সমস্ত রুম পুনরুদ্ধার করতে Home.rooms() ব্যবহার করুন, তারপর প্রতিটি ঘরে সংশ্লিষ্ট ডিভাইসগুলি প্রদর্শন করতে roomID = device.roomID ব্যবহার করুন।

self.home.rooms().batched()
  .combineLatest(self.home.devices().batched())
  .receive(on: DispatchQueue.main)
  .catch { error in
    Logger.error("Failed to load rooms and devices: \(error)")
    return Just((Set<Room>(), Set<HomeDevice>()))
  }
  .map { rooms, devices in
    var devicesByRoom = [Room: [HomeDevice]]()
    for room in rooms where room.structureID == currentStructureID {
      devicesByRoom[room] = devices.filter { $0.roomID == room.id }
    }
    return devicesByRoom
  }.assign(to: &self.$devicesByRoom)

নমুনা রুম কল

কক্ষের একটি তালিকা পান

Home ক্লাস ব্যবহার করে, আপনি কক্ষগুলির একটি তালিকা পেতে পারেন এবং তাদের জন্য বৈশিষ্ট্যগুলি অ্যাক্সেস করতে পারেন:

let allRoomsChanges = self.home.rooms()
let allRooms = try await allRoomsChanges.list()
let room = allRooms.first!
XCTAssertTrue(allRooms.contains(room))

print("id \(room.id) ")
print("name \(room.name) ")

একটি রুম তৈরি করুন

একটি Structure একটি নতুন ঘর তৈরি করতে:

let testName = "Test Room Name"
var newRoom: Room!
do {
  newRoom = try await structure.createRoom(name: testName)
  XCTAssertNotNil(newRoom)
} catch let error as HomeError {
  // Code for handling the exception
}

একটি রুম মুছুন

অথবা, বিকল্পভাবে, আপনি একটি রুম মুছতে পারেন:

val roomToDelete = structure.rooms().list().filter { it.name == "room_id1" }.firstOrNull()
    structure.deleteRoom(roomToDelete!!)

আপনি একটি রুম এর আইডি ব্যবহার করে মুছে ফেলতে পারেন:

let roomToDelete = allRooms.first(where: { $0.id == room.id })
if let roomToDelete1 = roomToDelete {
  do {
    try await structure.deleteRoom(roomToDelete1)
  } catch let error as HomeError {
    // Code for handling the exception
  }
}

ডিভাইস সহ একটি রুম মুছে ফেলা হলে, ডিভাইসগুলি এখনও কাঠামোর মধ্যে থাকবে তবে আর একটি রুমে বরাদ্দ করা হবে না।

ডিভাইসগুলিকে একটি আলাদা ঘরে সরান৷

Structure আপনাকে একটি ডিভাইসকে একটি ভিন্ন ঘরে সরাতে দেয়:

do {
  try await structure.move(device: light, to: room)
} catch let error as HomeError {
  // Code for handling the exception
}

একটি ঘরের নাম পরিবর্তন করুন

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

let updatedRoom = try await theRoom.setName("new room name")

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

API তালিকা

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

API বর্ণনা
devices() এই অ্যাকাউন্টে দৃশ্যমান সমস্ত ডিভাইস পান।
device(id:) একটি নির্দিষ্ট ডিভাইসের জন্য একজন Publisher পান যা বর্তমান অবস্থা এবং আবার ভবিষ্যতের যেকোনো অবস্থার আপডেটে নির্গত করে।
structures() Google অ্যাকাউন্টে সমস্ত কাঠামো পান। একটি Query<Structure> প্রদান করে যা আরও পুনরুদ্ধার এবং ফিল্টারিং বিকল্প প্রদান করে।
structure(id:) ম্যাচিং আইডি দিয়ে কাঠামো পান।
rooms() Google অ্যাকাউন্টে সমস্ত রুম পান। একটি Query<strRoom> যা আরও পুনরুদ্ধার এবং ফিল্টারিং বিকল্প প্রদান করে।
room(id:) একটি নির্দিষ্ট কক্ষের জন্য একজন Publisher পান যা বর্তমান অবস্থা এবং ভবিষ্যতের যেকোনো অবস্থার আপডেটে আবার নির্গত করে।

Structure নিম্নলিখিত API আছে:

API বর্ণনা
deleteRoom(id:) রুম আইডি সহ একটি রুম মুছুন।
id কাঠামোর অনন্য সিস্টেম আইডি।
move(device:, to:) কাঠামোর একটি ভিন্ন ঘরে একটি ডিভাইস সরান।
move(device:, to:) প্রদত্ত আইডি সহ ডিভাইসটিকে প্রদত্ত আইডি সহ ঘরে নিয়ে যান।
move(devices:, to:) প্রদত্ত ডিভাইসগুলিকে প্রদত্ত ঘরে নিয়ে যায়৷
move(devices:, to:) প্রদত্ত আইডি সহ ডিভাইসগুলিকে প্রদত্ত আইডি সহ ঘরে নিয়ে যায়৷
name কাঠামোর ব্যবহারকারীর দেওয়া নাম।

Room নিম্নলিখিত API আছে:

API বর্ণনা
id রুমের অনন্য সিস্টেম আইডি।
name রুমের ব্যবহারকারীর দেওয়া নাম।
structureID রুমটি যে কাঠামোর সাথে সম্পর্কিত তার অনন্য সিস্টেম আইডি।