diff --git a/.coveragerc b/.coveragerc index 36a1bb56ffb..611cb6cb983 100644 --- a/.coveragerc +++ b/.coveragerc @@ -256,9 +256,6 @@ omit = homeassistant/components/dormakaba_dkey/sensor.py homeassistant/components/dovado/* homeassistant/components/downloader/__init__.py - homeassistant/components/dsmr_reader/__init__.py - homeassistant/components/dsmr_reader/definitions.py - homeassistant/components/dsmr_reader/sensor.py homeassistant/components/dte_energy_bridge/sensor.py homeassistant/components/dublin_bus_transport/sensor.py homeassistant/components/dunehd/__init__.py diff --git a/CODEOWNERS b/CODEOWNERS index fd621c03ba2..ddd1e424397 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -342,8 +342,8 @@ build.json @home-assistant/supervisor /tests/components/drop_connect/ @ChandlerSystems @pfrazer /homeassistant/components/dsmr/ @Robbie1221 @frenck /tests/components/dsmr/ @Robbie1221 @frenck -/homeassistant/components/dsmr_reader/ @sorted-bits @glodenox -/tests/components/dsmr_reader/ @sorted-bits @glodenox +/homeassistant/components/dsmr_reader/ @sorted-bits @glodenox @erwindouna +/tests/components/dsmr_reader/ @sorted-bits @glodenox @erwindouna /homeassistant/components/duotecno/ @cereal2nd /tests/components/duotecno/ @cereal2nd /homeassistant/components/dwd_weather_warnings/ @runningman84 @stephan192 @andarotajo diff --git a/homeassistant/components/dsmr_reader/manifest.json b/homeassistant/components/dsmr_reader/manifest.json index 35dc21384bd..9c0e6da2c46 100644 --- a/homeassistant/components/dsmr_reader/manifest.json +++ b/homeassistant/components/dsmr_reader/manifest.json @@ -1,7 +1,7 @@ { "domain": "dsmr_reader", "name": "DSMR Reader", - "codeowners": ["@sorted-bits", "@glodenox"], + "codeowners": ["@sorted-bits", "@glodenox", "@erwindouna"], "config_flow": true, "dependencies": ["mqtt"], "documentation": "https://www.home-assistant.io/integrations/dsmr_reader", diff --git a/tests/components/dsmr_reader/test_definitions.py b/tests/components/dsmr_reader/test_definitions.py new file mode 100644 index 00000000000..3aef66c85d9 --- /dev/null +++ b/tests/components/dsmr_reader/test_definitions.py @@ -0,0 +1,111 @@ +"""Test the DSMR Reader definitions.""" + +import pytest + +from homeassistant.components.dsmr_reader.const import DOMAIN +from homeassistant.components.dsmr_reader.definitions import ( + DSMRReaderSensorEntityDescription, + dsmr_transform, + tariff_transform, +) +from homeassistant.components.dsmr_reader.sensor import DSMRSensor +from homeassistant.const import STATE_UNKNOWN +from homeassistant.core import HomeAssistant + +from tests.common import MockConfigEntry, async_fire_mqtt_message +from tests.typing import MqttMockHAClient + + +@pytest.mark.parametrize( + ("input", "expected"), + [ + ("20", 2.0), + ("version 5", "version 5"), + ], +) +async def test_dsmr_transform(input, expected) -> None: + """Test the dsmr_transform function.""" + assert dsmr_transform(input) == expected + + +@pytest.mark.parametrize( + ("input", "expected"), + [ + ("1", "low"), + ("0", "high"), + ], +) +async def test_tariff_transform(input, expected) -> None: + """Test the tariff_transform function.""" + assert tariff_transform(input) == expected + + +async def test_entity_tariff( + hass: HomeAssistant, + mqtt_mock: MqttMockHAClient, +): + """Test the state attribute of DSMRReaderSensorEntityDescription when a tariff transform is needed.""" + config_entry = MockConfigEntry( + domain=DOMAIN, + title=DOMAIN, + options={}, + entry_id="TEST_ENTRY_ID", + unique_id="UNIQUE_TEST_ID", + ) + config_entry.add_to_hass(hass) + assert await hass.config_entries.async_setup(config_entry.entry_id) + await hass.async_block_till_done() + + # Test if the payload is empty + async_fire_mqtt_message(hass, "dsmr/meter-stats/electricity_tariff", "") + await hass.async_block_till_done() + + electricity_tariff = "sensor.dsmr_meter_stats_electricity_tariff" + assert hass.states.get(electricity_tariff).state == STATE_UNKNOWN + + # Test high tariff + async_fire_mqtt_message(hass, "dsmr/meter-stats/electricity_tariff", "0") + await hass.async_block_till_done() + assert hass.states.get(electricity_tariff).state == "high" + + # Test low tariff + async_fire_mqtt_message(hass, "dsmr/meter-stats/electricity_tariff", "1") + await hass.async_block_till_done() + assert hass.states.get(electricity_tariff).state == "low" + + +async def test_entity_dsmr_transform(hass: HomeAssistant, mqtt_mock: MqttMockHAClient): + """Test the state attribute of DSMRReaderSensorEntityDescription when a dsmr transform is needed.""" + config_entry = MockConfigEntry( + domain=DOMAIN, + title=DOMAIN, + options={}, + entry_id="TEST_ENTRY_ID", + unique_id="UNIQUE_TEST_ID", + ) + config_entry.add_to_hass(hass) + assert await hass.config_entries.async_setup(config_entry.entry_id) + await hass.async_block_till_done() + + # Create the entity, since it's not by default + description = DSMRReaderSensorEntityDescription( + key="dsmr/meter-stats/dsmr_version", + name="version_test", + state=dsmr_transform, + ) + sensor = DSMRSensor(description, config_entry) + sensor.hass = hass + await sensor.async_added_to_hass() + + # Test dsmr version, if it's a digit + async_fire_mqtt_message(hass, "dsmr/meter-stats/dsmr_version", "42") + await hass.async_block_till_done() + + dsmr_version = "sensor.dsmr_meter_stats_dsmr_version" + assert hass.states.get(dsmr_version).state == "4.2" + + # Test dsmr version, if it's not a digit + async_fire_mqtt_message(hass, "dsmr/meter-stats/dsmr_version", "version 5") + await hass.async_block_till_done() + + assert hass.states.get(dsmr_version).state == "version 5" diff --git a/tests/components/dsmr_reader/test_sensor.py b/tests/components/dsmr_reader/test_sensor.py new file mode 100644 index 00000000000..5e4ffcba5c6 --- /dev/null +++ b/tests/components/dsmr_reader/test_sensor.py @@ -0,0 +1,66 @@ +"""Tests for DSMR Reader sensor.""" + +from homeassistant.components.dsmr_reader.const import DOMAIN +from homeassistant.components.dsmr_reader.definitions import ( + DSMRReaderSensorEntityDescription, +) +from homeassistant.components.dsmr_reader.sensor import DSMRSensor +from homeassistant.const import STATE_UNKNOWN +from homeassistant.core import HomeAssistant + +from tests.common import MockConfigEntry, async_fire_mqtt_message +from tests.typing import MqttMockHAClient + + +async def test_dsmr_sensor_mqtt( + hass: HomeAssistant, + mqtt_mock: MqttMockHAClient, +) -> None: + """Test the DSMRSensor class, via an emluated MQTT message.""" + config_entry = MockConfigEntry( + domain=DOMAIN, + title=DOMAIN, + options={}, + entry_id="TEST_ENTRY_ID", + unique_id="UNIQUE_TEST_ID", + ) + config_entry.add_to_hass(hass) + assert await hass.config_entries.async_setup(config_entry.entry_id) + await hass.async_block_till_done() + + electricity_delivered_1 = "sensor.dsmr_reading_electricity_delivered_1" + assert hass.states.get(electricity_delivered_1).state == STATE_UNKNOWN + + electricity_delivered_2 = "sensor.dsmr_reading_electricity_delivered_2" + assert hass.states.get(electricity_delivered_2).state == STATE_UNKNOWN + + # Test if the payload is empty + async_fire_mqtt_message(hass, "dsmr/reading/electricity_delivered_1", "") + await hass.async_block_till_done() + async_fire_mqtt_message(hass, "dsmr/reading/electricity_delivered_2", "") + await hass.async_block_till_done() + + assert hass.states.get(electricity_delivered_1).state == STATE_UNKNOWN + assert hass.states.get(electricity_delivered_2).state == STATE_UNKNOWN + + # Test if the payload is not empty + async_fire_mqtt_message(hass, "dsmr/reading/electricity_delivered_1", "1050.39") + await hass.async_block_till_done() + async_fire_mqtt_message(hass, "dsmr/reading/electricity_delivered_2", "2001.12") + await hass.async_block_till_done() + + assert hass.states.get(electricity_delivered_1).state == "1050.39" + assert hass.states.get(electricity_delivered_2).state == "2001.12" + + # Create a test entity to ensure the entity_description.state is not None + description = DSMRReaderSensorEntityDescription( + key="DSMR_TEST_KEY", + name="DSMR_TEST_NAME", + state=lambda x: x, + ) + sensor = DSMRSensor(description, config_entry) + sensor.hass = hass + await sensor.async_added_to_hass() + async_fire_mqtt_message(hass, "DSMR_TEST_KEY", "192.8") + await hass.async_block_till_done() + assert sensor.native_value == "192.8"