Always send sensor registration device class + entity category to prevent errors due to old registration (#3977)

* Always send device class during registration

 - Always send the device class for a sensor during registration to overwrite any existing invalid values

* Only send sensor registrations with null properties to core 2023.2+
This commit is contained in:
Joris Pelgröm 2023-10-28 17:18:03 +02:00 committed by GitHub
parent 7d76bb4b51
commit e8815f12e5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 60 additions and 25 deletions

View file

@ -20,7 +20,8 @@ import io.homeassistant.companion.android.common.data.integration.impl.entities.
import io.homeassistant.companion.android.common.data.integration.impl.entities.RateLimitRequest
import io.homeassistant.companion.android.common.data.integration.impl.entities.RateLimitResponse
import io.homeassistant.companion.android.common.data.integration.impl.entities.RegisterDeviceRequest
import io.homeassistant.companion.android.common.data.integration.impl.entities.SensorRequest
import io.homeassistant.companion.android.common.data.integration.impl.entities.SensorRegistrationRequest
import io.homeassistant.companion.android.common.data.integration.impl.entities.SensorUpdateRequest
import io.homeassistant.companion.android.common.data.integration.impl.entities.ServiceCallRequest
import io.homeassistant.companion.android.common.data.integration.impl.entities.Template
import io.homeassistant.companion.android.common.data.integration.impl.entities.UpdateLocationRequest
@ -700,30 +701,33 @@ class IntegrationRepositoryImpl @AssistedInject constructor(
val canRegisterCategoryStateClass = server.version?.isAtLeast(2021, 11, 0) == true
val canRegisterEntityDisabledState = server.version?.isAtLeast(2022, 6, 0) == true
val canRegisterDeviceClassDistance = server.version?.isAtLeast(2022, 10, 0) == true
val canRegisterNullProperties = server.version?.isAtLeast(2023, 2, 0) == true
val registrationData = SensorRegistrationRequest(
sensorRegistration.uniqueId,
if (canRegisterEntityDisabledState && sensorRegistration.disabled) {
null
} else if (sensorRegistration.state is String) {
sensorRegistration.state.ifBlank { null }
} else {
sensorRegistration.state
},
sensorRegistration.type,
sensorRegistration.icon,
sensorRegistration.attributes,
sensorRegistration.name,
when (sensorRegistration.deviceClass) {
"distance" -> if (canRegisterDeviceClassDistance) sensorRegistration.deviceClass else null
else -> sensorRegistration.deviceClass
},
sensorRegistration.unitOfMeasurement,
if (canRegisterCategoryStateClass) sensorRegistration.stateClass else null,
if (canRegisterCategoryStateClass) sensorRegistration.entityCategory else null,
if (canRegisterEntityDisabledState) sensorRegistration.disabled else null
)
val integrationRequest = IntegrationRequest(
"register_sensor",
SensorRequest(
sensorRegistration.uniqueId,
if (canRegisterEntityDisabledState && sensorRegistration.disabled) {
null
} else if (sensorRegistration.state is String) {
sensorRegistration.state.ifBlank { null }
} else {
sensorRegistration.state
},
sensorRegistration.type,
sensorRegistration.icon,
sensorRegistration.attributes,
sensorRegistration.name,
when (sensorRegistration.deviceClass) {
"distance" -> if (canRegisterDeviceClassDistance) sensorRegistration.deviceClass else null
else -> sensorRegistration.deviceClass
},
sensorRegistration.unitOfMeasurement,
if (canRegisterCategoryStateClass) sensorRegistration.stateClass else null,
if (canRegisterCategoryStateClass) sensorRegistration.entityCategory else null,
if (canRegisterEntityDisabledState) sensorRegistration.disabled else null
)
if (canRegisterNullProperties) registrationData else registrationData.toLegacy()
)
var causeException: Exception? = null
@ -751,7 +755,7 @@ class IntegrationRepositoryImpl @AssistedInject constructor(
val integrationRequest = IntegrationRequest(
"update_sensor_states",
sensors.map {
SensorRequest(
SensorUpdateRequest(
it.uniqueId,
if (it.state is String) it.state.ifBlank { null } else it.state,
it.type,

View file

@ -3,7 +3,30 @@ package io.homeassistant.companion.android.common.data.integration.impl.entities
import com.fasterxml.jackson.annotation.JsonInclude
@JsonInclude(JsonInclude.Include.NON_NULL)
data class SensorRequest<T>(
data class SensorRegistrationRequest<T>(
val uniqueId: String,
@JsonInclude(JsonInclude.Include.ALWAYS)
val state: T,
val type: String,
val icon: String,
val attributes: Map<String, Any>,
val name: String? = null,
@JsonInclude(JsonInclude.Include.ALWAYS) // Always to override incorrect value from old registration
val deviceClass: String? = null,
val unitOfMeasurement: String? = null,
val stateClass: String? = null,
@JsonInclude(JsonInclude.Include.ALWAYS) // Always to override incorrect value from old registration
val entityCategory: String? = null,
val disabled: Boolean? = null
) {
/** @return [SensorRegistrationRequestLegacy] for core < 2023.2 which doesn't accept null properties */
fun toLegacy(): SensorRegistrationRequestLegacy<T> = SensorRegistrationRequestLegacy(
uniqueId, state, type, icon, attributes, name, deviceClass, unitOfMeasurement, stateClass, entityCategory, disabled
)
}
@JsonInclude(JsonInclude.Include.NON_NULL)
data class SensorRegistrationRequestLegacy<T>(
val uniqueId: String,
@JsonInclude(JsonInclude.Include.ALWAYS)
val state: T,
@ -17,3 +40,11 @@ data class SensorRequest<T>(
val entityCategory: String? = null,
val disabled: Boolean? = null
)
data class SensorUpdateRequest<T>(
val uniqueId: String,
val state: T,
val type: String,
val icon: String,
val attributes: Map<String, Any>
)