Use device class for binary sensor friendly state to match frontend and core (#4395)

* Use device class for binary sensor friendly state to match frontend and core

* Update common/src/main/java/io/homeassistant/companion/android/common/data/integration/Entity.kt

Co-authored-by: Joris Pelgröm <jpelgrom@users.noreply.github.com>

---------

Co-authored-by: Joris Pelgröm <jpelgrom@users.noreply.github.com>
This commit is contained in:
Daniel Shokouhi 2024-05-13 21:51:31 -07:00 committed by GitHub
parent d640b9d974
commit 6e496c9720
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 119 additions and 64 deletions

View file

@ -700,8 +700,36 @@ val <T> Entity<T>.friendlyName: String
get() = (attributes as? Map<*, *>)?.get("friendly_name")?.toString() ?: entityId
fun <T> Entity<T>.friendlyState(context: Context, options: EntityRegistryOptions? = null, appendUnitOfMeasurement: Boolean = false): String {
// https://github.com/mikey0000/frontend/blob/c14d801380f04ac63c4cf9ac2479e3b39ef4db32/src/common/entity/get_states.ts#L5
var friendlyState = when (state) {
val attributes = this.attributes as Map<String, Any?>
var friendlyState = when (domain) {
"binary_sensor" -> {
// https://github.com/home-assistant/core/blob/dev/homeassistant/components/binary_sensor/strings.json#L113
when (attributes["device_class"]) {
"battery" -> if (state == "on") context.getString(commonR.string.state_low) else context.getString(commonR.string.state_normal)
"battery_charging" -> if (state == "on") context.getString(commonR.string.state_charging) else context.getString(commonR.string.state_not_charging)
"cold" -> if (state == "on") context.getString(commonR.string.state_cold) else context.getString(commonR.string.state_off)
"connectivity" -> if (state == "on") context.getString(commonR.string.state_connected) else context.getString(commonR.string.state_disconnected)
"door", "window", "garage_door", "opening" -> if (state == "on") context.getString(commonR.string.state_open) else context.getString(commonR.string.state_closed)
"gas" -> if (state == "on") context.getString(commonR.string.state_detected) else context.getString(commonR.string.state_clear)
"heat" -> if (state == "on") context.getString(commonR.string.state_hot) else context.getString(commonR.string.state_off)
"light" -> if (state == "on") context.getString(commonR.string.state_light_detected) else context.getString(commonR.string.state_no_light)
"lock" -> if (state == "on") context.getString(commonR.string.state_unlocked) else context.getString(commonR.string.state_locked)
"moisture" -> if (state == "on") context.getString(commonR.string.state_wet) else context.getString(commonR.string.state_dry)
"moving" -> if (state == "on") context.getString(commonR.string.state_moving) else context.getString(commonR.string.state_not_moving)
"plug" -> if (state == "on") context.getString(commonR.string.state_plugged_in) else context.getString(commonR.string.state_unplugged)
"presence" -> if (state == "on") context.getString(commonR.string.state_home) else context.getString(commonR.string.state_not_home)
"problem" -> if (state == "on") context.getString(commonR.string.state_problem) else context.getString(commonR.string.state_ok)
"running" -> if (state == "on") context.getString(commonR.string.state_running) else context.getString(commonR.string.state_not_running)
"safety" -> if (state == "on") context.getString(commonR.string.state_unsafe) else context.getString(commonR.string.state_safe)
"tamper" -> if (state == "on") context.getString(commonR.string.state_tampering_detected) else context.getString(commonR.string.state_off)
"update" -> if (state == "on") context.getString(commonR.string.state_update_available) else context.getString(commonR.string.state_up_to_date)
else -> if (state == "on") context.getString(commonR.string.state_on) else context.getString(commonR.string.state_off)
}
}
else -> {
// https://github.com/home-assistant/frontend/blob/dev/src/common/entity/get_states.ts#L5
when (state) {
"above_horizon" -> context.getString(commonR.string.state_above_horizon)
"active" -> context.getString(commonR.string.state_active)
"armed_away" -> context.getString(commonR.string.state_armed_away)
@ -765,6 +793,8 @@ fun <T> Entity<T>.friendlyState(context: Context, options: EntityRegistryOptions
"windy", "windy-variant" -> context.getString(commonR.string.state_windy)
else -> state
}
}
}
if (friendlyState == state && Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
try {
val stateInMillis = ZonedDateTime.parse(state, DateTimeFormatter.ISO_OFFSET_DATE_TIME)

View file

@ -1236,4 +1236,29 @@
<string name="feedback">Feedback</string>
<string name="basic_sensor_name_remaining_charge_time">Remaining charge time</string>
<string name="sensor_description_remaining_charge_time">Compute an approximation for how much time (in minutes) remains until the battery is fully charged. Returns unavailable if no time can be computed: either there is not enough current data to make a decision or the battery is currently discharging. Returns 0 if calculation is not complete but device is currently charging.</string>
<string name="state_low">Low</string>
<string name="state_normal">Normal</string>
<string name="state_charging">Charging</string>
<string name="state_not_charging">Not charging</string>
<string name="state_cold">Cold</string>
<string name="state_connected">Connected</string>
<string name="state_disconnected">Disconnected</string>
<string name="state_detected">Detected</string>
<string name="state_clear">Clear</string>
<string name="state_hot">Hot</string>
<string name="state_light_detected">Light detected</string>
<string name="state_no_light">No light</string>
<string name="state_wet">Wet</string>
<string name="state_moving">Moving</string>
<string name="state_not_moving">Not moving</string>
<string name="state_plugged_in">Plugged in</string>
<string name="state_unplugged">Unplugged</string>
<string name="state_ok">OK</string>
<string name="state_running">Running</string>
<string name="state_not_running">Not running</string>
<string name="state_unsafe">Unsafe</string>
<string name="state_safe">Safe</string>
<string name="state_tampering_detected">Tampering detected</string>
<string name="state_update_available">Update available</string>
<string name="state_up_to_date">Up-to-date</string>
</resources>