"""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 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 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.""" 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) 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"