mirror of
https://github.com/home-assistant/android
synced 2024-07-22 19:04:20 +00:00
Breaking Change: Add major and minor to UUID for beacon attribute in beacon monitor (#2909)
* Add major and minor to UUID for beacon attribute * Review comments
This commit is contained in:
parent
7c6096634f
commit
603e411823
|
@ -10,6 +10,8 @@ const val MAX_SKIPPED_UPDATED = 10
|
||||||
|
|
||||||
data class IBeacon(
|
data class IBeacon(
|
||||||
var uuid: String,
|
var uuid: String,
|
||||||
|
var major: String,
|
||||||
|
var minor: String,
|
||||||
var distance: Double,
|
var distance: Double,
|
||||||
var rssi: Double,
|
var rssi: Double,
|
||||||
var skippedUpdated: Int,
|
var skippedUpdated: Int,
|
||||||
|
@ -28,16 +30,18 @@ class IBeaconMonitor {
|
||||||
var tmp: Map<String, IBeacon> = linkedMapOf()
|
var tmp: Map<String, IBeacon> = linkedMapOf()
|
||||||
for (existingBeacon in beacons) {
|
for (existingBeacon in beacons) {
|
||||||
existingBeacon.skippedUpdated++
|
existingBeacon.skippedUpdated++
|
||||||
tmp += Pair(existingBeacon.uuid, existingBeacon)
|
tmp += Pair(name(existingBeacon.uuid, existingBeacon.major, existingBeacon.minor), existingBeacon)
|
||||||
}
|
}
|
||||||
for (newBeacon in newBeacons) {
|
for (newBeacon in newBeacons) {
|
||||||
val uuid = newBeacon.id1.toString()
|
val uuid = newBeacon.id1.toString()
|
||||||
|
val major = newBeacon.id2.toString()
|
||||||
|
val minor = newBeacon.id3.toString()
|
||||||
val distance = round(newBeacon.distance * 100) / 100
|
val distance = round(newBeacon.distance * 100) / 100
|
||||||
val rssi = newBeacon.runningAverageRssi
|
val rssi = newBeacon.runningAverageRssi
|
||||||
if (!tmp.contains(uuid)) { // we found a new beacon
|
if (!tmp.contains(uuid)) { // we found a new beacon
|
||||||
requireUpdate = true
|
requireUpdate = true
|
||||||
}
|
}
|
||||||
tmp += Pair(uuid, IBeacon(uuid, distance, rssi, 0))
|
tmp += Pair(uuid, IBeacon(uuid, major, minor, distance, rssi, 0))
|
||||||
}
|
}
|
||||||
val sorted = sort(tmp.values).toMutableList()
|
val sorted = sort(tmp.values).toMutableList()
|
||||||
if (requireUpdate) {
|
if (requireUpdate) {
|
||||||
|
@ -56,7 +60,8 @@ class IBeaconMonitor {
|
||||||
}
|
}
|
||||||
assert(sorted.count() == beacons.count())
|
assert(sorted.count() == beacons.count())
|
||||||
beacons.forEachIndexed foreach@{ i, existingBeacon ->
|
beacons.forEachIndexed foreach@{ i, existingBeacon ->
|
||||||
if (sorted[i].uuid != existingBeacon.uuid || // the distance order switched
|
|
||||||
|
if (name(sorted[i].uuid, sorted[i].major, sorted[i].minor) != name(existingBeacon.uuid, existingBeacon.major, existingBeacon.minor) || // the distance order switched
|
||||||
kotlin.math.abs(sorted[i].distance - existingBeacon.distance) > 0.5 // the distance difference is greater than 0.5m
|
kotlin.math.abs(sorted[i].distance - existingBeacon.distance) > 0.5 // the distance difference is greater than 0.5m
|
||||||
) {
|
) {
|
||||||
requireUpdate = true
|
requireUpdate = true
|
||||||
|
@ -71,7 +76,7 @@ class IBeaconMonitor {
|
||||||
|
|
||||||
private fun sendUpdate(context: Context, tmp: List<IBeacon>) {
|
private fun sendUpdate(context: Context, tmp: List<IBeacon>) {
|
||||||
beacons = tmp
|
beacons = tmp
|
||||||
sensorManager!!.updateBeaconMonitoringSensor(context)
|
sensorManager.updateBeaconMonitoringSensor(context)
|
||||||
SensorWorker.start(context)
|
SensorWorker.start(context)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
package io.homeassistant.companion.android.bluetooth.ble
|
||||||
|
|
||||||
|
fun <T> name(uuid: T, major: T, minor: T): String {
|
||||||
|
return "$uuid $major.$minor"
|
||||||
|
}
|
|
@ -9,6 +9,7 @@ import io.homeassistant.companion.android.bluetooth.ble.IBeaconTransmitter
|
||||||
import io.homeassistant.companion.android.bluetooth.ble.KalmanFilter
|
import io.homeassistant.companion.android.bluetooth.ble.KalmanFilter
|
||||||
import io.homeassistant.companion.android.bluetooth.ble.MonitoringManager
|
import io.homeassistant.companion.android.bluetooth.ble.MonitoringManager
|
||||||
import io.homeassistant.companion.android.bluetooth.ble.TransmitterManager
|
import io.homeassistant.companion.android.bluetooth.ble.TransmitterManager
|
||||||
|
import io.homeassistant.companion.android.bluetooth.ble.name
|
||||||
import io.homeassistant.companion.android.common.bluetooth.BluetoothDevice
|
import io.homeassistant.companion.android.common.bluetooth.BluetoothDevice
|
||||||
import io.homeassistant.companion.android.common.bluetooth.BluetoothUtils
|
import io.homeassistant.companion.android.common.bluetooth.BluetoothUtils
|
||||||
import io.homeassistant.companion.android.common.bluetooth.BluetoothUtils.supportsTransmitter
|
import io.homeassistant.companion.android.common.bluetooth.BluetoothUtils.supportsTransmitter
|
||||||
|
@ -16,7 +17,6 @@ import io.homeassistant.companion.android.common.sensors.SensorManager
|
||||||
import io.homeassistant.companion.android.database.AppDatabase
|
import io.homeassistant.companion.android.database.AppDatabase
|
||||||
import io.homeassistant.companion.android.database.sensor.SensorSetting
|
import io.homeassistant.companion.android.database.sensor.SensorSetting
|
||||||
import io.homeassistant.companion.android.database.sensor.SensorSettingType
|
import io.homeassistant.companion.android.database.sensor.SensorSettingType
|
||||||
import kotlinx.coroutines.runBlocking
|
|
||||||
import java.util.UUID
|
import java.util.UUID
|
||||||
import kotlin.collections.ArrayList
|
import kotlin.collections.ArrayList
|
||||||
import io.homeassistant.companion.android.common.R as commonR
|
import io.homeassistant.companion.android.common.R as commonR
|
||||||
|
@ -295,7 +295,7 @@ class BluetoothSensorManager : SensorManager {
|
||||||
KalmanFilter.maxIterations = getSetting(context, beaconMonitor, SETTING_BEACON_MONITOR_FILTER_ITERATIONS, SensorSettingType.NUMBER, DEFAULT_BEACON_MONITOR_FILTER_ITERATIONS).toIntOrNull() ?: DEFAULT_BEACON_MONITOR_FILTER_ITERATIONS.toInt()
|
KalmanFilter.maxIterations = getSetting(context, beaconMonitor, SETTING_BEACON_MONITOR_FILTER_ITERATIONS, SensorSettingType.NUMBER, DEFAULT_BEACON_MONITOR_FILTER_ITERATIONS).toIntOrNull() ?: DEFAULT_BEACON_MONITOR_FILTER_ITERATIONS.toInt()
|
||||||
KalmanFilter.rssiMultiplier = getSetting(context, beaconMonitor, SETTING_BEACON_MONITOR_FILTER_RSSI_MULTIPLIER, SensorSettingType.NUMBER, DEFAULT_BEACON_MONITOR_FILTER_RSSI_MULTIPLIER).toDoubleOrNull() ?: DEFAULT_BEACON_MONITOR_FILTER_RSSI_MULTIPLIER.toDouble()
|
KalmanFilter.rssiMultiplier = getSetting(context, beaconMonitor, SETTING_BEACON_MONITOR_FILTER_RSSI_MULTIPLIER, SensorSettingType.NUMBER, DEFAULT_BEACON_MONITOR_FILTER_RSSI_MULTIPLIER).toDoubleOrNull() ?: DEFAULT_BEACON_MONITOR_FILTER_RSSI_MULTIPLIER.toDouble()
|
||||||
|
|
||||||
var restart = monitoringManager.isMonitoring() &&
|
val restart = monitoringManager.isMonitoring() &&
|
||||||
(monitoringManager.scanPeriod != scanPeriod || monitoringManager.scanInterval != scanInterval)
|
(monitoringManager.scanPeriod != scanPeriod || monitoringManager.scanInterval != scanInterval)
|
||||||
monitoringManager.scanPeriod = scanPeriod
|
monitoringManager.scanPeriod = scanPeriod
|
||||||
monitoringManager.scanInterval = scanInterval
|
monitoringManager.scanInterval = scanInterval
|
||||||
|
@ -337,7 +337,7 @@ class BluetoothSensorManager : SensorManager {
|
||||||
if (state != "") state else lastState,
|
if (state != "") state else lastState,
|
||||||
icon,
|
icon,
|
||||||
mapOf(
|
mapOf(
|
||||||
"id" to bleTransmitterDevice.uuid + "-" + bleTransmitterDevice.major + "-" + bleTransmitterDevice.minor,
|
"id" to name(bleTransmitterDevice.uuid, bleTransmitterDevice.major, bleTransmitterDevice.minor),
|
||||||
"Transmitting power" to bleTransmitterDevice.transmitPowerSetting,
|
"Transmitting power" to bleTransmitterDevice.transmitPowerSetting,
|
||||||
"Advertise mode" to bleTransmitterDevice.advertiseModeSetting,
|
"Advertise mode" to bleTransmitterDevice.advertiseModeSetting,
|
||||||
"Measured power" to bleTransmitterDevice.measuredPowerSetting,
|
"Measured power" to bleTransmitterDevice.measuredPowerSetting,
|
||||||
|
@ -353,27 +353,22 @@ class BluetoothSensorManager : SensorManager {
|
||||||
|
|
||||||
val icon = if (monitoringManager.isMonitoring()) "mdi:bluetooth" else "mdi:bluetooth-off"
|
val icon = if (monitoringManager.isMonitoring()) "mdi:bluetooth" else "mdi:bluetooth-off"
|
||||||
|
|
||||||
var state = if (!BluetoothUtils.isOn(context)) "Bluetooth is turned off" else if (monitoringManager.isMonitoring()) "Monitoring" else "Stopped"
|
val state = if (!BluetoothUtils.isOn(context)) "Bluetooth is turned off" else if (monitoringManager.isMonitoring()) "Monitoring" else "Stopped"
|
||||||
|
|
||||||
var attr: Map<String, Any?> = mapOf()
|
val attr = mutableMapOf<String, Any?>()
|
||||||
if (BluetoothUtils.isOn(context) && monitoringManager.isMonitoring()) {
|
if (BluetoothUtils.isOn(context) && monitoringManager.isMonitoring()) {
|
||||||
for (beacon: IBeacon in beaconMonitoringDevice.beacons) {
|
for (beacon: IBeacon in beaconMonitoringDevice.beacons) {
|
||||||
attr += Pair(beacon.uuid, beacon.distance)
|
attr += Pair(name(beacon.uuid, beacon.major, beacon.minor), beacon.distance)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// reset the last_sent_state of the sensor so it won't skip the update of attributes
|
|
||||||
val sensorDao = AppDatabase.getInstance(context).sensorDao()
|
|
||||||
runBlocking {
|
|
||||||
sensorDao.updateLastSentStateAndIcon(beaconMonitor.id, null, null)
|
|
||||||
}
|
|
||||||
|
|
||||||
onSensorUpdated(
|
onSensorUpdated(
|
||||||
context,
|
context,
|
||||||
beaconMonitor,
|
beaconMonitor,
|
||||||
state,
|
state,
|
||||||
icon,
|
icon,
|
||||||
attr
|
attr,
|
||||||
|
forceUpdate = true
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue