در API های Home، مشاهده تغییرات حالت در خانه با استفاده از جریان ها در Kotlin امکان پذیر است. مشاهده تغییرات در ساختارها، اتاقها، فرادادههای دستگاه و وضعیت دستگاه در APIهای Home میتواند با هر 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" }!!
ردیابی تغییرات به یک ویژگی خاص در یک دستگاه
از هر ویژگی پشتیبانی شده توسط دستگاه و APIهای Home استفاده کنید. برای فهرست کامل، Trait
ببینید.
device.trait(OnOff).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
}
}