ডোরবেল ডিভাইসের ধরণটি দুটি বৈশিষ্ট্য ব্যবহার করে বাস্তবায়িত হয়: PushAvStreamTransportTrait , যা পুশ-ভিত্তিক প্রোটোকল ব্যবহার করে অডিও এবং ভিডিও স্ট্রিম পরিবহন পরিচালনা করে এবং WebRtcLiveViewTrait , যা লাইভস্ট্রিম এবং টকব্যাক নিয়ন্ত্রণ করার ক্ষমতা প্রদান করে।
কোনও বৈশিষ্ট্য ব্যবহার করার আগে বা বৈশিষ্ট্য আপডেট করার চেষ্টা করার আগে সর্বদা ডিভাইসের জন্য বৈশিষ্ট্য এবং কমান্ড সমর্থন পরীক্ষা করুন। নিয়ন্ত্রণ ডিভাইসগুলি দেখুনiOS আরও তথ্যের জন্য.
| হোম এপিআই ডিভাইসের ধরণ | বৈশিষ্ট্য | সুইফট নমুনা অ্যাপ | ব্যবহারের ধরণ |
|---|---|---|---|
ডোরবেল দরজার বাইরের একটি বোতাম দ্বারা চালিত একটি ডিভাইস যা একটি শ্রবণযোগ্য এবং/অথবা দৃশ্যমান সংকেত তৈরি করে, যা দরজার অন্য পাশে কোথাও থাকা ব্যক্তির দৃষ্টি আকর্ষণ করার জন্য ব্যবহৃত হয়। ডোরবেলগুলিতে অ্যাক্সেসযোগ্য লাইভস্ট্রিম, দ্বি-মুখী টকব্যাক বা সনাক্তকরণ ইভেন্ট থাকতে পারে। | প্রয়োজনীয় বৈশিষ্ট্য google PushAvStreamTransportTrait গুগল ওয়েবআরটিসিলাইভভিউট্রেট | ডোরবেল |
একটি ডিভাইস সম্পর্কে প্রাথমিক তথ্য পান
BasicInformation বৈশিষ্ট্যের মধ্যে রয়েছে বিক্রেতার নাম, বিক্রেতা আইডি, পণ্য আইডি, পণ্যের নাম (মডেল তথ্য সহ), সফ্টওয়্যার সংস্করণ এবং একটি ডিভাইসের সিরিয়াল নম্বরের মতো তথ্য:
// [START get_device_information] let vendorName = basicInfoTrait.attributes.vendorName! let vendorID = basicInfoTrait.attributes.vendorID! let productID = basicInfoTrait.attributes.productID! let productName = basicInfoTrait.attributes.productName! let softwareVersion = basicInfoTrait.attributes.softwareVersion! let serialNumber = basicInfoTrait.attributes.serialNumber! // [END get_device_information]
ডিভাইসের সংযোগ পরীক্ষা করুন
একটি ডিভাইসের সংযোগ আসলে ডিভাইসের ধরণ স্তরে পরীক্ষা করা হয় কারণ কিছু ডিভাইস একাধিক ডিভাইসের ধরণ সমর্থন করে। ফিরে আসা অবস্থা হল সেই ডিভাইসের সমস্ত বৈশিষ্ট্যের জন্য সংযোগের অবস্থার সংমিশ্রণ।
let lightConnectivity = dimmableLightDeviceType.metadata.sourceConnectivity .connectivityState
মিশ্র ডিভাইস ধরণের ক্ষেত্রে যখন ইন্টারনেট সংযোগ থাকে না, তখন partiallyOnline অবস্থা লক্ষ্য করা যেতে পারে। স্থানীয় রাউটিংয়ের কারণে Matter স্ট্যান্ডার্ড বৈশিষ্ট্যগুলি এখনও অনলাইনে থাকতে পারে, তবে ক্লাউড-ভিত্তিক বৈশিষ্ট্যগুলি অফলাইনে থাকবে।
একটি লাইভস্ট্রিম শুরু করুন
লাইভস্ট্রিম শুরু করতে, WebRtcLiveViewTrait বৈশিষ্ট্যের startLiveView(offerSdp:) পদ্ধতিতে Session Description Protocol (SDP) স্ট্রিং পাঠান, যা তিনটি মান প্রদান করে:
- অধিবেশনের জন্য এসডিপি।
- সেশনের সময়কাল সেকেন্ডে।
- সেশন আইডি, যা সেশন প্রসারিত বা সমাপ্ত করতে ব্যবহার করা যেতে পারে।
public func sendOffer(offerSdp: String) async throws
-> (answerSdp: String, mediaSessionId: String, liveViewDuration: TimeInterval)
{
do {
// Sending StartLiveView command
let response = try await liveViewTrait.startLiveView(
offerSdp: offerSdp
)
// Received StartLiveView response
return (
answerSdp: response.answerSdp,
mediaSessionId: response.mediaSessionId,
liveViewDuration: TimeInterval(response.liveSessionDurationSeconds)
)
} catch {
// Failed to send StartLiveView command
throw error
}
}
লাইভস্ট্রিম প্রসারিত করুন
লাইভস্ট্রিমের একটি পূর্বনির্ধারিত সময়কাল থাকে যার পরে সেগুলির মেয়াদ শেষ হয়ে যায়। একটি সক্রিয় স্ট্রিমের সময়কাল বাড়ানোর জন্য, extendLiveView(mediaSessionId:optionalArgsProvider:) পদ্ধতি ব্যবহার করে একটি এক্সটেনশন অনুরোধ জারি করুন:
public func extendLiveView(mediaSessionId: String) async throws {
do {
// Extending live view
let extendedDuration = try await liveViewTrait.extendLiveView(mediaSessionId: mediaSessionId)
} catch {
// Failed to extend live view
throw error
}
}
টকব্যাক শুরু করুন এবং বন্ধ করুন
টকব্যাক শুরু করতে, WebRtcLiveViewTrait বৈশিষ্ট্যের startTalkback(mediaSessionId:optionalArgsProvider:) পদ্ধতিটি কল করুন। থামাতে, stopTalkback(mediaSessionId:) ব্যবহার করুন।
public func toggleTwoWayTalk(isOn: Bool, mediaSessionId: String) async throws {
do {
if isOn {
try await liveViewTrait.startTalkback(mediaSessionId: mediaSessionId)
} else {
try await liveViewTrait.stopTalkback(mediaSessionId: mediaSessionId)
}
} catch {
throw HomeError.commandFailed("Failed to toggle twoWayTalk: \(error)")
}
}
রেকর্ডিং ক্ষমতা সক্ষম এবং অক্ষম করুন
ক্যামেরার রেকর্ডিং ক্ষমতা সক্রিয় করতে, TransportStatusEnum.Active কে PushAvStreamTransportTrait বৈশিষ্ট্যের setTransportStatus(transportStatus:optionalArgsProvider:) পদ্ধতিতে পাস করুন। রেকর্ডিং ক্ষমতা অক্ষম করতে, এটি TransportStatusEnum.Inactive পাস করুন। নিম্নলিখিত উদাহরণে, আমরা এই কলগুলিকে একটি একক কলে মুড়ে ফেলি যা রেকর্ডিং ক্ষমতা টগল করার জন্য একটি Boolean ব্যবহার করে:
public func toggleIsRecording(isOn: Bool) {
self.uiState = .loading
guard let pushAvStreamTransportTrait else {
// PushAvStreamTransportTrait not found.
return
}
Task {
do {
try await pushAvStreamTransportTrait.setTransportStatus(
transportStatus: isOn ? .active : .inactive)
if isOn {
do {
self.player = try self.createWebRtcPlayer()
} catch {
// Failed to initialize WebRtcPlayer
self.uiState = .disconnected
return
}
await self.player?.initialize()
self.uiState = .live
} else {
self.player = nil
self.uiState = .off
}
} catch {
// Failed to toggle onOff
}
}
}
ক্যামেরার রেকর্ডিং ক্ষমতা সক্রিয় বা নিষ্ক্রিয় করা ক্যামেরার ভিডিও চালু বা বন্ধ করার মতোই। যখন একটি ক্যামেরার ভিডিও চালু থাকে, তখন এটি রেকর্ডিং হয় (ইভেন্ট এবং সম্পর্কিত ক্লিপগুলির উদ্দেশ্যে)।
যখন রেকর্ডিং ক্ষমতা অক্ষম থাকে (ক্যামেরা ভিডিও বন্ধ থাকে):
- ডিভাইসের ধরণের
connectivityStateঅনুসারে ক্যামেরাটি এখনও অনলাইনে দেখাতে পারে। - লাইভস্ট্রিমটি অ্যাক্সেস করা যাচ্ছে না, এবং ক্যামেরা কোনও ক্লাউড ইভেন্ট সনাক্ত করতে পারে না।
রেকর্ডিং ক্ষমতা সক্রিয় আছে কিনা তা পরীক্ষা করে দেখুন।
ক্যামেরার রেকর্ডিং ক্ষমতা সক্রিয় কিনা তা নির্ধারণ করতে, কোনও সংযোগ সক্রিয় আছে কিনা তা পরীক্ষা করে দেখুন। নিম্নলিখিত উদাহরণটি এটি করার জন্য দুটি ফাংশন সংজ্ঞায়িত করে:
public func isDeviceRecording() -> Bool {
guard let pushAvStreamTransportTrait else {
// PushAvStreamTransportTrait not found.
return false
}
guard
let hasActiveConnection =
pushAvStreamTransportTrait
.attributes
.currentConnections?
.contains(where: { $0.transportStatus == .active })
else {
return false
}
return hasActiveConnection
}
ব্যাটারি সেটিংস
হোম এপিআই-এর মাধ্যমে বিভিন্ন ব্যাটারি সেটিংস নিয়ন্ত্রণ করা যেতে পারে।
ব্যাটারি ব্যবহারের পছন্দ সেট করুন
শক্তির ভারসাম্য সেট করার মাধ্যমে আপনি একটি ডিভাইসের ব্যাটারি লাইফ এবং পারফরম্যান্সের মধ্যে ট্রেডঅফ কনফিগার করতে পারবেন। আপনি "বর্ধিত," "ভারসাম্যপূর্ণ," এবং "পারফরম্যান্স" এর মতো বিভিন্ন ব্যাটারি প্রোফাইল তৈরি করতে পারেন এবং তাদের মধ্যে স্যুইচ করতে পারেন।
এই বৈশিষ্ট্যটি EnergyPreference বৈশিষ্ট্যের currentEnergyBalance বৈশিষ্ট্যটি আপডেট করে বাস্তবায়িত করা হয়। বৈশিষ্ট্যটি একটি পূর্ণসংখ্যা সূচক গ্রহণ করে যা ডিভাইসের energyBalances তালিকায় সংজ্ঞায়িত একটি নির্দিষ্ট প্রোফাইলের সাথে সঙ্গতিপূর্ণ (উদাহরণস্বরূপ, EXTENDED এর জন্য 0 , BALANCED এর জন্য 1 এবং PERFORMANCE জন্য 2 )।
currentEnergyBalance এর জন্য একটি null মান নির্দেশ করে যে ডিভাইসটি একটি কাস্টম প্রোফাইল ব্যবহার করছে। এটি একটি পঠনযোগ্য অবস্থা।
নিচে currentEnergyBalance অ্যাট্রিবিউট ব্যবহার করবে এমন একটি কাঠামোর উদাহরণ দেখানো হল, তারপরে অ্যাট্রিবিউট ব্যবহার করে এমন প্রকৃত কোড স্নিপেট দেখানো হল।
// Example energyBalances list { "energy_balances": [ { "step": 0, "label": "EXTENDED" }, { "step": 50, "label": "BALANCED" }, { "step": 100, "label": "PERFORMANCE" } ] }
private func setBatteryUsage(to option: UInt8) async throws { _ = try await energyPreferenceTrait.update { $0.setCurrentEnergyBalance(option) } }
অটোমেটিক ব্যাটারি সেভার চালু করুন
এই বৈশিষ্ট্যটি কনফিগার করতে, EnergyPreference বৈশিষ্ট্যের currentLowPowerModeSensitivity বৈশিষ্ট্যটি আপডেট করুন। এই বৈশিষ্ট্যটি একটি সংবেদনশীলতা স্তর নির্বাচন করতে একটি সূচক ব্যবহার করে, যেখানে 0 সাধারণত Disabled প্রতিনিধিত্ব করে এবং 1 Enabled বা Automatic প্রতিনিধিত্ব করে।
private func setAutoBatterySaver(to value: Bool) async throws { _ = try await energyPreferenceTrait.update { $0.setCurrentLowPowerModeSensitivity(value ? 1 : 0) } }
ব্যাটারি চার্জিং অবস্থা পান
ডিভাইসের বর্তমান চার্জিং অবস্থা (চার্জ হচ্ছে, সম্পূর্ণ চার্জ হচ্ছে, অথবা চার্জ হচ্ছে না) জানতে, PowerSource বৈশিষ্ট্যের batChargeState বৈশিষ্ট্যটি ব্যবহার করুন।
self.chargingState = powerSourceTrait.attributes.batChargeState var description: String switch self.chargingState { case .isCharging: description = "Charging" case .isAtFullCharge: description = "Full" case .isNotCharging: description = "Not Charging" default: description = "Unknown" }
ব্যাটারির লেভেল জেনে নিন
বর্তমান ব্যাটারি লেভেল পেতে, PowerSource বৈশিষ্ট্যের batChargeLevel অ্যাট্রিবিউট ব্যবহার করুন। লেভেলটি হয় OK , Warning (নিম্ন), অথবা Critical ।
self.batteryLevel = powerSourceTrait.attributes.batChargeLevel var description: String switch self.batteryLevel { case .ok: description = "OK" case .warning: description = "Warning" case .critical: description = "Critical" default: description = "Unknown" }
পাওয়ার সোর্সটি পান
ডিভাইসটি কোন পাওয়ার সোর্স ব্যবহার করছে তা নির্ধারণ করতে, PowerSource বৈশিষ্ট্যের BatPresent এবং wiredPresent বৈশিষ্ট্যগুলি ব্যবহার করুন।
if powerSourceTrait.attributes.wiredPresent ?? false { self.powerSourceType = .wired } else if powerSourceTrait.attributes.batPresent ?? false { self.powerSourceType = .battery } else { self.powerSourceType = nil }
অডিও সেটিংস
হোম এপিআই-এর মাধ্যমে বিভিন্ন অডিও সেটিংস নিয়ন্ত্রণ করা যেতে পারে।
মাইক্রোফোন চালু বা বন্ধ করুন
ডিভাইসের মাইক্রোফোন চালু বা বন্ধ করতে, বিল্ট-ইন setMicrophoneMuted ফাংশন ব্যবহার করে CameraAvStreamManagementTrait বৈশিষ্ট্যের microphoneMuted বৈশিষ্ট্যটি আপডেট করুন:
// Turn the device's microphone on or off
func setMicrophone(on: Bool) async {
do {
_ = try await self.cameraAvStreamManagementTrait?.update {
$0.setMicrophoneMuted(!on)
}
} catch {
// Error
}
}
অডিও রেকর্ডিং চালু বা বন্ধ করুন
ডিভাইসের জন্য অডিও রেকর্ডিং চালু বা বন্ধ করতে, বিল্ট-ইন setRecordingMicrophoneMuted ফাংশন ব্যবহার করে CameraAvStreamManagementTrait বৈশিষ্ট্যের recordingMicrophoneMuted বৈশিষ্ট্যটি আপডেট করুন:
// Turn audio recording on or off for the device
func setAudioRecording(on: Bool) async {
do {
_ = try await self.cameraAvStreamManagementTrait?.update {
$0.setRecordingMicrophoneMuted(!on)
}
} catch {
// Error
}
}
স্পিকারের ভলিউম সামঞ্জস্য করুন
ডিভাইসের জন্য স্পিকার ভলিউম সামঞ্জস্য করতে, বিল্ট-ইন setSpeakerVolumeLevel ফাংশন ব্যবহার করে CameraAvStreamManagementTrait বৈশিষ্ট্যের speakerVolumeLevel বৈশিষ্ট্যটি আপডেট করুন:
// Adjust the camera speaker volume
func setSpeakerVolume(to value: UInt8) async {
do {
_ = try await cameraAvStreamManagementTrait.update {
$0.setSpeakerVolumeLevel(value)
}
} catch {
// Error
}
}
অন্যান্য সেটিংস
হোম এপিআই-এর মাধ্যমে অন্যান্য বিভিন্ন সেটিংস নিয়ন্ত্রণ করা যেতে পারে।
নাইট ভিশন চালু বা বন্ধ করুন
ক্যামেরার জন্য নাইট ভিশন চালু বা বন্ধ করতে, বিল্ট-ইন setNightVision ফাংশন ব্যবহার করে CameraAvStreamManagementTrait বৈশিষ্ট্যের nightVision বৈশিষ্ট্য আপডেট করতে TriStateAutoEnum ব্যবহার করুন:
// Turn night vision on or off
func setNightVision(
to value: Google.CameraAvStreamManagementTrait.TriStateAutoEnum
) async {
do {
_ = try await cameraAvStreamManagementTrait.update {
$0.setNightVision(value)
}
} catch {
// Error
}
}
স্ট্যাটাস LED এর উজ্জ্বলতা পরিবর্তন করুন
স্ট্যাটাস LED এর উজ্জ্বলতা পরিবর্তন করতে, বিল্ট-ইন setStatusLightBrightness ফাংশন ব্যবহার করে CameraAvStreamManagementTrait বৈশিষ্ট্যের statusLightBrightness বৈশিষ্ট্য আপডেট করতে ThreeLevelAutoEnum ব্যবহার করুন:
// Set the LED brightness
func setStatusLightBrightness(
to value: Google.CameraAvStreamManagementTrait.ThreeLevelAutoEnum
) async {
do {
_ = try await cameraAvStreamManagementTrait.update {
$0.setStatusLightBrightness(value)
}
} catch {
// Error
}
}
ক্যামেরার ভিউপোর্ট পরিবর্তন করুন
ক্যামেরা ভিউপোর্টটি জুম এবং ক্রপ বৈশিষ্ট্যের মতোই যা জুম এবং এনহ্যান্স নেস্ট ক্যামেরা ভিডিও সাপোর্ট নিবন্ধে বর্ণিত হয়েছে।
ভিউপোর্টটি একটি ViewportStruct এ সংজ্ঞায়িত করা হয় যার চারটি মান থাকে, যা ভিউপোর্টের স্থানাঙ্ক হিসেবে ব্যবহৃত হয়। স্থানাঙ্কগুলি নিম্নরূপ সংজ্ঞায়িত করা হয়:
(x1,y1) -- (x2,y1) | | (x1,y2) -- (x2,y2)
ViewportStruct এর মান নির্ধারণ করা অ্যাপের UI এবং ক্যামেরা বাস্তবায়নের উপর নির্ভর করে। খুব মৌলিক স্তরে, ক্যামেরা ভিডিওর ভিউপোর্ট সেট করতে, বিল্ট-ইন setViewport ফাংশন ব্যবহার করে CameraAvStreamManagementTrait বৈশিষ্ট্যের viewport বৈশিষ্ট্যটি ViewportStruct দিয়ে আপডেট করুন।
func setCrop(x1: UInt16, y1: UInt16, x2: UInt16, y2: UInt16) {
let viewport = Google.CameraAvStreamManagementTrait.ViewportStruct(
x1: x1,
y1: y1,
x2: x2,
y2: y2
)
Task {
do {
try await cameraAvStreamManagementTrait.update {
$0.setViewport(viewport)
}
} catch {
// Error
}
}
}
একটি TransportOptionsStruct তৈরি করুন
কিছু সেটিংসের জন্য TransportOptionsStruct এর বৈশিষ্ট্যগুলিতে পরিবর্তন প্রয়োজন, যা তারপর একটি স্ট্রিমিং সংযোগের পরিবহন বিকল্পগুলিতে প্রেরণ করা হয়। Swift এর জন্য, কোনও বৈশিষ্ট্য আপডেট করার আগে এই কাঠামোটি তৈরি করা প্রয়োজন।
নিম্নলিখিত সেটিং পরিবর্তনগুলির সাথে ব্যবহারের জন্য স্ট্রাক্ট তৈরি করতে এই সহায়ক ফাংশনটি ব্যবহার করুন:
func getTransportOptions(
transportOptions: Google.PushAvStreamTransportTrait.TransportOptionsStruct,
wakeUpSensitivity: UInt8?,
maxEventLength: UInt32?
) async throws
-> Google.PushAvStreamTransportTrait.TransportOptionsStruct
{
var newMotionTimeControl:
Google.PushAvStreamTransportTrait.TransportMotionTriggerTimeControlStruct? = nil
if let maxEventLength {
guard let motionTimeControl = transportOptions.triggerOptions.motionTimeControl else {
throw HomeError.failedPrecondition(
// Error - cannot update max event length without motion time control
}
newMotionTimeControl =
Google.PushAvStreamTransportTrait.TransportMotionTriggerTimeControlStruct(
initialDuration: motionTimeControl.initialDuration,
augmentationDuration: motionTimeControl.augmentationDuration,
maxDuration: maxEventLength,
blindDuration: motionTimeControl.blindDuration
)
}
return Google.PushAvStreamTransportTrait.TransportOptionsStruct(
streamUsage: .recording,
videoStreamID: nil,
audioStreamID: nil,
tlsEndpointID: transportOptions.tlsEndpointID,
url: transportOptions.url,
triggerOptions: Google.PushAvStreamTransportTrait.TransportTriggerOptionsStruct(
triggerType: .motion,
motionZones: nil,
motionSensitivity: wakeUpSensitivity,
motionTimeControl: newMotionTimeControl,
maxPreRollLen: nil
),
ingestMethod: .cmafIngest,
containerOptions: Google.PushAvStreamTransportTrait.ContainerOptionsStruct(
containerType: .cmaf,
cmafContainerOptions: nil
),
expiryTime: nil
)
}
private func getRecordingConnection() async throws
-> Google.PushAvStreamTransportTrait.TransportConfigurationStruct?
{
guard let pushAvStreamTransportTrait else {
// Error - PushAvStreamTransport trait not available
return nil
}
let connections = try await pushAvStreamTransportTrait.findTransport().transportConfigurations
for connection in connections {
guard let transportOptions = connection.transportOptions,
transportOptions.streamUsage == .recording
else {
continue
}
return connection
}
return nil
}
ডিভাইসের জাগরণ সংবেদনশীলতা সামঞ্জস্য করুন
ডিভাইসটির জেগে ওঠার সংবেদনশীলতা ব্যাটারি সংরক্ষণের জন্য ব্যবহৃত হয়, ডিভাইসটি যে পরিসরের কার্যকলাপ অনুভব করতে পারে তা হ্রাস করে এবং সেই কার্যকলাপ সনাক্ত করার পরে ঘুম থেকে ওঠার সময় বাড়িয়ে।
হোম এপিআইগুলিতে, ডিভাইসের transportOptions এ triggerOptions এর motionSensitivity বৈশিষ্ট্য ব্যবহার করে এটি সেট করা যেতে পারে। এই বিকল্পগুলি প্রতিটি ডিভাইসের জন্য PushAvStreamTransportTrait বৈশিষ্ট্যের মধ্যে সংজ্ঞায়িত করা হয়।
জাগরণ সংবেদনশীলতা শুধুমাত্র নিম্নলিখিত মানগুলিতে সেট করা যেতে পারে:
- ১ = কম
- ৫ = মাঝারি
- ১০ = উচ্চ
আপডেট করার প্রক্রিয়া হল findTransport কমান্ড ব্যবহার করে সক্রিয় রেকর্ডিং স্ট্রিমগুলির জন্য পরিবহন কনফিগারেশন খুঁজে বের করা, তারপর modifyPushTransport কমান্ড ব্যবহার করে নতুন সংবেদনশীলতা মান দিয়ে কনফিগারেশনটি পরিবর্তন করা।
modifyPushTransport কমান্ডের জন্য সম্পূর্ণ TransportOptionsStruct পাস করা প্রয়োজন, তাই আপনাকে প্রথমে বর্তমান কনফিগারেশন থেকে বিদ্যমান মানগুলি অনুলিপি করতে হবে। এটি করার জন্য একটি সহায়ক ফাংশনের জন্য একটি TransportOptionsStruct তৈরি করুন দেখুন।
func setWakeUpSensitivity(to value: UInt8) async {
do {
let connection = try await getRecordingConnection()
guard let connection,
let transportOptions = connection.transportOptions
else {
// Error - Transport options not available
return
}
guard transportOptions.triggerOptions.motionSensitivity != nil else {
// Error - Motion sensitivity not available to be updated for this device
return
}
try await pushAvStreamTransportTrait.modifyPushTransport(
connectionID: connection.connectionID,
transportOptions: self.getTransportOptions(
transportOptions: transportOptions,
wakeUpSensitivity: value,
maxEventLength: nil
)
)
} catch {
// Error
}
}
ইভেন্টের সর্বোচ্চ দৈর্ঘ্য সামঞ্জস্য করুন
সর্বাধিক ইভেন্ট দৈর্ঘ্য হল ক্যামেরাটি একটি ইভেন্টের জন্য একটি ক্লিপ রেকর্ড করার সময়কাল। হোম এপিআই-এর মাধ্যমে এটি প্রতি ডিভাইসে, Google Home app (GHA) এর মতো একই দৈর্ঘ্যে, কয়েক সেকেন্ডের ব্যবধানে কনফিগার করা যেতে পারে:
- ১০ সেকেন্ড
- ১৫ সেকেন্ড
- ৩০ সেকেন্ড
- ৬০ সেকেন্ড (১ মিনিট)
- ১২০ সেকেন্ড (২ মিনিট)
- ১৮০ সেকেন্ড (৩ মিনিট)
হোম এপিআইগুলিতে, ডিভাইসের transportOptions এ triggerOptions এর motionTimeControl বৈশিষ্ট্য ব্যবহার করে এটি সেট করা যেতে পারে। এই বিকল্পগুলি প্রতিটি ডিভাইসের জন্য PushAvStreamTransportTrait বৈশিষ্ট্যের মধ্যে সংজ্ঞায়িত করা হয়।
আপডেট করার প্রক্রিয়া হল findTransport কমান্ড ব্যবহার করে সক্রিয় রেকর্ডিং স্ট্রিমগুলির জন্য পরিবহন কনফিগারেশন খুঁজে বের করা, তারপর modifyPushTransport কমান্ড ব্যবহার করে নতুন ইভেন্ট দৈর্ঘ্যের মান দিয়ে কনফিগারেশনটি পরিবর্তন করা।
modifyPushTransport কমান্ডের জন্য সম্পূর্ণ TransportOptionsStruct পাস করা প্রয়োজন, তাই আপনাকে প্রথমে বর্তমান কনফিগারেশন থেকে বিদ্যমান মানগুলি অনুলিপি করতে হবে। এটি করার জন্য একটি সহায়ক ফাংশনের জন্য একটি TransportOptionsStruct তৈরি করুন দেখুন।
func setMaxEventLength(to value: UInt32) async {
do {
let connection = try await getRecordingConnection()
guard let connection,
let transportOptions = connection.transportOptions
else {
// Error - Transport options not available
return
}
guard transportOptions.triggerOptions.motionTimeControl != nil else {
// Error - Motion time control not available to be updated for this device
return
}
try await pushAvStreamTransportTrait.modifyPushTransport(
connectionID: connection.connectionID,
transportOptions: self.getTransportOptions(
transportOptions: transportOptions,
wakeUpSensitivity: nil,
maxEventLength: value
)
)
} catch {
// Error
}
}
চাইম সেটিংস
হোম এপিআই-এর মাধ্যমে বিভিন্ন ডোরবেল চাইম সেটিংস নিয়ন্ত্রণ করা যেতে পারে।
চাইমের শব্দ পরিবর্তন করুন
ডোরবেলের শব্দ পরিবর্তন করতে, প্রথমে ChimeTrait বৈশিষ্ট্যের installedChimeSounds বৈশিষ্ট্য ব্যবহার করে ডিভাইসে ইনস্টল করা শব্দের তালিকা পান:
doorbellChimeTrait.attributes.installedChimeSounds?.compactMap { chimeSound in
return chimeSound.chimeID, chimeSound.name
}
তারপর, বিল্ট-ইন setSelectedChime ফাংশন ব্যবহার করে ChimeTrait বৈশিষ্ট্যের selectedChime বৈশিষ্ট্যটি আপডেট করুন:
func setDoorbellChime(chimeID: UInt8) async {
do {
_ = try await doorbellChimeTrait.update {
$0.setSelectedChime(chimeID)
}
} catch {
// Error
}
}
একটি বহিরাগত চাইম ব্যবহার করুন
ডোরবেলটি একটি বাহ্যিক ঘণ্টা ব্যবহার করার জন্য কনফিগার করা যেতে পারে, যেমন বাড়ির ভিতরে স্থাপিত একটি যান্ত্রিক ঘণ্টা। ডোরবেল ইনস্টল করার সময় এটি কনফিগার করা উচিত যাতে বাইরের ঘণ্টার সম্ভাব্য ক্ষতি এড়ানো যায়।
কোন ধরণের বহিরাগত চাইম ইনস্টল করা আছে তা নির্দেশ করতে, বিল্ট-ইন setExternalChime ফাংশন ব্যবহার করে ChimeTrait বৈশিষ্ট্যের externalChime বৈশিষ্ট্য আপডেট করতে ExternalChimeType ব্যবহার করুন:
// Indicate the external chime is mechanical
func setExternalChime(to value: Google.ChimeTrait.ExternalChimeType) async {
do {
_ = try await doorbellChimeTrait.update {
$0.setExternalChime(value)
}
} catch {
// Error
}
}
বাহ্যিক চাইমের সময়কাল পরিবর্তন করুন
একটি বহিরাগত চাইম বাজানোর সময়কাল, সেকেন্ডে, হোম API-এর মাধ্যমে কনফিগার করা যেতে পারে। যদি বহিরাগত চাইম একটি চাইম সময়কাল সমর্থন করে, তাহলে একজন ব্যবহারকারী এটি কনফিগার করতে চাইতে পারেন।
এখানে সেট করা মানটি বাহ্যিক চাইমের স্পেসিফিকেশন এবং এর প্রস্তাবিত চাইমের সময়কালের উপর নির্ভর করে।
বাহ্যিক চাইমের সময়কাল পরিবর্তন করতে, বিল্ট-ইন setExternalChimeDurationSeconds ফাংশন ব্যবহার করে ChimeTrait বৈশিষ্ট্যের externalChimeDurationSeconds অ্যাট্রিবিউট আপডেট করুন:
// Change the external chime duration
func setExternalChimeDuration(to value: UInt16) async {
do {
_ = try await doorbellChimeTrait.update {
$0.setExternalChimeDuration(value)
}
} catch {
// Error
}
}
একটি চাইম থিম সক্ষম করুন
কিছু ডোরবেলে এমন ঘণ্টা থাকতে পারে যা শুধুমাত্র সীমিত সময়ের জন্য ব্যবহারকারীদের জন্য উপলব্ধ। উদাহরণস্বরূপ, ছুটির দিনগুলির জন্য নির্দিষ্ট ঘণ্টা। এগুলোকে ঘণ্টা থিম বলা হয়।
কোন ব্যবহারকারীর জন্য কোন চাইম থিমগুলি উপলব্ধ তা দেখতে, একটি টাইমবক্স ফিল্টার তৈরি করুন এবং ChimeThemes বৈশিষ্ট্য থেকে getAvailableThemes কমান্ডের ফলাফল ফিল্টার করতে এটি ব্যবহার করুন। এটি থিমের নাম সহ উপলব্ধ থিমের একটি তালিকা প্রদান করে।
নিচের উদাহরণে তালিকাটি কীভাবে ফিল্টার করতে হয় তা দেখানো হয়েছে। একটি থিম সক্রিয় বলে বিবেচিত হবে যদি বর্তমান সময়টি তার শুরু এবং শেষ সময়ের (যথাক্রমে startTimeSeconds এবং endTimeSeconds মান) মধ্যে থাকে। যদি একটি শুরুর সময় সেট না করা থাকে, তাহলে এটি সময়ের শুরু থেকে সক্রিয় বলে বিবেচিত হবে। যদি একটি শেষ সময় সেট না করা থাকে, তাহলে এটি অনির্দিষ্টকালের জন্য সক্রিয় থাকবে। যদি দুটিই অনুপস্থিত থাকে, তাহলে থিমটি সর্বদা সক্রিয় থাকবে।
let chimeThemes = try await chimeThemeTrait.getAvailableThemes().themes
if !chimeThemes.isEmpty {
var chimeThemeSettings = []
for chimeTheme in chimeThemes {
let currentDateTime = UInt64(Date().timeIntervalSince1970)
// Only show chime themes that are active.
if chimeTheme.startTimeSeconds ?? 0 <= currentDateTime
&& chimeTheme.endTimeSeconds ?? UInt64.max >= currentDateTime
{
self.chimeThemeSettings.append(chimeTheme.name)
}
}
}
একবার আপনার পছন্দের থিমের নাম হয়ে গেলে, যেমন Christmas , আপনি ChimeThemes ChimeThemes বৈশিষ্ট্যের setSelectedTimeboxedThemeName() ফাংশন ব্যবহার করে এটি নির্বাচন করতে পারেন।
private func setChimeTheme(to value: String) async throws {
_ = try await chimeThemeTrait.update {
$0.setSelectedTimeboxedThemeName(value)
}
}```