ডোরবেল ডিভাইসের ধরণটি দুটি বৈশিষ্ট্য ব্যবহার করে বাস্তবায়িত হয়: PushAvStreamTransportTrait , যা পুশ-ভিত্তিক প্রোটোকল ব্যবহার করে অডিও এবং ভিডিও স্ট্রিম পরিবহন পরিচালনা করে এবং WebRtcLiveViewTrait , যা লাইভস্ট্রিম এবং টকব্যাক নিয়ন্ত্রণ করার ক্ষমতা প্রদান করে।
কোনও বৈশিষ্ট্য ব্যবহার করার আগে বা বৈশিষ্ট্য আপডেট করার চেষ্টা করার আগে সর্বদা ডিভাইসের জন্য বৈশিষ্ট্য এবং কমান্ড সমর্থন পরীক্ষা করুন। নিয়ন্ত্রণ ডিভাইসগুলি দেখুনiOS আরও তথ্যের জন্য.
| হোম এপিআই ডিভাইসের ধরণ | বৈশিষ্ট্য | সুইফট নমুনা অ্যাপ | ব্যবহারের ধরণ |
|---|---|---|---|
ডোরবেল দরজার বাইরের একটি বোতাম দ্বারা চালিত একটি ডিভাইস যা একটি শ্রবণযোগ্য এবং/অথবা দৃশ্যমান সংকেত তৈরি করে, যা দরজার অন্য পাশে কোথাও থাকা ব্যক্তির দৃষ্টি আকর্ষণ করার জন্য ব্যবহৃত হয়। ডোরবেলগুলিতে অ্যাক্সেসযোগ্য লাইভস্ট্রিম, দ্বি-মুখী টকব্যাক বা সনাক্তকরণ ইভেন্ট থাকতে পারে। | প্রয়োজনীয় বৈশিষ্ট্য google PushAvStreamTransportTrait গুগল ওয়েবআরটিসিলাইভভিউট্রেট | ডোরবেল |
একটি লাইভস্ট্রিম শুরু করুন
লাইভস্ট্রিম শুরু করতে, WebRtcLiveViewTrait বৈশিষ্ট্যের startLiveView(offerSdp:) পদ্ধতিতে Session Description Protocol (SDP) স্ট্রিং পাঠান, যা তিনটি মান প্রদান করে:
- অধিবেশনের জন্য এসডিপি।
- সেশনের সময়কাল সেকেন্ডে।
- সেশন আইডি, যা সেশন প্রসারিত বা সমাপ্ত করতে ব্যবহার করা যেতে পারে।
public func sendOffer(offerSdp: String) async throws
-> (answerSdp: String, mediaSessionId: String, liveViewDuration: TimeInterval)
{
do {
Logger.info("Sending StartLiveView command...")
let response = try await liveViewTrait.startLiveView(
offerSdp: offerSdp
)
Logger.info("Received StartLiveView response: \(response)")
return (
answerSdp: response.answerSdp,
mediaSessionId: response.mediaSessionId,
liveViewDuration: TimeInterval(response.liveSessionDurationSeconds)
)
} catch {
Logger.error("Failed to send StartLiveView command: \(error)")
throw error
}
}
লাইভস্ট্রিম প্রসারিত করুন
লাইভস্ট্রিমের একটি পূর্বনির্ধারিত সময়কাল থাকে যার পরে সেগুলির মেয়াদ শেষ হয়ে যায়। একটি সক্রিয় স্ট্রিমের সময়কাল বাড়ানোর জন্য, extendLiveView(mediaSessionId:optionalArgsProvider:) পদ্ধতি ব্যবহার করে একটি এক্সটেনশন অনুরোধ জারি করুন:
public func extendLiveView(mediaSessionId: String) async throws {
do {
Logger.info("Extending live view...")
let extendedDuration = try await liveViewTrait.extendLiveView(mediaSessionId: mediaSessionId)
Logger.info("Extended live view for \(extendedDuration.liveSessionDurationSeconds) seconds.")
} catch {
Logger.error("Failed to extend live view: \(error)")
throw error
}
}
টকব্যাক শুরু করুন এবং বন্ধ করুন
টকব্যাক শুরু করতে, WebRtcLiveViewTrait বৈশিষ্ট্যের startTalkback(mediaSessionId:optionalArgsProvider:) পদ্ধতিটি কল করুন। থামাতে, stopTalkback(mediaSessionId:) ব্যবহার করুন।
public func toggleTwoWayTalk(isOn: Bool, mediaSessionId: String) async throws {
do {
Logger.info("Toggling twoWayTalk to \(isOn ? "ON" : "OFF")...")
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 {
Logger.error("PushAvStreamTransportTrait not found.")
return
}
Task {
do {
try await pushAvStreamTransportTrait.setTransportStatus(
transportStatus: isOn ? .active : .inactive)
if isOn {
do {
self.player = try self.createWebRtcPlayer()
} catch {
Logger.error("Failed to initialize WebRtcPlayer: \(error)")
self.uiState = .disconnected
return
}
await self.player?.initialize()
self.uiState = .live
} else {
self.player = nil
self.uiState = .off
}
} catch {
Logger.error("Failed to toggle onOff: \(error)")
}
}
}
ক্যামেরার রেকর্ডিং ক্ষমতা সক্রিয় বা নিষ্ক্রিয় করা ক্যামেরার ভিডিও চালু বা বন্ধ করার মতোই। যখন একটি ক্যামেরার ভিডিও চালু থাকে, তখন এটি রেকর্ডিং হয় (ইভেন্ট এবং সম্পর্কিত ক্লিপগুলির উদ্দেশ্যে)।
যখন রেকর্ডিং ক্ষমতা অক্ষম থাকে (ক্যামেরা ভিডিও বন্ধ থাকে):
- ডিভাইসের ধরণের
connectivityStateঅনুসারে ক্যামেরাটি এখনও অনলাইনে দেখাতে পারে। - লাইভস্ট্রিমটি অ্যাক্সেস করা যাচ্ছে না, এবং ক্যামেরা কোনও ক্লাউড ইভেন্ট সনাক্ত করতে পারে না।
রেকর্ডিং ক্ষমতা সক্রিয় আছে কিনা তা পরীক্ষা করে দেখুন।
ক্যামেরার রেকর্ডিং ক্ষমতা সক্রিয় কিনা তা নির্ধারণ করতে, কোনও সংযোগ সক্রিয় আছে কিনা তা পরীক্ষা করে দেখুন। নিম্নলিখিত উদাহরণটি এটি করার জন্য দুটি ফাংশন সংজ্ঞায়িত করে:
public func isDeviceRecording() -> Bool {
guard let pushAvStreamTransportTrait else {
Logger.error("PushAvStreamTransportTrait not found.")
return false
}
guard
let hasActiveConnection =
pushAvStreamTransportTrait
.attributes
.currentConnections?
.contains(where: { $0.transportStatus == .active })
else {
return false
}
return hasActiveConnection
}
অডিও সেটিংস
হোম এপিআই-এর মাধ্যমে বিভিন্ন ক্যামেরা অডিও সেটিংস নিয়ন্ত্রণ করা যেতে পারে।
মাইক্রোফোন চালু বা বন্ধ করুন
ডিভাইসের মাইক্রোফোন চালু বা বন্ধ করতে, বিল্ট-ইন 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
}
}