초인종 기기 유형은 푸시 기반 프로토콜을 사용하여 오디오 및 동영상 스트림 전송을 처리하는 PushAvStreamTransportTrait과 라이브 스트림 및 인터콤을 제어하는 기능을 제공하는 WebRtcLiveViewTrait의 두 가지 특성을 사용하여 구현됩니다.
기능을 사용하거나 속성을 업데이트하려고 시도하기 전에 항상 기기의 속성 및 명령어 지원을 확인하세요. 자세한 내용은 iOS에서 기기 제어를 참고하세요.
| Home API 기기 유형 | 특성 | Swift 샘플 앱 | 사용 사례 |
|---|---|---|---|
초인종
문 밖에 있는 버튼으로 작동하며, 문 너머에 있는 사람의 주의를 끌기 위해 청각적 또는 시각적 신호를 내는 장치입니다. 초인종에는 접근 가능한 라이브 스트림, 양방향 TalkBack 또는 감지 활동이 포함될 수 있습니다. |
필수 특성 google PushAvStreamTransportTrait google WebRtcLiveViewTrait |
초인종 |
라이브 스트림 시작
라이브 스트림을 시작하려면 세션 설명 프로토콜 (SDP) 문자열을 WebRtcLiveViewTrait 특성의 startLiveView(offerSdp:) 메서드에 전송합니다. 이 메서드는 다음 세 값을 반환합니다.
- 세션의 SDP입니다.
- 세션 시간(초)입니다.
- 세션을 연장하거나 종료하는 데 사용할 수 있는 세션 ID입니다.
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
}
}
TalkBack 시작 및 중지
토크백을 시작하려면 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
}
오디오 설정
다양한 카메라 오디오 설정은 Home API를 통해 제어할 수 있습니다.
마이크 켜거나 끄기
기기의 마이크를 켜거나 끄려면 내장 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
}
}
기타 설정
다양한 기타 카메라 설정은 Home API를 통해 제어할 수 있습니다.
야간 적외선 조명 사용 설정 또는 사용 중지하기
카메라의 야간 모드를 사용 설정 또는 사용 중지하려면 TriStateAutoEnum를 사용하여 내장 setNightVision 함수를 통해 CameraAvStreamManagementTrait 특성의 nightVision 속성을 업데이트합니다.
// 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의 밝기를 변경하려면 ThreeLevelAutoEnum를 사용하여 내장 setStatusLightBrightness 함수를 사용하여 CameraAvStreamManagementTrait 특성의 statusLightBrightness 속성을 업데이트합니다.
// Set the LED brightness
func setStatusLightBrightness(
to value: Google.CameraAvStreamManagementTrait.ThreeLevelAutoEnum
) async {
do {
_ = try await cameraAvStreamManagementTrait.update {
$0.setStatusLightBrightness(value)
}
} catch {
// Error
}
}
카메라 표시 영역 변경
카메라 뷰포트는 Nest 카메라 동영상 확대/축소 및 개선 지원 도움말에 설명된 확대/축소 및 자르기 기능과 동일합니다.
뷰포트는 뷰포트의 좌표로 사용되는 네 개의 값이 포함된 ViewportStruct에 정의됩니다. 좌표는 다음과 같이 정의됩니다.
(x1,y1) -- (x2,y1) | | (x1,y2) -- (x2,y2)
ViewportStruct 값을 결정하는 것은 앱의 UI와 카메라 구현에 따라 다릅니다. 매우 기본적인 수준에서 카메라 동영상의 뷰포트를 설정하려면 내장 setViewport 함수를 사용하여 ViewportStruct로 CameraAvStreamManagementTrait 특성을 업데이트합니다.viewport
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
}
기기 절전 해제 민감도 조정
기기의 절전 모드 해제 감도는 기기가 활동을 감지할 수 있는 범위를 줄이고 활동을 감지한 후 절전 모드를 해제하는 시간을 늘려 배터리를 절약하는 데 사용됩니다.
Home API에서 이는 기기의 transportOptions에 있는 triggerOptions의 motionSensitivity 속성을 사용하여 설정할 수 있습니다. 이러한 옵션은 각 기기의 PushAvStreamTransportTrait 특성 내에 정의됩니다.
절전 모드 해제 감도는 다음 값으로만 설정할 수 있습니다.
- 1 = 낮음
- 5 = 보통
- 10 = 높음
업데이트 프로세스는 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
}
}
최대 이벤트 길이 조정
최대 활동 길이는 카메라가 활동의 클립을 녹화하는 시간입니다. Home API를 통해 기기별로 Google Home app (GHA)를 통해 설정하는 것과 동일한 길이로 초 단위 간격으로 구성할 수 있습니다.
- 10초
- 15초
- 30초
- 60초(1분)
- 120초(2분)
- 180초 (3분)
Home API에서 이는 기기의 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
}
}
차임벨 설정
Home API를 통해 다양한 초인종 차임벨 설정을 제어할 수 있습니다.
차임벨 소리 변경
초인종 차임벨 소리를 변경하려면 먼저 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
}
}
외부 차임벨 사용
초인종은 집 내부에 설치된 기계식 벨과 같은 외부 차임벨을 사용하도록 구성할 수 있습니다. 외부 차임벨의 손상을 방지하기 위해 초인종 설치 중에 구성해야 합니다.
설치된 외부 차임벨의 유형을 나타내려면 ExternalChimeType를 사용하여 내장 setExternalChime 함수를 사용하여 ChimeTrait 특성의 externalChime 속성을 업데이트합니다.
// Indicate the external chime is mechanical
func setExternalChime(to value: Google.ChimeTrait.ExternalChimeType) async {
do {
_ = try await doorbellChimeTrait.update {
$0.setExternalChime(value)
}
} catch {
// Error
}
}
외부 차임벨 지속 시간 변경
외부 초인종이 울리는 시간(초)은 Home 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
}
}