From 20c974e043958c3ced25f307cde2e5fab3c28252 Mon Sep 17 00:00:00 2001 From: ruben Date: Thu, 8 Feb 2024 23:19:51 +0100 Subject: [PATCH] Include support for colliding entityIds when using multi server within ClimateControl --- .../android/controls/CameraControl.kt | 8 ++--- .../android/controls/ClimateControl.kt | 30 +++++++++++-------- .../android/controls/CoverControl.kt | 4 +-- .../android/controls/DefaultButtonControl.kt | 4 +-- .../android/controls/DefaultSliderControl.kt | 4 +-- .../android/controls/DefaultSwitchControl.kt | 4 +-- .../companion/android/controls/FanControl.kt | 4 +-- .../companion/android/controls/HaControl.kt | 6 ++-- .../android/controls/HaFailedControl.kt | 4 +-- .../android/controls/LightControl.kt | 4 +-- .../companion/android/controls/LockControl.kt | 4 +-- .../android/controls/VacuumControl.kt | 4 +-- 12 files changed, 32 insertions(+), 48 deletions(-) diff --git a/app/src/main/java/io/homeassistant/companion/android/controls/CameraControl.kt b/app/src/main/java/io/homeassistant/companion/android/controls/CameraControl.kt index aa1569a294e..fe6dda70d60 100644 --- a/app/src/main/java/io/homeassistant/companion/android/controls/CameraControl.kt +++ b/app/src/main/java/io/homeassistant/companion/android/controls/CameraControl.kt @@ -14,7 +14,6 @@ import androidx.annotation.RequiresApi import io.homeassistant.companion.android.R import io.homeassistant.companion.android.common.data.integration.Entity import io.homeassistant.companion.android.common.data.integration.IntegrationRepository -import io.homeassistant.companion.android.common.data.websocket.impl.entities.AreaRegistryResponse import io.homeassistant.companion.android.common.util.STATE_UNAVAILABLE import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.runBlocking @@ -32,11 +31,10 @@ object CameraControl : HaControl { context: Context, control: Control.StatefulBuilder, entity: Entity>, - area: AreaRegistryResponse?, - baseUrl: String? + info: HaControlInfo ): Control.StatefulBuilder { - val image = if (baseUrl != null && (entity.attributes["entity_picture"] as? String)?.isNotBlank() == true) { - getThumbnail(baseUrl + entity.attributes["entity_picture"] as String) + val image = if (info.baseUrl != null && (entity.attributes["entity_picture"] as? String)?.isNotBlank() == true) { + getThumbnail(info.baseUrl + entity.attributes["entity_picture"] as String) } else { null } diff --git a/app/src/main/java/io/homeassistant/companion/android/controls/ClimateControl.kt b/app/src/main/java/io/homeassistant/companion/android/controls/ClimateControl.kt index 9d80706e3f8..822db10ca55 100644 --- a/app/src/main/java/io/homeassistant/companion/android/controls/ClimateControl.kt +++ b/app/src/main/java/io/homeassistant/companion/android/controls/ClimateControl.kt @@ -14,7 +14,6 @@ import android.service.controls.templates.ToggleRangeTemplate import androidx.annotation.RequiresApi import io.homeassistant.companion.android.common.data.integration.Entity import io.homeassistant.companion.android.common.data.integration.IntegrationRepository -import io.homeassistant.companion.android.common.data.websocket.impl.entities.AreaRegistryResponse import io.homeassistant.companion.android.common.R as commonR @RequiresApi(Build.VERSION_CODES.R) @@ -41,8 +40,7 @@ object ClimateControl : HaControl { context: Context, control: Control.StatefulBuilder, entity: Entity>, - area: AreaRegistryResponse?, - baseUrl: String? + info: HaControlInfo ): Control.StatefulBuilder { val minValue = (entity.attributes["min_temp"] as? Number)?.toFloat() ?: 0f val maxValue = (entity.attributes["max_temp"] as? Number)?.toFloat() ?: 100f @@ -65,7 +63,7 @@ object ClimateControl : HaControl { } val temperatureFormatSize = if (temperatureStepSize < 1f) "1" else "0" val rangeTemplate = RangeTemplate( - entity.entityId, + info.systemId, minValue, maxValue, currentValue, @@ -75,7 +73,7 @@ object ClimateControl : HaControl { if (entityShouldBePresentedAsThermostat(entity)) { val state = ClimateState(entity.state, ArrayList()) val toggleRangeTemplate = ToggleRangeTemplate( - entity.entityId + "_range", + info.systemId + "_range", true, context.getString(commonR.string.widget_tap_action_toggle), rangeTemplate @@ -85,10 +83,10 @@ object ClimateControl : HaControl { modesFlag = modesFlag or temperatureControlModeFlags[it]!! state.supportedModes.add(it) } - this.climateStates[entity.entityId] = state + this.climateStates[info.systemId] = state control.setControlTemplate( TemperatureControlTemplate( - entity.entityId, + info.systemId, toggleRangeTemplate, temperatureControlModes[entity.state]!!, temperatureControlModes[entity.state]!!, @@ -116,13 +114,18 @@ object ClimateControl : HaControl { integrationRepository: IntegrationRepository, action: ControlAction ): Boolean { + val entityStr: String = if (action.templateId.split(".").size > 2) { + action.templateId.split(".", limit = 2)[1] + } else { + action.templateId + } return when (action) { is FloatAction -> { integrationRepository.callService( - action.templateId.split(".")[0], + entityStr.split(".")[0], "set_temperature", hashMapOf( - "entity_id" to action.templateId, + "entity_id" to entityStr, "temperature" to (action as? FloatAction)?.newValue.toString() ) ) @@ -133,7 +136,7 @@ object ClimateControl : HaControl { action.templateId.split(".")[0], "set_hvac_mode", hashMapOf( - "entity_id" to action.templateId, + "entity_id" to entityStr, "hvac_mode" to ( temperatureControlModes.entries.find { it.value == ((action as? ModeAction)?.newMode ?: -1) @@ -144,14 +147,17 @@ object ClimateControl : HaControl { true } is BooleanAction -> { + if (this.climateStates[action.templateId] == null) { + return false + } val supportedModes = this.climateStates[action.templateId]!!.supportedModes val currentMode = this.climateStates[action.templateId]!!.currentMode val nextMode = (supportedModes.indexOf(currentMode) + 1) % supportedModes.count() integrationRepository.callService( - action.templateId.split(".")[0], + entityStr.split(".")[0], "set_hvac_mode", hashMapOf( - "entity_id" to action.templateId, + "entity_id" to entityStr, "hvac_mode" to supportedModes[nextMode] ) ) diff --git a/app/src/main/java/io/homeassistant/companion/android/controls/CoverControl.kt b/app/src/main/java/io/homeassistant/companion/android/controls/CoverControl.kt index 52ea1289bb2..94ac0b07cab 100644 --- a/app/src/main/java/io/homeassistant/companion/android/controls/CoverControl.kt +++ b/app/src/main/java/io/homeassistant/companion/android/controls/CoverControl.kt @@ -16,7 +16,6 @@ import io.homeassistant.companion.android.common.data.integration.Entity import io.homeassistant.companion.android.common.data.integration.IntegrationRepository import io.homeassistant.companion.android.common.data.integration.getCoverPosition import io.homeassistant.companion.android.common.data.integration.isActive -import io.homeassistant.companion.android.common.data.websocket.impl.entities.AreaRegistryResponse import io.homeassistant.companion.android.common.R as commonR @RequiresApi(Build.VERSION_CODES.R) @@ -26,8 +25,7 @@ object CoverControl : HaControl { context: Context, control: Control.StatefulBuilder, entity: Entity>, - area: AreaRegistryResponse?, - baseUrl: String? + info: HaControlInfo ): Control.StatefulBuilder { val position = entity.getCoverPosition() control.setControlTemplate( diff --git a/app/src/main/java/io/homeassistant/companion/android/controls/DefaultButtonControl.kt b/app/src/main/java/io/homeassistant/companion/android/controls/DefaultButtonControl.kt index e2ee174deb9..847eddb70d9 100644 --- a/app/src/main/java/io/homeassistant/companion/android/controls/DefaultButtonControl.kt +++ b/app/src/main/java/io/homeassistant/companion/android/controls/DefaultButtonControl.kt @@ -10,7 +10,6 @@ import androidx.annotation.RequiresApi import io.homeassistant.companion.android.common.data.integration.Entity import io.homeassistant.companion.android.common.data.integration.IntegrationRepository import io.homeassistant.companion.android.common.data.integration.domain -import io.homeassistant.companion.android.common.data.websocket.impl.entities.AreaRegistryResponse import io.homeassistant.companion.android.common.util.capitalize import java.util.Locale import io.homeassistant.companion.android.common.R as commonR @@ -21,8 +20,7 @@ object DefaultButtonControl : HaControl { context: Context, control: Control.StatefulBuilder, entity: Entity>, - area: AreaRegistryResponse?, - baseUrl: String? + info: HaControlInfo ): Control.StatefulBuilder { control.setStatusText("") control.setControlTemplate( diff --git a/app/src/main/java/io/homeassistant/companion/android/controls/DefaultSliderControl.kt b/app/src/main/java/io/homeassistant/companion/android/controls/DefaultSliderControl.kt index f8d859d72ba..31e86cc3f84 100644 --- a/app/src/main/java/io/homeassistant/companion/android/controls/DefaultSliderControl.kt +++ b/app/src/main/java/io/homeassistant/companion/android/controls/DefaultSliderControl.kt @@ -10,7 +10,6 @@ import android.service.controls.templates.RangeTemplate import androidx.annotation.RequiresApi import io.homeassistant.companion.android.common.data.integration.Entity import io.homeassistant.companion.android.common.data.integration.IntegrationRepository -import io.homeassistant.companion.android.common.data.websocket.impl.entities.AreaRegistryResponse import kotlinx.coroutines.runBlocking import io.homeassistant.companion.android.common.R as commonR @@ -20,8 +19,7 @@ object DefaultSliderControl : HaControl { context: Context, control: Control.StatefulBuilder, entity: Entity>, - area: AreaRegistryResponse?, - baseUrl: String? + info: HaControlInfo ): Control.StatefulBuilder { control.setStatusText("") control.setControlTemplate( diff --git a/app/src/main/java/io/homeassistant/companion/android/controls/DefaultSwitchControl.kt b/app/src/main/java/io/homeassistant/companion/android/controls/DefaultSwitchControl.kt index a4873828c5d..78646cb3720 100644 --- a/app/src/main/java/io/homeassistant/companion/android/controls/DefaultSwitchControl.kt +++ b/app/src/main/java/io/homeassistant/companion/android/controls/DefaultSwitchControl.kt @@ -13,7 +13,6 @@ import io.homeassistant.companion.android.common.data.integration.Entity import io.homeassistant.companion.android.common.data.integration.IntegrationRepository import io.homeassistant.companion.android.common.data.integration.domain import io.homeassistant.companion.android.common.data.integration.isActive -import io.homeassistant.companion.android.common.data.websocket.impl.entities.AreaRegistryResponse import io.homeassistant.companion.android.common.util.capitalize import java.util.Locale import io.homeassistant.companion.android.common.R as commonR @@ -24,8 +23,7 @@ object DefaultSwitchControl : HaControl { context: Context, control: Control.StatefulBuilder, entity: Entity>, - area: AreaRegistryResponse?, - baseUrl: String? + info: HaControlInfo ): Control.StatefulBuilder { control.setControlTemplate( ToggleTemplate( diff --git a/app/src/main/java/io/homeassistant/companion/android/controls/FanControl.kt b/app/src/main/java/io/homeassistant/companion/android/controls/FanControl.kt index a7821a972eb..5d619f453ce 100644 --- a/app/src/main/java/io/homeassistant/companion/android/controls/FanControl.kt +++ b/app/src/main/java/io/homeassistant/companion/android/controls/FanControl.kt @@ -17,7 +17,6 @@ import io.homeassistant.companion.android.common.data.integration.IntegrationRep import io.homeassistant.companion.android.common.data.integration.getFanSpeed import io.homeassistant.companion.android.common.data.integration.isActive import io.homeassistant.companion.android.common.data.integration.supportsFanSetSpeed -import io.homeassistant.companion.android.common.data.websocket.impl.entities.AreaRegistryResponse import io.homeassistant.companion.android.common.R as commonR @RequiresApi(Build.VERSION_CODES.R) @@ -26,8 +25,7 @@ object FanControl : HaControl { context: Context, control: Control.StatefulBuilder, entity: Entity>, - area: AreaRegistryResponse?, - baseUrl: String? + info: HaControlInfo ): Control.StatefulBuilder { if (entity.supportsFanSetSpeed()) { val position = entity.getFanSpeed() diff --git a/app/src/main/java/io/homeassistant/companion/android/controls/HaControl.kt b/app/src/main/java/io/homeassistant/companion/android/controls/HaControl.kt index eee7394a999..41e53730f6d 100644 --- a/app/src/main/java/io/homeassistant/companion/android/controls/HaControl.kt +++ b/app/src/main/java/io/homeassistant/companion/android/controls/HaControl.kt @@ -17,7 +17,6 @@ import io.homeassistant.companion.android.common.data.integration.Entity import io.homeassistant.companion.android.common.data.integration.IntegrationRepository import io.homeassistant.companion.android.common.data.integration.domain import io.homeassistant.companion.android.common.data.integration.friendlyState -import io.homeassistant.companion.android.common.data.websocket.impl.entities.AreaRegistryResponse import io.homeassistant.companion.android.webview.WebViewActivity @RequiresApi(Build.VERSION_CODES.R) @@ -77,15 +76,14 @@ interface HaControl { } } - return provideControlFeatures(context, control, entity, info.area, info.baseUrl).build() + return provideControlFeatures(context, control, entity, info).build() } fun provideControlFeatures( context: Context, control: Control.StatefulBuilder, entity: Entity>, - area: AreaRegistryResponse?, - baseUrl: String? + info: HaControlInfo ): Control.StatefulBuilder fun getDeviceType(entity: Entity>): Int diff --git a/app/src/main/java/io/homeassistant/companion/android/controls/HaFailedControl.kt b/app/src/main/java/io/homeassistant/companion/android/controls/HaFailedControl.kt index 33b79b81474..e833f02645b 100644 --- a/app/src/main/java/io/homeassistant/companion/android/controls/HaFailedControl.kt +++ b/app/src/main/java/io/homeassistant/companion/android/controls/HaFailedControl.kt @@ -10,7 +10,6 @@ import androidx.annotation.RequiresApi import io.homeassistant.companion.android.common.data.integration.Entity import io.homeassistant.companion.android.common.data.integration.IntegrationRepository import io.homeassistant.companion.android.common.data.integration.domain -import io.homeassistant.companion.android.common.data.websocket.impl.entities.AreaRegistryResponse import io.homeassistant.companion.android.common.util.capitalize import java.util.Locale @@ -20,8 +19,7 @@ object HaFailedControl : HaControl { context: Context, control: Control.StatefulBuilder, entity: Entity>, - area: AreaRegistryResponse?, - baseUrl: String? + info: HaControlInfo ): Control.StatefulBuilder { control.setStatus(if (entity.state == "notfound") Control.STATUS_NOT_FOUND else Control.STATUS_ERROR) control.setStatusText("") diff --git a/app/src/main/java/io/homeassistant/companion/android/controls/LightControl.kt b/app/src/main/java/io/homeassistant/companion/android/controls/LightControl.kt index 9202a5416e6..b4c599ec76c 100644 --- a/app/src/main/java/io/homeassistant/companion/android/controls/LightControl.kt +++ b/app/src/main/java/io/homeassistant/companion/android/controls/LightControl.kt @@ -17,7 +17,6 @@ import io.homeassistant.companion.android.common.data.integration.IntegrationRep import io.homeassistant.companion.android.common.data.integration.getLightBrightness import io.homeassistant.companion.android.common.data.integration.isActive import io.homeassistant.companion.android.common.data.integration.supportsLightBrightness -import io.homeassistant.companion.android.common.data.websocket.impl.entities.AreaRegistryResponse import io.homeassistant.companion.android.common.R as commonR @RequiresApi(Build.VERSION_CODES.R) @@ -26,8 +25,7 @@ object LightControl : HaControl { context: Context, control: Control.StatefulBuilder, entity: Entity>, - area: AreaRegistryResponse?, - baseUrl: String? + info: HaControlInfo ): Control.StatefulBuilder { val position = entity.getLightBrightness() control.setControlTemplate( diff --git a/app/src/main/java/io/homeassistant/companion/android/controls/LockControl.kt b/app/src/main/java/io/homeassistant/companion/android/controls/LockControl.kt index c33058ad124..4abeb6c6eb0 100644 --- a/app/src/main/java/io/homeassistant/companion/android/controls/LockControl.kt +++ b/app/src/main/java/io/homeassistant/companion/android/controls/LockControl.kt @@ -12,7 +12,6 @@ import androidx.annotation.RequiresApi import io.homeassistant.companion.android.common.data.integration.Entity import io.homeassistant.companion.android.common.data.integration.IntegrationRepository import io.homeassistant.companion.android.common.data.integration.isActive -import io.homeassistant.companion.android.common.data.websocket.impl.entities.AreaRegistryResponse import io.homeassistant.companion.android.common.R as commonR @RequiresApi(Build.VERSION_CODES.R) @@ -21,8 +20,7 @@ object LockControl : HaControl { context: Context, control: Control.StatefulBuilder, entity: Entity>, - area: AreaRegistryResponse?, - baseUrl: String? + info: HaControlInfo ): Control.StatefulBuilder { control.setControlTemplate( ToggleTemplate( diff --git a/app/src/main/java/io/homeassistant/companion/android/controls/VacuumControl.kt b/app/src/main/java/io/homeassistant/companion/android/controls/VacuumControl.kt index 582bb2a5373..8bd67d1de4e 100644 --- a/app/src/main/java/io/homeassistant/companion/android/controls/VacuumControl.kt +++ b/app/src/main/java/io/homeassistant/companion/android/controls/VacuumControl.kt @@ -12,7 +12,6 @@ import androidx.annotation.RequiresApi import io.homeassistant.companion.android.common.data.integration.Entity import io.homeassistant.companion.android.common.data.integration.IntegrationRepository import io.homeassistant.companion.android.common.data.integration.isActive -import io.homeassistant.companion.android.common.data.websocket.impl.entities.AreaRegistryResponse import io.homeassistant.companion.android.common.R as commonR @RequiresApi(Build.VERSION_CODES.R) @@ -24,8 +23,7 @@ object VacuumControl : HaControl { context: Context, control: Control.StatefulBuilder, entity: Entity>, - area: AreaRegistryResponse?, - baseUrl: String? + info: HaControlInfo ): Control.StatefulBuilder { entitySupportedFeatures = entity.attributes["supported_features"] as Int control.setControlTemplate(