Use device class enum where possible and supply possible states for those sensors (#4394)

* Use device class enum where possible and supply possible states for those sensors

* Add some missing sensors

* Review comments and suppress lint

* Add media session sensor to enum device class
This commit is contained in:
Daniel Shokouhi 2024-05-13 12:41:18 -07:00 committed by GitHub
parent 67d6be2d01
commit d640b9d974
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
12 changed files with 137 additions and 67 deletions

View file

@ -40,7 +40,8 @@ class ActivitySensorManager : BroadcastReceiver(), SensorManager {
"sensor", "sensor",
commonR.string.basic_sensor_name_activity, commonR.string.basic_sensor_name_activity,
commonR.string.sensor_description_detected_activity, commonR.string.sensor_description_detected_activity,
"mdi:walk" "mdi:walk",
deviceClass = "enum"
) )
private val sleepConfidence = SensorManager.BasicSensor( private val sleepConfidence = SensorManager.BasicSensor(
@ -111,7 +112,9 @@ class ActivitySensorManager : BroadcastReceiver(), SensorManager {
activity, activity,
probActivity, probActivity,
getSensorIcon(probActivity), getSensorIcon(probActivity),
result.probableActivities.associate { typeToString(it) to it.confidence } result.probableActivities.associate { typeToString(it) to it.confidence }.plus(
"options" to listOf("in_vehicle", "on_bicycle", "on_foot", "still", "tilting", "walking", "running")
)
) )
} }
} }

View file

