diff --git a/homeassistant/components/flume/sensor.py b/homeassistant/components/flume/sensor.py index 0f0213ec984d..70ffee8973fc 100644 --- a/homeassistant/components/flume/sensor.py +++ b/homeassistant/components/flume/sensor.py @@ -11,7 +11,7 @@ from homeassistant.components.sensor import ( SensorEntityDescription, SensorStateClass, ) -from homeassistant.const import UnitOfVolume +from homeassistant.const import UnitOfVolume, UnitOfVolumeFlowRate from homeassistant.core import HomeAssistant from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback from homeassistant.helpers.typing import StateType @@ -34,7 +34,8 @@ FLUME_QUERIES_SENSOR: tuple[SensorEntityDescription, ...] = ( key="current_interval", translation_key="current_interval", suggested_display_precision=2, - native_unit_of_measurement=f"{UnitOfVolume.GALLONS}/m", + native_unit_of_measurement=UnitOfVolumeFlowRate.GALLONS_PER_MINUTE, + device_class=SensorDeviceClass.VOLUME_FLOW_RATE, state_class=SensorStateClass.MEASUREMENT, ), SensorEntityDescription( @@ -65,14 +66,16 @@ FLUME_QUERIES_SENSOR: tuple[SensorEntityDescription, ...] = ( key="last_60_min", translation_key="last_60_min", suggested_display_precision=2, - native_unit_of_measurement=f"{UnitOfVolume.GALLONS}/h", + native_unit_of_measurement=UnitOfVolumeFlowRate.GALLONS_PER_HOUR, + device_class=SensorDeviceClass.VOLUME_FLOW_RATE, state_class=SensorStateClass.MEASUREMENT, ), SensorEntityDescription( key="last_24_hrs", translation_key="last_24_hrs", suggested_display_precision=2, - native_unit_of_measurement=f"{UnitOfVolume.GALLONS}/d", + native_unit_of_measurement=UnitOfVolumeFlowRate.GALLONS_PER_DAY, + device_class=SensorDeviceClass.VOLUME_FLOW_RATE, state_class=SensorStateClass.MEASUREMENT, ), SensorEntityDescription( diff --git a/tests/components/flume/conftest.py b/tests/components/flume/conftest.py index 6173db1e2b95..49d403a659b8 100644 --- a/tests/components/flume/conftest.py +++ b/tests/components/flume/conftest.py @@ -41,6 +41,7 @@ SENSOR_DEVICE = { "type": 2, # Sensor "location": { "name": "Sensor Location", + "tz": "America/New_York", }, "name": "Flume Sensor", "connected": True, diff --git a/tests/components/flume/snapshots/test_sensor.ambr b/tests/components/flume/snapshots/test_sensor.ambr new file mode 100644 index 000000000000..17c7716e072c --- /dev/null +++ b/tests/components/flume/snapshots/test_sensor.ambr @@ -0,0 +1,413 @@ +# serializer version: 1 +# name: test_sensors[sensor.flume_sensor_sensor_location_24_hours-entry] + EntityRegistryEntrySnapshot({ + 'aliases': list([ + None, + ]), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.flume_sensor_sensor_location_24_hours', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': '24 hours', + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 2, + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': '24 hours', + 'platform': 'flume', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'last_24_hrs', + 'unique_id': 'last_24_hrs_1234', + 'unit_of_measurement': , + }) +# --- +# name: test_sensors[sensor.flume_sensor_sensor_location_24_hours-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'attribution': 'Data provided by Flume API', + 'device_class': 'volume_flow_rate', + 'friendly_name': 'Flume Sensor Sensor Location 24 hours', + 'state_class': , + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'sensor.flume_sensor_sensor_location_24_hours', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '20.4', + }) +# --- +# name: test_sensors[sensor.flume_sensor_sensor_location_30_days-entry] + EntityRegistryEntrySnapshot({ + 'aliases': list([ + None, + ]), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.flume_sensor_sensor_location_30_days', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': '30 days', + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 2, + }), + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': '30 days', + 'platform': 'flume', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'last_30_days', + 'unique_id': 'last_30_days_1234', + 'unit_of_measurement': 'gal/mo', + }) +# --- +# name: test_sensors[sensor.flume_sensor_sensor_location_30_days-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'attribution': 'Data provided by Flume API', + 'friendly_name': 'Flume Sensor Sensor Location 30 days', + 'state_class': , + 'unit_of_measurement': 'gal/mo', + }), + 'context': , + 'entity_id': 'sensor.flume_sensor_sensor_location_30_days', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '150.8', + }) +# --- +# name: test_sensors[sensor.flume_sensor_sensor_location_60_minutes-entry] + EntityRegistryEntrySnapshot({ + 'aliases': list([ + None, + ]), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.flume_sensor_sensor_location_60_minutes', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': '60 minutes', + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 2, + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': '60 minutes', + 'platform': 'flume', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'last_60_min', + 'unique_id': 'last_60_min_1234', + 'unit_of_measurement': , + }) +# --- +# name: test_sensors[sensor.flume_sensor_sensor_location_60_minutes-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'attribution': 'Data provided by Flume API', + 'device_class': 'volume_flow_rate', + 'friendly_name': 'Flume Sensor Sensor Location 60 minutes', + 'state_class': , + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'sensor.flume_sensor_sensor_location_60_minutes', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '5.5', + }) +# --- +# name: test_sensors[sensor.flume_sensor_sensor_location_current-entry] + EntityRegistryEntrySnapshot({ + 'aliases': list([ + None, + ]), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.flume_sensor_sensor_location_current', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Current', + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 2, + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Current', + 'platform': 'flume', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'current_interval', + 'unique_id': 'current_interval_1234', + 'unit_of_measurement': , + }) +# --- +# name: test_sensors[sensor.flume_sensor_sensor_location_current-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'attribution': 'Data provided by Flume API', + 'device_class': 'volume_flow_rate', + 'friendly_name': 'Flume Sensor Sensor Location Current', + 'state_class': , + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'sensor.flume_sensor_sensor_location_current', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '1.23', + }) +# --- +# name: test_sensors[sensor.flume_sensor_sensor_location_current_day-entry] + EntityRegistryEntrySnapshot({ + 'aliases': list([ + None, + ]), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.flume_sensor_sensor_location_current_day', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Current day', + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 2, + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Current day', + 'platform': 'flume', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'today', + 'unique_id': 'today_1234', + 'unit_of_measurement': , + }) +# --- +# name: test_sensors[sensor.flume_sensor_sensor_location_current_day-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'attribution': 'Data provided by Flume API', + 'device_class': 'water', + 'friendly_name': 'Flume Sensor Sensor Location Current day', + 'state_class': , + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'sensor.flume_sensor_sensor_location_current_day', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '10.2', + }) +# --- +# name: test_sensors[sensor.flume_sensor_sensor_location_current_month-entry] + EntityRegistryEntrySnapshot({ + 'aliases': list([ + None, + ]), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.flume_sensor_sensor_location_current_month', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Current month', + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 2, + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Current month', + 'platform': 'flume', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'month_to_date', + 'unique_id': 'month_to_date_1234', + 'unit_of_measurement': , + }) +# --- +# name: test_sensors[sensor.flume_sensor_sensor_location_current_month-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'attribution': 'Data provided by Flume API', + 'device_class': 'water', + 'friendly_name': 'Flume Sensor Sensor Location Current month', + 'state_class': , + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'sensor.flume_sensor_sensor_location_current_month', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '100.1', + }) +# --- +# name: test_sensors[sensor.flume_sensor_sensor_location_current_week-entry] + EntityRegistryEntrySnapshot({ + 'aliases': list([ + None, + ]), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.flume_sensor_sensor_location_current_week', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Current week', + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 2, + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Current week', + 'platform': 'flume', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'week_to_date', + 'unique_id': 'week_to_date_1234', + 'unit_of_measurement': , + }) +# --- +# name: test_sensors[sensor.flume_sensor_sensor_location_current_week-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'attribution': 'Data provided by Flume API', + 'device_class': 'water', + 'friendly_name': 'Flume Sensor Sensor Location Current week', + 'state_class': , + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'sensor.flume_sensor_sensor_location_current_week', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '50.5', + }) +# --- diff --git a/tests/components/flume/test_sensor.py b/tests/components/flume/test_sensor.py new file mode 100644 index 000000000000..6d541de479fb --- /dev/null +++ b/tests/components/flume/test_sensor.py @@ -0,0 +1,49 @@ +"""Test the flume sensor.""" + +from unittest.mock import patch + +import pytest +from syrupy.assertion import SnapshotAssertion + +from homeassistant.const import Platform +from homeassistant.core import HomeAssistant +from homeassistant.helpers import entity_registry as er +from homeassistant.util.unit_system import US_CUSTOMARY_SYSTEM + +from tests.common import MockConfigEntry, snapshot_platform + + +@pytest.fixture(autouse=True) +def platforms_fixture(): + """Return the platforms to be loaded for this test.""" + with patch("homeassistant.components.flume.PLATFORMS", [Platform.SENSOR]): + yield + + +@pytest.mark.usefixtures("access_token", "device_list") +async def test_sensors( + hass: HomeAssistant, + config_entry: MockConfigEntry, + entity_registry: er.EntityRegistry, + snapshot: SnapshotAssertion, +) -> None: + """Test sensors.""" + hass.config.units = US_CUSTOMARY_SYSTEM + + flume_values = { + "current_interval": 1.23, + "month_to_date": 100.1, + "week_to_date": 50.5, + "today": 10.2, + "last_60_min": 5.5, + "last_24_hrs": 20.4, + "last_30_days": 150.8, + } + + with patch("homeassistant.components.flume.sensor.FlumeData") as mock_flume_data: + mock_flume_data.return_value.values = flume_values + + assert await hass.config_entries.async_setup(config_entry.entry_id) + await hass.async_block_till_done() + + await snapshot_platform(hass, entity_registry, snapshot, config_entry.entry_id)