diff --git a/homeassistant/components/asuswrt/const.py b/homeassistant/components/asuswrt/const.py index b450030ea3a..e41d683a7df 100644 --- a/homeassistant/components/asuswrt/const.py +++ b/homeassistant/components/asuswrt/const.py @@ -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"] diff --git a/homeassistant/components/asuswrt/router.py b/homeassistant/components/asuswrt/router.py index b94de51b2fb..3c911d7712e 100644 --- a/homeassistant/components/asuswrt/router.py +++ b/homeassistant/components/asuswrt/router.py @@ -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, } diff --git a/homeassistant/components/asuswrt/sensor.py b/homeassistant/components/asuswrt/sensor.py index cfa8748d2ba..086c7373a4e 100644 --- a/homeassistant/components/asuswrt/sensor.py +++ b/homeassistant/components/asuswrt/sensor.py @@ -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__) diff --git a/tests/components/asuswrt/test_sensor.py b/tests/components/asuswrt/test_sensor.py index cbdded64ff9..19c27777c2a 100644 --- a/tests/components/asuswrt/test_sensor.py +++ b/tests/components/asuswrt/test_sensor.py @@ -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