מעקב אחרי מצב המכשיר ב-Android

ב-Home APIs ל-Android, אפשר לעקוב אחרי שינויים במצב של הבית באמצעות flows ב-Kotlin. אפשר לעקוב אחרי שינויים במבנים, בחדרים, במטא-נתונים של מכשירים ובמצב המכשיר באמצעות כל API שמשתמש ב-HomeObjectsFlow interface. כדי לעשות את זה, אוספים נתונים מהתהליך.

כשמוסיפים, מוחקים או משנים פריט באוסף, מוחזרת התמונה העדכנית ביותר של האוסף.

המפתח צריך להסיק את השינויים הספציפיים על ידי השוואה בין התמונה הזו לבין עותק ישן יותר. אפשר להשתמש בשדה id שמופיע לכל סוג של אובייקט אב ב-Home APIs למטרה הזו.

איך משתמשים ברצפי פעולות

בהמשך מופיעות כמה דוגמאות בסיסיות לאיסוף נתונים מתהליכים בממשקי ה-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 שנתמך על ידי ממשקי ה-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>:

  1. ‫events(event: EventFactory<T>) מחזירה תרשים זרימה לסוג מסוים של אירוע:

    val eventFlow = homeDevice.type(DoorLockDevice).first().events(DoorLock.DoorLockAlarmEvent)
    
  2. ‫events(trait: TraitFactory<T>) מחזירה זרם של כל האירועים שנשלחים על ידי מאפיין:

    val eventflow = homeDevice.type(DoorLockDevice).first().events(DoorLock)
    
  3. ‫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 -> {}
  }
}