core/tests/components/sense/test_sensor.py

235 lines
7.9 KiB
Python
Raw Normal View History

"""The tests for Sense sensor platform."""
from datetime import timedelta
from unittest.mock import MagicMock, PropertyMock
from freezegun.api import FrozenDateTimeFactory
import pytest
from sense_energy import Scale
from syrupy.assertion import SnapshotAssertion
from homeassistant.components.sense.const import ACTIVE_UPDATE_RATE, TREND_UPDATE_RATE
from homeassistant.components.sensor import DOMAIN as SENSOR_DOMAIN
2024-10-25 18:45:55 +00:00
from homeassistant.const import Platform
from homeassistant.core import HomeAssistant
from homeassistant.helpers import entity_registry as er
from homeassistant.util.dt import utcnow
from . import setup_platform
from .const import (
DEVICE_1_DAY_ENERGY,
DEVICE_1_NAME,
DEVICE_2_DAY_ENERGY,
DEVICE_2_NAME,
DEVICE_2_POWER,
MONITOR_ID,
)
from tests.common import MockConfigEntry, async_fire_time_changed, snapshot_platform
@pytest.mark.usefixtures("entity_registry_enabled_by_default")
async def test_sensors(
hass: HomeAssistant,
mock_sense: MagicMock,
config_entry: MockConfigEntry,
entity_registry: er.EntityRegistry,
snapshot: SnapshotAssertion,
) -> None:
"""Test Sensor."""
await setup_platform(hass, config_entry, Platform.SENSOR)
await snapshot_platform(hass, entity_registry, snapshot, config_entry.entry_id)
async def test_device_power_sensors(
hass: HomeAssistant,
entity_registry: er.EntityRegistry,
mock_sense: MagicMock,
config_entry: MockConfigEntry,
) -> None:
"""Test the Sense device power sensors."""
device_1, device_2 = mock_sense.devices
device_1.power_w = 0
device_2.power_w = 0
2024-10-25 18:45:55 +00:00
await setup_platform(hass, config_entry, SENSOR_DOMAIN)
device_1, device_2 = mock_sense.devices
state = hass.states.get(f"sensor.{DEVICE_1_NAME.lower()}_power")
assert state.state == "0"
state = hass.states.get(f"sensor.{DEVICE_2_NAME.lower()}_power")
assert state.state == "0"
device_2.power_w = DEVICE_2_POWER
async_fire_time_changed(hass, utcnow() + timedelta(seconds=ACTIVE_UPDATE_RATE))
await hass.async_block_till_done()
state = hass.states.get(f"sensor.{DEVICE_1_NAME.lower()}_power")
assert state.state == "0"
state = hass.states.get(f"sensor.{DEVICE_2_NAME.lower()}_power")
assert state.state == f"{DEVICE_2_POWER:.1f}"
async def test_device_energy_sensors(
hass: HomeAssistant,
entity_registry: er.EntityRegistry,
mock_sense: MagicMock,
config_entry: MockConfigEntry,
freezer: FrozenDateTimeFactory,
) -> None:
"""Test the Sense device power sensors."""
await setup_platform(hass, config_entry, SENSOR_DOMAIN)
device_1, device_2 = mock_sense.devices
state = hass.states.get(f"sensor.{DEVICE_1_NAME.lower()}_daily_energy")
assert state.state == f"{DEVICE_1_DAY_ENERGY:.0f}"
state = hass.states.get(f"sensor.{DEVICE_2_NAME.lower()}_daily_energy")
assert state.state == f"{DEVICE_2_DAY_ENERGY:.0f}"
device_1.energy_kwh[Scale.DAY] = 0
device_2.energy_kwh[Scale.DAY] = 0
freezer.tick(timedelta(seconds=TREND_UPDATE_RATE))
async_fire_time_changed(hass)
await hass.async_block_till_done()
state = hass.states.get(f"sensor.{DEVICE_1_NAME.lower()}_daily_energy")
assert state.state == "0"
state = hass.states.get(f"sensor.{DEVICE_2_NAME.lower()}_daily_energy")
assert state.state == "0"
device_2.energy_kwh[Scale.DAY] = DEVICE_1_DAY_ENERGY
freezer.tick(timedelta(seconds=TREND_UPDATE_RATE))
async_fire_time_changed(hass)
await hass.async_block_till_done()
state = hass.states.get(f"sensor.{DEVICE_1_NAME.lower()}_daily_energy")
assert state.state == "0"
state = hass.states.get(f"sensor.{DEVICE_2_NAME.lower()}_daily_energy")
assert state.state == f"{DEVICE_1_DAY_ENERGY:.0f}"
async def test_voltage_sensors(
hass: HomeAssistant,
entity_registry: er.EntityRegistry,
mock_sense: MagicMock,
config_entry: MockConfigEntry,
) -> None:
"""Test the Sense voltage sensors."""
2024-10-25 18:45:55 +00:00
type(mock_sense).active_voltage = PropertyMock(return_value=[120, 121])
await setup_platform(hass, config_entry, SENSOR_DOMAIN)
state = hass.states.get(f"sensor.sense_{MONITOR_ID}_l1_voltage")
assert state.state == "120"
state = hass.states.get(f"sensor.sense_{MONITOR_ID}_l2_voltage")
assert state.state == "121"
type(mock_sense).active_voltage = PropertyMock(return_value=[122, 123])
async_fire_time_changed(hass, utcnow() + timedelta(seconds=ACTIVE_UPDATE_RATE))
await hass.async_block_till_done()
state = hass.states.get(f"sensor.sense_{MONITOR_ID}_l1_voltage")
assert state.state == "122"
state = hass.states.get(f"sensor.sense_{MONITOR_ID}_l2_voltage")
assert state.state == "123"
async def test_active_power_sensors(
hass: HomeAssistant,
entity_registry: er.EntityRegistry,
mock_sense: MagicMock,
config_entry: MockConfigEntry,
) -> None:
"""Test the Sense power sensors."""
type(mock_sense).active_power = PropertyMock(return_value=400)
type(mock_sense).active_solar_power = PropertyMock(return_value=500)
2024-10-25 18:45:55 +00:00
await setup_platform(hass, config_entry, SENSOR_DOMAIN)
state = hass.states.get(f"sensor.sense_{MONITOR_ID}_energy")
assert state.state == "400"
state = hass.states.get(f"sensor.sense_{MONITOR_ID}_production")
assert state.state == "500"
type(mock_sense).active_power = PropertyMock(return_value=600)
type(mock_sense).active_solar_power = PropertyMock(return_value=700)
async_fire_time_changed(hass, utcnow() + timedelta(seconds=ACTIVE_UPDATE_RATE))
await hass.async_block_till_done()
state = hass.states.get(f"sensor.sense_{MONITOR_ID}_energy")
assert state.state == "600"
state = hass.states.get(f"sensor.sense_{MONITOR_ID}_production")
assert state.state == "700"
async def test_trend_energy_sensors(
hass: HomeAssistant,
entity_registry: er.EntityRegistry,
mock_sense: MagicMock,
config_entry: MockConfigEntry,
) -> None:
"""Test the Sense power sensors."""
mock_sense.get_stat.side_effect = lambda sensor_type, variant: {
(Scale.DAY, "usage"): 100,
(Scale.DAY, "production"): 200,
(Scale.DAY, "from_grid"): 300,
(Scale.DAY, "to_grid"): 400,
(Scale.DAY, "net_production"): 500,
(Scale.DAY, "production_pct"): 600,
(Scale.DAY, "solar_powered"): 700,
}.get((sensor_type, variant), 0)
await setup_platform(hass, config_entry, SENSOR_DOMAIN)
state = hass.states.get(f"sensor.sense_{MONITOR_ID}_daily_energy")
assert state.state == "100"
state = hass.states.get(f"sensor.sense_{MONITOR_ID}_daily_production")
assert state.state == "200"
state = hass.states.get(f"sensor.sense_{MONITOR_ID}_daily_from_grid")
assert state.state == "300"
state = hass.states.get(f"sensor.sense_{MONITOR_ID}_daily_to_grid")
assert state.state == "400"
state = hass.states.get(f"sensor.sense_{MONITOR_ID}_daily_net_production")
assert state.state == "500"
mock_sense.get_stat.side_effect = lambda sensor_type, variant: {
(Scale.DAY, "usage"): 1000,
(Scale.DAY, "production"): 2000,
(Scale.DAY, "from_grid"): 3000,
(Scale.DAY, "to_grid"): 4000,
(Scale.DAY, "net_production"): 5000,
(Scale.DAY, "production_pct"): 6000,
(Scale.DAY, "solar_powered"): 7000,
}.get((sensor_type, variant), 0)
async_fire_time_changed(hass, utcnow() + timedelta(seconds=600))
await hass.async_block_till_done()
state = hass.states.get(f"sensor.sense_{MONITOR_ID}_daily_energy")
assert state.state == "1000"
state = hass.states.get(f"sensor.sense_{MONITOR_ID}_daily_production")
assert state.state == "2000"
state = hass.states.get(f"sensor.sense_{MONITOR_ID}_daily_from_grid")
assert state.state == "3000"
state = hass.states.get(f"sensor.sense_{MONITOR_ID}_daily_to_grid")
assert state.state == "4000"
state = hass.states.get(f"sensor.sense_{MONITOR_ID}_daily_net_production")
assert state.state == "5000"