diff --git a/homeassistant/components/qnap_qsw/sensor.py b/homeassistant/components/qnap_qsw/sensor.py index 618c20b4cc2..5fecf28c9f2 100644 --- a/homeassistant/components/qnap_qsw/sensor.py +++ b/homeassistant/components/qnap_qsw/sensor.py @@ -7,10 +7,20 @@ from typing import Final from aioqsw.const import ( QSD_FAN1_SPEED, QSD_FAN2_SPEED, + QSD_LINK, + QSD_PORT_NUM, + QSD_PORTS_STATISTICS, + QSD_PORTS_STATUS, + QSD_RX_ERRORS, + QSD_RX_OCTETS, + QSD_RX_SPEED, + QSD_SYSTEM_BOARD, QSD_SYSTEM_SENSOR, QSD_SYSTEM_TIME, QSD_TEMP, QSD_TEMP_MAX, + QSD_TX_OCTETS, + QSD_TX_SPEED, QSD_UPTIME, ) @@ -21,7 +31,12 @@ from homeassistant.components.sensor import ( SensorStateClass, ) from homeassistant.config_entries import ConfigEntry -from homeassistant.const import TEMP_CELSIUS, TIME_SECONDS +from homeassistant.const import ( + DATA_BYTES, + DATA_RATE_BYTES_PER_SECOND, + TEMP_CELSIUS, + TIME_SECONDS, +) from homeassistant.core import HomeAssistant, callback from homeassistant.helpers.entity import EntityCategory from homeassistant.helpers.entity_platform import AddEntitiesCallback @@ -55,6 +70,44 @@ SENSOR_TYPES: Final[tuple[QswSensorEntityDescription, ...]] = ( state_class=SensorStateClass.MEASUREMENT, subkey=QSD_FAN2_SPEED, ), + QswSensorEntityDescription( + attributes={ + ATTR_MAX: [QSD_SYSTEM_BOARD, QSD_PORT_NUM], + }, + entity_registry_enabled_default=False, + icon="mdi:ethernet", + key=QSD_PORTS_STATUS, + name="Ports", + state_class=SensorStateClass.MEASUREMENT, + subkey=QSD_LINK, + ), + QswSensorEntityDescription( + entity_registry_enabled_default=False, + icon="mdi:download-network", + key=QSD_PORTS_STATISTICS, + name="RX", + native_unit_of_measurement=DATA_BYTES, + state_class=SensorStateClass.TOTAL_INCREASING, + subkey=QSD_RX_OCTETS, + ), + QswSensorEntityDescription( + entity_registry_enabled_default=False, + icon="mdi:close-network", + key=QSD_PORTS_STATISTICS, + entity_category=EntityCategory.DIAGNOSTIC, + name="RX Errors", + state_class=SensorStateClass.TOTAL_INCREASING, + subkey=QSD_RX_ERRORS, + ), + QswSensorEntityDescription( + entity_registry_enabled_default=False, + icon="mdi:download-network", + key=QSD_PORTS_STATISTICS, + name="RX Speed", + native_unit_of_measurement=DATA_RATE_BYTES_PER_SECOND, + state_class=SensorStateClass.MEASUREMENT, + subkey=QSD_RX_SPEED, + ), QswSensorEntityDescription( attributes={ ATTR_MAX: [QSD_SYSTEM_SENSOR, QSD_TEMP_MAX], @@ -66,6 +119,24 @@ SENSOR_TYPES: Final[tuple[QswSensorEntityDescription, ...]] = ( state_class=SensorStateClass.MEASUREMENT, subkey=QSD_TEMP, ), + QswSensorEntityDescription( + entity_registry_enabled_default=False, + icon="mdi:upload-network", + key=QSD_PORTS_STATISTICS, + name="TX", + native_unit_of_measurement=DATA_BYTES, + state_class=SensorStateClass.TOTAL_INCREASING, + subkey=QSD_TX_OCTETS, + ), + QswSensorEntityDescription( + entity_registry_enabled_default=False, + icon="mdi:upload-network", + key=QSD_PORTS_STATISTICS, + name="TX Speed", + native_unit_of_measurement=DATA_RATE_BYTES_PER_SECOND, + state_class=SensorStateClass.MEASUREMENT, + subkey=QSD_TX_SPEED, + ), QswSensorEntityDescription( icon="mdi:timer-outline", key=QSD_SYSTEM_TIME, @@ -116,7 +187,8 @@ class QswSensor(QswSensorEntity, SensorEntity): @callback def _async_update_attrs(self) -> None: """Update sensor attributes.""" - self._attr_native_value = self.get_device_value( + value = self.get_device_value( self.entity_description.key, self.entity_description.subkey ) + self._attr_native_value = value super()._async_update_attrs() diff --git a/tests/components/qnap_qsw/test_sensor.py b/tests/components/qnap_qsw/test_sensor.py index 3caf223c808..b37a45e441e 100644 --- a/tests/components/qnap_qsw/test_sensor.py +++ b/tests/components/qnap_qsw/test_sensor.py @@ -1,12 +1,17 @@ """The sensor tests for the QNAP QSW platform.""" +from unittest.mock import AsyncMock + from homeassistant.components.qnap_qsw.const import ATTR_MAX from homeassistant.core import HomeAssistant from .util import async_init_integration -async def test_qnap_qsw_create_sensors(hass: HomeAssistant) -> None: +async def test_qnap_qsw_create_sensors( + hass: HomeAssistant, + entity_registry_enabled_by_default: AsyncMock, +) -> None: """Test creation of sensors.""" await async_init_integration(hass) @@ -17,9 +22,28 @@ async def test_qnap_qsw_create_sensors(hass: HomeAssistant) -> None: state = hass.states.get("sensor.qsw_m408_4c_fan_2_speed") assert state is None + state = hass.states.get("sensor.qsw_m408_4c_ports") + assert state.state == "3" + assert state.attributes.get(ATTR_MAX) == 12 + + state = hass.states.get("sensor.qsw_m408_4c_rx_errors") + assert state.state == "22" + + state = hass.states.get("sensor.qsw_m408_4c_rx") + assert state.state == "22200" + + state = hass.states.get("sensor.qsw_m408_4c_rx_speed") + assert state.state == "0" + state = hass.states.get("sensor.qsw_m408_4c_temperature") assert state.state == "31" assert state.attributes.get(ATTR_MAX) == 85 + state = hass.states.get("sensor.qsw_m408_4c_tx") + assert state.state == "11100" + + state = hass.states.get("sensor.qsw_m408_4c_tx_speed") + assert state.state == "0" + state = hass.states.get("sensor.qsw_m408_4c_uptime") assert state.state == "91"