Add AsusWRT load average sensors (#52230)

This commit is contained in:
ollo69 2021-06-28 22:33:15 +02:00 committed by GitHub
parent f538e07902
commit c6efdedd3c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 39 additions and 1 deletions

View File

@ -23,4 +23,5 @@ PROTOCOL_TELNET = "telnet"
# Sensors
SENSORS_BYTES = ["sensor_rx_bytes", "sensor_tx_bytes"]
SENSORS_CONNECTED_DEVICE = ["sensor_connected_device"]
SENSORS_LOAD_AVG = ["sensor_load_avg1", "sensor_load_avg5", "sensor_load_avg15"]
SENSORS_RATES = ["sensor_rx_rates", "sensor_tx_rates"]

View File

@ -42,6 +42,7 @@ from .const import (
PROTOCOL_TELNET,
SENSORS_BYTES,
SENSORS_CONNECTED_DEVICE,
SENSORS_LOAD_AVG,
SENSORS_RATES,
)
@ -54,6 +55,7 @@ SCAN_INTERVAL = timedelta(seconds=30)
SENSORS_TYPE_BYTES = "sensors_bytes"
SENSORS_TYPE_COUNT = "sensors_count"
SENSORS_TYPE_LOAD_AVG = "sensors_load_avg"
SENSORS_TYPE_RATES = "sensors_rates"
_LOGGER = logging.getLogger(__name__)
@ -100,6 +102,15 @@ class AsusWrtSensorDataHandler:
return _get_dict(SENSORS_RATES, rates)
async def _get_load_avg(self):
"""Fetch load average information from the router."""
try:
avg = await self._api.async_get_loadavg()
except (OSError, ValueError) as exc:
raise UpdateFailed(exc) from exc
return _get_dict(SENSORS_LOAD_AVG, avg)
def update_device_count(self, conn_devices: int):
"""Update connected devices attribute."""
if self._connected_devices == conn_devices:
@ -113,6 +124,8 @@ class AsusWrtSensorDataHandler:
method = self._get_connected_devices
elif sensor_type == SENSORS_TYPE_BYTES:
method = self._get_bytes
elif sensor_type == SENSORS_TYPE_LOAD_AVG:
method = self._get_load_avg
elif sensor_type == SENSORS_TYPE_RATES:
method = self._get_rates
else:
@ -316,8 +329,9 @@ class AsusWrtRouter:
self._sensors_data_handler.update_device_count(self._connected_devices)
sensors_types = {
SENSORS_TYPE_COUNT: SENSORS_CONNECTED_DEVICE,
SENSORS_TYPE_BYTES: SENSORS_BYTES,
SENSORS_TYPE_COUNT: SENSORS_CONNECTED_DEVICE,
SENSORS_TYPE_LOAD_AVG: SENSORS_LOAD_AVG,
SENSORS_TYPE_RATES: SENSORS_RATES,
}

View File

@ -20,6 +20,7 @@ from .const import (
DOMAIN,
SENSORS_BYTES,
SENSORS_CONNECTED_DEVICE,
SENSORS_LOAD_AVG,
SENSORS_RATES,
)
from .router import KEY_COORDINATOR, KEY_SENSORS, AsusWrtRouter
@ -67,6 +68,18 @@ CONNECTION_SENSORS = {
SENSOR_FACTOR: 1000000000,
SENSOR_ICON: "mdi:upload",
},
SENSORS_LOAD_AVG[0]: {
SENSOR_NAME: "Load Avg (1m)",
SENSOR_ICON: "mdi:cpu-32-bit",
},
SENSORS_LOAD_AVG[1]: {
SENSOR_NAME: "Load Avg (5m)",
SENSOR_ICON: "mdi:cpu-32-bit",
},
SENSORS_LOAD_AVG[2]: {
SENSOR_NAME: "Load Avg (15m)",
SENSOR_ICON: "mdi:cpu-32-bit",
},
}
_LOGGER = logging.getLogger(__name__)

View File

@ -39,6 +39,7 @@ CONFIG_DATA = {
MOCK_BYTES_TOTAL = [60000000000, 50000000000]
MOCK_CURRENT_TRANSFER_RATES = [20000000, 10000000]
MOCK_LOAD_AVG = [1.1, 1.2, 1.3]
SENSOR_NAMES = [
"Devices Connected",
@ -46,6 +47,9 @@ SENSOR_NAMES = [
"Download",
"Upload Speed",
"Upload",
"Load Avg (1m)",
"Load Avg (5m)",
"Load Avg (15m)",
]
@ -81,6 +85,9 @@ def mock_controller_connect(mock_devices):
service_mock.return_value.async_get_current_transfer_rates = AsyncMock(
return_value=MOCK_CURRENT_TRANSFER_RATES
)
service_mock.return_value.async_get_loadavg = AsyncMock(
return_value=MOCK_LOAD_AVG
)
yield service_mock
@ -125,6 +132,9 @@ async def test_sensors(hass, connect, mock_devices):
assert hass.states.get(f"{sensor_prefix}_download").state == "60.0"
assert hass.states.get(f"{sensor_prefix}_upload_speed").state == "80.0"
assert hass.states.get(f"{sensor_prefix}_upload").state == "50.0"
assert hass.states.get(f"{sensor_prefix}_load_avg_1m").state == "1.1"
assert hass.states.get(f"{sensor_prefix}_load_avg_5m").state == "1.2"
assert hass.states.get(f"{sensor_prefix}_load_avg_15m").state == "1.3"
assert hass.states.get(f"{sensor_prefix}_devices_connected").state == "2"
# add one device and remove another