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:
Daniel Shokouhi 2022-09-24 13:04:31 -07:00 committed by GitHub
parent 7c6096634f
commit 603e411823
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 22 additions and 17 deletions

View File

@ -10,6 +10,8 @@ const val MAX_SKIPPED_UPDATED = 10
data class IBeacon(
var uuid: String,
var major: String,
var minor: String,
var distance: Double,
var rssi: Double,
var skippedUpdated: Int,
@ -28,16 +30,18 @@ class IBeaconMonitor {
var tmp: Map<String, IBeacon> = linkedMapOf()
for (existingBeacon in beacons) {
existingBeacon.skippedUpdated++
tmp += Pair(existingBeacon.uuid, existingBeacon)
tmp += Pair(name(existingBeacon.uuid, existingBeacon.major, existingBeacon.minor), existingBeacon)
}
for (newBeacon in newBeacons) {
val uuid = newBeacon.id1.toString()
val major = newBeacon.id2.toString()
val minor = newBeacon.id3.toString()
val distance = round(newBeacon.distance * 100) / 100
val rssi = newBeacon.runningAverageRssi
if (!tmp.contains(uuid)) { // we found a new beacon
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()
if (requireUpdate) {
@ -56,7 +60,8 @@ class IBeaconMonitor {
}
assert(sorted.count() == beacons.count())
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
) {
requireUpdate = true
@ -71,7 +76,7 @@ class IBeaconMonitor {
private fun sendUpdate(context: Context, tmp: List<IBeacon>) {
beacons = tmp
sensorManager!!.updateBeaconMonitoringSensor(context)
sensorManager.updateBeaconMonitoringSensor(context)
SensorWorker.start(context)
}
}

View File

@ -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"
}

View File

@ -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.MonitoringManager
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.BluetoothUtils
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.sensor.SensorSetting
import io.homeassistant.companion.android.database.sensor.SensorSettingType
import kotlinx.coroutines.runBlocking
import java.util.UUID
import kotlin.collections.ArrayList
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.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
@ -337,7 +337,7 @@ class BluetoothSensorManager : SensorManager {
if (state != "") state else lastState,
icon,
mapOf(
"id" to bleTransmitterDevice.uuid + "-" + bleTransmitterDevice.major + "-" + bleTransmitterDevice.minor,
"id" to name(bleTransmitterDevice.uuid, bleTransmitterDevice.major, bleTransmitterDevice.minor),
"Transmitting power" to bleTransmitterDevice.transmitPowerSetting,
"Advertise mode" to bleTransmitterDevice.advertiseModeSetting,
"Measured power" to bleTransmitterDevice.measuredPowerSetting,
@ -353,27 +353,22 @@ class BluetoothSensorManager : SensorManager {
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()) {
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(
context,
beaconMonitor,
state,
icon,
attr
attr,
forceUpdate = true
)
}