Split up WiFi sensor, part 1 (#904)

* Split up wifi attributes into their own sensor, part 1

* Add note to remove attributes after next release

* Wifi to WiFi for consistency
This commit is contained in:
Daniel Shokouhi 2020-09-08 14:52:20 -07:00 committed by GitHub
parent f771048f73
commit 514532b282
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 291 additions and 9 deletions

View file

@ -16,6 +16,45 @@ class NetworkSensorManager : SensorManager {
R.string.basic_sensor_name_wifi, R.string.basic_sensor_name_wifi,
R.string.sensor_description_wifi_connection R.string.sensor_description_wifi_connection
) )
val bssidState = SensorManager.BasicSensor(
"wifi_bssid",
"sensor",
R.string.basic_sensor_name_wifi_bssid,
R.string.sensor_description_wifi_bssid
)
val wifiIp = SensorManager.BasicSensor(
"wifi_ip_address",
"sensor",
R.string.basic_sensor_name_wifi_ip,
R.string.sensor_description_wifi_ip
)
val wifiLinkSpeed = SensorManager.BasicSensor(
"wifi_link_speed",
"sensor",
R.string.basic_sensor_name_wifi_link_speed,
R.string.sensor_description_wifi_link_speed,
unitOfMeasurement = "Mbps"
)
val wifiState = SensorManager.BasicSensor(
"wifi_state",
"binary_sensor",
R.string.basic_sensor_name_wifi_state,
R.string.sensor_description_wifi_state
)
val wifiFrequency = SensorManager.BasicSensor(
"wifi_frequency",
"sensor",
R.string.basic_sensor_name_wifi_frequency,
R.string.sensor_description_wifi_frequency,
unitOfMeasurement = "MHz"
)
val wifiSignalStrength = SensorManager.BasicSensor(
"wifi_signal_strength",
"sensor",
R.string.basic_sensor_name_wifi_signal,
R.string.sensor_description_wifi_signal,
unitOfMeasurement = "dBm"
)
} }
override val enabledByDefault: Boolean override val enabledByDefault: Boolean
@ -23,7 +62,7 @@ class NetworkSensorManager : SensorManager {
override val name: Int override val name: Int
get() = R.string.sensor_name_network get() = R.string.sensor_name_network
override val availableSensors: List<SensorManager.BasicSensor> override val availableSensors: List<SensorManager.BasicSensor>
get() = listOf(wifiConnection) get() = listOf(wifiConnection, bssidState, wifiIp, wifiLinkSpeed, wifiState, wifiFrequency, wifiSignalStrength)
override fun requiredPermissions(): Array<String> { override fun requiredPermissions(): Array<String> {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
@ -40,6 +79,12 @@ class NetworkSensorManager : SensorManager {
context: Context context: Context
) { ) {
updateWifiConnectionSensor(context) updateWifiConnectionSensor(context)
updateBSSIDSensor(context)
updateWifiIPSensor(context)
updateWifiLinkSpeedSensor(context)
updateWifiSensor(context)
updateWifiFrequencySensor(context)
updateWifiSignalStrengthSensor(context)
} }
private fun updateWifiConnectionSensor(context: Context) { private fun updateWifiConnectionSensor(context: Context) {
@ -82,13 +127,13 @@ class NetworkSensorManager : SensorManager {
val attributes = conInfo?.let { val attributes = conInfo?.let {
mapOf( mapOf(
"bssid" to conInfo.bssid, "bssid" to conInfo.bssid, // Remove after next release
"ip_address" to getIpAddress(conInfo.ipAddress), "ip_address" to getIpAddress(conInfo.ipAddress), // Remove after next release
"link_speed" to conInfo.linkSpeed, "link_speed" to conInfo.linkSpeed, // Remove after next release
"is_hidden" to conInfo.hiddenSSID, "is_hidden" to conInfo.hiddenSSID,
"is_wifi_on" to wifiEnabled, "is_wifi_on" to wifiEnabled, // Remove after next release
"frequency" to conInfo.frequency, "frequency" to conInfo.frequency, // Remove after next release
"signal_level" to lastScanStrength "signal_level" to lastScanStrength // Remove after next release
) )
}.orEmpty() }.orEmpty()
@ -100,6 +145,230 @@ class NetworkSensorManager : SensorManager {
) )
} }
private fun updateBSSIDSensor(context: Context) {
if (!isEnabled(context, bssidState.id))
return
var conInfo: WifiInfo? = null
var lastScanStrength = -1
if (checkPermission(context)) {
val wifiManager =
(context.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager)
conInfo = wifiManager.connectionInfo
lastScanStrength = wifiManager.scanResults.firstOrNull {
it.BSSID == conInfo.bssid
}?.level ?: -1
}
var signalStrength = -1
if (lastScanStrength != -1) {
signalStrength = WifiManager.calculateSignalLevel(lastScanStrength, 4)
}
val icon = "mdi:wifi-strength-" + when (signalStrength) {
-1 -> "off"
0 -> "outline"
else -> signalStrength
}
val bssid = if (conInfo!!.bssid == null) "<not connected>" else conInfo.bssid
onSensorUpdated(context,
bssidState,
bssid,
icon,
mapOf()
)
}
private fun updateWifiIPSensor(context: Context) {
if (!isEnabled(context, wifiIp.id))
return
var conInfo: WifiInfo? = null
var deviceIp = "Unknown"
var lastScanStrength = -1
if (checkPermission(context)) {
val wifiManager =
(context.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager)
conInfo = wifiManager.connectionInfo
deviceIp = if (conInfo.networkId == -1) {
"<not connected>"
} else {
getIpAddress(conInfo.ipAddress)
}
lastScanStrength = wifiManager.scanResults.firstOrNull {
it.BSSID == conInfo.bssid
}?.level ?: -1
}
var signalStrength = -1
if (lastScanStrength != -1) {
signalStrength = WifiManager.calculateSignalLevel(lastScanStrength, 4)
}
val icon = "mdi:wifi-strength-" + when (signalStrength) {
-1 -> "off"
0 -> "outline"
else -> signalStrength
}
onSensorUpdated(context,
wifiIp,
deviceIp,
icon,
mapOf()
)
}
private fun updateWifiLinkSpeedSensor(context: Context) {
if (!isEnabled(context, wifiLinkSpeed.id))
return
var conInfo: WifiInfo? = null
var linkSpeed = 0
var lastScanStrength = -1
if (checkPermission(context)) {
val wifiManager =
(context.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager)
conInfo = wifiManager.connectionInfo
linkSpeed = if (conInfo.networkId == -1) {
0
} else {
conInfo.linkSpeed
}
lastScanStrength = wifiManager.scanResults.firstOrNull {
it.BSSID == conInfo.bssid
}?.level ?: -1
}
var signalStrength = -1
if (lastScanStrength != -1) {
signalStrength = WifiManager.calculateSignalLevel(lastScanStrength, 4)
}
val icon = "mdi:wifi-strength-" + when (signalStrength) {
-1 -> "off"
0 -> "outline"
else -> signalStrength
}
onSensorUpdated(context,
wifiLinkSpeed,
linkSpeed,
icon,
mapOf()
)
}
private fun updateWifiSensor(context: Context) {
if (!isEnabled(context, wifiState.id))
return
var wifiEnabled = false
if (checkPermission(context)) {
val wifiManager =
(context.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager)
wifiEnabled = wifiManager.isWifiEnabled
}
val icon = if (wifiEnabled) "mdi:wifi" else "mdi:wifi-off"
onSensorUpdated(context,
wifiState,
wifiEnabled,
icon,
mapOf()
)
}
private fun updateWifiFrequencySensor(context: Context) {
if (!isEnabled(context, wifiFrequency.id))
return
var conInfo: WifiInfo? = null
var frequency = 0
var lastScanStrength = -1
if (checkPermission(context)) {
val wifiManager =
(context.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager)
conInfo = wifiManager.connectionInfo
frequency = if (conInfo.networkId == -1) {
0
} else {
conInfo.frequency
}
lastScanStrength = wifiManager.scanResults.firstOrNull {
it.BSSID == conInfo.bssid
}?.level ?: -1
}
var signalStrength = -1
if (lastScanStrength != -1) {
signalStrength = WifiManager.calculateSignalLevel(lastScanStrength, 4)
}
val icon = "mdi:wifi-strength-" + when (signalStrength) {
-1 -> "off"
0 -> "outline"
else -> signalStrength
}
onSensorUpdated(context,
wifiFrequency,
frequency,
icon,
mapOf()
)
}
private fun updateWifiSignalStrengthSensor(context: Context) {
if (!isEnabled(context, wifiSignalStrength.id))
return
var conInfo: WifiInfo? = null
var lastScanStrength = -1
if (checkPermission(context)) {
val wifiManager =
(context.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager)
conInfo = wifiManager.connectionInfo
lastScanStrength = wifiManager.scanResults.firstOrNull {
it.BSSID == conInfo.bssid
}?.level ?: -1
}
var signalStrength = -1
if (lastScanStrength != -1) {
signalStrength = WifiManager.calculateSignalLevel(lastScanStrength, 4)
}
val icon = "mdi:wifi-strength-" + when (signalStrength) {
-1 -> "off"
0 -> "outline"
else -> signalStrength
}
onSensorUpdated(context,
wifiSignalStrength,
lastScanStrength,
icon,
mapOf()
)
}
private fun getIpAddress(ip: Int): String { private fun getIpAddress(ip: Int): String {
return (ip and 0xFF).toString() + "." + return (ip and 0xFF).toString() + "." +
(ip shr 8 and 0xFF) + "." + (ip shr 8 and 0xFF) + "." +

View file

@ -175,7 +175,13 @@ like to connect to:</string>
<string name="basic_sensor_name_battery_state">Battery State</string> <string name="basic_sensor_name_battery_state">Battery State</string>
<string name="basic_sensor_name_bluetooth">Bluetooth Connection</string> <string name="basic_sensor_name_bluetooth">Bluetooth Connection</string>
<string name="basic_sensor_name_last_reboot">Last Reboot</string> <string name="basic_sensor_name_last_reboot">Last Reboot</string>
<string name="basic_sensor_name_wifi">Wifi Connection</string> <string name="basic_sensor_name_wifi">WiFi Connection</string>
<string name="basic_sensor_name_wifi_bssid">WiFi BSSID</string>
<string name="basic_sensor_name_wifi_ip">WiFi IP Address</string>
<string name="basic_sensor_name_wifi_link_speed">WiFi Link Speed</string>
<string name="basic_sensor_name_wifi_state">WiFi State</string>
<string name="basic_sensor_name_wifi_frequency">WiFi Frequency</string>
<string name="basic_sensor_name_wifi_signal">WiFi Signal Strength</string>
<string name="basic_sensor_name_alarm">Next Alarm</string> <string name="basic_sensor_name_alarm">Next Alarm</string>
<string name="basic_sensor_name_phone">Phone State</string> <string name="basic_sensor_name_phone">Phone State</string>
<string name="basic_sensor_name_sim1">SIM 1</string> <string name="basic_sensor_name_sim1">SIM 1</string>
@ -208,7 +214,14 @@ like to connect to:</string>
<string name="sensor_description_steps_sensor">The total number of steps since the last reboot of the device</string> <string name="sensor_description_steps_sensor">The total number of steps since the last reboot of the device</string>
<string name="sensor_description_internal_storage">Information about the total and available storage space internally</string> <string name="sensor_description_internal_storage">Information about the total and available storage space internally</string>
<string name="sensor_description_external_storage">Information about the total and available storage space externally</string> <string name="sensor_description_external_storage">Information about the total and available storage space externally</string>
<string name="sensor_description_wifi_connection">Information about the currently connected WiFi network</string> <string name="sensor_description_storage_sensor">Information about the total and available storage space internally and externally</string>
<string name="sensor_description_wifi_connection">The name of the network the device is currently connected to</string>
<string name="sensor_description_wifi_bssid">The mac address of the currently connected WiFi access point</string>
<string name="sensor_description_wifi_ip">The current IP address of the device on the network</string>
<string name="sensor_description_wifi_link_speed">The current link speed of the device to the connected network</string>
<string name="sensor_description_wifi_state">Whether or not WiFi is enabled on the device</string>
<string name="sensor_description_wifi_frequency">The frequency band of the connected network</string>
<string name="sensor_description_wifi_signal">The signal strength of the device to the WiFi network</string>
<string name="sensor_summary">Use this to manage what sensors are enabled/disabled.</string> <string name="sensor_summary">Use this to manage what sensors are enabled/disabled.</string>
<string name="sensor_title">Manage Sensors</string> <string name="sensor_title">Manage Sensors</string>
<string name="sensor">Sensor</string> <string name="sensor">Sensor</string>