diff --git a/homeassistant/components/glances/icons.json b/homeassistant/components/glances/icons.json index 9f3e00540de..f6a1dcfea39 100644 --- a/homeassistant/components/glances/icons.json +++ b/homeassistant/components/glances/icons.json @@ -60,6 +60,12 @@ }, "gpu_memory_usage": { "default": "mdi:memory" + }, + "network_rx": { + "default": "mdi:transmission-tower" + }, + "network_tx": { + "default": "mdi:transmission-tower" } } } diff --git a/homeassistant/components/glances/sensor.py b/homeassistant/components/glances/sensor.py index 80671c0642e..c5706757725 100644 --- a/homeassistant/components/glances/sensor.py +++ b/homeassistant/components/glances/sensor.py @@ -265,6 +265,24 @@ SENSOR_TYPES = { native_unit_of_measurement=PERCENTAGE, state_class=SensorStateClass.MEASUREMENT, ), + ("network", "rx"): GlancesSensorEntityDescription( + key="rx", + type="network", + translation_key="network_rx", + native_unit_of_measurement=UnitOfDataRate.BYTES_PER_SECOND, + suggested_unit_of_measurement=UnitOfDataRate.MEGABITS_PER_SECOND, + device_class=SensorDeviceClass.DATA_RATE, + state_class=SensorStateClass.MEASUREMENT, + ), + ("network", "tx"): GlancesSensorEntityDescription( + key="tx", + type="network", + translation_key="network_tx", + native_unit_of_measurement=UnitOfDataRate.BYTES_PER_SECOND, + suggested_unit_of_measurement=UnitOfDataRate.MEGABITS_PER_SECOND, + device_class=SensorDeviceClass.DATA_RATE, + state_class=SensorStateClass.MEASUREMENT, + ), } @@ -279,7 +297,7 @@ async def async_setup_entry( entities: list[GlancesSensor] = [] for sensor_type, sensors in coordinator.data.items(): - if sensor_type in ["fs", "diskio", "sensors", "raid", "gpu"]: + if sensor_type in ["fs", "diskio", "sensors", "raid", "gpu", "network"]: entities.extend( GlancesSensor( coordinator, diff --git a/homeassistant/components/glances/strings.json b/homeassistant/components/glances/strings.json index 208d14563df..11735601ce9 100644 --- a/homeassistant/components/glances/strings.json +++ b/homeassistant/components/glances/strings.json @@ -115,6 +115,12 @@ }, "gpu_processor_usage": { "name": "{sensor_label} processor usage" + }, + "network_rx": { + "name": "{sensor_label} RX" + }, + "network_tx": { + "name": "{sensor_label} TX" } } }, diff --git a/tests/components/glances/__init__.py b/tests/components/glances/__init__.py index 6fbfc73b7be..beba7163bc2 100644 --- a/tests/components/glances/__init__.py +++ b/tests/components/glances/__init__.py @@ -12,168 +12,6 @@ MOCK_USER_INPUT: dict[str, Any] = { "verify_ssl": True, } -MOCK_DATA = { - "cpu": { - "total": 10.6, - "user": 7.6, - "system": 2.1, - "idle": 88.8, - "nice": 0.0, - "iowait": 0.6, - }, - "diskio": [ - { - "time_since_update": 1, - "disk_name": "nvme0n1", - "read_count": 12, - "write_count": 466, - "read_bytes": 184320, - "write_bytes": 23863296, - "key": "disk_name", - }, - ], - "docker": { - "containers": [ - { - "key": "name", - "name": "container1", - "Status": "running", - "cpu": {"total": 50.94973493230174}, - "cpu_percent": 50.94973493230174, - "memory": { - "usage": 1120321536, - "limit": 3976318976, - "rss": 480641024, - "cache": 580915200, - "max_usage": 1309597696, - }, - "memory_usage": 539406336, - }, - { - "key": "name", - "name": "container2", - "Status": "running", - "cpu": {"total": 26.23567931034483}, - "cpu_percent": 26.23567931034483, - "memory": { - "usage": 85139456, - "limit": 3976318976, - "rss": 33677312, - "cache": 35012608, - "max_usage": 87650304, - }, - "memory_usage": 50126848, - }, - ] - }, - "fs": [ - { - "device_name": "/dev/sda8", - "fs_type": "ext4", - "mnt_point": "/ssl", - "size": 511320748032, - "used": 32910458880, - "free": 457917374464, - "percent": 6.7, - "key": "mnt_point", - }, - { - "device_name": "/dev/sda8", - "fs_type": "ext4", - "mnt_point": "/media", - "size": 511320748032, - "used": 32910458880, - "free": 457917374464, - "percent": 6.7, - "key": "mnt_point", - }, - ], - "mem": { - "total": 3976318976, - "available": 2878337024, - "percent": 27.6, - "used": 1097981952, - "free": 2878337024, - "active": 567971840, - "inactive": 1679704064, - "buffers": 149807104, - "cached": 1334816768, - "shared": 1499136, - }, - "sensors": [ - { - "label": "cpu_thermal 1", - "value": 59, - "warning": None, - "critical": None, - "unit": "C", - "type": "temperature_core", - "key": "label", - }, - { - "label": "err_temp", - "value": "ERR", - "warning": None, - "critical": None, - "unit": "C", - "type": "temperature_hdd", - "key": "label", - }, - { - "label": "na_temp", - "value": "NA", - "warning": None, - "critical": None, - "unit": "C", - "type": "temperature_hdd", - "key": "label", - }, - ], - "system": { - "os_name": "Linux", - "hostname": "fedora-35", - "platform": "64bit", - "linux_distro": "Fedora Linux 35", - "os_version": "5.15.6-200.fc35.x86_64", - "hr_name": "Fedora Linux 35 64bit", - }, - "raid": { - "md3": { - "status": "active", - "type": "raid1", - "components": {"sdh1": "2", "sdi1": "0"}, - "available": "2", - "used": "2", - "config": "UU", - }, - "md1": { - "status": "active", - "type": "raid1", - "components": {"sdg": "0", "sde": "1"}, - "available": "2", - "used": "2", - "config": "UU", - }, - "md4": { - "status": "active", - "type": "raid1", - "components": {"sdf1": "1", "sdb1": "0"}, - "available": "2", - "used": "2", - "config": "UU", - }, - "md0": { - "status": "active", - "type": "raid1", - "components": {"sdc": "2", "sdd": "3"}, - "available": "2", - "used": "2", - "config": "UU", - }, - }, - "uptime": "3 days, 10:25:20", -} - MOCK_REFERENCE_DATE: datetime = datetime.fromisoformat("2024-02-13T14:13:12") HA_SENSOR_DATA: dict[str, Any] = { @@ -214,6 +52,11 @@ HA_SENSOR_DATA: dict[str, Any] = { "config": "UU", }, }, + "network": { + "lo": {"is_up": True, "rx": 7646, "tx": 7646, "speed": 0.0}, + "dummy0": {"is_up": False, "rx": 0.0, "tx": 0.0, "speed": 0.0}, + "eth0": {"is_up": True, "rx": 3953, "tx": 5995, "speed": 9.8}, + }, "uptime": "3 days, 10:25:20", "gpu": { "NVIDIA GeForce RTX 3080 (GPU 0)": { diff --git a/tests/components/glances/snapshots/test_sensor.ambr b/tests/components/glances/snapshots/test_sensor.ambr index 64ea8dd1052..662e95c6a1c 100644 --- a/tests/components/glances/snapshots/test_sensor.ambr +++ b/tests/components/glances/snapshots/test_sensor.ambr @@ -200,6 +200,114 @@ 'state': '59', }) # --- +# name: test_sensor_states[sensor.0_0_0_0_dummy0_rx-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.0_0_0_0_dummy0_rx', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + 'sensor.private': dict({ + 'suggested_unit_of_measurement': , + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'dummy0 RX', + 'platform': 'glances', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': 'network_rx', + 'unique_id': 'test-dummy0-rx', + 'unit_of_measurement': , + }) +# --- +# name: test_sensor_states[sensor.0_0_0_0_dummy0_rx-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'data_rate', + 'friendly_name': '0.0.0.0 dummy0 RX', + 'state_class': , + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'sensor.0_0_0_0_dummy0_rx', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '0.000000', + }) +# --- +# name: test_sensor_states[sensor.0_0_0_0_dummy0_tx-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.0_0_0_0_dummy0_tx', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + 'sensor.private': dict({ + 'suggested_unit_of_measurement': , + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'dummy0 TX', + 'platform': 'glances', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': 'network_tx', + 'unique_id': 'test-dummy0-tx', + 'unit_of_measurement': , + }) +# --- +# name: test_sensor_states[sensor.0_0_0_0_dummy0_tx-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'data_rate', + 'friendly_name': '0.0.0.0 dummy0 TX', + 'state_class': , + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'sensor.0_0_0_0_dummy0_tx', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '0.000000', + }) +# --- # name: test_sensor_states[sensor.0_0_0_0_err_temp_temperature-entry] EntityRegistryEntrySnapshot({ 'aliases': set({ @@ -251,6 +359,222 @@ 'state': 'unavailable', }) # --- +# name: test_sensor_states[sensor.0_0_0_0_eth0_rx-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.0_0_0_0_eth0_rx', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + 'sensor.private': dict({ + 'suggested_unit_of_measurement': , + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'eth0 RX', + 'platform': 'glances', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': 'network_rx', + 'unique_id': 'test-eth0-rx', + 'unit_of_measurement': , + }) +# --- +# name: test_sensor_states[sensor.0_0_0_0_eth0_rx-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'data_rate', + 'friendly_name': '0.0.0.0 eth0 RX', + 'state_class': , + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'sensor.0_0_0_0_eth0_rx', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '0.03162', + }) +# --- +# name: test_sensor_states[sensor.0_0_0_0_eth0_tx-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.0_0_0_0_eth0_tx', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + 'sensor.private': dict({ + 'suggested_unit_of_measurement': , + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'eth0 TX', + 'platform': 'glances', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': 'network_tx', + 'unique_id': 'test-eth0-tx', + 'unit_of_measurement': , + }) +# --- +# name: test_sensor_states[sensor.0_0_0_0_eth0_tx-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'data_rate', + 'friendly_name': '0.0.0.0 eth0 TX', + 'state_class': , + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'sensor.0_0_0_0_eth0_tx', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '0.04796', + }) +# --- +# name: test_sensor_states[sensor.0_0_0_0_lo_rx-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.0_0_0_0_lo_rx', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + 'sensor.private': dict({ + 'suggested_unit_of_measurement': , + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'lo RX', + 'platform': 'glances', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': 'network_rx', + 'unique_id': 'test-lo-rx', + 'unit_of_measurement': , + }) +# --- +# name: test_sensor_states[sensor.0_0_0_0_lo_rx-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'data_rate', + 'friendly_name': '0.0.0.0 lo RX', + 'state_class': , + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'sensor.0_0_0_0_lo_rx', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '0.06117', + }) +# --- +# name: test_sensor_states[sensor.0_0_0_0_lo_tx-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.0_0_0_0_lo_tx', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + 'sensor.private': dict({ + 'suggested_unit_of_measurement': , + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'lo TX', + 'platform': 'glances', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': 'network_tx', + 'unique_id': 'test-lo-tx', + 'unit_of_measurement': , + }) +# --- +# name: test_sensor_states[sensor.0_0_0_0_lo_tx-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'data_rate', + 'friendly_name': '0.0.0.0 lo TX', + 'state_class': , + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'sensor.0_0_0_0_lo_tx', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '0.06117', + }) +# --- # name: test_sensor_states[sensor.0_0_0_0_md1_available-entry] EntityRegistryEntrySnapshot({ 'aliases': set({