From 0148c65284e454209e1ce99865772a9ab1c95aa5 Mon Sep 17 00:00:00 2001 From: Wouter van der Wal <33957974+wjtje@users.noreply.github.com> Date: Tue, 30 Aug 2022 02:27:02 +0200 Subject: [PATCH] Calculate fan speed step count (#2818) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Calculate fan speed step count * Fix linting issues * Fixed wrong function name in log text Co-authored-by: Joris Pelgröm Co-authored-by: Joris Pelgröm --- .../android/common/data/integration/Entity.kt | 21 ++++++++++++++++++- .../android/home/views/DetailsPanelView.kt | 4 +++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/common/src/main/java/io/homeassistant/companion/android/common/data/integration/Entity.kt b/common/src/main/java/io/homeassistant/companion/android/common/data/integration/Entity.kt index 9d42529f6..dfb18e707 100644 --- a/common/src/main/java/io/homeassistant/companion/android/common/data/integration/Entity.kt +++ b/common/src/main/java/io/homeassistant/companion/android/common/data/integration/Entity.kt @@ -3,6 +3,7 @@ package io.homeassistant.companion.android.common.data.integration import android.graphics.Color import android.util.Log import java.util.Calendar +import kotlin.math.round data class Entity( val entityId: String, @@ -80,7 +81,25 @@ fun Entity.getFanSpeed(): EntityPosition? { max = maxValue ) } catch (e: Exception) { - Log.e(EntityExt.TAG, "Unable to get getLightBrightness", e) + Log.e(EntityExt.TAG, "Unable to get getFanSpeed", e) + null + } +} + +fun Entity.getFanSteps(): Int? { + return try { + if (!supportsFanSetSpeed()) return null + + fun calculateNumStep(percentageStep: Double): Int { + val numSteps = round(100 / percentageStep).toInt() + if (numSteps <= 10) return numSteps + if (numSteps % 10 == 0) return 10 + return calculateNumStep(percentageStep * 2) + } + + return calculateNumStep(((attributes as Map<*, *>)["percentage_step"] as? Double)?.toDouble() ?: 1.0) - 1 + } catch (e: Exception) { + Log.e(EntityExt.TAG, "Unable to get getFanSteps") null } } diff --git a/wear/src/main/java/io/homeassistant/companion/android/home/views/DetailsPanelView.kt b/wear/src/main/java/io/homeassistant/companion/android/home/views/DetailsPanelView.kt index c11a8d8b4..221c08855 100644 --- a/wear/src/main/java/io/homeassistant/companion/android/home/views/DetailsPanelView.kt +++ b/wear/src/main/java/io/homeassistant/companion/android/home/views/DetailsPanelView.kt @@ -30,6 +30,7 @@ import io.homeassistant.companion.android.common.data.integration.Entity import io.homeassistant.companion.android.common.data.integration.EntityExt import io.homeassistant.companion.android.common.data.integration.domain import io.homeassistant.companion.android.common.data.integration.getFanSpeed +import io.homeassistant.companion.android.common.data.integration.getFanSteps import io.homeassistant.companion.android.common.data.integration.getLightBrightness import io.homeassistant.companion.android.common.data.integration.supportsFanSetSpeed import io.homeassistant.companion.android.common.data.integration.supportsLightBrightness @@ -169,6 +170,7 @@ fun FanSpeedSlider( val haptic = LocalHapticFeedback.current val context = LocalContext.current val position = entity.getFanSpeed() ?: return + val steps = entity.getFanSteps() ?: return Column { Text( @@ -190,7 +192,7 @@ fun FanSpeedSlider( haptic ) }, - steps = 9, + steps = steps, valueRange = position.min..position.max, decreaseIcon = { Image(