סוג המכשיר 'מצלמה' מיושם באמצעות שתי תכונות:
PushAvStreamTransport,
שמטפלת בהעברת סטרימינג של אודיו ווידאו באמצעות פרוטוקולים מבוססי-push, ו-
WebRtcLiveView,
שמספקת את היכולת לשלוט בשידורים חיים וב-TalkBack.
לפני שמשתמשים בתכונות או מנסים לעדכן מאפיינים, תמיד צריך לבדוק אם המכשיר תומך במאפיינים ובפקודות. מידע נוסף זמין במאמר שליטה במכשירים ב-Android.
| Home APIs Device Type | תכונות | אפליקציה לדוגמה ב-Kotlin | תרחיש לדוגמה |
|---|---|---|---|
|
מצלמה
מכשיר שמצלם תמונות סטילס או סרטונים. המצלמות עשויות לכלול שידורים חיים נגישים, שיחה משני צידי הדלת או אירועי זיהוי. |
Required Traits google PushAvStreamTransport google WebRtcLiveView |
מצלמה |
קבלת מידע בסיסי על מכשיר
מאפיין BasicInformation כולל מידע כמו שם הספק, מזהה הספק, מזהה המוצר, שם המוצר (כולל פרטי הדגם), גרסת התוכנה והמספר הסידורי של המכשיר:
// 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}") }
הזמן האחרון שבו המכשיר יצר קשר עם הענן
כדי למצוא את הפעם האחרונה שבה המכשיר יצר קשר עם הענן, משתמשים במאפיין lastContactTimestamp של מאפיין ExtendedGeneralDiagnostics:
fun getLastContactTimeStamp(trait: ExtendedGeneralDiagnostics): java.time.Instant { val timestamp = trait.lastContactTimestamp return Instant.ofEpochSecond(timestamp.toLong()) }
בדיקת החיבור של מכשיר
הקישוריות של מכשיר נבדקת למעשה ברמת סוג המכשיר, כי חלק מהמכשירים תומכים בכמה סוגי מכשירים. המצב שמוחזר הוא שילוב של מצבי הקישוריות של כל המאפיינים במכשיר.
val lightConnectivity = dimmableLightDevice.metadata.sourceConnectivity.connectivityState
המצב PARTIALLY_ONLINE עשוי להופיע במקרה של סוגי מכשירים מעורבים כשאין חיבור לאינטרנט.
יכול להיות שמאפיינים רגילים של Matter עדיין יהיו אונליין בגלל ניתוב מקומי, אבל מאפיינים מבוססי-ענן יהיו אופליין.
התחלת שידור חי
כדי להתחיל שידור חי, שולחים את המחרוזת Session Description Protocol (SDP) לשיטה startLiveView() של מאפיין WebRtcLiveView, שמחזירה WebRtcLiveViewTrait.StartLiveViewCommand.Response שמכיל שלושה ערכים:
- נתוני ה-SDP של הסשן.
- משך הסשן בשניות.
- מזהה הסשן, שאפשר להשתמש בו כדי להאריך או לסיים את הסשן.
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)
הארכת שידור חי
לשידורים חיים יש משך זמן מוגדר מראש, ולאחר מכן הם מסתיימים. כדי להאריך את משך הזמן של סטרימינג פעיל, צריך לשלוח בקשת הארכה באמצעות השיטה 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 }
איך מתחילים ומפסיקים את TalkBack
כדי להפעיל את TalkBack, מתקשרים אל השיטה startTalkback() של המאפיין WebRtcLiveView. כדי להפסיק, משתמשים בפקודה 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) } }
הפעלה והשבתה של יכולת ההקלטה
כדי להפעיל את יכולת ההקלטה של המצלמה, צריך להעביר את הערך
TransportStatusEnum.Active
לשיטה
setTransportStatus()
של מאפיין
PushAvStreamTransport. כדי להשבית את האפשרות להקלטה, מעבירים את הערך TransportStatusEnum.Inactive.
בדוגמה הבאה, אנחנו עוטפים את הקריאות האלה בקריאה אחת שמשתמשת ב-Boolean כדי להפעיל או להשבית את יכולת ההקלטה:
// 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) } }
הפעלה או השבתה של יכולת ההקלטה של המצלמה זהות להפעלה או להשבתה של הווידאו מהמצלמה. כשהווידאו מהמצלמה מופעל, המצלמה מקליטה (למטרות של אירועים וקליפים קשורים).
כשהיכולת להקליט מושבתת (הווידאו מהמצלמה מושבת):
- המצלמה עדיין יכולה להופיע כמחוברת לאינטרנט לפי
connectivityStateסוג המכשיר. - אין גישה לשידור החי, והמצלמה לא מזהה אירועים בענן.
איך בודקים אם אפשרות ההקלטה מופעלת
כדי לבדוק אם יכולת ההקלטה של המצלמה מופעלת, צריך לבדוק אם יש חיבורים פעילים. בדוגמה הבאה מוגדרות שתי פונקציות שמבצעות את הפעולה הזו:
// 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 }
דרך נוספת לבדוק היא באמצעות הפונקציה findTransport() עם פרדיקט:
// Fetch the current connections suspend fun queryRecordModeState(trait: PushAvStreamTransport) { return trait.findTransport().let { it.transportConfigurations.any { it.transportStatus == TransportStatusEnum.Active } }
הגדרות הסוללה
אפשר לשלוט בהגדרות שונות של הסוללה באמצעות ממשקי ה-API של Home.
הגדרת העדפת השימוש בסוללה
הגדרת מאזן האנרגיה מאפשרת לכם לקבוע את האיזון בין חיי הסוללה לבין הביצועים של המכשיר. אפשר ליצור פרופילים שונים של סוללה, כמו 'מורחב', 'מאוזן' ו'ביצועים', ולעבור ביניהם.
התכונה הזו מיושמת על ידי עדכון המאפיין currentEnergyBalance של מאפיין EnergyPreference. המאפיין מקבל אינדקס של מספר שלם שתואם לפרופיל ספציפי שמוגדר ברשימה energyBalances של המכשיר (לדוגמה, 0 עבור EXTENDED, 1 עבור BALANCED ו-2 עבור PERFORMANCE).
ערך של null במאפיין currentEnergyBalance מציין שהמכשיר משתמש בפרופיל מותאם אישית. זהו מצב קריאה בלבד.
בדוגמה הבאה מוצג מבנה שמאפיין currentEnergyBalance ישתמש בו, ואחריו קטע הקוד בפועל שמשתמש במאפיין.
// 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)
הפעלה אוטומטית של מצב החיסכון בסוללה
כדי להגדיר את התכונה הזו, צריך לעדכן את מאפיין currentLowPowerModeSensitivity של מאפיין EnergyPreference. במאפיין הזה משתמשים באינדקס כדי לבחור רמת רגישות, כאשר 0 מייצג בדרך כלל Disabled, ו-1 מייצג Enabled או 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) } }
קבלת מצב הטעינה של הסוללה
כדי לקבל את מצב הטעינה הנוכחי של המכשיר (בטעינה, טעינה מלאה או לא בטעינה), משתמשים במאפיין batChargeState של מאפיין 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" }
קבלת רמת הטעינה
כדי לקבל את רמת הטעינה הנוכחית של הסוללה, משתמשים במאפיין
batChargeLevel
של מאפיין
PowerSource. הרמה היא OK, Warning (נמוכה) או 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" }
קבלת מקור הכוח
כדי לקבוע את מקור החשמל שבו המכשיר משתמש, צריך להשתמש במאפיינים BatPresent ו-wiredPresent של מאפיין PowerSource.
val trait: PowerSource val isWired = trait.wiredPresent val hasBattery = trait.batPresent
הגדרות אודיו
אפשר לשלוט בהגדרות שונות של אודיו באמצעות ממשקי ה-API של Home.
הפעלה או השבתה של המיקרופון
כדי להפעיל או להשבית את המיקרופון במכשיר, מעדכנים את מאפיין microphoneMuted של מאפיין התכונה CameraAvStreamManagement באמצעות הפונקציה המובנית setMicrophoneMuted Kotlin:
// Turn the device's microphone on or off suspend fun turnOffMicrophone(disableMicrophone: Boolean, trait: CameraAvStreamManagement) { trait.update { setMicrophoneMuted(disableMicrophone) } }
איך מפעילים או משביתים את הקלטת האודיו
כדי להפעיל או להשבית את הקלטת האודיו במכשיר, מעדכנים את המאפיין
recordingMicrophoneMuted
של המאפיין CameraAvStreamManagement באמצעות הפונקציה המובנית
setRecordingMicrophoneMuted Kotlin:
// Turn audio recording on or off for the device suspend fun turnOffAudioRecording(disableAudioRecording: Boolean, trait: CameraAvStreamManagement) { trait.update { setRecordingMicrophoneMuted(disableAudioRecording) } }
שינוי עוצמת הקול של הרמקול
כדי לשנות את עוצמת הקול של הרמקול במכשיר, מעדכנים את המאפיין
speakerVolumeLevel
של מאפיין התכונה CameraAvStreamManagement באמצעות פונקציית Kotlin המובנית:
setSpeakerVolumeLevel
// Adjust the camera speaker volume suspend fun adjustSpeakerVolume(volume: Int, trait: CameraAvStreamManagement) { trait.update { setSpeakerVolumeLevel(volume.toUbyte()) } }
הגדרות של אזורי פעילות
מאפיין ZoneManagement מספק ממשק לניהול אזורים מותאמים אישית שמעניינים אתכם (אזורי פעילות) במצלמות ובפעמוני דלת.
האזורים האלה משמשים לסינון זיהוי האירועים (כמו תנועה של אנשים או כלי רכב) לאזורים ספציפיים בשדה הראייה של המכשיר.
המשתמש מגדיר אזורי פעילות באפליקציית שותף, ומאפשר לו לצייר אזורים מעל אזורים ספציפיים בשדה הראייה של המצלמה. אזורי הזמן שהוגדרו על ידי המשתמש מתורגמים למבנים שבהם נעשה שימוש במאפיין הזה. מידע נוסף על אופן הפעולה של אזורי פעילות זמין במאמר הגדרה ושימוש באזורי פעילות.
אזורי פעילות מוגדרים בדרך כלל באמצעות קואורדינטות קרטזיות דו-ממדיות.
מאפיין המיקום מספק את TwoDCartesianVertexStruct לקודקודים ואת TwoDCartesianZoneStruct להגדרת האזור (שם, קודקודים, צבע ושימוש).
בדיקת אזורי הפעילות
כדי להציג אזורי פעילות, מסמנים את התיבה zones של מאפיין המאפיינים 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() }
הוספת אזור פעילות
כדי ליצור אזור חדש, משתמשים בפקודה createTwoDCartesianZone. הפקודה הזו מקבלת TwoDCartesianZoneStruct, שמגדיר את השם, הקודקודים, הצבע והשימוש של האזור.
בדוגמה הבאה מוצג איך ליצור אזור בשם Front Porch עם ארבע נקודות קודקוד, בצבע סלמון (#F439A0) ועם שימוש לזיהוי תנועה.
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}") } }
עדכון אזור פעילות
כדי לעדכן אזור קיים, משתמשים בפקודה updateTwoDCartesianZone. הפקודה הזו דורשת את zoneId ואת TwoDCartesianZoneStruct המעודכן.
private suspend fun ZoneManagement.updateZone( zoneId: UShort, zone: ZoneManagementTrait.TwoDCartesianZoneStruct ) { // Execute the command to update the zone this.updateTwoDCartesianZone(zoneId = zoneId, zone = zone) }
מחיקת אזור פעילות
כדי להסיר אזור, משתמשים בפקודה removeZone עם zoneId ספציפי.
private suspend fun ZoneManagement.deleteZone(zoneId: UShort) { // Execute the command to remove the zone this.removeZone(zoneId = zoneId) }
טריגרים לאירועים של זיהוי צליל
מאפיין AvStreamAnalysis מספק ממשק לניהול טריגרים של זיהוי אירועים במצלמות ובפעמוני דלת. טריגרים מבוססי-ראייה (כמו אנשים או כלי רכב) יכולים להיות ספציפיים לאזור, אבל טריגרים שקשורים לצליל הם בדרך כלל הגדרות ברמת המכשיר.
אלה סוגי הטריגרים שזמינים לזיהוי צלילים באמצעות EventTriggerTypeEnum:
| מצב | ערך enum | תיאור |
|---|---|---|
| צליל | Sound |
זיהוי צלילים כללי. |
| מישהו מדבר | PersonTalking |
מזהה דיבור. |
| נביחת כלב | DogBark |
מזהה קולות של כלבים. |
| זכוכית נשברת | GlassBreak |
זיהוי של צליל זכוכית נשברת. |
| גלאי עשן | SmokeAlarm |
מזהה התראות של גלאי עשן, שלרוב מזוהות לפי דפוס קולי T3 (שלושה צפצופים קצרים ואז הפסקה). |
| גלאי פחמן חד-חמצני | CoAlarm |
מזהה אזעקות של פחמן חד-חמצני (CO), בדרך כלל לפי דפוס הצליל T4 (ארבעה צפצופים קצרים ואז הפסקה). |
בדיקת הסטטוס של זיהוי הצלילים
כדי להציג למשתמש את המצב הנוכחי של זיהוי צלילים, צריך לבדוק מה המכשיר תומך ומה מופעל על ידי החומרה של המכשיר. שני המאפיינים שצריך לבדוק הם:
בפיתוח ל-Android באמצעות Kotlin Flows, בדרך כלל מתבצעת תצפית על המאפיין AvStreamAnalysis מתוך 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) ) } }
עדכון של קבוצת הטריגרים המופעלים
כדי לעדכן את קבוצת הטריגרים המופעלים, משתמשים בפקודה SetOrUpdateEventDetectionTriggers, שמקבלת רשימה של מבני 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) }
מצבי הקלטה
מאפיין RecordingMode מספק ממשק לניהול התנהגות ההקלטה של סרטונים ותמונות במצלמות ובפעמוני דלת. התכונה מאפשרת למשתמשים לבחור בין הקלטה רציפה, הקלטה בזמן אירוע (EBR) או השבתה מלאה של ההקלטה (רק בתצוגה בשידור חי).
התג RecordingModeEnum
מגדיר את אסטרטגיות ההקלטה הזמינות:
| מצב | ערך enum | תיאור |
|---|---|---|
| מושבת | Disabled |
ההקלטה מושבתת לחלוטין. משמש בעיקר מכשירים מדור קודם. |
| CVR (הקלטת וידאו רציפה) | Cvr |
הסרטון מוקלט מסביב לשעון. נדרש מינוי (לדוגמה, Google Google Home Premium. |
| EBR (Event Based Recording) | Ebr |
ההקלטה מופעלת על ידי אירועים (אדם, תנועה). אורך הסרטון תלוי במשך האירוע ובמינוי. |
| ETR (הקלטה שמופעלת על ידי אירוע) | Etr |
הקלטה של תצוגה מקדימה קצרה (לדוגמה, 10 שניות) מופעלת על ידי אירועים. |
| תצוגה חיה | LiveView |
ההקלטה מושבתת, אבל המשתמשים עדיין יכולים לגשת לשידור החי. |
| תמונות סטילס | Images |
במקום סרטונים, המצלמה מתעדת צילומים כשיש אירועים. |
בדיקת מצבי ההקלטה
כדי להציג את הגדרות ההקלטה הנוכחיות, בודקים את המאפיינים של מאפיין RecordingMode:
-
supportedRecordingModes– כל אמצעי התחבורה הפוטנציאליים -
availableRecordingModes– אמצעי תחבורה שאפשר לבחור -
selectedRecordingMode– המצב הפעיל
// 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(), ) } }
שינוי מצב ההקלטה
לפני העדכון, מוודאים שהאינדקס שנבחר ממאפיין supportedRecordingModes
מופיע במאפיין availableRecordingModes.
כדי לעדכן את המצב שנבחר, משתמשים בפונקציה setSelectedRecordingMode ומעבירים את האינדקס של המצב שנבחר:
private suspend fun RecordingMode.updateRecordingMode(index: Int) { // Execute the command to update the selected mode this.setSelectedRecordingMode(index.toUByte()) }
הגדרות אחרות
אפשר לשלוט בהגדרות שונות אחרות באמצעות ממשקי ה-API של Home.
שינוי כיוון התמונה
אפשר לסובב את הכיוון של התמונה (הסרטון) מהמצלמה. אפשר לסובב את הסרטון רק ב-180 מעלות.
כדי לשנות את כיוון התמונה של המצלמה, מעדכנים את המאפיין imageRotation של מאפיין המאפיינים CameraAvStreamManagement באמצעות הפונקציה המובנית setImageRotation Kotlin:
// Change the camera's image orientation val isRotated = false cameraAvStreamManagement.update { setImageRotation(if (isRotated) 180.toUShort() else 0.toUShort()) }
הפעלה או השבתה של ראיית לילה
כדי להפעיל או להשבית את ראיית הלילה במצלמה, משתמשים ב-TriStateAutoEnum
כדי לעדכן את המאפיין
nightVision של מאפיין CameraAvStreamManagement באמצעות הפונקציה המובנית
setNightVision Kotlin:
// Turn night vision on cameraAvStreamManagement.update { setNightVision(CameraAvStreamManagementTrait.TriStateAutoEnum.On) } // Turn night vision off CameraAvStreamManagement.update { setNightVision(CameraAvStreamManagementTrait.TriStateAutoEnum.Off) }
שינוי הבהירות של נורית הסטטוס
כדי לשנות את הבהירות של נורית הסטטוס, משתמשים ב-ThreeLevelAutoEnum כדי לעדכן את המאפיין statusLightBrightness של מאפיין CameraAvStreamManagement באמצעות פונקציית Kotlin המובנית:setStatusLightBrightness
// Set the LED brightness to high cameraAvStreamManagement.update { setStatusLightBrightness(CameraAvStreamManagementTrait.ThreeLevelAutoEnum.High) } // Set the LED brightness to low cameraAvStreamManagement.update { setStatusLightBrightness(CameraAvStreamManagementTrait.ThreeLevelAutoEnum.Low) }
שינוי מרחק התצוגה של המצלמה
אזור התצוגה של המצלמה זהה לתכונה 'התקרבות וחיתוך' שמתוארת במאמר התמיכה בנושא התקרבות והגדלה של סרטונים ממצלמת Nest.
הגדרת אזור התצוגה מופיעה בתג ViewportStruct שמכיל ארבעה ערכים, שמשמשים כקואורדינטות של אזור התצוגה. הקואורדינטות מוגדרות כך:
(x1,y1) -- (x2,y1) | | (x1,y2) -- (x2,y2)
הערכים של ViewportStruct נקבעים לפי ממשק המשתמש של האפליקציה וההטמעה של המצלמה. ברמה הבסיסית ביותר, כדי להגדיר את אזור התצוגה של סרטון המצלמה, צריך לעדכן את המאפיין viewport של מאפיין המאפיינים CameraAvStreamManagement באמצעות ViewportStruct, באמצעות הפונקציה המובנית setViewport Kotlin:
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(), ) ) }
שינוי הרגישות של יציאה ממצב שינה
הרגישות של יציאה ממצב שינה של המכשיר משמשת לחיסכון בסוללה. היא עוזרת להקטין את הטווח שבו המכשיר יכול לזהות פעילות, ולהגדיל את הזמן שנדרש להתעוררות אחרי זיהוי הפעילות.
בממשקי ה-API של Home, אפשר להגדיר את זה באמצעות המאפיין motionSensitivity של triggerOptions בtransportOptions של המכשיר. האפשרויות האלה מוגדרות במאפיין PushAvStreamTransport של כל מכשיר.
אפשר להגדיר את הרגישות של יציאה ממצב שינה רק לערכים הבאים:
- 1 = נמוך
- 5 = בינוני
- 10 = גבוה
כדי לעדכן את ההגדרה, צריך למצוא את הגדרות התעבורה של הזרמי ההקלטה הפעילים באמצעות הפקודה findTransport, ואז לשנות את ההגדרה עם ערך הרגישות החדש באמצעות הפקודה 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, ) } }
שינוי משך האירוע המקסימלי
משך האירוע המקסימלי הוא משך הזמן שבו המצלמה תקליט קליפ של אירוע. אפשר להגדיר את זה באמצעות ממשקי ה-API של Home, לכל מכשיר בנפרד, לאותם אורכים כמו דרך GHA, במרווחי זמן של שניות:
- 10 שניות
- 15 שניות
- 30 שניות
- 60 שניות (דקה אחת)
- 120 שניות (2 דקות)
- 180 שניות (3 דקות)
בממשקי ה-API של Home, אפשר להגדיר את זה באמצעות המאפיין motionTimeControl של triggerOptions בtransportOptions של המכשיר. האפשרויות האלה מוגדרות במאפיין PushAvStreamTransport של כל מכשיר.
כדי לעדכן את ההגדרה, צריך למצוא את הגדרת ההעברה של הזרמי ההקלטה הפעילים באמצעות הפקודה findTransport, ואז לשנות את ההגדרה עם הערך החדש של אורך האירוע באמצעות הפקודה 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, ) } }
הפעלה או השבתה של ניתוח נתונים
כל מכשיר יכול להצטרף בנפרד לשליחת נתוני ניתוח מפורטים אל Google Home Cloud (ראו Cloud Monitoring for Home APIs).
כדי להפעיל את האנליטיקה במכשיר, מגדירים את המאפיין analyticsEnabled של ExtendedGeneralDiagnosticsTrait לערך true. כשמגדירים את analyticsEnabled, נכס אחר, logUploadEnabled, מוגדר אוטומטית ל-true, מה שמאפשר להעלות את קובצי יומן הניתוח לענן של Google Home.
// Enable analytics extendedGeneralDiagnostics.update { setAnalyticsEnabled(true) } // Disable analytics extendedGeneralDiagnostics.update { setAnalyticsEnabled(false) }