diff --git a/app/src/full/java/io/homeassistant/companion/android/sensors/GeocodeSensorManager.kt b/app/src/full/java/io/homeassistant/companion/android/sensors/GeocodeSensorManager.kt index ff0ea2167..1dfbb0454 100644 --- a/app/src/full/java/io/homeassistant/companion/android/sensors/GeocodeSensorManager.kt +++ b/app/src/full/java/io/homeassistant/companion/android/sensors/GeocodeSensorManager.kt @@ -71,7 +71,8 @@ class GeocodeSensorManager : SensorManager { "Country" to it.countryName, "ISO Country Code" to it.countryCode, "Locality" to it.locality, - "Location" to listOf(it.latitude, it.longitude), + "Latitude" to it.latitude, + "Longitude" to it.longitude, "Postal Code" to it.postalCode, "Sub Administrative Area" to it.subAdminArea, "Sub Locality" to it.subLocality, diff --git a/app/src/full/java/io/homeassistant/companion/android/sensors/LocationSensorManager.kt b/app/src/full/java/io/homeassistant/companion/android/sensors/LocationSensorManager.kt index 46b17eb71..e9ec5fd22 100644 --- a/app/src/full/java/io/homeassistant/companion/android/sensors/LocationSensorManager.kt +++ b/app/src/full/java/io/homeassistant/companion/android/sensors/LocationSensorManager.kt @@ -308,7 +308,7 @@ class LocationSensorManager : BroadcastReceiver(), SensorManager { Log.d(TAG, "Not requesting accurate location, last accurate location was too recent") return } - sensorDao.add(Attribute(backgroundLocation.id, "lastAccurateLocationRequest", now.toString())) + sensorDao.add(Attribute(backgroundLocation.id, "lastAccurateLocationRequest", now.toString(), "string")) val maxRetries = 5 val request = createLocationRequest() diff --git a/app/src/main/java/io/homeassistant/companion/android/database/AppDatabase.kt b/app/src/main/java/io/homeassistant/companion/android/database/AppDatabase.kt index b6857cfa0..658165f0c 100644 --- a/app/src/main/java/io/homeassistant/companion/android/database/AppDatabase.kt +++ b/app/src/main/java/io/homeassistant/companion/android/database/AppDatabase.kt @@ -30,7 +30,7 @@ import io.homeassistant.companion.android.database.widget.TemplateWidgetEntity StaticWidgetEntity::class, TemplateWidgetEntity::class ], - version = 7 + version = 8 ) abstract class AppDatabase : RoomDatabase() { abstract fun authenticationDao(): AuthenticationDao @@ -62,7 +62,8 @@ abstract class AppDatabase : RoomDatabase() { MIGRATION_3_4, MIGRATION_4_5, MIGRATION_5_6, - MIGRATION_6_7 + MIGRATION_6_7, + MIGRATION_7_8 ) .build() } @@ -156,5 +157,10 @@ abstract class AppDatabase : RoomDatabase() { database.execSQL("CREATE TABLE IF NOT EXISTS `sensor_attributes` (`sensor_id` TEXT NOT NULL, `name` TEXT NOT NULL, `value` TEXT NOT NULL, PRIMARY KEY(`sensor_id`, `name`))") } } + private val MIGRATION_7_8 = object : Migration(7, 8) { + override fun migrate(database: SupportSQLiteDatabase) { + database.execSQL("ALTER TABLE `sensor_attributes` ADD `value_type` TEXT NOT NULL DEFAULT 'string'") + } + } } } diff --git a/app/src/main/java/io/homeassistant/companion/android/database/sensor/Attribute.kt b/app/src/main/java/io/homeassistant/companion/android/database/sensor/Attribute.kt index 0fdde0202..0eaa2800f 100644 --- a/app/src/main/java/io/homeassistant/companion/android/database/sensor/Attribute.kt +++ b/app/src/main/java/io/homeassistant/companion/android/database/sensor/Attribute.kt @@ -10,5 +10,7 @@ data class Attribute( @ColumnInfo(name = "name") val name: String, @ColumnInfo(name = "value") - val value: String + var value: String, + @ColumnInfo(name = "value_type") + var valueType: String ) diff --git a/app/src/main/java/io/homeassistant/companion/android/database/sensor/SensorWithAttributes.kt b/app/src/main/java/io/homeassistant/companion/android/database/sensor/SensorWithAttributes.kt index 5b3647f16..44371b290 100644 --- a/app/src/main/java/io/homeassistant/companion/android/database/sensor/SensorWithAttributes.kt +++ b/app/src/main/java/io/homeassistant/companion/android/database/sensor/SensorWithAttributes.kt @@ -14,7 +14,16 @@ data class SensorWithAttributes( val attributes: List ) { fun toSensorRegistration(): SensorRegistration { - val attributes = attributes.map { it.name to it.value }.toMap() + val attributes = attributes.map { + val attributeValue = when (it.valueType) { + "boolean" -> it.value.toBoolean() + "float" -> it.value.toFloat() + "int" -> it.value.toInt() + "string" -> it.value + else -> throw IllegalArgumentException("Attribute: ${it.name} is of unknown type: ${it.valueType}") + } + it.name to attributeValue + }.toMap() val state = when (sensor.stateType) { "" -> "" "boolean" -> sensor.state.toBoolean() diff --git a/app/src/main/java/io/homeassistant/companion/android/sensors/SensorManager.kt b/app/src/main/java/io/homeassistant/companion/android/sensors/SensorManager.kt index 445363278..c2cea1ad3 100644 --- a/app/src/main/java/io/homeassistant/companion/android/sensors/SensorManager.kt +++ b/app/src/main/java/io/homeassistant/companion/android/sensors/SensorManager.kt @@ -67,7 +67,6 @@ interface SensorManager { ) { val sensorDao = AppDatabase.getInstance(context).sensorDao() val sensor = sensorDao.get(basicSensor.id) ?: return - sensor.id = basicSensor.id sensor.state = state.toString() sensor.stateType = when (state) { @@ -84,10 +83,24 @@ interface SensorManager { sensor.unitOfMeasurement = basicSensor.unitOfMeasurement sensorDao.update(sensor) - sensorDao.clearAttributes(basicSensor.id) - attributes.entries.forEach { entry -> - sensorDao.add(Attribute(basicSensor.id, entry.key, entry.value.toString())) + + for (item in attributes) { + val valueType = when (item.value) { + is Boolean -> "boolean" + is Int -> "int" + is Number -> "float" + else -> "string" // Always default to String for attributes + } + + sensorDao.add( + Attribute( + basicSensor.id, + item.key, + item.value.toString(), + valueType + ) + ) } } }