Send state based on reported status, apply car prefix to car sensors, add some logging around new car sensors (#3668)

* Apply car prefix to car sensors, add some logging around new car sensors

* Update state based on reported status, minor clean up

* Make code more concise per review comment

* Use unavailable when status is not given
This commit is contained in:
Daniel Shokouhi 2023-07-19 13:18:05 -07:00 committed by GitHub
parent c4da52bdab
commit d421b88db2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 42 additions and 29 deletions

View file

@ -17,6 +17,7 @@ import io.homeassistant.companion.android.common.R
import io.homeassistant.companion.android.common.sensors.SensorManager
import io.homeassistant.companion.android.vehicle.HaCarAppService
@RequiresApi(Build.VERSION_CODES.O)
class CarSensorManager :
SensorManager,
DefaultLifecycleObserver {
@ -132,7 +133,6 @@ class CarSensorManager :
private fun allDisabled(): Boolean = sensorsList.none { isEnabled(context, it) }
@RequiresApi(Build.VERSION_CODES.O)
private fun connected(): Boolean = HaCarAppService.carInfo != null
override fun requestSensorUpdate(context: Context) {
@ -160,7 +160,6 @@ class CarSensorManager :
}
}
@RequiresApi(Build.VERSION_CODES.O)
@androidx.annotation.OptIn(androidx.car.app.annotations.ExperimentalCarApi::class)
private fun setListener(l: Listener, enable: Boolean) {
if (enable) {
@ -206,38 +205,39 @@ class CarSensorManager :
}
}
@RequiresApi(Build.VERSION_CODES.O)
private fun updateCarInfo() {
for (l in listenerSensors) {
if (l.value.any { isEnabled(context, it) }) {
if (listenerLastRegistered[l.key] != -1L && listenerLastRegistered[l.key]!! + SensorManager.SENSOR_LISTENER_TIMEOUT < System.currentTimeMillis()) {
Log.d(TAG, "Re-registering CarInfo ${l.key} listener as it appears to be stuck")
setListener(l.key, false)
listenerSensors.forEach { (listener, sensors) ->
if (sensors.any { isEnabled(context, it) }) {
if (listenerLastRegistered[listener] != -1L && listenerLastRegistered[listener]!! + SensorManager.SENSOR_LISTENER_TIMEOUT < System.currentTimeMillis()) {
Log.d(TAG, "Re-registering CarInfo $listener listener as it appears to be stuck")
setListener(listener, false)
}
if (listenerLastRegistered[l.key] == -1L) {
setListener(l.key, true)
if (listenerLastRegistered[listener] == -1L) {
setListener(listener, true)
}
}
}
}
@RequiresApi(Build.VERSION_CODES.O)
fun onEnergyAvailable(data: EnergyLevel) {
if (data.fuelPercent.status == CarValue.STATUS_SUCCESS && isEnabled(context, fuelLevel)) {
private fun onEnergyAvailable(data: EnergyLevel) {
val fuelStatus = carValueStatus(data.fuelPercent.status)
Log.d(TAG, "Received Energy level: $data")
if (isEnabled(context, fuelLevel)) {
onSensorUpdated(
context,
fuelLevel,
data.fuelPercent.value!!,
fuelStatus ?: data.fuelPercent.value!!,
fuelLevel.statelessIcon,
mapOf()
)
}
if (data.batteryPercent.status == CarValue.STATUS_SUCCESS && isEnabled(context, batteryLevel)) {
val batteryStatus = carValueStatus(data.batteryPercent.status)
if (isEnabled(context, batteryLevel)) {
onSensorUpdated(
context,
batteryLevel,
data.batteryPercent.value!!,
batteryStatus ?: data.batteryPercent.value!!,
batteryLevel.statelessIcon,
mapOf()
)
@ -245,13 +245,14 @@ class CarSensorManager :
setListener(Listener.ENERGY, false)
}
@RequiresApi(Build.VERSION_CODES.O)
fun onModelAvailable(data: Model) {
if (data.name.status == CarValue.STATUS_SUCCESS && isEnabled(context, carName)) {
private fun onModelAvailable(data: Model) {
val status = carValueStatus(data.name.status)
Log.d(TAG, "Received model information: $data")
if (isEnabled(context, carName)) {
onSensorUpdated(
context,
carName,
data.name.value!!,
status ?: data.name.value!!,
carName.statelessIcon,
mapOf(
"car_manufacturer" to data.manufacturer.value,
@ -262,14 +263,15 @@ class CarSensorManager :
setListener(Listener.MODEL, false)
}
@RequiresApi(Build.VERSION_CODES.O)
@androidx.annotation.OptIn(androidx.car.app.annotations.ExperimentalCarApi::class)
fun onStatusAvailable(data: EvStatus) {
if (data.evChargePortConnected.status == CarValue.STATUS_SUCCESS && isEnabled(context, carStatus)) {
val status = carValueStatus(data.evChargePortConnected.status)
Log.d(TAG, "Received status available: $data")
if (isEnabled(context, carStatus)) {
onSensorUpdated(
context,
carStatus,
data.evChargePortConnected.value == true,
status ?: (data.evChargePortConnected.value == true),
carStatus.statelessIcon,
mapOf(
"car_charge_port_open" to (data.evChargePortOpen.value == true)
@ -279,18 +281,29 @@ class CarSensorManager :
setListener(Listener.STATUS, false)
}
@RequiresApi(Build.VERSION_CODES.O)
@androidx.annotation.OptIn(androidx.car.app.annotations.ExperimentalCarApi::class)
fun onMileageAvailable(data: Mileage) {
if (data.odometerMeters.status == CarValue.STATUS_SUCCESS && isEnabled(context, odometerValue)) {
val status = carValueStatus(data.odometerMeters.status)
Log.d(TAG, "Received mileage: $data")
if (isEnabled(context, odometerValue)) {
onSensorUpdated(
context,
odometerValue,
data.odometerMeters.value!!,
status ?: data.odometerMeters.value!!,
odometerValue.statelessIcon,
mapOf()
)
}
setListener(Listener.MILEAGE, false)
}
private fun carValueStatus(value: Int): String? {
return when (value) {
CarValue.STATUS_SUCCESS -> null
CarValue.STATUS_UNAVAILABLE -> "unavailable"
CarValue.STATUS_UNKNOWN -> "unknown"
CarValue.STATUS_UNIMPLEMENTED -> "unimplemented"
else -> "unavailable"
}
}
}

View file

@ -63,9 +63,9 @@
<string name="basic_sensor_name_bluetooth">Bluetooth Connection</string>
<string name="basic_sensor_name_car_battery">Car Battery</string>
<string name="basic_sensor_name_car_name">Car Name</string>
<string name="basic_sensor_name_car_charging_status">Charging Status</string>
<string name="basic_sensor_name_car_fuel">Fuel</string>
<string name="basic_sensor_name_car_odometer">Odometer</string>
<string name="basic_sensor_name_car_charging_status">Car Charging Status</string>
<string name="basic_sensor_name_car_fuel">Car Fuel</string>
<string name="basic_sensor_name_car_odometer">Car Odometer</string>
<string name="basic_sensor_name_charger_type">Charger Type</string>
<string name="basic_sensor_name_charging">Is Charging</string>
<string name="basic_sensor_name_current_time_zone">Current Time Zone</string>