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

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

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

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

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

בהמשך מופיעות כמה דוגמאות בסיסיות לאיסוף נתונים מתהליכים ב-Home APIs. בדוגמאות הבאות, צריך ליצור מופע של 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" }!!

מעקב אחרי שינויים בתכונה ספציפית במכשיר

אפשר להשתמש בכל תכונה שנתמכת במכשיר ובממשקי Home API. לרשימה המלאה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 לבית, אירועים משמשים לזיהוי שינויים במצב של מכשיר.

כדי להירשם לאירועים במכשיר ספציפי, צריך להפעיל אחת משלוש 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, משתמשים בפונקציה flow.collect():

eventflow.collect { event ->
  if (event != null) {
    logger.atInfo().log("Received event %s", event)
    // do something
  }
}

הרשמה לאירועים שקשורים לישויות

אתם יכולים להאזין לאירועים שמופקים בכל פעם שנוספת, מוסרת או מתעדכנת ישות (כמו מבנה, חדר, מכשיר או אוטומציה). האירועים האלה הם מופעים של HomeObjectChangeEvent, והם כוללים את המזהה של הישות שהשתנתה.

כדי לקבל זרם שמפיק את האירועים הרצויים, מפעילים את ה-method‏ stream() ב-HomeObjectsFlow<T> שנוצר על ידי ה-method המתאים של Flow:

טבלה: Event streams
ישות ממשק שיטת הזרימה
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 -> {}
  }
}