From 603e4118233c8d54e66571ac760a13e46413e136 Mon Sep 17 00:00:00 2001 From: Daniel Shokouhi Date: Sat, 24 Sep 2022 13:04:31 -0700 Subject: [PATCH] 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 --- .../android/bluetooth/ble/IBeaconMonitor.kt | 13 ++++++++---- .../bluetooth/ble/IBeaconNameFormat.kt | 5 +++++ .../android/sensors/BluetoothSensorManager.kt | 21 +++++++------------ 3 files changed, 22 insertions(+), 17 deletions(-) create mode 100755 app/src/main/java/io/homeassistant/companion/android/bluetooth/ble/IBeaconNameFormat.kt diff --git a/app/src/main/java/io/homeassistant/companion/android/bluetooth/ble/IBeaconMonitor.kt b/app/src/main/java/io/homeassistant/companion/android/bluetooth/ble/IBeaconMonitor.kt index 96c27ec1b..0da7f9e21 100644 --- a/app/src/main/java/io/homeassistant/companion/android/bluetooth/ble/IBeaconMonitor.kt +++ b/app/src/main/java/io/homeassistant/companion/android/bluetooth/ble/IBeaconMonitor.kt @@ -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 = 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) { beacons = tmp - sensorManager!!.updateBeaconMonitoringSensor(context) + sensorManager.updateBeaconMonitoringSensor(context) SensorWorker.start(context) } } diff --git a/app/src/main/java/io/homeassistant/companion/android/bluetooth/ble/IBeaconNameFormat.kt b/app/src/main/java/io/homeassistant/companion/android/bluetooth/ble/IBeaconNameFormat.kt new file mode 100755 index 000000000..860613f88 --- /dev/null +++ b/app/src/main/java/io/homeassistant/companion/android/bluetooth/ble/IBeaconNameFormat.kt @@ -0,0 +1,5 @@ +package io.homeassistant.companion.android.bluetooth.ble + +fun name(uuid: T, major: T, minor: T): String { + return "$uuid $major.$minor" +} diff --git a/app/src/main/java/io/homeassistant/companion/android/sensors/BluetoothSensorManager.kt b/app/src/main/java/io/homeassistant/companion/android/sensors/BluetoothSensorManager.kt index dee5f3d7f..fde52f671 100644 --- a/app/src/main/java/io/homeassistant/companion/android/sensors/BluetoothSensorManager.kt +++ b/app/src/main/java/io/homeassistant/companion/android/sensors/BluetoothSensorManager.kt @@ -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 = mapOf() + val attr = mutableMapOf() 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 ) }