ב-Home APIs ל-Android, אפשר לעקוב אחרי שינויים במצב של הבית באמצעות flows ב-Kotlin. אפשר לעקוב אחרי שינויים במבנים, בחדרים, במטא-נתונים של המכשירים ובמצב המכשיר באמצעות כל API שנוצר מ-HomeObjectsFlow
interface. כדי לעשות את זה, אוספים נתונים מהתהליך.
כשמוסיפים, מוחקים או משנים פריט באוסף, מוחזרת התמונה העדכנית ביותר של האוסף.
המפתח צריך להסיק מהם השינויים הספציפיים על ידי השוואה בין התמונה הזו לבין עותק ישן יותר. אפשר להשתמש בשדה id
שמופיע לכל סוג של אובייקט אב בממשקי Home API למטרה הזו.
איך משתמשים בתהליכי עבודה
בהמשך מופיעות כמה דוגמאות בסיסיות לאיסוף נתונים מתהליכים בממשקי ה-API של Home.
בדוגמאות הבאות, צריך ליצור מופע של Home
לפני שניגשים לקולקציות בדף הבית:
val context = LocalContext.current
val homeManager = Home.getClient(context)
מעקב אחרי שינויים במבנה
השינויים הבאים במבנה מפעילים את האוסף הזה:
- שם הבית
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 שנתמך על ידי Home APIs. הרשימה המלאה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 המתאים:
ישות | ממשק | שיטת התהליך |
---|---|---|
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 -> {} } }