@ -119,6 +119,7 @@ class CarSensorManager :
R.string.basic_sensor_name_car_fuel_type, R.string.basic_sensor_name_car_fuel_type,
R.string.sensor_description_car_fuel_type, R.string.sensor_description_car_fuel_type,
"mdi:gas-station", "mdi:gas-station",
deviceClass = "enum",
entityCategory = SensorManager.ENTITY_CATEGORY_DIAGNOSTIC entityCategory = SensorManager.ENTITY_CATEGORY_DIAGNOSTIC
), ),
autoPermissions = listOf("com.google.android.gms.permission.CAR_FUEL"), autoPermissions = listOf("com.google.android.gms.permission.CAR_FUEL"),
@ -131,6 +132,7 @@ class CarSensorManager :
R.string.basic_sensor_name_car_ev_connector_type, R.string.basic_sensor_name_car_ev_connector_type,
R.string.sensor_description_car_ev_connector_type, R.string.sensor_description_car_ev_connector_type,
"mdi:car-electric", "mdi:car-electric",
deviceClass = "enum",
entityCategory = SensorManager.ENTITY_CATEGORY_DIAGNOSTIC entityCategory = SensorManager.ENTITY_CATEGORY_DIAGNOSTIC
), ),
autoPermissions = listOf("com.google.android.gms.permission.CAR_FUEL"), autoPermissions = listOf("com.google.android.gms.permission.CAR_FUEL"),
@ -182,6 +184,38 @@ class CarSensorManager :
private fun connected(): Boolean = HaCarAppService.carInfo != null private fun connected(): Boolean = HaCarAppService.carInfo != null
private val fuelTypeMap = mapOf(
EnergyProfile.FUEL_TYPE_BIODIESEL to "Biodiesel",
EnergyProfile.FUEL_TYPE_CNG to "Compressed natural gas",
EnergyProfile.FUEL_TYPE_DIESEL_1 to "#1 Grade Diesel",
EnergyProfile.FUEL_TYPE_DIESEL_2 to "#2 Grade Diesel",
EnergyProfile.FUEL_TYPE_E85 to "85% ethanol/gasoline blend",
EnergyProfile.FUEL_TYPE_ELECTRIC to "Electric",
EnergyProfile.FUEL_TYPE_HYDROGEN to "Hydrogen fuel cell",
EnergyProfile.FUEL_TYPE_LEADED to "Leaded gasoline",
EnergyProfile.FUEL_TYPE_LNG to "Liquified natural gas",
EnergyProfile.FUEL_TYPE_LPG to "Liquified petroleum gas",
EnergyProfile.FUEL_TYPE_OTHER to "Other",
EnergyProfile.FUEL_TYPE_UNLEADED to "Unleaded gasoline",
EnergyProfile.FUEL_TYPE_UNKNOWN to STATE_UNKNOWN
)
private val evTypeMap = mapOf(
EnergyProfile.EVCONNECTOR_TYPE_CHADEMO to "CHAdeMo fast charger connector",
EnergyProfile.EVCONNECTOR_TYPE_COMBO_1 to "Combined Charging System Combo 1",
EnergyProfile.EVCONNECTOR_TYPE_COMBO_2 to "Combined Charging System Combo 2",
EnergyProfile.EVCONNECTOR_TYPE_GBT to "GBT_AC Fast Charging Standard",
EnergyProfile.EVCONNECTOR_TYPE_GBT_DC to "GBT_DC Fast Charging Standard",
EnergyProfile.EVCONNECTOR_TYPE_J1772 to "Connector type SAE J1772",
EnergyProfile.EVCONNECTOR_TYPE_MENNEKES to "IEC 62196 Type 2 connector",
EnergyProfile.EVCONNECTOR_TYPE_OTHER to "other",
EnergyProfile.EVCONNECTOR_TYPE_SCAME to "IEC_TYPE_3_AC connector",
EnergyProfile.EVCONNECTOR_TYPE_TESLA_HPWC to "High Power Wall Charger of Tesla",
EnergyProfile.EVCONNECTOR_TYPE_TESLA_ROADSTER to "Connector of Tesla Roadster",
EnergyProfile.EVCONNECTOR_TYPE_TESLA_SUPERCHARGER to "Supercharger of Tesla",
EnergyProfile.EVCONNECTOR_TYPE_UNKNOWN to STATE_UNKNOWN
)
override val name: Int override val name: Int
get() = R.string.sensor_name_car get() = R.string.sensor_name_car
@ -195,6 +229,7 @@ class CarSensorManager :
} }
} }
@Suppress("KotlinConstantConditions")
override fun hasSensor(context: Context): Boolean { override fun hasSensor(context: Context): Boolean {
this.latestContext = context.applicationContext this.latestContext = context.applicationContext
@ -239,12 +274,23 @@ class CarSensorManager :
} else { } else {
carSensorsList.forEach { carSensorsList.forEach {
if (isEnabled(context, it)) { if (isEnabled(context, it)) {
val attrs = if (it.sensor.id == fuelType.sensor.id || it.sensor.id == evConnector.sensor.id) {
mapOf(
"options" to when (it.sensor.id) {
fuelType.sensor.id -> fuelTypeMap.values.toList()
evConnector.sensor.id -> evTypeMap.values.toList()
else -> {} // unreachable
}
)
} else {
mapOf()
}
onSensorUpdated( onSensorUpdated(
context, context,
it.sensor, it.sensor,
STATE_UNAVAILABLE, STATE_UNAVAILABLE,
it.sensor.statelessIcon, it.sensor.statelessIcon,
mapOf() attrs
) )
} }
} }
@ -420,7 +466,8 @@ class CarSensorManager :
if (fuelTypeStatus == "success") getFuelType(data.fuelTypes.value!!) else STATE_UNKNOWN, if (fuelTypeStatus == "success") getFuelType(data.fuelTypes.value!!) else STATE_UNKNOWN,
fuelType.sensor.statelessIcon, fuelType.sensor.statelessIcon,
mapOf( mapOf(
"status" to fuelTypeStatus "status" to fuelTypeStatus,
"options" to fuelTypeMap.values.toList()
), ),
forceUpdate = true forceUpdate = true
) )
@ -432,7 +479,8 @@ class CarSensorManager :
if (evConnectorTypeStatus == "success") getEvConnectorType(data.evConnectorTypes.value!!) else STATE_UNKNOWN, if (evConnectorTypeStatus == "success") getEvConnectorType(data.evConnectorTypes.value!!) else STATE_UNKNOWN,
evConnector.sensor.statelessIcon, evConnector.sensor.statelessIcon,
mapOf( mapOf(
"status" to evConnectorTypeStatus "status" to evConnectorTypeStatus,
"options" to evTypeMap.values.toList()
), ),
forceUpdate = true forceUpdate = true
) )
@ -452,22 +500,7 @@ class CarSensorManager :
private fun getFuelType(values: List<Int>): String { private fun getFuelType(values: List<Int>): String {
val fuelTypeList = emptyList<String>().toMutableList() val fuelTypeList = emptyList<String>().toMutableList()
values.forEach { values.forEach {
fuelTypeList += when (it) { fuelTypeList += fuelTypeMap.getOrDefault(it, STATE_UNKNOWN)
EnergyProfile.FUEL_TYPE_BIODIESEL -> "Biodiesel"
EnergyProfile.FUEL_TYPE_CNG -> "Compressed natural gas"
EnergyProfile.FUEL_TYPE_DIESEL_1 -> "#1 Grade Diesel"
EnergyProfile.FUEL_TYPE_DIESEL_2 -> "#2 Grade Diesel"
EnergyProfile.FUEL_TYPE_E85 -> "85% ethanol/gasoline blend"
EnergyProfile.FUEL_TYPE_ELECTRIC -> "Electric"
EnergyProfile.FUEL_TYPE_HYDROGEN -> "Hydrogen fuel cell"
EnergyProfile.FUEL_TYPE_LEADED -> "Leaded gasoline"
EnergyProfile.FUEL_TYPE_LNG -> "Liquified natural gas"
EnergyProfile.FUEL_TYPE_LPG -> "Liquified petroleum gas"
EnergyProfile.FUEL_TYPE_OTHER -> "Other"
EnergyProfile.FUEL_TYPE_UNKNOWN -> STATE_UNKNOWN
EnergyProfile.FUEL_TYPE_UNLEADED -> "Unleaded gasoline"
else -> STATE_UNKNOWN
}
} }
return fuelTypeList.toString() return fuelTypeList.toString()
} }
@ -475,22 +508,7 @@ class CarSensorManager :
private fun getEvConnectorType(values: List<Int>): String { private fun getEvConnectorType(values: List<Int>): String {
val evConnectorList = emptyList<String>().toMutableList() val evConnectorList = emptyList<String>().toMutableList()
values.forEach { values.forEach {
evConnectorList += when (it) { evConnectorList += evTypeMap.getOrDefault(it, STATE_UNKNOWN)
EnergyProfile.EVCONNECTOR_TYPE_CHADEMO -> "CHAdeMo fast charger connector"
EnergyProfile.EVCONNECTOR_TYPE_COMBO_1 -> "Combined Charging System Combo 1"
EnergyProfile.EVCONNECTOR_TYPE_COMBO_2 -> "Combined Charging System Combo 2"
EnergyProfile.EVCONNECTOR_TYPE_GBT -> "GBT_AC Fast Charging Standard"
EnergyProfile.EVCONNECTOR_TYPE_GBT_DC -> "GBT_DC Fast Charging Standard"
EnergyProfile.EVCONNECTOR_TYPE_J1772 -> "Connector type SAE J1772"
EnergyProfile.EVCONNECTOR_TYPE_MENNEKES -> "IEC 62196 Type 2 connector"
EnergyProfile.EVCONNECTOR_TYPE_OTHER -> "other"
EnergyProfile.EVCONNECTOR_TYPE_SCAME -> "IEC_TYPE_3_AC connector"
EnergyProfile.EVCONNECTOR_TYPE_TESLA_HPWC -> "High Power Wall Charger of Tesla"
EnergyProfile.EVCONNECTOR_TYPE_TESLA_ROADSTER -> "Connector of Tesla Roadster"
EnergyProfile.EVCONNECTOR_TYPE_TESLA_SUPERCHARGER -> "Supercharger of Tesla"
EnergyProfile.EVCONNECTOR_TYPE_UNKNOWN -> STATE_UNKNOWN
else -> STATE_UNKNOWN
}
} }
return evConnectorList.toString() return evConnectorList.toString()
} }

