Typ urządzenia Camera jest implementowany za pomocą 2 cech:PushAvStreamTransport, która obsługuje transport strumieni audio i wideo za pomocą protokołów opartych na wysyłaniu, oraz WebRtcLiveView, która umożliwia sterowanie transmisjami na żywo i funkcją talkback.
Przed użyciem jakichkolwiek funkcji lub próbą zaktualizowania atrybutów zawsze sprawdzaj, czy urządzenie obsługuje atrybuty i polecenia. Więcej informacji znajdziesz w artykule Sterowanie urządzeniami na Android.
| Typ urządzenia interfejsów Home API | Cechy | Przykładowa aplikacja w Kotlinie | Przypadek użycia |
|---|---|---|---|
|
Aparat
Urządzenie, które robi zdjęcia lub nagrywa filmy. Kamery mogą mieć funkcje takie jak dostępne transmisje na żywo, rozmowa dwukierunkowa czy wykrywanie zdarzeń. |
Wymagane cechy google PushAvStreamTransport google WebRtcLiveView |
Aparat |
Uzyskiwanie podstawowych informacji o urządzeniu
Cechą BasicInformation
są informacje takie jak nazwa dostawcy, identyfikator dostawcy, identyfikator produktu,
nazwa produktu (zawiera informacje o modelu), wersja oprogramowania
i numer seryjny urządzenia:
// Get device basic information. All general information traits are on the RootNodeDevice type. device.type(RootNodeDevice).first().standardTraits.basicInformation?.let { basicInformation -> println("vendorName ${basicInformation.vendorName}") println("vendorId ${basicInformation.vendorId}") println("productId ${basicInformation.productId}") println("productName ${basicInformation.productName}") println("softwareVersion ${basicInformation.softwareVersion}") println("serialNumber ${basicInformation.serialNumber}") }
Pobieranie najnowszej godziny kontaktu urządzenia z chmurą
Aby znaleźć ostatni czas, w którym urządzenie miało kontakt z chmurą, użyj atrybutu lastContactTimestamp cechy ExtendedGeneralDiagnostics:
fun getLastContactTimeStamp(trait: ExtendedGeneralDiagnostics): java.time.Instant { val timestamp = trait.lastContactTimestamp return Instant.ofEpochSecond(timestamp.toLong()) }
Sprawdzanie połączenia urządzenia
Połączenie urządzenia jest sprawdzane na poziomie typu urządzenia, ponieważ niektóre urządzenia obsługują wiele typów. Zwracany stan jest kombinacją stanów łączności wszystkich cech na tym urządzeniu.
val lightConnectivity = dimmableLightDevice.metadata.sourceConnectivity.connectivityState
Stan PARTIALLY_ONLINE może wystąpić w przypadku różnych typów urządzeń, gdy nie ma połączenia z internetem.
Matter standardowe sygnały mogą być nadal online ze względu na lokalne przekierowywanie, ale sygnały oparte na chmurze będą offline.
Rozpoczynanie transmisji na żywo
Aby rozpocząć transmisję na żywo, wyślij ciąg znaków protokołu SDP do metody startLiveView() cechy WebRtcLiveView, która zwraca obiekt WebRtcLiveViewTrait.StartLiveViewCommand.Response zawierający 3 wartości:
- SDP sesji.
- Czas trwania sesji w sekundach.
- Identyfikator sesji, który może służyć do przedłużenia lub zakończenia sesji.
suspend fun getWebRtcLiveViewTrait(cameraDevice: HomeDevice) { return cameraDevice.type(GoogleCameraDevice).trait(WebRtcLiveView).first { it?.metadata?.sourceConnectivity?.connectivityState == ConnectivityState.ONLINE } } // Start the live view suspend fun startCameraStream(trait: WebRtcLiveView, offerSdp: String) { val response = trait.startLiveView(offerSdp) // Response contains three fields (see below) return response } ... // This is used to manage the WebRTC connection val peerConnection: RTCPeerConnection = ... ... val startResponse = startCameraStream(sdp) val answerSdp = startResponse?.answerSdp val sessionDuration = startResponse?.liveSessionDurationSeconds val mediaSessionId = startResponse?.mediaSessionId peerConnection.setRemoteDescription(SessionDescription.Type.ANSWER, answerSdp)
Przedłużanie transmisji na żywo
Transmisje na żywo mają z góry określony czas trwania, po którym wygasają. Aby wydłużyć czas trwania aktywnego strumienia, wyślij prośbę o przedłużenie za pomocą metody WebRtcLiveView.extendLiveView():
// Assuming camera stream has just been started suspend fun scheduleExtension(trait: WebRtcLiveView, mediaSessionId: String, liveSessionDurationSeconds: UShort ) { delay(liveSessionDurationSeconds - BUFFER_SECONDS * 1000) val response = trait.extendLiveView(mediaSessionId) // returns how long the session will be live for return response.liveSessionDurationSeconds }
Włączanie i wyłączanie TalkBack
Aby rozpocząć rozmowę, wywołaj metodę startTalkback()
cechy WebRtcLiveView
talkback. Aby zatrzymać, użyj stopTalkback().
// Make sure camera stream is on suspend fun setTalkback(isOn: Boolean, trait: WebRtcLiveView, mediaSessionId: String) { if(isOn) { trait.startTalkback(mediaSessionId) } else { trait.stopTalkback(mediaSessionId) } }
Włączanie i wyłączanie możliwości nagrywania
Aby włączyć funkcję nagrywania kamery, przekaż wartość
TransportStatusEnum.Active
do metody
PushAvStreamTransport
cechy
setTransportStatus(). Aby wyłączyć możliwość nagrywania, przekaż wartość
TransportStatusEnum.Inactive.
W poniższym przykładzie umieszczamy te wywołania w jednym wywołaniu, które używa Boolean, aby przełączać możliwość nagrywania:
// Start or stop recording for all connections. suspend fun setCameraRecording(trait: PushAvStreamTransport, isOn: Boolean) { if(isOn) { trait.setTransportStatus(TransportStatusEnum.Active) } else { trait.setTransportStatus(TransportStatusEnum.Inactive) } }
Włączenie lub wyłączenie nagrywania przez kamerę jest równoznaczne z włączeniem lub wyłączeniem wideo z kamery. Gdy wideo z kamery jest włączone, kamera nagrywa (na potrzeby zdarzeń i powiązanych klipów).
Gdy funkcja nagrywania jest wyłączona (wideo z kamery jest wyłączone):
- Kamera może nadal być widoczna jako online zgodnie z
connectivityStatetypu urządzenia. - Nie można uzyskać dostępu do transmisji na żywo, a kamera nie wykrywa żadnych zdarzeń w chmurze.
Sprawdzanie, czy funkcja nagrywania jest włączona
Aby sprawdzić, czy funkcja nagrywania kamery jest włączona, sprawdź, czy są aktywne jakiekolwiek połączenia. Poniższy przykład definiuje 2 funkcje, które to umożliwiają:
// Get the on/off state suspend fun onOffState(pushAvStreamTransport: PushAvStreamTransport) { return pushAvStreamTransport .currentConnections?.any { it.transportStatus == TransportStatusEnum.Active } ?: false } // Check if the camera's recording capability is enabled fun PushAvStreamTransport.recordModeActive(): Boolean { return currentConnections?.any { it.transportStatus == TransportStatusEnum.Active } ?: false }
Innym sposobem sprawdzenia jest użycie funkcji findTransport() z predykatem:
// Fetch the current connections suspend fun queryRecordModeState(trait: PushAvStreamTransport) { return trait.findTransport().let { it.transportConfigurations.any { it.transportStatus == TransportStatusEnum.Active } }
Ustawienia baterii
Różnymi ustawieniami baterii można sterować za pomocą interfejsów Home API.
Ustawianie preferencji wykorzystania baterii
Ustawienie bilansu energetycznego umożliwia skonfigurowanie kompromisu między czasem pracy baterii a wydajnością urządzenia. Możesz utworzyć różne profile baterii, np. „Wydłużony”, „Zrównoważony” i „Wydajność”, i przełączać się między nimi.
Ta funkcja jest wdrażana przez aktualizację atrybutu currentEnergyBalance cechy EnergyPreference. Atrybut przyjmuje liczbę całkowitą, która odpowiada konkretnemu profilowi zdefiniowanemu na liście energyBalances urządzenia (np. 0 dla EXTENDED, 1 dla BALANCED i 2 dla PERFORMANCE).
Wartość null w przypadku currentEnergyBalance oznacza, że urządzenie używa profilu niestandardowego. Jest to stan tylko do odczytu.
Poniżej znajdziesz przykład struktury, której będzie używać atrybut currentEnergyBalance, a następnie fragment kodu, który korzysta z tego atrybutu.
// Example energyBalances list energy_balances: [ { step: 0, label: "EXTENDED" }, { step: 50, label: "BALANCED" }, { step: 100, label: "PERFORMANCE" } ]
// The index parameter must be within the UByte range (0-255). suspend fun setEnergyBalance(trait: EnergyPreference, index: Int) { trait.update { setCurrentEnergyBalance(index.toUByte()) } } // Setting the battery usage to more recording ie performance setEnergyBalance(energyPreference, 2)
Włączanie automatycznego oszczędzania baterii
Aby skonfigurować tę funkcję, zaktualizuj atrybut currentLowPowerModeSensitivity cechy EnergyPreference. Ten atrybut używa indeksu do wyboru poziomu wrażliwości, gdzie 0 zwykle oznacza Disabled, a 1 oznacza Enabled lub Automatic.
suspend fun setAutomaticBatterySaver(enable: Boolean, trait: EnergyPreference) { // 0 is Disabled, 1 is Enabled val value = if (enable) 1.toUByte() else 0.toUByte() trait.update { setCurrentLowPowerModeSensitivity(value) } }
Sprawdzanie stanu ładowania baterii
Aby uzyskać bieżący stan ładowania urządzenia (ładowanie, pełne naładowanie lub brak ładowania), użyj atrybutu batChargeState cechy PowerSource.
// Get the battery charging state val batteryChargeState = powerSource.batChargeState when (batteryChargeState) { PowerSourceTrait.BatChargeStateEnum.IsCharging -> "Charging" PowerSourceTrait.BatChargeStateEnum.IsAtFullCharge -> "Full" PowerSourceTrait.BatChargeStateEnum.IsNotCharging -> "Not Charging" else -> "Unknown" }
Sprawdzanie poziomu baterii
Aby uzyskać bieżący poziom baterii, użyj atrybutu
batChargeLevel
cechy
PowerSource. Poziom to OK, Warning (niski) lub Critical.
// Get the battery charge level val batteryLevel = powerSourceTrait.batChargeLevel when (batteryLevel) { PowerSourceTrait.BatChargeLevelEnum.OK -> "OK" PowerSourceTrait.BatChargeLevelEnum.Warning -> "Warning" PowerSourceTrait.BatChargeLevelEnum.Critical -> "Critical" else -> "Unknown" }
Uzyskiwanie źródła zasilania
Aby określić źródło zasilania urządzenia, użyj atrybutów BatPresent i wiredPresent cechy PowerSource.
val trait: PowerSource val isWired = trait.wiredPresent val hasBattery = trait.batPresent
Ustawienia dźwięku
Różnymi ustawieniami dźwięku można sterować za pomocą interfejsów Home API.
Włączanie i wyłączanie mikrofonu
Aby włączyć lub wyłączyć mikrofon urządzenia, zaktualizuj atrybut
microphoneMuted
cechy CameraAvStreamManagement za pomocą wbudowanej funkcji
setMicrophoneMuted w języku Kotlin:
// Turn the device's microphone on or off suspend fun turnOffMicrophone(disableMicrophone: Boolean, trait: CameraAvStreamManagement) { trait.update { setMicrophoneMuted(disableMicrophone) } }
Włączanie i wyłączanie nagrywania dźwięku
Aby włączyć lub wyłączyć nagrywanie dźwięku na urządzeniu, zaktualizuj atrybut recordingMicrophoneMuted
cechy CameraAvStreamManagement za pomocą wbudowanej funkcji setRecordingMicrophoneMuted w języku Kotlin:
// Turn audio recording on or off for the device suspend fun turnOffAudioRecording(disableAudioRecording: Boolean, trait: CameraAvStreamManagement) { trait.update { setRecordingMicrophoneMuted(disableAudioRecording) } }
Dostosowywanie głośności głośnika
Aby dostosować głośność głośnika urządzenia, zaktualizuj atrybut speakerVolumeLevel cechy CameraAvStreamManagement za pomocą wbudowanej funkcji setSpeakerVolumeLevel w języku Kotlin:
// Adjust the camera speaker volume suspend fun adjustSpeakerVolume(volume: Int, trait: CameraAvStreamManagement) { trait.update { setSpeakerVolumeLevel(volume.toUbyte()) } }
Ustawienia miejsc aktywności
Cechą ZoneManagement jest interfejs do zarządzania niestandardowymi obszarami zainteresowania (miejscami aktywności) na kamerach i dzwonkach do drzwi.
Strefy te służą do filtrowania wykrywania zdarzeń (np. ruchu osoby lub pojazdu) w określonych obszarach w polu widzenia urządzenia.
Miejsca aktywności są konfigurowane przez użytkownika w aplikacji partnera. Umożliwia to wyznaczanie stref w określonych obszarach pola widzenia kamery. Zdefiniowane przez użytkownika strefy są następnie przekształcane w struktury używane przez ten atrybut. Więcej informacji o tym, jak działają miejsca aktywności, znajdziesz w artykule Konfigurowanie i używanie miejsc aktywności.
Strefy aktywności są zwykle definiowane za pomocą 2-wymiarowych współrzędnych kartezjańskich.
Cechą jest TwoDCartesianVertexStruct dla wierzchołków i TwoDCartesianZoneStruct
dla definicji strefy (nazwa, wierzchołki, kolor i użycie).
Sprawdzanie miejsc aktywności
Aby wyświetlić strefy aktywności, sprawdź atrybut zones
cechy ZoneManagement.
// 1. Obtain the trait flow from the device private val zoneManagementFlow: Flow= device.type(CAMERA_TYPE).flatMapLatest { it.trait(ZoneManagement) } // 2. Map the flow to the list of zone structures val activityZones: Flow<List<ZoneManagementTrait.ZoneInformationStruct>> = zoneManagementFlow.map { trait -> trait.zones ?: emptyList() }
Dodawanie strefy aktywności
Aby utworzyć nową strefę, użyj polecenia createTwoDCartesianZone. To polecenie przyjmuje TwoDCartesianZoneStruct, który określa nazwę, wierzchołki, kolor i użycie strefy.
Poniższy przykład pokazuje, jak utworzyć strefę o nazwie „Front Porch” (Weranda) z 4 wierzchołkami w kolorze łososiowym (#F439A0), która będzie używana do wykrywania ruchu.
import com.google.home.google.ZoneManagement import com.google.home.google.ZoneManagementTrait import com.google.home.matter.serialization.OptionalValue /** * Creates a custom activity zone named "Front Porch" with a salmon color * configured for motion detection. */ suspend fun createFrontPorchZone(zoneManagement: ZoneManagement) { // 1. Define the vertices for the zone (2D Cartesian coordinates) // Values are typically scaled to a maximum defined by the device's twoDCartesianMax attribute. val vertices = listOf( ZoneManagementTrait.TwoDCartesianVertexStruct(x = 260u, y = 422u), ZoneManagementTrait.TwoDCartesianVertexStruct(x = 1049u, y = 0u), ZoneManagementTrait.TwoDCartesianVertexStruct(x = 2048u, y = 0u), ZoneManagementTrait.TwoDCartesianVertexStruct(x = 2048u, y = 950u), ZoneManagementTrait.TwoDCartesianVertexStruct(x = 1630u, y = 1349u), ZoneManagementTrait.TwoDCartesianVertexStruct(x = 880u, y = 2048u), ZoneManagementTrait.TwoDCartesianVertexStruct(x = 0u, y = 2048u), ZoneManagementTrait.TwoDCartesianVertexStruct(x = 638u, y = 1090u) ) // 2. Define the zone structure val newZone = ZoneManagementTrait.TwoDCartesianZoneStruct( name = "Front Porch", vertices = vertices, // Usage defines what the zone filters (for example, Motion, Person, Vehicle) use = listOf(ZoneManagementTrait.ZoneUseEnum.Motion), // Color is typically a hex string (for example, Salmon/Pink) color = OptionalValue.present("#F439A0") ) try { // 3. Execute the command to add the zone to the device zoneManagement.createTwoDCartesianZone(newZone) println("Successfully created activity zone.") } catch (e: Exception) { // Handle potential HomeException or Timeout println("Failed to create activity zone: ${e.message}") } }
Aktualizowanie strefy aktywności
Aby zaktualizować istniejącą strefę, użyj polecenia
updateTwoDCartesianZone. To polecenie wymaga zoneId i zaktualizowanego TwoDCartesianZoneStruct.
private suspend fun ZoneManagement.updateZone( zoneId: UShort, zone: ZoneManagementTrait.TwoDCartesianZoneStruct ) { // Execute the command to update the zone this.updateTwoDCartesianZone(zoneId = zoneId, zone = zone) }
Usuwanie strefy aktywności
Aby usunąć strefę, użyj polecenia
removeZone
z określonym argumentem zoneId.
private suspend fun ZoneManagement.deleteZone(zoneId: UShort) { // Execute the command to remove the zone this.removeZone(zoneId = zoneId) }
Aktywatory zdarzeń dźwiękowych
Cecha AvStreamAnalysis udostępnia interfejs do zarządzania wyzwalaczami wykrywania zdarzeń na kamerach i dzwonkach do drzwi. Wywoływanie na podstawie obrazu (np. wykrywanie osób lub pojazdów) może być związane z określonym obszarem, ale wywoływanie na podstawie dźwięku jest zwykle konfigurowane na poziomie urządzenia.
W przypadku wykrywania dźwięku za pomocą EventTriggerTypeEnum dostępne są te typy reguł:
| Tryb | Wartość typu wyliczeniowego | Opis |
|---|---|---|
| Dźwięk | Sound |
Ogólne wykrywanie dźwięku. |
| Ktoś coś mówi | PersonTalking |
wykrywa mowę, |
| Szczekanie psa | DogBark |
Wykrywa wokalizacje psów. |
| Odgłos tłuczonego szkła | GlassBreak |
wykrywa odgłos tłuczonego szkła; |
| Alarm z czujnika dymu | SmokeAlarm |
Wykrywa alarmy z czujnika dymu, które często są rozpoznawane po sygnale dźwiękowym T3 (3 krótkie sygnały dźwiękowe, po których następuje przerwa). |
| alarm z czujnika tlenku węgla | CoAlarm |
Wykrywa alarmy z czujników tlenku węgla, które zwykle są rozpoznawane po sygnale dźwiękowym T4 (4 krótkie sygnały dźwiękowe, po których następuje przerwa). |
Sprawdzanie stanu wykrywania dźwięku
Aby wyświetlić użytkownikowi bieżący stan wykrywania dźwięku, musisz sprawdzić, co obsługuje urządzenie i co jest włączone przez sprzęt urządzenia. Sprawdź te 2 atrybuty:
Podczas tworzenia aplikacji na Androida z użyciem Kotlin Flows zwykle obserwujesz cechę
AvStreamAnalysis z HomeDevice.
// Example structure to store the data class EventTriggerAttribute(val type: EventTriggerTypeEnum, val enabled: Boolean) // 1. Obtain the trait flow from the device private val avStreamAnalysisFlow: Flow<AvStreamAnalysis> = device.traitFromType(AvStreamAnalysis, CAMERA_TYPES.first { device.has(it) }) // 2. Map the flow to a list of sound event attributes val soundEventTriggersState: Flow<List<EventTriggerAttribute>> = avStreamAnalysisFlow.map { trait -> // Get raw lists from the trait attributes val supported = trait.supportedEventTriggers ?: emptyList() val enabled = trait.enabledEventTriggers ?: emptyList() // Define sound-specific triggers to filter for val soundTypes = setOf( EventTriggerTypeEnum.Sound, EventTriggerTypeEnum.PersonTalking, EventTriggerTypeEnum.DogBark, EventTriggerTypeEnum.GlassBreak, EventTriggerTypeEnum.SmokeAlarm, EventTriggerTypeEnum.CoAlarm, ) // Filter and associate status supported .filter { soundTypes.contains(it) } .map { type -> EventTriggerAttribute( type = type, enabled = enabled.contains(type) ) } }
Aktualizowanie zestawu włączonych aktywatorów
Aby zaktualizować zestaw włączonych wyzwalaczy, użyj polecenia
SetOrUpdateEventDetectionTriggers
które przyjmuje listę struktur EventTriggerEnablement.
private suspend fun AvStreamAnalysis.updateEventTriggers( eventTriggers: List<EventTriggerAttribute> ) { val toUpdate = eventTriggers.map { EventTriggerEnablement( eventTriggerType = it.type, enablementStatus = if (it.enabled) { EnablementStatusEnum.Enabled } else { EnablementStatusEnum.Disabled }, ) } // Execute the command on the device setOrUpdateEventDetectionTriggers(toUpdate) }
Tryby nagrywania
Cechą RecordingMode jest interfejs do zarządzania nagrywaniem wideo i obrazów na kamerach i dzwonkach do drzwi. Umożliwia użytkownikom wybór między nagrywaniem ciągłym, nagrywaniem zdarzeń lub całkowitym wyłączeniem nagrywania (tylko podgląd na żywo).
Element RecordingModeEnum określa dostępne strategie rejestrowania:
| Tryb | Wartość typu wyliczeniowego | Opis |
|---|---|---|
| Wyłączono | Disabled |
Nagrywanie jest całkowicie wyłączone. Używany głównie przez starsze urządzenia. |
| CVR (Continuous Video Recording) | Cvr |
Filmy są nagrywane przez całą dobę. Wymaga subskrypcji (np. Google Google Home Premium). |
| EBR (nagrywanie zdarzeń) | Ebr |
Nagrywanie jest aktywowane przez zdarzenia (osoba, ruch). Długość wideo zależy od czasu trwania wydarzenia i subskrypcji. |
| ETR (nagrywanie wywoływane zdarzeniem) | Etr |
krótkie nagranie podglądu (np. 10 sekund) wywoływane przez zdarzenia. |
| Widok Live View | LiveView |
Nagrywanie jest wyłączone, ale użytkownicy nadal mogą oglądać transmisję na żywo. |
| Grafika | Images |
Zamiast filmów rejestrowane są migawki, gdy wystąpią zdarzenia. |
Sprawdzanie trybów nagrywania
Aby wyświetlić bieżącą konfigurację nagrywania, sprawdź atrybuty cechy RecordingMode:
supportedRecordingModes– wszystkie potencjalne trybyavailableRecordingModes– wybierane trybyselectedRecordingMode– tryb aktywny
// 1. Obtain the trait flow from the device private val recordingModeTraitFlow: Flow= device.traitFromType(RecordingMode, CAMERA_TYPES.first { device.has(it) }) // 2. Map the flow to recording mode options data class RecordingModeOptions( val recordingMode: RecordingModeTrait.RecordingModeEnum, val index: Int, val available: Boolean, val readableString: String, ) private val recordingModeOptions: Flow<List > = recordingModeTraitFlow.map { trait -> val supported = trait.supportedRecordingModes?.map { it.recordingMode } ?: emptyList() val available = trait.availableRecordingModes?.map { it.toInt() } ?: emptyList() supported.withIndex().map { (index, mode) -> RecordingModeOptions( recordingMode = mode, index = index, available = available.contains(index), readableString = mode.toReadableString(), ) } }
Zmiana trybu nagrywania
Przed aktualizacją upewnij się, że wybrany indeks z atrybutu supportedRecordingModes
występuje w atrybucie availableRecordingModes.
Aby zaktualizować wybrany tryb, użyj funkcji
setSelectedRecordingMode, przekazując indeks wybranego trybu:
private suspend fun RecordingMode.updateRecordingMode(index: Int) { // Execute the command to update the selected mode this.setSelectedRecordingMode(index.toUByte()) }
Inne ustawienia
Za pomocą interfejsów Home API można sterować różnymi innymi ustawieniami.
Zmienianie orientacji obrazu
Orientację obrazu z kamery (filmu) można obracać. Film można obrócić tylko o 180 stopni.
Aby zmienić orientację obrazu z kamery, zaktualizuj atrybut
imageRotation
cechy CameraAvStreamManagement za pomocą wbudowanej funkcji
setImageRotation Kotlin:
// Change the camera's image orientation val isRotated = false cameraAvStreamManagement.update { setImageRotation(if (isRotated) 180.toUShort() else 0.toUShort()) }
Włączanie i wyłączanie widzenia w nocy
Aby włączyć lub wyłączyć tryb nocny w przypadku kamery, użyj polecenia TriStateAutoEnum, aby zaktualizować atrybut nightVision cechy CameraAvStreamManagement za pomocą wbudowanej funkcji setNightVision w języku Kotlin:
// Turn night vision on cameraAvStreamManagement.update { setNightVision(CameraAvStreamManagementTrait.TriStateAutoEnum.On) } // Turn night vision off CameraAvStreamManagement.update { setNightVision(CameraAvStreamManagementTrait.TriStateAutoEnum.Off) }
Zmiana jasności diody LED stanu
Aby zmienić jasność diody LED stanu, użyj
ThreeLevelAutoEnum
do zaktualizowania atrybutu
statusLightBrightness
cechy CameraAvStreamManagement za pomocą wbudowanej funkcji
setStatusLightBrightness Kotlin:
// Set the LED brightness to high cameraAvStreamManagement.update { setStatusLightBrightness(CameraAvStreamManagementTrait.ThreeLevelAutoEnum.High) } // Set the LED brightness to low cameraAvStreamManagement.update { setStatusLightBrightness(CameraAvStreamManagementTrait.ThreeLevelAutoEnum.Low) }
Zmiana widocznego obszaru kamery
Widok z kamery jest taki sam jak w przypadku funkcji powiększania i kadrowania opisanej w artykule pomocy Powiększanie i ulepszanie obrazu z kamery Nest.
Obszar wyświetlania jest zdefiniowany w ViewportStruct, który zawiera 4 wartości używane jako współrzędne obszaru wyświetlania. Współrzędne są zdefiniowane w ten sposób:
(x1,y1) -- (x2,y1) | | (x1,y2) -- (x2,y2)
Określanie wartości parametru ViewportStruct zależy od interfejsu aplikacji i implementacji kamery. Aby ustawić obszar widoku filmu z kamery, zaktualizuj atrybut viewport
cechy CameraAvStreamManagement za pomocą ViewportStruct, używając wbudowanej funkcji Kotlina setViewport:
cameraAvStreamManagement .update { setViewport( CameraAvStreamManagementTrait.ViewportStruct( x1 = horizontalRange.rangeStart.roundToInt().toUShort(), x2 = horizontalRange.rangeEnd.roundToInt().toUShort(), y1 = verticalRange.rangeStart.roundToInt().toUShort(), y2 = verticalRange.rangeEnd.roundToInt().toUShort(), ) ) }
Dostosowywanie czułości wybudzania urządzenia
Czułość wybudzania urządzenia służy do oszczędzania baterii poprzez zmniejszenie zakresu, w którym urządzenie może wykrywać aktywność, i wydłużenie czasu wybudzania po wykryciu tej aktywności.
W interfejsach Home API można to ustawić za pomocą właściwości motionSensitivity elementu triggerOptions w transportOptions urządzenia. Te opcje są zdefiniowane w PushAvStreamTransport dla każdego urządzenia.
Czułość wybudzania można ustawić tylko na te wartości:
- 1 = Niski
- 5 = Średni
- 10 = Wysoki
Aby zaktualizować konfigurację, znajdź konfigurację transportu dla aktywnych strumieni nagrywania za pomocą polecenia findTransport, a następnie zmodyfikuj konfigurację, podając nową wartość czułości za pomocą polecenia modifyPushTransport:
// Create a struct with the new wake-up sensitivity val toUpdate = TransportOptionsStruct( triggerOptions = TransportTriggerOptionsStruct( motionSensitivity = OptionalValue.present(wakeUpSensitivity.toUByte()) ) ) // Get the configurations for active connections val connections = pushAvStreamTransport.findTransport().transportConfigurations // Update all recording streams with the new transport options. for (connection in connections) { if (connection.transportOptions.getOrNull()?.streamUsage == StreamUsageEnum.Recording) { trait.modifyPushTransport( connectionId = connection.connectionId, transportOptions = toUpdate, ) } }
Dostosowywanie maksymalnego czasu trwania zdarzenia
Maksymalna długość zdarzenia to czas, przez jaki kamera będzie nagrywać klip w przypadku zdarzenia. Za pomocą interfejsów Home API można skonfigurować dla każdego urządzenia te same długości, co w przypadku GHA, w odstępach sekund:
- 10 sekund
- 15 sekund
- 30 sekund
- 60 sekund (1 minuta)
- 120 sekund (2 minuty)
- 180 sekund (3 minuty)
W interfejsach Home API można to ustawić za pomocą właściwości motionTimeControl elementu triggerOptions w transportOptions urządzenia. Te opcje są zdefiniowane w PushAvStreamTransport dla każdego urządzenia.
Aby zaktualizować konfigurację, znajdź konfigurację transportu dla aktywnych strumieni nagrywania za pomocą polecenia
findTransport
, a następnie zmodyfikuj konfigurację, podając nową wartość długości zdarzenia za pomocą polecenia
modifyPushTransport:
// Create a struct with the new max event length // where maxDuration is the length in seconds val toUpdate = TransportOptionsStruct( triggerOptions = TransportTriggerOptionsStruct( motionTimeControl = OptionalValue.present( TransportMotionTriggerTimeControlStruct(maxDuration = it.toUInt()) ) ) ) // Get the configurations for active connections val connections = pushAvStreamTransport.findTransport().transportConfigurations // Update all recording streams with the new transport options. for (connection in connections) { if (connection.transportOptions.getOrNull()?.streamUsage == StreamUsageEnum.Recording) { trait.modifyPushTransport( connectionId = connection.connectionId, transportOptions = toUpdate, ) } }
Włączanie i wyłączanie statystyk
Każde urządzenie może indywidualnie wyrazić zgodę na wysyłanie szczegółowych danych analitycznych do chmury Google Home (patrz Cloud Monitoring for Home APIs).
Aby włączyć analizy na urządzeniu, ustaw wartość właściwości
analyticsEnabled
elementu
ExtendedGeneralDiagnosticsTrait
na true. Gdy ustawisz analyticsEnabled, inna właściwość, logUploadEnabled, zostanie automatycznie ustawiona na true, co umożliwia przesyłanie plików dziennika analitycznego do chmury Google Home.
// Enable analytics extendedGeneralDiagnostics.update { setAnalyticsEnabled(true) } // Disable analytics extendedGeneralDiagnostics.update { setAnalyticsEnabled(false) }