আইওএসের জন্য হোম এপিআই-এর মাধ্যমে স্ট্রাকচার এপিআই অ্যাক্সেস করা যেতে পারে।
স্ট্রাকচার 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 | রুমটি যে কাঠামোর সাথে সম্পর্কিত তার অনন্য সিস্টেম আইডি। |