Skip to content

Commit

Permalink
Include support for colliding entityIds when using multi server withi…
Browse files Browse the repository at this point in the history
…n ClimateControl
  • Loading branch information
StopMotionCuber committed Feb 8, 2024
1 parent 067e374 commit 20c974e
Show file tree
Hide file tree
Showing 12 changed files with 32 additions and 48 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -32,11 +31,10 @@ object CameraControl : HaControl {
context: Context,
control: Control.StatefulBuilder,
entity: Entity<Map<String, Any>>,
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
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -41,8 +40,7 @@ object ClimateControl : HaControl {
context: Context,
control: Control.StatefulBuilder,
entity: Entity<Map<String, Any>>,
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
Expand All @@ -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,
Expand All @@ -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
Expand All @@ -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]!!,
Expand Down Expand Up @@ -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()
)
)
Expand All @@ -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)
Expand All @@ -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]
)
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -26,8 +25,7 @@ object CoverControl : HaControl {
context: Context,
control: Control.StatefulBuilder,
entity: Entity<Map<String, Any>>,
area: AreaRegistryResponse?,
baseUrl: String?
info: HaControlInfo
): Control.StatefulBuilder {
val position = entity.getCoverPosition()
control.setControlTemplate(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -21,8 +20,7 @@ object DefaultButtonControl : HaControl {
context: Context,
control: Control.StatefulBuilder,
entity: Entity<Map<String, Any>>,
area: AreaRegistryResponse?,
baseUrl: String?
info: HaControlInfo
): Control.StatefulBuilder {
control.setStatusText("")
control.setControlTemplate(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -20,8 +19,7 @@ object DefaultSliderControl : HaControl {
context: Context,
control: Control.StatefulBuilder,
entity: Entity<Map<String, Any>>,
area: AreaRegistryResponse?,
baseUrl: String?
info: HaControlInfo
): Control.StatefulBuilder {
control.setStatusText("")
control.setControlTemplate(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -24,8 +23,7 @@ object DefaultSwitchControl : HaControl {
context: Context,
control: Control.StatefulBuilder,
entity: Entity<Map<String, Any>>,
area: AreaRegistryResponse?,
baseUrl: String?
info: HaControlInfo
): Control.StatefulBuilder {
control.setControlTemplate(
ToggleTemplate(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -26,8 +25,7 @@ object FanControl : HaControl {
context: Context,
control: Control.StatefulBuilder,
entity: Entity<Map<String, Any>>,
area: AreaRegistryResponse?,
baseUrl: String?
info: HaControlInfo
): Control.StatefulBuilder {
if (entity.supportsFanSetSpeed()) {
val position = entity.getFanSpeed()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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<Map<String, Any>>,
area: AreaRegistryResponse?,
baseUrl: String?
info: HaControlInfo
): Control.StatefulBuilder

fun getDeviceType(entity: Entity<Map<String, Any>>): Int
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -20,8 +19,7 @@ object HaFailedControl : HaControl {
context: Context,
control: Control.StatefulBuilder,
entity: Entity<Map<String, Any>>,
area: AreaRegistryResponse?,
baseUrl: String?
info: HaControlInfo
): Control.StatefulBuilder {
control.setStatus(if (entity.state == "notfound") Control.STATUS_NOT_FOUND else Control.STATUS_ERROR)
control.setStatusText("")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -26,8 +25,7 @@ object LightControl : HaControl {
context: Context,
control: Control.StatefulBuilder,
entity: Entity<Map<String, Any>>,
area: AreaRegistryResponse?,
baseUrl: String?
info: HaControlInfo
): Control.StatefulBuilder {
val position = entity.getLightBrightness()
control.setControlTemplate(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -21,8 +20,7 @@ object LockControl : HaControl {
context: Context,
control: Control.StatefulBuilder,
entity: Entity<Map<String, Any>>,
area: AreaRegistryResponse?,
baseUrl: String?
info: HaControlInfo
): Control.StatefulBuilder {
control.setControlTemplate(
ToggleTemplate(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -24,8 +23,7 @@ object VacuumControl : HaControl {
context: Context,
control: Control.StatefulBuilder,
entity: Entity<Map<String, Any>>,
area: AreaRegistryResponse?,
baseUrl: String?
info: HaControlInfo
): Control.StatefulBuilder {
entitySupportedFeatures = entity.attributes["supported_features"] as Int
control.setControlTemplate(
Expand Down

0 comments on commit 20c974e

Please sign in to comment.