Der Gerätetyp „Türklingel“ wird mit zwei Attributen implementiert:
PushAvStreamTransportTrait,
das den Transport von Audio- und Videostreams über Push-basierte Protokolle übernimmt, und
WebRtcLiveViewTrait,
das die Möglichkeit bietet, Livestreams und Gegensprechen zu steuern.
Prüfen Sie immer, ob ein Gerät Attribute und Befehle unterstützt, bevor Sie Funktionen verwenden oder versuchen, Attribute zu aktualisieren. Weitere Informationen finden Sie unter Geräte aufiOSsteuern.
| Gerätetyp für Home-APIs | Merkmale | Swift-Beispiel-App | Anwendungsfall |
|---|---|---|---|
|
Türklingel
Ein Gerät, das durch einen Knopf außerhalb einer Tür betätigt wird und ein akustisches und/oder visuelles Signal erzeugt. Dadurch soll die Aufmerksamkeit einer Person erregt werden, die sich auf der anderen Seite der Tür befindet. Türklingeln können zugängliche Livestreams, Zweiwege-Audio oder Erkennungsereignisse bieten. |
Erforderliche Attribute google PushAvStreamTransportTrait google WebRtcLiveViewTrait |
Türklingel |
Grundlegende Informationen zu einem Gerät abrufen
Das Attribut BasicInformation enthält Informationen wie den Namen des Anbieters, die Anbieter-ID, die Produkt-ID, den Produktnamen (einschließlich Modellinformationen) und die Softwareversion eines Geräts:
// [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! // [END get_device_information]
Seriennummer abrufen
Verwenden Sie den Befehl GetSerialNumber des Traits ExtendedBasicInformation, um die Seriennummer des Geräts abzurufen.
Im Beispiel wird die Seriennummer in einer Variablen mit dem Namen serialNumber gespeichert:
// Assuming extendedBasicInformationTrait: Google.ExtendedBasicInformationTrait let response = try await extendedBasicInformationTrait.getSerialNumber() let serialNumber = response.serialNumber
Kurzantworten
Mit der Funktion „Kurzantworten“ kann der Nutzer eine vordefinierte Nachricht an ein Türklingelgerät senden.
Diese Funktion ist nur auf Türklingeln verfügbar. Die Liste der vordefinierten Nachrichten ist für die Partner-App verfügbar. Sie kann sie dem Nutzer zur Auswahl präsentieren. Vordefinierte Nachrichten können nicht vom Nutzer bearbeitet werden.
Kurzantworten werden über das Merkmal PresetMessage implementiert.
Eine voreingestellte Nachricht abspielen
Wenn Sie eine voreingestellte Nachricht abspielen möchten, rufen Sie die Methode playPresetMessage auf und übergeben Sie einen der Stringwerte aus der Eigenschaft availablePhraseTypes.
import GoogleHomeSDK
import GoogleHomeTypes
func playDoorbellPresetMessage(device: HomeDevice, phraseTypeString: String) async {
// 1. Retrieve the GoogleDoorbellDeviceType helper on the device
guard let doorbellDeviceType = await device.types.get(GoogleDoorbellDeviceType.self) else {
print("This device is not a Google Doorbell or is currently uninitialized.")
return
}
// 2. Extract the Google.PresetMessageTrait
guard let presetMessageTrait = doorbellDeviceType.traits[Google.PresetMessageTrait.self] else {
print("PresetMessageTrait is not supported on this device.")
return
}
// 3. (Optional) Check available phrase types supported by the device
if let availablePhrases = presetMessageTrait.attributes.availablePhraseTypes {
let phraseTypeNames = availablePhrases.map { $0.phraseType }
print("Supported quick response phrases: \(phraseTypeNames)")
}
// 4. Send the playPresetMessage command asynchronously
do {
try await presetMessageTrait.playPresetMessage(phraseType: phraseTypeString)
print("Preset message successfully requested.")
} catch {
print("SDK error occurred playing preset message: \(error)")
}
}
Gesprochene Sprache festlegen
Gesprochene Sprache festlegen
Mit der Methode setActiveLocale des Traits LocalizationConfiguration kannst du die aktive gesprochene Sprache eines Geräts auf ein bestimmtes Gebietsschema (z. B. „en_US“) festlegen.
// Setting the active language // Assuming localizationConfigurationTrait: Matter.LocalizationConfigurationTrait let selectedLocale = "en_US" try await localizationConfigurationTrait.update { $0.setActiveLocale(selectedLocale) }
Letzten Zeitpunkt des Cloud-Kontakts des Geräts abrufen
Verwende das Attribut lastContactTimestamp des Traits ExtendedGeneralDiagnostics, um den letzten Zeitpunkt zu ermitteln, zu dem das Gerät Kontakt mit der Cloud hatte:
if let lastContactTimeStamp = extendedGeneralDiagnosticsTrait.attributes.lastContactTimestamp { self.lastContactTime = Date(timeIntervalSince1970: Double(lastConnectedTimeStamp)) }
Einstellungen für die Art der Kamerabefestigung
Das Merkmal Mount enthält Einstellungen für die Kameramontage und Statusinformationen. Sie können Attribute wie den Bereitstellungsstatus, den Erkennungstyp und den Namen des Bereitstellungstyps lesen.
Außerdem können Sie mit dem Trait Mount die Standardkonfiguration für den Montagetyp überschreiben.
// 1. Get the Mount trait guard let mountTrait = deviceType.traits[Google.MountTrait.self] else { print("Mount trait not supported or configured on this device.") return } // 2. Read the current mount state, detection type, and type name let mountState = mountTrait.attributes.mountState // Type: Google.MountTrait.MountStateEnum? let mountDetectionType = mountTrait.attributes.mountDetectionType // Type: Google.MountTrait.MountDetectionTypeEnum? let mountTypeName = mountTrait.attributes.mountTypeName // Type: String? // 3. Update the mount type override try await mountTrait.update { mutableTrait in mutableTrait.setMountTypeOverride(.official) }
Verbindung eines Geräts prüfen
Die Verbindung für ein Gerät wird tatsächlich auf der Ebene des Gerätetyps geprüft, da einige Geräte mehrere Gerätetypen unterstützen. Der zurückgegebene Status ist eine Kombination der Verbindungsstatus für alle Merkmale auf diesem Gerät.
let lightConnectivity = dimmableLightDeviceType.metadata.sourceConnectivity .connectivityState
Der Status partiallyOnline kann bei gemischten Gerätetypen auftreten, wenn keine Internetverbindung besteht. Matter-Standardmerkmale sind aufgrund des lokalen Routings möglicherweise weiterhin online, cloudbasierte Merkmale jedoch nicht.
IP-Adresse des Geräts abrufen
Verwenden Sie das Attribut networkInterfaces von GeneralDiagnosticsTrait, um die IP-Adresse des Geräts zu ermitteln.
Die Adressen werden als Data-Objekte zurückgegeben, die Sie mit dem Network-Framework in standardmäßige IPv4- oder IPv6-Strings formatieren können:
func getIpAddresses(trait: Matter.GeneralDiagnosticsTrait) -> [String] {
let interfaces = trait.attributes.networkInterfaces ?? []
var ipAddresses: [String] = []
for interface in interfaces {
for data in interface.iPv4Addresses {
if let ipv4 = IPv4Address(data) {
ipAddresses.append(String(describing: ipv4))
}
}
for data in interface.iPv6Addresses {
if let ipv6 = IPv6Address(data) {
ipAddresses.append(String(describing: ipv6))
}
}
}
return ipAddresses
}
Livestream starten
Wenn Sie einen Livestream starten möchten, senden Sie den SDP-String (Session Description Protocol) an die Methode startLiveView(offerSdp:) des Traits WebRtcLiveViewTrait. Diese Methode gibt drei Werte zurück:
- Das SDP für die Sitzung.
- Die Sitzungsdauer in Sekunden.
- Die Sitzungs-ID, die zum Verlängern oder Beenden der Sitzung verwendet werden kann.
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
}
}
Livestream verlängern
Livestreams haben eine voreingestellte Dauer, nach der sie ablaufen. Wenn Sie die Dauer eines aktiven Streams verlängern möchten, senden Sie eine Verlängerungsanfrage mit der Methode 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
}
}
TalkBack starten und beenden
Rufen Sie die Methode startTalkback(mediaSessionId:optionalArgsProvider:) des Traits WebRtcLiveViewTrait auf, um Talkback zu starten.
Verwenden Sie stopTalkback(mediaSessionId:), um die Aufnahme zu beenden.
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)")
}
}
Livestream verwalten
Das Anpassen der Livestream-Qualität ist nützlich, um die Bandbreitennutzung basierend auf dem Wiedergabekontext des Clients zu optimieren. So kann beispielsweise zu einer niedrigeren Auflösung gewechselt werden, wenn eine kleinere Vorschaukachel, die Rasteransicht oder der Bild-im-Bild-Modus angezeigt wird.
Wenn Sie die Qualität dynamisch ändern möchten, verwenden Sie das Attribut WebRtcLiveView. Damit wird die Auflösung der aktiven Livestreamsitzung auf einem bestimmten Client verwaltet. Das ist nicht dasselbe wie die Konfiguration einer geräteweiten Bandbreiteneinstellung direkt auf dem Gerät, die sich auf alle gleichzeitigen Zuschauer und die Qualität der in der Cloud gespeicherten Videoaufzeichnungen auswirkt.
Das folgende Beispiel zeigt, wie du die Livestreamqualität für ein Gerät abrufst und aktualisierst:
Unterstützte Qualitätsoptionen abrufen: Ruft die verfügbaren Streamingauflösungen ab, die vom Gerät unterstützt werden. Der Code fragt das
WebRtcLiveView-Trait ab, um die unterstützten Streamqualitäten als Liste vonQualityHint-Werten (z. B..sd,.hd,.fhd,.qhdoder.uhd) mithilfe dersupportedQualityHints-Eigenschaft verfügbar zu machen.Livestream-Qualität ändern: Wenden Sie eine ausgewählte
QualityHintan, um die Streamingauflösung des aktiven Livestreams zu ändern, z. B. von Standard Definition zu High Definition. Die FunktionupdateQualityHintverwendet die MethodechangeLiveViewQualitydes TraitsWebRtcLiveView, um die ausgewählteQualityHint-Konfiguration auf die aktive Mediensitzung anzuwenden.
public var supportedQualityHints: [Google.WebRtcLiveViewTrait.QualityHint] { return liveViewTrait?.attributes.supportedQualityHints ?? [] } public func updateQualityHint( liveViewTrait: Google.WebRtcLiveViewTrait, hint: Google.WebRtcLiveViewTrait.QualityHint, mediaSessionId: String ) async { do { _ = try await liveViewTrait.changeLiveViewQuality( mediaSessionId: mediaSessionId, qualityHint: hint ) } catch { // error } }
Aufzeichnungsfunktion aktivieren und deaktivieren
Um die Aufnahmefunktion der Kamera zu aktivieren, übergeben Sie TransportStatusEnum.Active an die Methode setTransportStatus(transportStatus:optionalArgsProvider:) des Traits PushAvStreamTransportTrait. Wenn Sie die Aufnahmefunktion deaktivieren möchten, übergeben Sie sie TransportStatusEnum.Inactive.
Im folgenden Beispiel fassen wir diese Aufrufe in einem einzigen Aufruf zusammen, der ein Boolean verwendet, um die Aufnahmefunktion zu aktivieren oder zu deaktivieren:
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
}
}
}
Das Aktivieren oder Deaktivieren der Aufnahmefunktion der Kamera entspricht dem Ein- oder Ausschalten des Kameravideos. Wenn das Video einer Kamera aktiviert ist, wird es für Ereignisse und zugehörige Clips aufgezeichnet.
Wenn die Aufzeichnungsfunktion deaktiviert ist (das Kameravideo ist deaktiviert):
- Die Kamera kann gemäß dem
connectivityStatedes Gerätetyps weiterhin als online angezeigt werden. - Auf den Livestream kann nicht zugegriffen werden und die Kamera erkennt keine Cloud-Ereignisse.
Prüfen, ob die Aufnahmefunktion aktiviert ist
Wenn Sie prüfen möchten, ob die Aufnahmefunktion einer Kamera aktiviert ist, sehen Sie nach, ob Verbindungen aktiv sind. Im folgenden Beispiel werden zwei Funktionen definiert, um dies zu tun:
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
}
Akkueinstellungen
Über die Home-APIs können verschiedene Akku-Einstellungen gesteuert werden.
Einstellung für die Akkunutzung festlegen
Mit der Einstellung für die Energiebilanz können Sie den Kompromiss zwischen Akkulaufzeit und Leistung für ein Gerät konfigurieren. Sie können verschiedene Akkuprofile erstellen, z. B. „Erweitert“, „Ausgewogen“ und „Leistung“, und zwischen ihnen wechseln.
Diese Funktion wird durch Aktualisieren des Attributs currentEnergyBalance des Traits EnergyPreference implementiert. Das Attribut akzeptiert einen Ganzzahlindex, der einem bestimmten Profil in der Liste energyBalances des Geräts entspricht (z. B. 0 für EXTENDED, 1 für BALANCED und 2 für PERFORMANCE).
Ein null-Wert für currentEnergyBalance gibt an, dass das Gerät ein benutzerdefiniertes Profil verwendet. Dies ist ein schreibgeschützter Status.
Im Folgenden sehen Sie ein Beispiel für eine Struktur, die vom Attribut currentEnergyBalance verwendet wird, gefolgt vom tatsächlichen Code-Snippet, in dem das Attribut verwendet wird.
// 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) } }
Automatischen Energiesparmodus aktivieren
Aktualisieren Sie das Attribut currentLowPowerModeSensitivity des Traits EnergyPreference, um diese Funktion zu konfigurieren. Für dieses Attribut wird ein Index verwendet, um eine Vertraulichkeitsstufe auszuwählen. Dabei steht 0 in der Regel für Disabled und 1 für Enabled oder Automatic.
private func setAutoBatterySaver(to value: Bool) async throws { _ = try await energyPreferenceTrait.update { $0.setCurrentLowPowerModeSensitivity(value ? 1 : 0) } }
Akkuladestatus abrufen
Verwenden Sie das Attribut batChargeState des Trait PowerSource, um den aktuellen Ladestatus des Geräts abzurufen (wird geladen, vollständig geladen oder wird nicht geladen).
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" }
Akkustand abrufen
Verwende das Attribut batChargeLevel des Trait PowerSource, um den aktuellen Akkuladestand abzurufen. Der Wert ist entweder OK, Warning (niedrig) oder 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" }
Stromquelle
Verwende die Attribute BatPresent und wiredPresent des Traits PowerSource, um die Stromquelle des Geräts zu ermitteln.
if powerSourceTrait.attributes.wiredPresent ?? false { self.powerSourceType = .wired } else if powerSourceTrait.attributes.batPresent ?? false { self.powerSourceType = .battery } else { self.powerSourceType = nil }
Audioeinstellungen
Über die Home-APIs lassen sich verschiedene Audioeinstellungen steuern.
Mikrofon ein- und ausschalten
Aktualisieren Sie das Attribut microphoneMuted des Traits CameraAvStreamManagementTrait mit der integrierten Funktion setMicrophoneMuted, um das Mikrofon des Geräts zu aktivieren oder zu deaktivieren:
// Turn the device's microphone on or off
func setMicrophone(on: Bool) async {
do {
_ = try await self.cameraAvStreamManagementTrait?.update {
$0.setMicrophoneMuted(!on)
}
} catch {
// Error
}
}
Audioaufnahme ein- oder ausschalten
Wenn Sie die Audioaufnahme für das Gerät aktivieren oder deaktivieren möchten, aktualisieren Sie das Attribut recordingMicrophoneMuted des Traits CameraAvStreamManagementTrait mit der integrierten Funktion setRecordingMicrophoneMuted:
// 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
}
}
Lautsprecherlautstärke anpassen
Wenn Sie die Lautstärke des Lautsprechers für das Gerät anpassen möchten, aktualisieren Sie das Attribut speakerVolumeLevel des Traits CameraAvStreamManagementTrait mit der integrierten Funktion setSpeakerVolumeLevel:
// Adjust the camera speaker volume
func setSpeakerVolume(to value: UInt8) async {
do {
_ = try await cameraAvStreamManagementTrait.update {
$0.setSpeakerVolumeLevel(value)
}
} catch {
// Error
}
}
Einstellungen für Alarmbereiche
Das Attribut ZoneManagement bietet eine Schnittstelle zum Verwalten benutzerdefinierter Bereiche (Alarmbereiche) auf Kamera- und Türklingelgeräten.
Mit diesen Zonen kann die Ereigniserkennung (z. B. Bewegung von Personen oder Fahrzeugen) auf bestimmte Bereiche im Sichtfeld des Geräts gefiltert werden.
Alarmbereiche werden vom Nutzer in einer Partneranwendung konfiguriert. Er kann Bereiche im Sichtfeld der Kamera markieren. Diese benutzerdefinierten Zonen werden dann in die von diesem Merkmal verwendeten Strukturen übersetzt. Weitere Informationen zur Funktionsweise von Alarmbereichen findest du unter Alarmbereiche einrichten und verwenden.
Alarmbereiche werden in der Regel mit 2D-kartesischen Koordinaten definiert.
Das Merkmal stellt die TwoDCartesianVertexStruct für Eckpunkte und die TwoDCartesianZoneStruct für die Zonendefinition (Name, Eckpunkte, Farbe und Verwendung) bereit.
Alarmbereiche prüfen
Wenn Sie Alarmbereiche anzeigen möchten, prüfen Sie das Attribut zones des Traits ZoneManagement.
let zoneManagementTrait: Google.ZoneManagementTrait self.zones = zoneManagementTrait.attributes.zones ?? []
Alarmbereich hinzufügen
Verwenden Sie zum Erstellen einer neuen Zone den Befehl createTwoDCartesianZone. Dieser Befehl verwendet ein TwoDCartesianZoneStruct, das den Namen, die Eckpunkte, die Farbe und die Verwendung der Zone definiert.
Im folgenden Beispiel wird eine Zone mit dem Namen „Veranda“ mit vier Eckpunkten erstellt, die lachsfarben (#F439A0) ist und für die Bewegungserkennung verwendet wird.
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 } }
Alarmbereich aktualisieren
Verwenden Sie den Befehl updateTwoDCartesianZone, um eine vorhandene Zone zu aktualisieren. Für diesen Befehl sind die Berechtigung zoneId und die aktualisierte TwoDCartesianZoneStruct erforderlich.
let zoneManagementTrait: Google.ZoneManagementTrait let zoneID: UInt16 let zone: Google.ZoneManagementTrait.TwoDCartesianZoneStruct do { _ = try await zoneManagementTrait.updateTwoDCartesianZone( zoneID: zoneID, zone: zone) } catch { // Error }
Alarmbereich löschen
Verwenden Sie zum Entfernen einer Zone den Befehl removeZone mit dem entsprechenden zoneId.
let zoneManagementTrait: Google.ZoneManagementTrait let zoneID: UInt16 do { _ = try await zoneManagementTrait.removeZone(zoneID: zoneID) } catch { // Error }
Trigger für Geräuschereignisse
Das AvStreamAnalysis-Trait bietet eine Schnittstelle zum Verwalten von Triggern für die Ereigniserkennung auf Kamera- und Türklingelgeräten. Bildbasierte Trigger (z. B. Personen oder Fahrzeuge) können zonenbezogen sein, während tonbezogene Trigger in der Regel auf Geräteebene konfiguriert werden.
Für die Geräuscherkennung mit dem EventTriggerTypeEnum sind die folgenden Triggertypen verfügbar:
| Modus | Enum-Wert | Beschreibung |
|---|---|---|
| Ton | Sound |
Allgemeine Geräuscherkennung. |
| Sprechende Person | PersonTalking |
Erkennt Sprache. |
| Hundegebell | DogBark |
Erkennt Hundegebell. |
| Zerbrechendes Glas | GlassBreak |
Erkennt das Geräusch von zerbrechendem Glas. |
| Rauchalarm | SmokeAlarm |
Erkennt Rauchmelder, die oft am T3-Signal (drei kurze Pieptöne gefolgt von einer Pause) zu erkennen sind. |
| Kohlenmonoxidalarm | CoAlarm |
Erkennt Kohlenmonoxid-Alarme (CO-Alarme), die in der Regel am T4-Signal erkannt werden (vier kurze Signaltöne, gefolgt von einer Pause). |
Status der Geräuscherkennung prüfen
Um dem Nutzer den aktuellen Status der Geräuscherkennung anzuzeigen, müssen Sie prüfen, was das Gerät unterstützt und was von der Gerätehardware aktiviert wird. Die beiden Attribute, die Sie prüfen sollten, sind:
In der iOS-Entwicklung greifen Sie in der Regel über das Gerät auf das AvStreamAnalysis-Merkmal zu, um diese Attribute zu lesen.
// 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) ) ) }
Aktivierte Trigger aktualisieren
Verwenden Sie den Befehl SetOrUpdateEventDetectionTriggers, um die Gruppe der aktivierten Trigger zu aktualisieren. Er akzeptiert eine Liste von EventTriggerEnablement-Strukturen.
// 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 )
Aufnahmemodi
Das RecordingMode-Trait bietet eine Schnittstelle zum Verwalten des Verhaltens bei der Video- und Bildaufzeichnung auf Kamera- und Türklingelgeräten. Nutzer können zwischen der Videoaufzeichnung rund um die Uhr, dem ereignisbasierten Videoverlauf oder der vollständigen Deaktivierung der Aufzeichnung (nur Live-Ansicht) wählen.
Der Enum-Wert RecordingModeEnum definiert die verfügbaren Aufzeichnungsstrategien:
| Modus | Enum-Wert | Beschreibung |
|---|---|---|
| Deaktiviert | Disabled |
Die Aufzeichnung ist vollständig deaktiviert. Wird hauptsächlich von älteren Geräten verwendet. |
| CVR (Videoaufzeichnung rund um die Uhr) | Cvr |
Videos werden rund um die Uhr aufgezeichnet. Abo erforderlich (z. B. Google Home Premium). |
| EBR (Event Based Recording, ereignisbasierter Videoverlauf) | Ebr |
Die Aufzeichnung wird durch Ereignisse (Person, Bewegung) ausgelöst. Die Videolänge hängt von der Dauer des Ereignisses und dem Abo ab. |
| ETR (Event Triggered Recording, ereignisbasierte Aufzeichnung) | Etr |
Kurze Vorschauaufnahmen (z. B. 10 Sekunden), die durch Ereignisse ausgelöst werden. |
| Live View | LiveView |
Die Aufzeichnung ist deaktiviert, Nutzer können aber weiterhin auf den Livestream zugreifen. |
| Standbilder | Images |
Bei Ereignissen werden Momentaufnahmen anstelle von Videos aufgezeichnet. |
Aufnahmemodi prüfen
So rufen Sie die aktuelle Aufzeichnungskonfiguration auf:RecordingMode
supportedRecordingModes– Alle potenziellen ModiavailableRecordingModes– Auswählbare ModiselectedRecordingMode: Der Aktivmodus
// 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, ) ) } }
Aufnahmemodus ändern
Prüfen Sie vor dem Aktualisieren, ob der ausgewählte Index aus dem Attribut supportedRecordingModes im Attribut availableRecordingModes vorhanden ist.
Verwenden Sie die Funktion setSelectedRecordingMode, um den ausgewählten Modus zu aktualisieren. Übergeben Sie dazu den Index des ausgewählten Modus:
let recordingModeTrait: Google.RecordingModeTrait let recordingModeID: UInt8 _ = try await recordingModeTrait.update { $0.setSelectedRecordingMode(recordingModeID) }
Weitere Einstellungen
Über die Home-APIs lassen sich verschiedene andere Einstellungen steuern.
Nachtsichtmodus aktivieren oder deaktivieren
Wenn Sie die Nachtsicht für die Kamera aktivieren oder deaktivieren möchten, verwenden Sie TriStateAutoEnum, um das Attribut nightVision des Traits CameraAvStreamManagementTrait mit der integrierten Funktion setNightVision zu aktualisieren:
// Turn night vision on or off
func setNightVision(
to value: Google.CameraAvStreamManagementTrait.TriStateAutoEnum
) async {
do {
_ = try await cameraAvStreamManagementTrait.update {
$0.setNightVision(value)
}
} catch {
// Error
}
}
Helligkeit der Status-LED ändern
Wenn Sie die Helligkeit der Status-LED ändern möchten, verwenden Sie ThreeLevelAutoEnum, um das Attribut statusLightBrightness des Traits CameraAvStreamManagementTrait mit der integrierten Funktion setStatusLightBrightness zu aktualisieren:
// Set the LED brightness
func setStatusLightBrightness(
to value: Google.CameraAvStreamManagementTrait.ThreeLevelAutoEnum
) async {
do {
_ = try await cameraAvStreamManagementTrait.update {
$0.setStatusLightBrightness(value)
}
} catch {
// Error
}
}
Kamera-Darstellungsbereich ändern
Der Kamera-Viewport entspricht der Funktion „Zoomen und zuschneiden“, die im Hilfeartikel zum Zoomen und Optimieren von Nest-Kameravideos beschrieben wird.
Der Viewport wird in einem ViewportStruct definiert, das vier Werte enthält, die als Koordinaten des Viewports verwendet werden. Die Koordinaten sind so definiert:
(x1,y1) -- (x2,y1) | | (x1,y2) -- (x2,y2)
Die Werte für ViewportStruct hängen von der Benutzeroberfläche und der Kameraimplementierung einer App ab. Um den Viewport des Kameravideos festzulegen, müssen Sie das Attribut viewport des Traits CameraAvStreamManagementTrait mit einem ViewportStruct aktualisieren. Verwenden Sie dazu die integrierte Funktion 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
}
}
}
TransportOptionsStruct generieren
Für einige Einstellungen müssen Eigenschaften in einem TransportOptionsStruct geändert werden, das dann an die Transportoptionen einer Streamingverbindung übergeben wird. In Swift muss diese Struktur generiert werden, bevor Eigenschaften aktualisiert werden.
Verwenden Sie diese Hilfsfunktion, um die Struktur für die folgenden Einstellungsänderungen zu generieren:
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
}
Analyse aktivieren oder deaktivieren
Jedes Gerät kann einzeln zustimmen, detaillierte Analysedaten an die Google Home-Cloud zu senden (siehe Cloud Monitoring for Home APIs).
Wenn Sie die Analyse für ein Gerät aktivieren möchten, legen Sie die Eigenschaft analyticsEnabled) des ExtendedGeneralDiagnosticsTrait auf true fest. Wenn Sie analyticsEnabled festlegen, wird automatisch eine andere Property, logUploadEnabled, auf true gesetzt. Dadurch können die Analyselogdateien in die Google Home-Cloud hochgeladen werden.
// Enable analytics
_ = try await extendedGeneralDiagnosticsTrait.update {
$0.setAnalyticsEnabled(true)
}
// Disable analytics
_ = try await extendedGeneralDiagnosticsTrait.update {
$0.setAnalyticsEnabled(false)
}
Transport- und Aufzeichnungskonfigurationen
In diesem Abschnitt werden Einstellungen für die Streamingqualität der Kamera und die Ereignisauslösung behandelt. Diese Einstellungen werden über das Trait PushAvStreamTransport verwaltet.
Transporteinstellungen lesen
In diesem Abschnitt wird gezeigt, wie Sie die aktuelle Konfiguration eines Kamera- oder Türklingelgeräts abrufen. Es ruft das PushAvStreamTransport-Merkmal ab, sucht nach der für die Aufzeichnung verwendeten Verbindung und extrahiert dann die aktuellen Werte für Bandbreitenqualität, Empfindlichkeit für die Beendigung des Ruhemodus und maximale Ereignislänge.
// Assuming access to // var pushAvStreamTransportTrait: Google.PushAvStreamTransportTrait let connections = try await pushAvStreamTransportTrait.findTransport().transportConfigurations // Locate the connection designated for recording let recordingConnection = connections.first { connection in guard let transportOptions = connection.transportOptions else { return false } return transportOptions.streamUsage == .recording } let options = recordingConnection?.transportOptions // 1. Bandwidth Quality (Video Stream ID) let videoStreamId = options?.videoStreamID // 2. Wake-up Sensitivity (Motion Sensitivity) let wakeUpSensitivity = options?.triggerOptions.motionSensitivity // 3. Max Event Length (Motion Trigger Time Control) let maxEventLength = options?.triggerOptions.motionTimeControl?.maxDuration
Transporteinstellungen aktualisieren
In diesem Abschnitt wird beschrieben, wie Sie die Transporteinstellungen ändern.
Dabei wird ein neues TransportOptionsStruct mit den neuen Werten erstellt und dann mit dem Befehl modifyPushTransport an das Gerät gesendet. Die aktualisierten Einstellungen werden auf die im vorherigen Schritt gefundene Aufzeichnungsverbindung angewendet.
Verwenden Sie zum Ändern dieser Einstellungen den Befehl modifyPushTransport mit einem TransportOptionsStruct.
// Example: Updating to Max Quality and 30s duration let currentOptions = recordingConnection!.transportOptions! let newOptions = Google.PushAvStreamTransportTrait.TransportOptionsStruct( streamUsage: .recording, videoStreamID: 2, // Max Quality tlsEndpointID: currentOptions.tlsEndpointID, url: currentOptions.url, triggerOptions: Google.PushAvStreamTransportTrait.TransportTriggerOptionsStruct( triggerType: .motion, motionSensitivity: 5, // Medium motionTimeControl: Google.PushAvStreamTransportTrait.TransportMotionTriggerTimeControlStruct( initialDuration: currentOptions.triggerOptions.motionTimeControl?.initialDuration ?? 10, augmentationDuration: currentOptions.triggerOptions.motionTimeControl?.augmentationDuration ?? 5, maxDuration: 30, blindDuration: currentOptions.triggerOptions.motionTimeControl?.blindDuration ?? 0 ) ), ingestMethod: currentOptions.ingestMethod, containerOptions: currentOptions.containerOptions ) try await pushAvStreamTransportTrait.modifyPushTransport( connectionID: recordingConnection!.connectionID, transportOptions: newOptions )
Bandbreitenqualität ermitteln
Die Eigenschaft videoStreamId des TransportOptionsStruct entspricht einer bestimmten Videostreamkonfiguration.
Die unterstützten Videostreams finden Sie im Attribut allocatedVideoStreams, das eine Liste von VideoStreamStructs ist.
aus dem CameraAvStreamManagement-Trait für das Gerät.
Empfindlichkeit für die Beendigung des Ruhemodus anpassen
Das Attribut motionSensitivity des TransportTriggerOptionsStruct entspricht den folgenden Werten:
| Label | Wert (UInt8) |
|---|---|
| Niedrig | 1 |
| Mittel | 5 |
| Hoch | 10 |
Maximale Ereignisdauer anpassen
Die maxDuration-Property von TransportMotionTriggerTimeControlStruct entspricht den folgenden UInt32-Zeiträumen (in Sekunden):
- 10, 15, 30, 60, 120, 180
Glockeneinstellungen
Über die Home-APIs lassen sich verschiedene Einstellungen für den Glockenton der Türklingel steuern.
Glockenton ändern
Wenn Sie den Klingelton der Türklingel ändern möchten, rufen Sie zuerst die Liste der Klingeltöne ab, die auf dem Gerät installiert sind. Verwenden Sie dazu das Attribut installedChimeSounds des Traits ChimeTrait:
doorbellChimeTrait.attributes.installedChimeSounds?.compactMap { chimeSound in
return chimeSound.chimeID, chimeSound.name
}
Aktualisieren Sie dann das Attribut selectedChime des Traits ChimeTrait mit der integrierten Funktion setSelectedChime:
func setDoorbellChime(chimeID: UInt8) async {
do {
_ = try await doorbellChimeTrait.update {
$0.setSelectedChime(chimeID)
}
} catch {
// Error
}
}
Externe Glocke verwenden
Die Türklingel kann so konfiguriert werden, dass sie eine externe Glocke verwendet, z. B. eine mechanische Glocke im Haus. Dies sollte bei der Installation der Türklingel konfiguriert werden, um potenzielle Schäden am externen Gong zu vermeiden.
Um anzugeben, welcher Typ von externem Gong installiert ist, verwenden Sie ExternalChimeType, um das Attribut externalChime des ChimeTrait-Traits mit der integrierten Funktion setExternalChime zu aktualisieren:
// Indicate the external chime is mechanical
func setExternalChime(to value: Google.ChimeTrait.ExternalChimeType) async {
do {
_ = try await doorbellChimeTrait.update {
$0.setExternalChime(value)
}
} catch {
// Error
}
}
Dauer des externen Glockentons ändern
Die Dauer, in Sekunden, die ein externer Gong klingelt, kann über die Home-APIs konfiguriert werden. Wenn die externe Glocke eine Dauer für den Glockenton unterstützt, kann der Nutzer diese konfigurieren.
Der hier festgelegte Wert hängt von den Spezifikationen des externen Gonges und der empfohlenen Gongdauer ab.
Wenn Sie die Dauer des externen Glockentons ändern möchten, aktualisieren Sie das Attribut externalChimeDurationSeconds des Traits ChimeTrait mit der integrierten Funktion setExternalChimeDurationSeconds:
// Change the external chime duration
func setExternalChimeDuration(to value: UInt16) async {
do {
_ = try await doorbellChimeTrait.update {
$0.setExternalChimeDuration(value)
}
} catch {
// Error
}
}
Klingelton-Design aktivieren
Einige Türklingeln haben möglicherweise Klingeltöne, die Nutzern nur für begrenzte Zeit zur Verfügung stehen. Das können beispielsweise Glockenspiele für Feiertage sein. Sie werden als Glockenspiel-Themen bezeichnet.
Wenn Sie sehen möchten, welche Klingelton-Designs für einen Nutzer verfügbar sind, erstellen Sie einen Timebox-Filter und verwenden Sie ihn, um die Ergebnisse des Befehls getAvailableThemes aus dem Merkmal ChimeThemes zu filtern. Daraufhin wird eine Liste der verfügbaren Designs mit den jeweiligen Namen zurückgegeben.
Im folgenden Beispiel wird gezeigt, wie die Liste gefiltert wird.
Ein Theme gilt als aktiv, wenn die aktuelle Zeit innerhalb des Start- und Endzeitpunkts liegt (die Werte startTimeSeconds bzw. endTimeSeconds). Wenn keine Startzeit festgelegt ist, gilt sie als von Anfang an aktiv. Wenn keine Endzeit festgelegt ist, bleibt sie auf unbestimmte Zeit aktiv. Wenn beide fehlen, ist das Design immer aktiv.
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)
}
}
}
Sobald Sie den Namen des gewünschten Designs haben, z. B. Christmas, können Sie es mit der Funktion setSelectedTimeboxedThemeName() für das ChimeThemes ChimeThemes-Attribut auswählen.
private func setChimeTheme(to value: String) async throws {
_ = try await chimeThemeTrait.update {
$0.setSelectedTimeboxedThemeName(value)
}
}
Einstellungen für Benachrichtigungen über Besucher
Sie können die Einstellungen für Benachrichtigungen über Besucher für Türklingeln mit dem VisitorAnnouncement-Trait der Home APIs abfragen und verwalten. Mit diesem Merkmal wird gesteuert, ob die Anwesenheit eines Besuchers auf Google-Smart-Lautsprechern oder ‑Displays angekündigt wird, wenn jemand an der Tür klingelt.
Das folgende Beispiel zeigt, wie Sie prüfen, ob Benachrichtigungen über Besucher aktiviert sind, und wie Sie diese Einstellung aktualisieren:
let visitorAnnouncementsEnabled: Bool = visitorAnnouncementTrait.attributes.visitorAnnouncementsEnabled let value: Bool _ = try await self.visitorAnnouncementTrait?.update { $0.setVisitorAnnouncementsEnabled(value) }