Il tipo di dispositivo Videocamera viene implementato utilizzando due tratti:
PushAvStreamTransportTrait,
che gestisce il trasporto di stream audio e video utilizzando protocolli basati sul push, e
WebRtcLiveViewTrait,
che offre la possibilità di controllare i live streaming e il talkback.
Prima di utilizzare qualsiasi funzionalità o tentare di aggiornare gli attributi, controlla sempre il supporto degli attributi e dei comandi per un dispositivo. Per ulteriori informazioni, consulta Controllare i dispositivi su iOS.
| Tipo di dispositivo API Home | Tratti | App di esempio Swift | Caso d'uso |
|---|---|---|---|
|
Videocamera
Un dispositivo che acquisisce immagini statiche o video. Le videocamere possono includere live streaming accessibili, talkback bidirezionale o eventi di rilevamento. |
Tratti obbligatori google PushAvStreamTransportTrait google WebRtcLiveViewTrait |
Videocamera |
Ottenere informazioni di base su un dispositivo
Il BasicInformation
tratto include informazioni come il nome del fornitore, l'ID fornitore, l'ID prodotto,
il nome del prodotto (incluse le informazioni sul modello), la versione del software,
e il numero di serie di un dispositivo:
// [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]
Ottenere l'ultima volta che il dispositivo ha contattato il cloud
Per trovare l'ultima volta che il dispositivo ha contattato il cloud, utilizza
l'attributo lastContactTimestamp del
ExtendedGeneralDiagnostics
tratto:
if let lastContactTimeStamp = extendedGeneralDiagnosticsTrait.attributes.lastContactTimestamp { self.lastContactTime = Date(timeIntervalSince1970: Double(lastConnectedTimeStamp)) }
Controllare la connettività di un dispositivo
La connettività di un dispositivo viene effettivamente controllata a livello di tipo di dispositivo perché alcuni dispositivi supportano più tipi di dispositivi. Lo stato restituito è una combinazione degli stati di connettività di tutti i tratti del dispositivo.
let lightConnectivity = dimmableLightDeviceType.metadata.sourceConnectivity .connectivityState
In caso di tipi di dispositivi misti, quando non è presente una connessione a internet, potrebbe essere visualizzato lo stato partiallyOnline. Matter I tratti standard
di Matter potrebbero essere ancora online a causa del routing locale, ma i tratti basati sul cloud saranno
offline.
Avviare un live streaming
Per avviare un live streaming, invia la stringa SDP (Session Description Protocol)
al
WebRtcLiveViewTrait
tratto's
startLiveView(offerSdp:)
metodo, che restituisce tre valori:
- L'SDP per la sessione.
- La durata della sessione in secondi.
- L'ID sessione, che può essere utilizzato per estendere o terminare la sessione.
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
}
}
Estendere un live streaming
I live streaming hanno una durata preimpostata dopo la quale scadono. Per allungare la
durata di uno stream attivo, invia una richiesta di estensione utilizzando il
extendLiveView(mediaSessionId:optionalArgsProvider:)
metodo:
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
}
}
Avviare e interrompere il talkback
Per avviare il talkback, chiama il
WebRtcLiveViewTrait
metodo startTalkback(mediaSessionId:optionalArgsProvider:) del tratto.
Per interrompere, utilizza 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)")
}
}
Abilitare e disabilitare la funzionalità di registrazione
Per abilitare la funzionalità di registrazione della videocamera, passa
TransportStatusEnum.Active
al
PushAvStreamTransportTrait
del tratto
setTransportStatus(transportStatus:optionalArgsProvider:)
metodo. Per disabilitare la funzionalità di registrazione, passala a
TransportStatusEnum.Inactive.
Nell'esempio seguente, racchiudiamo queste chiamate in una singola chiamata che utilizza un valore Boolean per attivare/disattivare la funzionalità di registrazione:
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
}
}
}
L'abilitazione o la disabilitazione della funzionalità di registrazione della videocamera equivale all'attivazione o alla disattivazione del video della videocamera. Quando il video di una videocamera è attivo, la videocamera registra (ai fini degli eventi e dei clip correlati).
Quando la funzionalità di registrazione è disabilitata (il video della videocamera è disattivato):
- La videocamera può comunque essere visualizzata come online in base a
connectivityStatedel tipo di dispositivo. - Non è possibile accedere al live streaming e la videocamera non rileva eventi cloud.
Controllare se la funzionalità di registrazione è abilitata
Per determinare se la funzionalità di registrazione di una videocamera è abilitata, controlla se sono attive delle connessioni. L'esempio seguente definisce due funzioni per eseguire questa operazione:
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
}
Impostazioni batteria
È possibile controllare varie impostazioni della batteria tramite le API Home.
Impostare la preferenza di utilizzo della batteria
L'impostazione del bilanciamento energetico consente di configurare il compromesso tra durata della batteria e prestazioni di un dispositivo. Puoi creare diversi profili della batteria, ad esempio "Esteso", "Bilanciato" e "Prestazioni", e passare da uno all'altro.
Questa funzionalità viene implementata aggiornando l'
currentEnergyBalance attributo
del EnergyPreference
tratto. L'attributo accetta un indice intero che corrisponde a un profilo specifico definito nell'elenco energyBalances del dispositivo (ad esempio, 0 per EXTENDED, 1 per BALANCED e 2 per PERFORMANCE).
Un valore null per currentEnergyBalance indica che il dispositivo utilizza un profilo personalizzato. Questo è uno stato di sola lettura.
Di seguito è riportato un esempio di struttura che verrà utilizzata dall'attributo currentEnergyBalance, seguito dallo snippet di codice effettivo che utilizza l'attributo.
// 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) } }
Attivare il risparmio energetico automatico
Per configurare questa funzionalità, aggiorna l'
currentLowPowerModeSensitivity attributo
del EnergyPreference
tratto. Questo attributo utilizza un indice per selezionare un livello di sensibilità, dove 0 in genere rappresenta Disabled e 1 rappresenta Enabled o Automatic.
private func setAutoBatterySaver(to value: Bool) async throws { _ = try await energyPreferenceTrait.update { $0.setCurrentLowPowerModeSensitivity(value ? 1 : 0) } }
Ottenere lo stato di ricarica della batteria
Per ottenere lo stato di ricarica attuale del dispositivo (in carica, completamente carico o non
in carica), utilizza l'
batChargeState
attributo del
PowerSource
tratto.
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" }
Ottenere il livello batteria
Per ottenere il livello batteria attuale, utilizza l'
batChargeLevel
attributo del
PowerSource
trait. Il livello è OK, Warning (basso) o 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" }
Ottenere la fonte di alimentazione
Per determinare la fonte di alimentazione utilizzata dal dispositivo,
utilizza gli attributi BatPresent
e
wiredPresent
del tratto PowerSource.
if powerSourceTrait.attributes.wiredPresent ?? false { self.powerSourceType = .wired } else if powerSourceTrait.attributes.batPresent ?? false { self.powerSourceType = .battery } else { self.powerSourceType = nil }
Impostazioni audio
È possibile controllare varie impostazioni audio tramite le API Home.
Attivare o disattivare il microfono
Per attivare o disattivare il microfono del dispositivo, aggiorna l'
microphoneMuted
attributo del tratto CameraAvStreamManagementTrait utilizzando la funzione integrata
setMicrophoneMuted funzione:
// Turn the device's microphone on or off
func setMicrophone(on: Bool) async {
do {
_ = try await self.cameraAvStreamManagementTrait?.update {
$0.setMicrophoneMuted(!on)
}
} catch {
// Error
}
}
Attivare o disattivare la registrazione audio
Per attivare o disattivare la registrazione audio per il dispositivo, aggiorna l'
recordingMicrophoneMuted
attributo del tratto CameraAvStreamManagementTrait utilizzando la funzione integrata
setRecordingMicrophoneMuted funzione:
// 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
}
}
Regolare il volume dello speaker
Per regolare il volume dello speaker del dispositivo, aggiorna l'
speakerVolumeLevel
attributo del tratto CameraAvStreamManagementTrait utilizzando la funzione integrata
setSpeakerVolumeLevel
// Adjust the camera speaker volume
func setSpeakerVolume(to value: UInt8) async {
do {
_ = try await cameraAvStreamManagementTrait.update {
$0.setSpeakerVolumeLevel(value)
}
} catch {
// Error
}
}
Impostazioni delle zone attive
Il tratto ZoneManagement fornisce un'interfaccia per la gestione delle regioni di interesse personalizzate (zone attive) su videocamere e campanelli.
Queste zone vengono utilizzate per filtrare il rilevamento degli eventi (ad esempio il movimento di persone o veicoli) in aree specifiche all'interno del campo visivo del dispositivo.
Le zone attive vengono configurate dall'utente all'interno di un'applicazione partner, consentendogli di disegnare zone su aree specifiche nel campo visivo della videocamera. Queste zone definite dall'utente vengono poi tradotte nelle strutture utilizzate da questo tratto. Per ulteriori informazioni sul funzionamento delle zone attive, consulta Configurare e utilizzare le zone attive.
Le zone attive vengono in genere definite utilizzando coordinate cartesiane 2D.
Il tratto fornisce il
TwoDCartesianVertexStruct per i vertici e il
TwoDCartesianZoneStruct
per la definizione della zona (nome, vertici, colore e utilizzo).
Controllare le zone attive
Per visualizzare le zone attive, controlla l'
zones
attributo del ZoneManagement tratto.
let zoneManagementTrait: Google.ZoneManagementTrait self.zones = zoneManagementTrait.attributes.zones ?? []
Aggiungere una zona attiva
Per creare una nuova zona, utilizza il
createTwoDCartesianZone comando. Questo comando accetta un TwoDCartesianZoneStruct,
che definisce il nome, i vertici, il colore e l'utilizzo della zona.
L'esempio seguente mostra come creare una zona denominata "Veranda" con quattro vertici, color salmone (#F439A0) e utilizzata per il rilevamento del movimento.
import GoogleHomeSDK import GoogleHomeTypes func createFrontPorchZone(trait: Google.ZoneManagementTrait) async { // 1. Define the vertices for the zone (2D Cartesian coordinates) // Values are UInt16, typically scaled to the device's twoDCartesianMax. let vertices = [ Google.ZoneManagementTrait.TwoDCartesianVertexStruct(x = 260, y = 422), Google.ZoneManagementTrait.TwoDCartesianVertexStruct(x = 1049, y = 0), Google.ZoneManagementTrait.TwoDCartesianVertexStruct(x = 2048, y = 0), Google.ZoneManagementTrait.TwoDCartesianVertexStruct(x = 2048, y = 950), Google.ZoneManagementTrait.TwoDCartesianVertexStruct(x = 1630, y = 1349), Google.ZoneManagementTrait.TwoDCartesianVertexStruct(x = 880, y = 2048), Google.ZoneManagementTrait.TwoDCartesianVertexStruct(x = 0, y = 2048), Google.ZoneManagementTrait.TwoDCartesianVertexStruct(x = 638, y = 1090) ] // 2. Define the zone structure using the given SDK struct let newZone = Google.ZoneManagementTrait.TwoDCartesianZoneStruct( name: "Front Porch", use: [.motion], // ZoneUseEnum.motion vertices: vertices, // Color is a hex string (for example, Salmon/Pink) color: "#F439A0" ) do { // 3. Execute the raw command to add the zone to the device // This returns the created zone's ID (UInt16). var newZoneID = try await trait.createTwoDCartesianZone(zone: newZone) } catch { // Error } }
Aggiornare una zona attiva
Per aggiornare una zona esistente, utilizza il
updateTwoDCartesianZone comando. Questo comando richiede zoneId e aggiornato
TwoDCartesianZoneStruct.
let zoneManagementTrait: Google.ZoneManagementTrait let zoneID: UInt16 let zone: Google.ZoneManagementTrait.TwoDCartesianZoneStruct do { _ = try await zoneManagementTrait.updateTwoDCartesianZone( zoneID: zoneID, zone: zone) } catch { // Error }
Eliminare una zona attiva
Per rimuovere una zona, utilizza il
removeZone comando con il zoneId specifico.
let zoneManagementTrait: Google.ZoneManagementTrait let zoneID: UInt16 do { _ = try await zoneManagementTrait.removeZone(zoneID: zoneID) } catch { // Error }
Trigger evento audio
Il tratto AvStreamAnalysis fornisce un'interfaccia per la gestione dei trigger di rilevamento degli eventi su videocamere e campanelli. Sebbene i trigger basati sulla visione (ad esempio persone o veicoli) possano essere specifici per zona, i trigger relativi all'audio sono in genere configurazioni a livello di dispositivo.
I seguenti tipi di trigger sono disponibili per il rilevamento audio con il
EventTriggerTypeEnum:
| Modalità | Valore enum | Descrizione |
|---|---|---|
| Suono | Sound |
Rilevamento dei suoni generale. |
| Persona che parla | PersonTalking |
Rileva il parlato. |
| Cane che abbaia | DogBark |
Rileva le vocalizzazioni canine. |
| Vetri rotti | GlassBreak |
Rileva il suono di vetri rotti. |
| Allarme fumo | SmokeAlarm |
Rileva gli allarmi fumo, spesso riconosciuti dal pattern audio T3 (tre segnali acustici brevi seguiti da una pausa). |
| Allarme CO | CoAlarm |
Rileva gli allarmi di monossido di carbonio (CO), in genere riconosciuti dal pattern audio T4 (quattro segnali acustici brevi seguiti da una pausa). |
Controllare lo stato del rilevamento dei suoni
Per mostrare all'utente lo stato attuale del rilevamento dei suoni, devi controllare cosa supporta il dispositivo e cosa è abilitato dall'hardware del dispositivo. I due attributi da controllare sono:
Nello sviluppo per iOS, in genere si accede al tratto AvStreamAnalysis dal dispositivo per leggere questi attributi.
// Example struct to store event triggers public struct EventTrigger: Equatable { public var id: Google.AvStreamAnalysisTrait.EventTriggerTypeEnum public var enabled: Bool } let avStreamAnalysisTrait: Google.AvStreamAnalysisTrait let possibleEventTriggers = avStreamAnalysisTrait.attributes.supportedEventTriggers ?? [] let enabledEventTriggers = avStreamAnalysisTrait.attributes.enabledEventTriggers ?? [] let eventTriggers [EventTrigger] = [] for trigger in possibleEventTriggers { self.eventTriggers.append( EventTrigger( id: trigger, enabled: enabledEventTriggers.contains(trigger) ) ) }
Aggiornare l'insieme di trigger abilitati
Per aggiornare l'insieme di trigger abilitati, utilizza il
SetOrUpdateEventDetectionTriggers
comando, che accetta un elenco di EventTriggerEnablement strutture.
// Example struct to store event triggers public struct EventTrigger: Equatable { public var id: Google.AvStreamAnalysisTrait.EventTriggerTypeEnum public var enabled: Bool } let avStreamAnalysisTrait: Google.AvStreamAnalysisTrait let eventTriggers: [EventTrigger] let enabledEventTriggers = eventTriggers.map { Google.AvStreamAnalysisTrait.EventTriggerEnablement( eventTriggerType: $0.id, enablementStatus: $0.enabled ? .enabled : .disabled ) } try await avStreamAnalysisTrait.setOrUpdateEventDetectionTriggers( eventTriggerEnablements: enabledEventTriggers )
Modalità di registrazione
Il tratto RecordingMode fornisce un'interfaccia per la gestione del comportamento di registrazione di video e immagini su videocamere e campanelli. Consente agli utenti di scegliere tra la registrazione continua, la registrazione basata sugli eventi o la disattivazione completa della registrazione (solo Live View).
Il RecordingModeEnum
definisce le strategie di registrazione disponibili:
| Modalità | Valore enum | Descrizione |
|---|---|---|
| Disabilitata | Disabled |
La registrazione è completamente disabilitata. Utilizzata principalmente dai dispositivi legacy. |
| CVR (Continuous Video Recording) | Cvr |
Il video viene registrato 24 ore su 24, 7 giorni su 7. Richiede un abbonamento (ad esempio, Google Home Premium. |
| EBR (Event Based Recording) | Ebr |
La registrazione viene attivata dagli eventi (persona, movimento). La durata del video dipende dalla durata dell'evento e dall'abbonamento. |
| ETR (Event Triggered Recording) | Etr |
Registrazione di anteprima breve (ad esempio, 10 secondi) attivata dagli eventi. |
| Live View | LiveView |
La registrazione è disabilitata, ma gli utenti possono comunque accedere al live streaming. |
| Immagini statiche | Images |
Quando si verificano eventi, vengono registrate le istantanee anziché i video. |
Controllare le modalità di registrazione
Per visualizzare la configurazione di registrazione attuale, controlla gli attributi del tratto RecordingMode:
supportedRecordingModes- Tutte le modalità potenzialiavailableRecordingModes- Modalità selezionabiliselectedRecordingMode- La modalità attiva
// Example struct to store recording modes. public struct RecordingMode: Hashable { public let id: UInt8 public let mode: Google.RecordingModeTrait.RecordingModeEnum } let recordingModeTrait: Google.RecordingModeTrait if let availableRecordingModes = recordingModeTrait.attributes.availableRecordingModes, let supportedRecordingModes = recordingModeTrait.attributes.supportedRecordingModes, let selectedRecordingMode = recordingModeTrait.attributes.selectedRecordingMode { var recordingModes: [RecordingMode] = [] for recordingModeId in availableRecordingModes { guard Int(recordingModeId) < supportedRecordingModes.count, Int(recordingModeId) >= 0 else { // Out of bounds error } recordingModes.append( RecordingMode( id: recordingModeId, mode: supportedRecordingModes[Int(recordingModeId)].recordingMode, ) ) } }
Cambiare la modalità di registrazione
Prima di aggiornare, assicurati che l'indice scelto dall'attributo supportedRecordingModes sia presente nell'attributo availableRecordingModes.
Per aggiornare la modalità selezionata, utilizza la funzione setSelectedRecordingMode, passando l'indice della modalità scelta:
let recordingModeTrait: Google.RecordingModeTrait let recordingModeID: UInt8 _ = try await recordingModeTrait.update { $0.setSelectedRecordingMode(recordingModeID) }
Altre impostazioni
È possibile controllare varie altre impostazioni tramite le API Home.
Modificare l'orientamento dell'immagine
È possibile ruotare l'orientamento dell'immagine (video) della videocamera. Il video può essere ruotato solo di 180 gradi.
Per modificare l'orientamento dell'immagine della videocamera, aggiorna l'
imageRotation
attributo del tratto CameraAvStreamManagementTrait utilizzando la funzione integrata
setImageRotation function:
// Change the camera's image orientation
// Value must be 0 or 180
func setImageRotation(to value: UInt16) async {
do {
_ = try await cameraAvStreamManagementTrait.update {
$0.setImageRotation(value)
}
} catch {
// Error
}
}
Attivare o disattivare la visione notturna
Per attivare o disattivare la visione notturna della videocamera, utilizza TriStateAutoEnum
per aggiornare l'
nightVision
attributo del tratto CameraAvStreamManagementTrait utilizzando la funzione integrata
setNightVision:
// Turn night vision on or off
func setNightVision(
to value: Google.CameraAvStreamManagementTrait.TriStateAutoEnum
) async {
do {
_ = try await cameraAvStreamManagementTrait.update {
$0.setNightVision(value)
}
} catch {
// Error
}
}
Modificare la luminosità del LED di stato
Per modificare la luminosità del LED di stato, utilizza
ThreeLevelAutoEnum
per aggiornare l'
statusLightBrightness
attributo del tratto CameraAvStreamManagementTrait utilizzando la funzione integrata
setStatusLightBrightness:
// Set the LED brightness
func setStatusLightBrightness(
to value: Google.CameraAvStreamManagementTrait.ThreeLevelAutoEnum
) async {
do {
_ = try await cameraAvStreamManagementTrait.update {
$0.setStatusLightBrightness(value)
}
} catch {
// Error
}
}
Modificare la finestra della videocamera
La finestra della videocamera è la stessa della funzionalità Zoom e ritaglio descritta nell' articolo del Centro assistenza Aumentare lo zoom e migliorare i video della videocamera Nest.
La finestra viene definita in un ViewportStruct che contiene quattro valori, utilizzati come coordinate della finestra. Le coordinate sono definite come:
(x1,y1) -- (x2,y1) | | (x1,y2) -- (x2,y2)
La determinazione dei valori per ViewportStruct dipende dall'interfaccia utente e dall'implementazione della videocamera di un'app. A un livello molto base, per impostare la finestra del video della videocamera
video, aggiorna l'
viewport
attributo del tratto CameraAvStreamManagementTrait con un ViewportStruct, utilizzando
la funzione integrata setViewport.
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
}
}
}
Generare un TransportOptionsStruct
Alcune impostazioni richiedono modifiche alle proprietà di un TransportOptionsStruct, che viene poi passato alle opzioni di trasporto di una connessione di streaming. Per Swift, questa struttura deve essere generata prima di aggiornare qualsiasi proprietà.
Utilizza questa funzione helper per generare la struttura da utilizzare con le seguenti modifiche delle impostazioni:
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
}
Regolare la sensibilità di riattivazione del dispositivo
La sensibilità di riattivazione del dispositivo viene utilizzata per risparmiare batteria riducendo l'intervallo in cui il dispositivo può rilevare l'attività e aumentando il tempo di riattivazione dopo aver rilevato l'attività.
Nelle API Home, questa impostazione può essere configurata utilizzando la proprietà motionSensitivity di triggerOptions in transportOptions del dispositivo. Queste opzioni sono definite all'interno del tratto PushAvStreamTransportTrait per ogni dispositivo.
La sensibilità riattivazione può essere impostata solo sui seguenti valori:
- 1 = Bassa
- 5 = Media
- 10 = Alta
La procedura di aggiornamento consiste nel trovare la configurazione di trasporto per gli stream di registrazione attivi
utilizzando il
findTransport
comando, quindi modificare la configurazione con il nuovo valore di sensibilità utilizzando il
modifyPushTransport
comando.
Il comando modifyPushTransport richiede il passaggio dell'intero TransportOptionsStruct, quindi devi prima copiare i valori esistenti dalla configurazione attuale. Per una funzione
helper, consulta Generare un 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
}
}
Regolare la durata massima degli eventi
La durata massima degli eventi è la durata della registrazione di un clip per un evento da parte della videocamera. Tramite le API Home, questa impostazione può essere configurata, per ogni dispositivo, con le stesse durate dell'Google Home app (GHA), a intervalli di secondi:
- 10 secondi
- 15 secondi
- 30 secondi
- 60 secondi (1 minuto)
- 120 secondi (2 minuti)
- 180 secondi (3 minuti)
Nelle API Home, questa impostazione può essere configurata utilizzando la proprietà motionTimeControl di triggerOptions in transportOptions del dispositivo. Queste opzioni sono definite all'interno del tratto PushAvStreamTransportTrait per ogni dispositivo.
La procedura di aggiornamento consiste nel trovare la configurazione di trasporto per gli stream di registrazione attivi
utilizzando il
findTransport
comando, quindi modificare la configurazione con il nuovo valore di durata dell'evento utilizzando il
modifyPushTransport
comando.
Il comando modifyPushTransport richiede il passaggio dell'intero TransportOptionsStruct, quindi devi prima copiare i valori esistenti dalla configurazione attuale. Per una funzione
helper, consulta Generare un 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
}
}
Attivare o disattivare Analytics
Ogni dispositivo può attivare individualmente l'invio di dati di analisi dettagliati al cloud Google Home (vedi Cloud Monitoring per le API Home).
Per attivare Analytics per un dispositivo, imposta la
analyticsEnabled)
proprietà di
ExtendedGeneralDiagnosticsTrait
su true. Quando imposti analyticsEnabled, un'altra proprietà, logUploadEnabled, viene impostata automaticamente su true, il che consente di caricare i file di log di analisi nel cloud Google Home.
// Enable analytics
_ = try await extendedGeneralDiagnosticsTrait.update {
$0.setAnalyticsEnabled(true)
}
// Disable analytics
_ = try await extendedGeneralDiagnosticsTrait.update {
$0.setAnalyticsEnabled(false)
}