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 44a9486 commit 44fb3c5
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 @@ -15,7 +15,6 @@ import io.homeassistant.companion.android.R
import io.homeassistant.companion.android.common.R as commonR
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 java.net.URL
import java.util.concurrent.TimeUnit
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 @@ -15,7 +15,6 @@ import androidx.annotation.RequiresApi
import io.homeassistant.companion.android.common.R as commonR
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

@RequiresApi(Build.VERSION_CODES.R)
object ClimateControl : HaControl {
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 @@ -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.getCoverPosition
import io.homeassistant.companion.android.common.data.integration.isActive
import io.homeassistant.companion.android.common.data.websocket.impl.entities.AreaRegistryResponse

@RequiresApi(Build.VERSION_CODES.R)
object CoverControl : HaControl {
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 @@ -11,7 +11,6 @@ import io.homeassistant.companion.android.common.R as commonR
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 @@ -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 @@ -11,7 +11,6 @@ import androidx.annotation.RequiresApi
import io.homeassistant.companion.android.common.R as commonR
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

@RequiresApi(Build.VERSION_CODES.R)
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 @@ -14,7 +14,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

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 @@ -18,16 +18,14 @@ 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

@RequiresApi(Build.VERSION_CODES.R)
object FanControl : HaControl {
override fun provideControlFeatures(
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 @@ -18,16 +18,14 @@ 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

@RequiresApi(Build.VERSION_CODES.R)
object LightControl : HaControl {
override fun provideControlFeatures(
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 @@ -13,16 +13,14 @@ import io.homeassistant.companion.android.common.R as commonR
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

@RequiresApi(Build.VERSION_CODES.R)
object LockControl : HaControl {
override fun provideControlFeatures(
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 @@ -13,7 +13,6 @@ import io.homeassistant.companion.android.common.R as commonR
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

@RequiresApi(Build.VERSION_CODES.R)
object VacuumControl : HaControl {
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 44fb3c5

Please sign in to comment.