ב-Home APIs ל-Android, אפשר לעקוב אחרי שינויים במצב של הבית באמצעות flows ב-Kotlin. אפשר לעקוב אחרי שינויים במבנים, בחדרים, במטא-נתונים של מכשירים ובמצב המכשיר באמצעות כל API שמשתמש ב-HomeObjectsFlow
interface. כדי לעשות את זה, אוספים נתונים מהתהליך.
כשמוסיפים, מוחקים או משנים פריט באוסף, מוחזרת התמונה העדכנית ביותר של האוסף.
המפתח צריך להסיק את השינויים הספציפיים על ידי השוואה בין התמונה הזו לבין עותק ישן יותר. אפשר להשתמש בשדה id שמופיע לכל סוג של אובייקט אב ב-Home APIs למטרה הזו.
איך משתמשים ברצפי פעולות
בהמשך מופיעות כמה דוגמאות בסיסיות לאיסוף נתונים מתהליכים בממשקי ה-API של Home.
בדוגמאות הבאות, צריך ליצור מופע של Home לפני שניגשים לקולקציות בדף הבית:
val context = LocalContext.current
val homeManager = Home.getClient(context)
מעקב אחרי שינויים במבנה
השינויים הבאים במבנה יפעילו את האוסף הזה:
- מבנה name
homeManager.structures().map { it.firstOrNull() }.collect {
println("Structure ${it.id} updated to ${it}")
}
val structure = homeManager.structures().list().firstOrNull()!!
מעקב אחר שינויים במכשיר ספציפי
השינויים הבאים במכשיר מפעילים את האוסף הזה:
- מצב הקישוריות
- שם המכשיר
- חברות בחדר
- קבוצת התכונות הנתמכות
- קבוצת הסוגים הנתמכים
structure
.devices()
.map { devices -> device.filter { it.name == "Bedroom Lamp" }.single() }
.collect {
println("The bedroom lamp has changed!")
}
val device = structure.devices().list().firstOrNull { it.name == "Bedroom Lamp" }!!
מעקב אחרי שינויים במאפיין ספציפי במכשיר
אפשר להשתמש בכל מאפיין שנתמך על ידי המכשיר וממשקי ה-API של Home. הרשימה המלאה זמינה
כאןTrait.
val trait = device.type(DimmableLightDevice)?.map { it.trait(OnOff)}.first()
trait?.collect {
if (it != null) {
println("Got new state update! ${it.onOff}")
}
}
מעקב אחר שינויים בסוג מסוים במכשיר
השינויים הבאים במכשיר יפעילו את האיסוף הזה:
- שינויים בכל מאפיין בסוג המכשיר שנוצר
להשתמש בכל סוג מכשיר Matter שנתמך על ידי ממשקי ה-API של Home. הרשימה המלאה זמינה DeviceType.
device.type(DimmableLightDevice).collect { type ->
println("Got new state update! ${type.trait(LevelControl)?.currentLevel}")
}
מעקב אחרי שינויים בחדר במבנה
השינויים הבאים בחדר מפעילים את האוסף הזה:
כדי לעקוב אחרי מועד ההוספה או ההסרה של מכשירים מחדר, משתמשים בdevices()
תהליך.
structure.rooms().collect {
println("Got a new updated set of rooms!")
for (room in it) {
println("Got room $room")
}
}
הרשמה לקבלת עדכונים על אירועים
בממשקי ה-API של Home, נעשה שימוש באירועים כדי לזהות שינויים במצב של מכשיר.
כדי להירשם לאירועים במכשיר ספציפי, מתקשרים לאחד משלושת המספרים HomeDevice.פונקציות events, שכל אחת מהן מחזירה Flow<Event>:
events(event: EventFactory<T>)מחזירה תרשים זרימה לסוג מסוים של אירוע:val eventFlow = homeDevice.type(DoorLockDevice).first().events(DoorLock.DoorLockAlarmEvent)
events(trait: TraitFactory<T>)מחזירה זרם של כל האירועים שנשלחים על ידי מאפיין:val eventflow = homeDevice.type(DoorLockDevice).first().events(DoorLock)
events()מחזירה זרם של אירועים שזמינים לאובייקט:val eventflow = homeDevice.type(DoorLockDevice).first().events()
כדי להשתמש באירועים מתוך זרימה, משתמשים בפונקציה flow.collect():
eventflow.collect { event ->
if (event != null) {
logger.atInfo().log("Received event %s", event)
// do something
}
}
הרשמה לקבלת עדכונים על אירועים שקשורים לישויות
אתם יכולים להאזין לאירועים שמופקים בכל פעם שישות (כמו מבנה, חדר, מכשיר או אוטומציה) מתווספת, מוסרת או מתעדכנת. האירועים האלה הם מקרים של HomeObjectChangeEvent והם כוללים את המזהה של הישות שהשתנתה.
כדי לקבל סטרימינג שמפיק את האירועים הרצויים, מפעילים את method stream() ב-HomeObjectsFlow<T> שנוצר על ידי method Flow המתאים:
| ישות | ממשק | Flow Method |
|---|---|---|
Structure
|
HasStructures
|
structures()
|
Room
|
HasRooms
|
rooms()
|
HomeDevice
|
HasHomeDevices
|
devices()
|
Automation
|
HasAutomations
|
automations()
|
לדוגמה, כך אפשר לטפל בשינויים במכשירים:
val devicesStream = home.devices().stream() // Collect and react to device changes. devicesStream.collect { deviceEvent -> when (deviceEvent) { is HomeObjectAddedEvent -> println("New device now available with id: ${deviceEvent.id}") is HomeObjectUpdatedEvent -> println("Device ${deviceEvent.id} has been updated") is HomeObjectRemovedEvent -> println("Device is removed from your account") else -> {} } }