hass-core/tests/components/shelly/test_sensor.py

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

804 lines
26 KiB
Python
Raw Normal View History

"""Tests for Shelly sensor platform."""
from copy import deepcopy
from unittest.mock import Mock
2023-08-25 16:06:43 +02:00
from freezegun.api import FrozenDateTimeFactory
import pytest
2023-08-25 16:06:43 +02:00
from homeassistant.components.homeassistant import (
DOMAIN as HA_DOMAIN,
SERVICE_UPDATE_ENTITY,
)
from homeassistant.components.sensor import (
ATTR_STATE_CLASS,
DOMAIN as SENSOR_DOMAIN,
SensorDeviceClass,
SensorStateClass,
)
from homeassistant.components.shelly.const import DOMAIN
from homeassistant.const import (
ATTR_DEVICE_CLASS,
ATTR_ENTITY_ID,
ATTR_UNIT_OF_MEASUREMENT,
PERCENTAGE,
STATE_UNAVAILABLE,
STATE_UNKNOWN,
UnitOfEnergy,
)
from homeassistant.core import HomeAssistant, State
from homeassistant.helpers.device_registry import DeviceRegistry
from homeassistant.helpers.entity_registry import EntityRegistry
from homeassistant.setup import async_setup_component
from . import (
get_entity_state,
init_integration,
mock_polling_rpc_update,
mock_rest_update,
mutate_rpc_device_status,
register_device,
register_entity,
)
from tests.common import mock_restore_cache_with_extra_data
RELAY_BLOCK_ID = 0
SENSOR_BLOCK_ID = 3
DEVICE_BLOCK_ID = 4
async def test_block_sensor(
hass: HomeAssistant,
mock_block_device: Mock,
entity_registry: EntityRegistry,
monkeypatch: pytest.MonkeyPatch,
) -> None:
"""Test block sensor."""
entity_id = f"{SENSOR_DOMAIN}.test_name_channel_1_power"
await init_integration(hass, 1)
assert hass.states.get(entity_id).state == "53.4"
monkeypatch.setattr(mock_block_device.blocks[RELAY_BLOCK_ID], "power", 60.1)
mock_block_device.mock_update()
assert hass.states.get(entity_id).state == "60.1"
entry = entity_registry.async_get(entity_id)
assert entry
assert entry.unique_id == "123456789ABC-relay_0-power"
async def test_energy_sensor(
hass: HomeAssistant, mock_block_device: Mock, entity_registry: EntityRegistry
) -> None:
"""Test energy sensor."""
entity_id = f"{SENSOR_DOMAIN}.test_name_channel_1_energy"
await init_integration(hass, 1)
state = hass.states.get(entity_id)
# 1234567.89 Wmin / 60 / 1000 = 20.5761315 kWh
assert state.state == "20.5761315"
# suggested unit is KWh
assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == UnitOfEnergy.KILO_WATT_HOUR
entry = entity_registry.async_get(entity_id)
assert entry
assert entry.unique_id == "123456789ABC-relay_0-energy"
async def test_power_factory_unit_migration(
hass: HomeAssistant, mock_block_device: Mock, entity_registry: EntityRegistry
) -> None:
"""Test migration unit of the power factory sensor."""
entity_registry.async_get_or_create(
SENSOR_DOMAIN,
DOMAIN,
"123456789ABC-emeter_0-powerFactor",
suggested_object_id="test_name_power_factor",
unit_of_measurement="%",
)
entity_id = f"{SENSOR_DOMAIN}.test_name_power_factor"
await init_integration(hass, 1)
state = hass.states.get(entity_id)
# Value of 0.98 is converted to 98.0%
assert state.state == "98.0"
assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == PERCENTAGE
entry = entity_registry.async_get(entity_id)
assert entry
assert entry.unique_id == "123456789ABC-emeter_0-powerFactor"
async def test_power_factory_without_unit_migration(
hass: HomeAssistant, mock_block_device: Mock, entity_registry: EntityRegistry
) -> None:
"""Test unit and value of the power factory sensor without unit migration."""
entity_id = f"{SENSOR_DOMAIN}.test_name_power_factor"
await init_integration(hass, 1)
state = hass.states.get(entity_id)
assert state.state == "0.98"
assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) is None
entry = entity_registry.async_get(entity_id)
assert entry
assert entry.unique_id == "123456789ABC-emeter_0-powerFactor"
async def test_block_rest_sensor(
hass: HomeAssistant,
freezer: FrozenDateTimeFactory,
mock_block_device: Mock,
monkeypatch: pytest.MonkeyPatch,
) -> None:
"""Test block REST sensor."""
entity_id = register_entity(hass, SENSOR_DOMAIN, "test_name_rssi", "rssi")
await init_integration(hass, 1)
assert hass.states.get(entity_id).state == "-64"
monkeypatch.setitem(mock_block_device.status["wifi_sta"], "rssi", -71)
2023-08-25 16:06:43 +02:00
await mock_rest_update(hass, freezer)
assert hass.states.get(entity_id).state == "-71"
async def test_block_sleeping_sensor(
hass: HomeAssistant,
mock_block_device: Mock,
entity_registry: EntityRegistry,
monkeypatch: pytest.MonkeyPatch,
) -> None:
"""Test block sleeping sensor."""
monkeypatch.setattr(
mock_block_device.blocks[DEVICE_BLOCK_ID], "sensor_ids", {"battery": 98}
)
entity_id = f"{SENSOR_DOMAIN}.test_name_temperature"
await init_integration(hass, 1, sleep_period=1000)
# Sensor should be created when device is online
assert hass.states.get(entity_id) is None
# Make device online
mock_block_device.mock_online()
2024-04-28 11:19:38 -05:00
await hass.async_block_till_done(wait_background_tasks=True)
assert hass.states.get(entity_id).state == "22.1"
monkeypatch.setattr(mock_block_device.blocks[SENSOR_BLOCK_ID], "temp", 23.4)
mock_block_device.mock_update()
assert hass.states.get(entity_id).state == "23.4"
entry = entity_registry.async_get(entity_id)
assert entry
assert entry.unique_id == "123456789ABC-sensor_0-temp"
async def test_block_restored_sleeping_sensor(
hass: HomeAssistant,
mock_block_device: Mock,
device_registry: DeviceRegistry,
monkeypatch: pytest.MonkeyPatch,
) -> None:
"""Test block restored sleeping sensor."""
entry = await init_integration(hass, 1, sleep_period=1000, skip_setup=True)
register_device(device_registry, entry)
entity_id = register_entity(
hass, SENSOR_DOMAIN, "test_name_temperature", "sensor_0-temp", entry
)
extra_data = {"native_value": "20.4", "native_unit_of_measurement": "°C"}
mock_restore_cache_with_extra_data(hass, ((State(entity_id, ""), extra_data),))
monkeypatch.setattr(mock_block_device, "initialized", False)
await hass.config_entries.async_setup(entry.entry_id)
await hass.async_block_till_done()
state = hass.states.get(entity_id)
assert state
assert state.state == "20.4"
assert state.attributes[ATTR_STATE_CLASS] == SensorStateClass.MEASUREMENT
assert state.attributes[ATTR_DEVICE_CLASS] == SensorDeviceClass.TEMPERATURE
# Make device online
monkeypatch.setattr(mock_block_device, "initialized", True)
mock_block_device.mock_online()
2024-04-28 11:19:38 -05:00
await hass.async_block_till_done(wait_background_tasks=True)
assert hass.states.get(entity_id).state == "22.1"
async def test_block_restored_sleeping_sensor_no_last_state(
hass: HomeAssistant,
mock_block_device: Mock,
device_registry: DeviceRegistry,
monkeypatch: pytest.MonkeyPatch,
) -> None:
"""Test block restored sleeping sensor missing last state."""
entry = await init_integration(hass, 1, sleep_period=1000, skip_setup=True)
register_device(device_registry, entry)
entity_id = register_entity(
hass, SENSOR_DOMAIN, "test_name_temperature", "sensor_0-temp", entry
)
monkeypatch.setattr(mock_block_device, "initialized", False)
await hass.config_entries.async_setup(entry.entry_id)
await hass.async_block_till_done()
assert hass.states.get(entity_id).state == STATE_UNKNOWN
# Make device online
monkeypatch.setattr(mock_block_device, "initialized", True)
mock_block_device.mock_online()
2024-04-28 11:19:38 -05:00
await hass.async_block_till_done(wait_background_tasks=True)
assert hass.states.get(entity_id).state == "22.1"
async def test_block_sensor_error(
hass: HomeAssistant,
mock_block_device: Mock,
entity_registry: EntityRegistry,
monkeypatch: pytest.MonkeyPatch,
) -> None:
"""Test block sensor unavailable on sensor error."""
entity_id = f"{SENSOR_DOMAIN}.test_name_battery"
await init_integration(hass, 1)
assert hass.states.get(entity_id).state == "98"
monkeypatch.setattr(mock_block_device.blocks[DEVICE_BLOCK_ID], "battery", -1)
mock_block_device.mock_update()
assert hass.states.get(entity_id).state == STATE_UNAVAILABLE
entry = entity_registry.async_get(entity_id)
assert entry
assert entry.unique_id == "123456789ABC-device_0-battery"
async def test_block_sensor_removal(
hass: HomeAssistant,
mock_block_device: Mock,
entity_registry: EntityRegistry,
monkeypatch: pytest.MonkeyPatch,
) -> None:
"""Test block sensor is removed due to removal_condition."""
entity_id = register_entity(
hass, SENSOR_DOMAIN, "test_name_battery", "device_0-battery"
)
assert entity_registry.async_get(entity_id) is not None
monkeypatch.setitem(mock_block_device.settings, "external_power", 1)
await init_integration(hass, 1)
assert entity_registry.async_get(entity_id) is None
async def test_block_not_matched_restored_sleeping_sensor(
hass: HomeAssistant,
mock_block_device: Mock,
device_registry: DeviceRegistry,
monkeypatch: pytest.MonkeyPatch,
) -> None:
"""Test block not matched to restored sleeping sensor."""
entry = await init_integration(hass, 1, sleep_period=1000, skip_setup=True)
register_device(device_registry, entry)
entity_id = register_entity(
hass, SENSOR_DOMAIN, "test_name_temperature", "sensor_0-temp", entry
)
extra_data = {"native_value": "20.4", "native_unit_of_measurement": "°C"}
mock_restore_cache_with_extra_data(hass, ((State(entity_id, ""), extra_data),))
monkeypatch.setattr(mock_block_device, "initialized", False)
await hass.config_entries.async_setup(entry.entry_id)
await hass.async_block_till_done()
assert hass.states.get(entity_id).state == "20.4"
# Make device online
monkeypatch.setattr(
mock_block_device.blocks[SENSOR_BLOCK_ID], "description", "other_desc"
)
monkeypatch.setattr(mock_block_device, "initialized", True)
mock_block_device.mock_online()
2024-04-28 11:19:38 -05:00
await hass.async_block_till_done(wait_background_tasks=True)
assert hass.states.get(entity_id).state == "20.4"
async def test_block_sensor_without_value(
hass: HomeAssistant, mock_block_device: Mock, monkeypatch: pytest.MonkeyPatch
) -> None:
"""Test block sensor without value is not created."""
entity_id = f"{SENSOR_DOMAIN}.test_name_battery"
monkeypatch.setattr(mock_block_device.blocks[DEVICE_BLOCK_ID], "battery", None)
await init_integration(hass, 1)
assert hass.states.get(entity_id) is None
async def test_block_sensor_unknown_value(
hass: HomeAssistant, mock_block_device: Mock, monkeypatch: pytest.MonkeyPatch
) -> None:
"""Test block sensor unknown value."""
entity_id = f"{SENSOR_DOMAIN}.test_name_battery"
await init_integration(hass, 1)
monkeypatch.setattr(mock_block_device.blocks[DEVICE_BLOCK_ID], "battery", None)
mock_block_device.mock_update()
assert hass.states.get(entity_id).state == STATE_UNKNOWN
async def test_rpc_sensor(
hass: HomeAssistant, mock_rpc_device: Mock, monkeypatch: pytest.MonkeyPatch
) -> None:
"""Test RPC sensor."""
entity_id = f"{SENSOR_DOMAIN}.test_cover_0_power"
await init_integration(hass, 2)
assert hass.states.get(entity_id).state == "85.3"
mutate_rpc_device_status(monkeypatch, mock_rpc_device, "cover:0", "apower", "88.2")
mock_rpc_device.mock_update()
assert hass.states.get(entity_id).state == "88.2"
mutate_rpc_device_status(monkeypatch, mock_rpc_device, "cover:0", "apower", None)
mock_rpc_device.mock_update()
assert hass.states.get(entity_id).state == STATE_UNKNOWN
@pytest.mark.usefixtures("entity_registry_enabled_by_default")
async def test_rpc_rssi_sensor_removal(
hass: HomeAssistant,
mock_rpc_device: Mock,
monkeypatch: pytest.MonkeyPatch,
) -> None:
"""Test RPC RSSI sensor removal if no WiFi stations enabled."""
entity_id = f"{SENSOR_DOMAIN}.test_name_rssi"
entry = await init_integration(hass, 2)
# WiFi1 enabled, do not remove sensor
assert get_entity_state(hass, entity_id) == "-63"
# WiFi1 & WiFi2 disabled - remove sensor
monkeypatch.setitem(mock_rpc_device.config["wifi"]["sta"], "enable", False)
await hass.config_entries.async_reload(entry.entry_id)
await hass.async_block_till_done()
assert hass.states.get(entity_id) is None
# WiFi2 enabled, do not remove sensor
monkeypatch.setitem(mock_rpc_device.config["wifi"]["sta1"], "enable", True)
await hass.config_entries.async_reload(entry.entry_id)
await hass.async_block_till_done()
assert get_entity_state(hass, entity_id) == "-63"
async def test_rpc_illuminance_sensor(
hass: HomeAssistant, mock_rpc_device: Mock, entity_registry: EntityRegistry
) -> None:
"""Test RPC illuminacne sensor."""
entity_id = f"{SENSOR_DOMAIN}.test_name_illuminance"
await init_integration(hass, 2)
assert hass.states.get(entity_id).state == "345"
entry = entity_registry.async_get(entity_id)
assert entry
assert entry.unique_id == "123456789ABC-illuminance:0-illuminance"
async def test_rpc_sensor_error(
hass: HomeAssistant,
mock_rpc_device: Mock,
entity_registry: EntityRegistry,
monkeypatch: pytest.MonkeyPatch,
) -> None:
"""Test RPC sensor unavailable on sensor error."""
entity_id = f"{SENSOR_DOMAIN}.test_name_voltmeter"
await init_integration(hass, 2)
assert hass.states.get(entity_id).state == "4.321"
mutate_rpc_device_status(monkeypatch, mock_rpc_device, "voltmeter", "voltage", None)
mock_rpc_device.mock_update()
assert hass.states.get(entity_id).state == STATE_UNAVAILABLE
entry = entity_registry.async_get(entity_id)
assert entry
assert entry.unique_id == "123456789ABC-voltmeter-voltmeter"
async def test_rpc_polling_sensor(
hass: HomeAssistant,
freezer: FrozenDateTimeFactory,
mock_rpc_device: Mock,
entity_registry: EntityRegistry,
monkeypatch: pytest.MonkeyPatch,
) -> None:
"""Test RPC polling sensor."""
entity_id = register_entity(hass, SENSOR_DOMAIN, "test_name_rssi", "wifi-rssi")
await init_integration(hass, 2)
assert hass.states.get(entity_id).state == "-63"
mutate_rpc_device_status(monkeypatch, mock_rpc_device, "wifi", "rssi", "-70")
2023-08-25 16:06:43 +02:00
await mock_polling_rpc_update(hass, freezer)
assert hass.states.get(entity_id).state == "-70"
entry = entity_registry.async_get(entity_id)
assert entry
assert entry.unique_id == "123456789ABC-wifi-rssi"
async def test_rpc_sleeping_sensor(
hass: HomeAssistant,
mock_rpc_device: Mock,
device_registry: DeviceRegistry,
monkeypatch: pytest.MonkeyPatch,
) -> None:
"""Test RPC online sleeping sensor."""
entity_id = f"{SENSOR_DOMAIN}.test_name_temperature"
monkeypatch.setitem(mock_rpc_device.status["sys"], "wakeup_period", 1000)
entry = await init_integration(hass, 2, sleep_period=1000)
# Sensor should be created when device is online
assert hass.states.get(entity_id) is None
register_entity(
hass,
SENSOR_DOMAIN,
"test_name_temperature",
"temperature:0-temperature_0",
entry,
)
# Make device online
mock_rpc_device.mock_online()
2024-04-28 11:19:38 -05:00
await hass.async_block_till_done(wait_background_tasks=True)
assert hass.states.get(entity_id).state == "22.9"
mutate_rpc_device_status(monkeypatch, mock_rpc_device, "temperature:0", "tC", 23.4)
mock_rpc_device.mock_update()
assert hass.states.get(entity_id).state == "23.4"
async def test_rpc_restored_sleeping_sensor(
hass: HomeAssistant,
mock_rpc_device: Mock,
device_registry: DeviceRegistry,
monkeypatch: pytest.MonkeyPatch,
) -> None:
"""Test RPC restored sensor."""
entry = await init_integration(hass, 2, sleep_period=1000, skip_setup=True)
register_device(device_registry, entry)
entity_id = register_entity(
hass,
SENSOR_DOMAIN,
"test_name_temperature",
"temperature:0-temperature_0",
entry,
)
extra_data = {"native_value": "21.0", "native_unit_of_measurement": "°C"}
mock_restore_cache_with_extra_data(hass, ((State(entity_id, ""), extra_data),))
monkeypatch.setattr(mock_rpc_device, "initialized", False)
await hass.config_entries.async_setup(entry.entry_id)
await hass.async_block_till_done()
assert hass.states.get(entity_id).state == "21.0"
# Make device online
monkeypatch.setattr(mock_rpc_device, "initialized", True)
mock_rpc_device.mock_online()
2024-04-28 11:19:38 -05:00
await hass.async_block_till_done(wait_background_tasks=True)
# Mock update
mock_rpc_device.mock_update()
await hass.async_block_till_done()
assert hass.states.get(entity_id).state == "22.9"
async def test_rpc_restored_sleeping_sensor_no_last_state(
hass: HomeAssistant,
mock_rpc_device: Mock,
device_registry: DeviceRegistry,
monkeypatch: pytest.MonkeyPatch,
) -> None:
"""Test RPC restored sensor missing last state."""
entry = await init_integration(hass, 2, sleep_period=1000, skip_setup=True)
register_device(device_registry, entry)
entity_id = register_entity(
hass,
SENSOR_DOMAIN,
"test_name_temperature",
"temperature:0-temperature_0",
entry,
)
monkeypatch.setattr(mock_rpc_device, "initialized", False)
await hass.config_entries.async_setup(entry.entry_id)
await hass.async_block_till_done()
assert hass.states.get(entity_id).state == STATE_UNKNOWN
# Make device online
monkeypatch.setattr(mock_rpc_device, "initialized", True)
mock_rpc_device.mock_online()
2024-04-28 11:19:38 -05:00
await hass.async_block_till_done(wait_background_tasks=True)
# Mock update
mock_rpc_device.mock_update()
await hass.async_block_till_done()
assert hass.states.get(entity_id).state == "22.9"
@pytest.mark.usefixtures("entity_registry_enabled_by_default")
async def test_rpc_em1_sensors(
hass: HomeAssistant, entity_registry: EntityRegistry, mock_rpc_device: Mock
) -> None:
"""Test RPC sensors for EM1 component."""
await init_integration(hass, 2)
state = hass.states.get("sensor.test_name_em0_power")
assert state
assert state.state == "85.3"
entry = entity_registry.async_get("sensor.test_name_em0_power")
assert entry
assert entry.unique_id == "123456789ABC-em1:0-power_em1"
state = hass.states.get("sensor.test_name_em1_power")
assert state
assert state.state == "123.3"
entry = entity_registry.async_get("sensor.test_name_em1_power")
assert entry
assert entry.unique_id == "123456789ABC-em1:1-power_em1"
state = hass.states.get("sensor.test_name_em0_total_active_energy")
assert state
assert state.state == "123.4564"
entry = entity_registry.async_get("sensor.test_name_em0_total_active_energy")
assert entry
assert entry.unique_id == "123456789ABC-em1data:0-total_act_energy"
state = hass.states.get("sensor.test_name_em1_total_active_energy")
assert state
assert state.state == "987.6543"
entry = entity_registry.async_get("sensor.test_name_em1_total_active_energy")
assert entry
assert entry.unique_id == "123456789ABC-em1data:1-total_act_energy"
async def test_rpc_sleeping_update_entity_service(
hass: HomeAssistant,
mock_rpc_device: Mock,
entity_registry: EntityRegistry,
monkeypatch: pytest.MonkeyPatch,
caplog: pytest.LogCaptureFixture,
) -> None:
"""Test RPC sleeping device when the update_entity service is used."""
await async_setup_component(hass, "homeassistant", {})
entity_id = f"{SENSOR_DOMAIN}.test_name_temperature"
monkeypatch.setitem(mock_rpc_device.status["sys"], "wakeup_period", 1000)
await init_integration(hass, 2, sleep_period=1000)
# Entity should be created when device is online
assert hass.states.get(entity_id) is None
# Make device online
mock_rpc_device.mock_online()
2024-04-28 11:19:38 -05:00
await hass.async_block_till_done(wait_background_tasks=True)
state = hass.states.get(entity_id)
assert state.state == "22.9"
await hass.services.async_call(
HA_DOMAIN,
SERVICE_UPDATE_ENTITY,
service_data={ATTR_ENTITY_ID: entity_id},
blocking=True,
)
# Entity should be available after update_entity service call
state = hass.states.get(entity_id)
assert state.state == "22.9"
entry = entity_registry.async_get(entity_id)
assert entry
assert entry.unique_id == "123456789ABC-temperature:0-temperature_0"
assert (
"Entity sensor.test_name_temperature comes from a sleeping device"
in caplog.text
)
async def test_block_sleeping_update_entity_service(
hass: HomeAssistant,
mock_block_device: Mock,
entity_registry: EntityRegistry,
monkeypatch: pytest.MonkeyPatch,
caplog: pytest.LogCaptureFixture,
) -> None:
"""Test block sleeping device when the update_entity service is used."""
await async_setup_component(hass, "homeassistant", {})
entity_id = f"{SENSOR_DOMAIN}.test_name_temperature"
monkeypatch.setitem(
mock_block_device.settings,
"sleep_mode",
{"period": 60, "unit": "m"},
)
await init_integration(hass, 1, sleep_period=3600)
# Sensor should be created when device is online
assert hass.states.get(entity_id) is None
# Make device online
mock_block_device.mock_online()
2024-04-28 11:19:38 -05:00
await hass.async_block_till_done(wait_background_tasks=True)
assert hass.states.get(entity_id).state == "22.1"
await hass.services.async_call(
HA_DOMAIN,
SERVICE_UPDATE_ENTITY,
service_data={ATTR_ENTITY_ID: entity_id},
blocking=True,
)
# Entity should be available after update_entity service call
state = hass.states.get(entity_id)
assert state.state == "22.1"
entry = entity_registry.async_get(entity_id)
assert entry
assert entry.unique_id == "123456789ABC-sensor_0-temp"
assert (
"Entity sensor.test_name_temperature comes from a sleeping device"
in caplog.text
)
async def test_rpc_analog_input_sensors(
hass: HomeAssistant, mock_rpc_device: Mock, entity_registry: EntityRegistry
) -> None:
"""Test RPC analog input xpercent sensor."""
await init_integration(hass, 2)
entity_id = f"{SENSOR_DOMAIN}.test_name_analog_input"
assert hass.states.get(entity_id).state == "89"
entry = entity_registry.async_get(entity_id)
assert entry
assert entry.unique_id == "123456789ABC-input:1-analoginput"
entity_id = f"{SENSOR_DOMAIN}.test_name_analog_value"
assert hass.states.get(entity_id).state == "8.9"
entry = entity_registry.async_get(entity_id)
assert entry
assert entry.unique_id == "123456789ABC-input:1-analoginput_xpercent"
async def test_rpc_disabled_analog_input_sensors(
hass: HomeAssistant, mock_rpc_device: Mock, monkeypatch: pytest.MonkeyPatch
) -> None:
"""Test RPC disabled counter sensor."""
new_config = deepcopy(mock_rpc_device.config)
new_config["input:1"]["enable"] = False
monkeypatch.setattr(mock_rpc_device, "config", new_config)
await init_integration(hass, 2)
entity_id = f"{SENSOR_DOMAIN}.test_name_analog_input"
assert hass.states.get(entity_id) is None
entity_id = f"{SENSOR_DOMAIN}.test_name_analog_value"
assert hass.states.get(entity_id) is None
async def test_rpc_disabled_xpercent(
hass: HomeAssistant, mock_rpc_device: Mock, monkeypatch: pytest.MonkeyPatch
) -> None:
"""Test RPC empty xpercent value."""
mutate_rpc_device_status(
monkeypatch,
mock_rpc_device,
"input:1",
"xpercent",
None,
)
await init_integration(hass, 2)
entity_id = f"{SENSOR_DOMAIN}.test_name_analog_input"
assert hass.states.get(entity_id).state == "89"
entity_id = f"{SENSOR_DOMAIN}.test_name_analog_value"
assert hass.states.get(entity_id) is None
async def test_rpc_pulse_counter_sensors(
hass: HomeAssistant,
mock_rpc_device: Mock,
entity_registry: EntityRegistry,
monkeypatch: pytest.MonkeyPatch,
) -> None:
"""Test RPC counter sensor."""
await init_integration(hass, 2)
entity_id = f"{SENSOR_DOMAIN}.gas_pulse_counter"
state = hass.states.get(entity_id)
assert state.state == "56174"
assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == "pulse"
assert state.attributes.get(ATTR_STATE_CLASS) == SensorStateClass.TOTAL
entry = entity_registry.async_get(entity_id)
assert entry
assert entry.unique_id == "123456789ABC-input:2-pulse_counter"
entity_id = f"{SENSOR_DOMAIN}.gas_counter_value"
assert hass.states.get(entity_id).state == "561.74"
entry = entity_registry.async_get(entity_id)
assert entry
assert entry.unique_id == "123456789ABC-input:2-counter_value"
async def test_rpc_disabled_pulse_counter_sensors(
hass: HomeAssistant, mock_rpc_device: Mock, monkeypatch: pytest.MonkeyPatch
) -> None:
"""Test RPC disabled counter sensor."""
new_config = deepcopy(mock_rpc_device.config)
new_config["input:2"]["enable"] = False
monkeypatch.setattr(mock_rpc_device, "config", new_config)
await init_integration(hass, 2)
entity_id = f"{SENSOR_DOMAIN}.gas_pulse_counter"
assert hass.states.get(entity_id) is None
entity_id = f"{SENSOR_DOMAIN}.gas_counter_value"
assert hass.states.get(entity_id) is None
async def test_rpc_disabled_xtotal_counter(
hass: HomeAssistant, mock_rpc_device: Mock, monkeypatch: pytest.MonkeyPatch
) -> None:
"""Test RPC disabled xtotal counter."""
mutate_rpc_device_status(
monkeypatch,
mock_rpc_device,
"input:2",
"counts",
{"total": 20635},
)
await init_integration(hass, 2)
entity_id = f"{SENSOR_DOMAIN}.gas_pulse_counter"
assert hass.states.get(entity_id).state == "20635"
entity_id = f"{SENSOR_DOMAIN}.gas_counter_value"
assert hass.states.get(entity_id) is None