در Home API برای Android، مشاهده تغییرات وضعیت در خانه ازطریق استفاده از
جریانها
در Kotlin امکانپذیر شده است. مشاهده تغییرات در ساختارها، اتاقها، فراداده دستگاه، و
وضعیت دستگاه در Home API را میتوان با هر API که از
HomeObjectsFlow
میانای ارثبری میکند انجام داد. این کار با
جمعآوری از جریان انجام میشود.
وقتی موردی در مجموعه اضافه، حذف، یا اصلاح شود، آخرین عکس آنی مجموعه برگردانده میشود.
توسعهدهنده باید با مقایسه این عکس آنی با نسخه قدیمیتر، تغییرات خاص را استنتاج کند. فیلد id ارائهشده برای هر نوع شیء والد
در Home API میتواند برای
این منظور استفاده شود.
نحوه استفاده از جریانها
در ادامه چند نمونه ساده از جمعآوری از جریانها در Home API آورده شده است.
برای مثالهای زیر، قبلاز دسترسی به مجموعهها در خانه، باید نمونهای از 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 که 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")
}
}
مشترک شدن در رویدادها
در Home API، از رویدادها برای تشخیص تغییرات در وضعیت دستگاه استفاده میشود.
برای مشترک شدن در رویدادهای دستگاهی خاص، یکی از سه
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
هستند و شناسه نهادی را که تغییر کرده است بههمراه دارند.
برای دریافت جریانی که رویدادهای موردنظرتان را تولید میکند،
روش stream() را
در HomeObjectsFlow<T>
تولیدشده توسط روش 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 -> {} } }