View file

@ -64,6 +64,7 @@ class NotificationSensorManager : NotificationListenerService(), SensorManager {
commonR.string.basic_sensor_name_media_session, commonR.string.basic_sensor_name_media_session,
commonR.string.sensor_description_media_session, commonR.string.sensor_description_media_session,
"mdi:play-circle", "mdi:play-circle",
deviceClass = "enum",
docsLink = "https://companion.home-assistant.io/docs/core/sensors#media-session-sensor" docsLink = "https://companion.home-assistant.io/docs/core/sensors#media-session-sensor"
) )
} }
@ -260,6 +261,21 @@ class NotificationSensorManager : NotificationListenerService(), SensorManager {
} }
} }
private val mediaStates = mapOf(
PlaybackState.STATE_PLAYING to "Playing",
PlaybackState.STATE_PAUSED to "Paused",
PlaybackState.STATE_STOPPED to "Stopped",
PlaybackState.STATE_BUFFERING to "Buffering",
PlaybackState.STATE_CONNECTING to "Connecting",
PlaybackState.STATE_ERROR to "Error",
PlaybackState.STATE_FAST_FORWARDING to "Fast Forwarding",
PlaybackState.STATE_NONE to "None",
PlaybackState.STATE_REWINDING to "Rewinding",
PlaybackState.STATE_SKIPPING_TO_NEXT to "Skip to Next",
PlaybackState.STATE_SKIPPING_TO_PREVIOUS to "Skip to Previous",
PlaybackState.STATE_SKIPPING_TO_QUEUE_ITEM to "Skip to Queue Item"
)
private fun updateMediaSession(context: Context) { private fun updateMediaSession(context: Context) {
if (!isEnabled(context, mediaSession)) { if (!isEnabled(context, mediaSession)) {
return return
@ -283,7 +299,10 @@ class NotificationSensorManager : NotificationListenerService(), SensorManager {
) )
} }
} }
attr += mapOf("total_media_session_count" to sessionCount) attr += mapOf(
"total_media_session_count" to sessionCount,
"options" to mediaStates.values.toList()
)
onSensorUpdated( onSensorUpdated(
context, context,
mediaSession, mediaSession,
@ -295,21 +314,7 @@ class NotificationSensorManager : NotificationListenerService(), SensorManager {
} }
private fun getPlaybackState(state: Int?): String { private fun getPlaybackState(state: Int?): String {
return when (state) { return mediaStates.getOrDefault(state ?: PlaybackState.STATE_NONE, STATE_UNKNOWN)
PlaybackState.STATE_PLAYING -> "Playing"
PlaybackState.STATE_PAUSED -> "Paused"
PlaybackState.STATE_STOPPED -> "Stopped"
PlaybackState.STATE_BUFFERING -> "Buffering"
PlaybackState.STATE_CONNECTING -> "Connecting"
PlaybackState.STATE_ERROR -> "Error"
PlaybackState.STATE_FAST_FORWARDING -> "Fast Forwarding"
PlaybackState.STATE_NONE -> "None"
PlaybackState.STATE_REWINDING -> "Rewinding"
PlaybackState.STATE_SKIPPING_TO_NEXT -> "Skip to Next"
PlaybackState.STATE_SKIPPING_TO_PREVIOUS -> "Skip to Previous"
PlaybackState.STATE_SKIPPING_TO_QUEUE_ITEM -> "Skip to Queue Item"
else -> STATE_UNKNOWN
}
} }
/** /**

View file

@ -702,6 +702,7 @@ class IntegrationRepositoryImpl @AssistedInject constructor(
val canRegisterEntityDisabledState = server.version?.isAtLeast(2022, 6, 0) == true val canRegisterEntityDisabledState = server.version?.isAtLeast(2022, 6, 0) == true
val canRegisterDeviceClassDistance = server.version?.isAtLeast(2022, 10, 0) == true val canRegisterDeviceClassDistance = server.version?.isAtLeast(2022, 10, 0) == true
val canRegisterNullProperties = server.version?.isAtLeast(2023, 2, 0) == true val canRegisterNullProperties = server.version?.isAtLeast(2023, 2, 0) == true
val canRegisterDeviceClassEnum = server.version?.isAtLeast(2023, 1, 0) == true
val registrationData = SensorRegistrationRequest( val registrationData = SensorRegistrationRequest(
sensorRegistration.uniqueId, sensorRegistration.uniqueId,
@ -718,6 +719,7 @@ class IntegrationRepositoryImpl @AssistedInject constructor(
sensorRegistration.name, sensorRegistration.name,
when (sensorRegistration.deviceClass) { when (sensorRegistration.deviceClass) {
"distance" -> if (canRegisterDeviceClassDistance) sensorRegistration.deviceClass else null "distance" -> if (canRegisterDeviceClassDistance) sensorRegistration.deviceClass else null
"enum" -> if (canRegisterDeviceClassEnum) sensorRegistration.deviceClass else null
else -> sensorRegistration.deviceClass else -> sensorRegistration.deviceClass
}, },
sensorRegistration.unitOfMeasurement, sensorRegistration.unitOfMeasurement,

View file

@ -79,6 +79,7 @@ abstract class AppSensorManagerBase : SensorManager {
commonR.string.basic_sensor_name_app_standby, commonR.string.basic_sensor_name_app_standby,
commonR.string.sensor_description_app_standby, commonR.string.sensor_description_app_standby,
"mdi:android", "mdi:android",
deviceClass = "enum",
docsLink = "https://companion.home-assistant.io/docs/core/sensors#app-usage-sensors", docsLink = "https://companion.home-assistant.io/docs/core/sensors#app-usage-sensors",
entityCategory = SensorManager.ENTITY_CATEGORY_DIAGNOSTIC entityCategory = SensorManager.ENTITY_CATEGORY_DIAGNOSTIC
) )
@ -89,6 +90,7 @@ abstract class AppSensorManagerBase : SensorManager {
commonR.string.basic_sensor_name_app_importance, commonR.string.basic_sensor_name_app_importance,
commonR.string.sensor_description_app_importance, commonR.string.sensor_description_app_importance,
"mdi:android", "mdi:android",
deviceClass = "enum",
docsLink = "https://companion.home-assistant.io/docs/core/sensors#app-importance-sensor", docsLink = "https://companion.home-assistant.io/docs/core/sensors#app-importance-sensor",
entityCategory = SensorManager.ENTITY_CATEGORY_DIAGNOSTIC entityCategory = SensorManager.ENTITY_CATEGORY_DIAGNOSTIC
) )
@ -265,7 +267,9 @@ abstract class AppSensorManagerBase : SensorManager {
app_standby_bucket, app_standby_bucket,
appStandbyBucket, appStandbyBucket,
app_standby_bucket.statelessIcon, app_standby_bucket.statelessIcon,
mapOf() mapOf(
"options" to listOf("active", "frequent", "rare", "restricted", "working_set", "never")
)
) )
} }
@ -319,7 +323,12 @@ abstract class AppSensorManagerBase : SensorManager {
app_importance, app_importance,
importance, importance,
app_importance.statelessIcon, app_importance.statelessIcon,
mapOf() mapOf(
"options" to listOf(
"cached", "cant_save_state", "foreground", "foreground_service", "gone",
"perceptible", "service", "top_sleeping", "visible", "not_running"
)
)
) )
} }
} }

View file

@ -20,6 +20,7 @@ class AudioSensorManager : SensorManager {
commonR.string.sensor_name_ringer_mode, commonR.string.sensor_name_ringer_mode,
commonR.string.sensor_description_audio_sensor, commonR.string.sensor_description_audio_sensor,
"mdi:volume-high", "mdi:volume-high",
deviceClass = "enum",
updateType = SensorManager.BasicSensor.UpdateType.INTENT updateType = SensorManager.BasicSensor.UpdateType.INTENT
) )
private val audioState = SensorManager.BasicSensor( private val audioState = SensorManager.BasicSensor(
@ -27,7 +28,8 @@ class AudioSensorManager : SensorManager {
"sensor", "sensor",
commonR.string.sensor_name_audio_mode, commonR.string.sensor_name_audio_mode,
commonR.string.sensor_description_audio_mode, commonR.string.sensor_description_audio_mode,
"mdi:volume-high" "mdi:volume-high",
deviceClass = "enum"
) )
private val headphoneState = SensorManager.BasicSensor( private val headphoneState = SensorManager.BasicSensor(
"headphone_state", "headphone_state",
@ -212,7 +214,9 @@ class AudioSensorManager : SensorManager {
audioSensor, audioSensor,
ringerMode, ringerMode,
icon, icon,
mapOf() mapOf(
"options" to listOf("normal", "silent", "vibrate")
)
) )
} }
@ -247,7 +251,12 @@ class AudioSensorManager : SensorManager {
audioState, audioState,
audioMode, audioMode,
icon, icon,
mapOf() mapOf(
"options" to listOf(
"normal", "ringing", "in_call", "in_communication", "call_screening",
"call_redirect", "communication_redirect"
)
)
) )
} }

View file

@ -38,6 +38,7 @@ class BatterySensorManager : SensorManager {
commonR.string.basic_sensor_name_battery_state, commonR.string.basic_sensor_name_battery_state,
commonR.string.sensor_description_battery_state, commonR.string.sensor_description_battery_state,
"mdi:battery-charging", "mdi:battery-charging",
deviceClass = "enum",
entityCategory = SensorManager.ENTITY_CATEGORY_DIAGNOSTIC, entityCategory = SensorManager.ENTITY_CATEGORY_DIAGNOSTIC,
updateType = SensorManager.BasicSensor.UpdateType.INTENT, updateType = SensorManager.BasicSensor.UpdateType.INTENT,
enabledByDefault = true enabledByDefault = true
@ -58,6 +59,7 @@ class BatterySensorManager : SensorManager {
commonR.string.basic_sensor_name_charger_type, commonR.string.basic_sensor_name_charger_type,
commonR.string.sensor_description_charger_type, commonR.string.sensor_description_charger_type,
"mdi:power-plug", "mdi:power-plug",
deviceClass = "enum",
entityCategory = SensorManager.ENTITY_CATEGORY_DIAGNOSTIC, entityCategory = SensorManager.ENTITY_CATEGORY_DIAGNOSTIC,
updateType = SensorManager.BasicSensor.UpdateType.INTENT, updateType = SensorManager.BasicSensor.UpdateType.INTENT,
enabledByDefault = true enabledByDefault = true
@ -68,6 +70,7 @@ class BatterySensorManager : SensorManager {
commonR.string.basic_sensor_name_battery_health, commonR.string.basic_sensor_name_battery_health,
commonR.string.sensor_description_battery_health, commonR.string.sensor_description_battery_health,
"mdi:battery-heart-variant", "mdi:battery-heart-variant",
deviceClass = "enum",
entityCategory = SensorManager.ENTITY_CATEGORY_DIAGNOSTIC entityCategory = SensorManager.ENTITY_CATEGORY_DIAGNOSTIC
) )
@ -223,7 +226,9 @@ class BatterySensorManager : SensorManager {
batteryState, batteryState,
chargingStatus, chargingStatus,
icon, icon,
mapOf() mapOf(
"options" to listOf("charging", "discharging", "full", "not_charging")
)
) )
} }
@ -262,7 +267,9 @@ class BatterySensorManager : SensorManager {
chargerTypeState, chargerTypeState,
chargerType, chargerType,
icon, icon,
mapOf() mapOf(
"options" to listOf("ac", "usb", "wireless", "dock", "none")
)
) )
} }
@ -282,7 +289,9 @@ class BatterySensorManager : SensorManager {
batteryHealthState, batteryHealthState,
batteryHealth, batteryHealth,
icon, icon,
mapOf() mapOf(
"options" to listOf("cold", "dead", "good", "overheated", "over_voltage", "failed")
)
) )
} }

View file

@ -89,6 +89,7 @@ class BluetoothSensorManager : SensorManager {
commonR.string.basic_sensor_name_bluetooth_ble_emitter, commonR.string.basic_sensor_name_bluetooth_ble_emitter,
commonR.string.sensor_description_bluetooth_ble_emitter, commonR.string.sensor_description_bluetooth_ble_emitter,
"mdi:bluetooth", "mdi:bluetooth",
deviceClass = "enum",
entityCategory = SensorManager.ENTITY_CATEGORY_DIAGNOSTIC, entityCategory = SensorManager.ENTITY_CATEGORY_DIAGNOSTIC,
updateType = SensorManager.BasicSensor.UpdateType.INTENT updateType = SensorManager.BasicSensor.UpdateType.INTENT
) )
@ -100,6 +101,7 @@ class BluetoothSensorManager : SensorManager {
commonR.string.basic_sensor_name_bluetooth_ble_beacon_monitor, commonR.string.basic_sensor_name_bluetooth_ble_beacon_monitor,
commonR.string.sensor_description_bluetooth_ble_beacon_monitor, commonR.string.sensor_description_bluetooth_ble_beacon_monitor,
"mdi:bluetooth", "mdi:bluetooth",
deviceClass = "enum",
entityCategory = SensorManager.ENTITY_CATEGORY_DIAGNOSTIC, entityCategory = SensorManager.ENTITY_CATEGORY_DIAGNOSTIC,
updateType = SensorManager.BasicSensor.UpdateType.CUSTOM updateType = SensorManager.BasicSensor.UpdateType.CUSTOM
) )
@ -375,7 +377,8 @@ class BluetoothSensorManager : SensorManager {
"Transmitting power" to bleTransmitterDevice.transmitPowerSetting, "Transmitting power" to bleTransmitterDevice.transmitPowerSetting,
"Advertise mode" to bleTransmitterDevice.advertiseModeSetting, "Advertise mode" to bleTransmitterDevice.advertiseModeSetting,
"Measured power" to bleTransmitterDevice.measuredPowerSetting, "Measured power" to bleTransmitterDevice.measuredPowerSetting,
"Supports transmitter" to supportsTransmitter(context) "Supports transmitter" to supportsTransmitter(context),
"options" to listOf("Transmitting", "Bluetooth is turned off", "Stopped", "Unable to transmit")
) )
) )
} }
@ -402,7 +405,9 @@ class BluetoothSensorManager : SensorManager {
beaconMonitor, beaconMonitor,
state, state,
icon, icon,
attr, attr.plus(
"options" to listOf("Monitoring", "Stopped", "Bluetooth is turned off")
),
forceUpdate = true forceUpdate = true
) )
} }

View file

@ -21,6 +21,7 @@ class DNDSensorManager : SensorManager {
commonR.string.sensor_name_dnd, commonR.string.sensor_name_dnd,
commonR.string.sensor_description_dnd_sensor, commonR.string.sensor_description_dnd_sensor,
"mdi:minus-circle", "mdi:minus-circle",
deviceClass = "enum",
entityCategory = SensorManager.ENTITY_CATEGORY_DIAGNOSTIC, entityCategory = SensorManager.ENTITY_CATEGORY_DIAGNOSTIC,
updateType = SensorManager.BasicSensor.UpdateType.INTENT updateType = SensorManager.BasicSensor.UpdateType.INTENT
) )
@ -77,7 +78,9 @@ class DNDSensorManager : SensorManager {
dndSensor, dndSensor,
state, state,
dndSensor.statelessIcon, dndSensor.statelessIcon,
mapOf() mapOf(
"options" to listOf("alarms_only", "off", "priority_only", "total_silence")
)
) )
} }
} }

View file

@ -137,6 +137,7 @@ class NetworkSensorManager : SensorManager {
commonR.string.basic_sensor_name_network_type, commonR.string.basic_sensor_name_network_type,
commonR.string.sensor_description_network_type, commonR.string.sensor_description_network_type,
"mdi:network", "mdi:network",
deviceClass = "enum",
docsLink = "https://companion.home-assistant.io/docs/core/sensors#network-type-sensor", docsLink = "https://companion.home-assistant.io/docs/core/sensors#network-type-sensor",
entityCategory = SensorManager.ENTITY_CATEGORY_DIAGNOSTIC, entityCategory = SensorManager.ENTITY_CATEGORY_DIAGNOSTIC,
updateType = SensorManager.BasicSensor.UpdateType.INTENT updateType = SensorManager.BasicSensor.UpdateType.INTENT
@ -615,7 +616,8 @@ class NetworkSensorManager : SensorManager {
networkCapability, networkCapability,
icon, icon,
mapOf( mapOf(
"metered" to metered "metered" to metered,
"options" to listOf("bluetooth", "cellular", "ethernet", "lowpan", "usb", "vpn", "wifi", "wifi_aware")
) )
) )
} }

View file

@ -24,6 +24,7 @@ class PhoneStateSensorManager : SensorManager {
commonR.string.basic_sensor_name_phone, commonR.string.basic_sensor_name_phone,
commonR.string.sensor_description_phone_state, commonR.string.sensor_description_phone_state,
"mdi:phone", "mdi:phone",
deviceClass = "enum",
docsLink = "https://companion.home-assistant.io/docs/core/sensors#phone-state-sensor", docsLink = "https://companion.home-assistant.io/docs/core/sensors#phone-state-sensor",
updateType = SensorManager.BasicSensor.UpdateType.INTENT updateType = SensorManager.BasicSensor.UpdateType.INTENT
) )
@ -111,7 +112,9 @@ class PhoneStateSensorManager : SensorManager {
phoneState, phoneState,
state, state,
phoneIcon, phoneIcon,
mapOf() mapOf(
"options" to listOf("idle", "ringing", "offhook")
)
) )
} }

View file

@ -39,6 +39,7 @@ class HealthServicesSensorManager : SensorManager {
commonR.string.sensor_name_activity_state, commonR.string.sensor_name_activity_state,
commonR.string.sensor_description_activity_state, commonR.string.sensor_description_activity_state,
"mdi:account", "mdi:account",
deviceClass = "enum",
entityCategory = SensorManager.ENTITY_CATEGORY_DIAGNOSTIC, entityCategory = SensorManager.ENTITY_CATEGORY_DIAGNOSTIC,
updateType = SensorManager.BasicSensor.UpdateType.INTENT updateType = SensorManager.BasicSensor.UpdateType.INTENT
) )
@ -205,7 +206,8 @@ class HealthServicesSensorManager : SensorManager {
getActivityIcon(info), getActivityIcon(info),
mapOf( mapOf(
"time" to info.stateChangeTime, "time" to info.stateChangeTime,
"exercise_type" to info.exerciseInfo?.exerciseType?.name "exercise_type" to info.exerciseInfo?.exerciseType?.name,
"options" to listOf("asleep", "passive", "exercise")
), ),
forceUpdate = forceUpdate forceUpdate = forceUpdate
) )