"""Test the switchbot sensors.""" from unittest.mock import patch import pytest from homeassistant.components.sensor import ATTR_STATE_CLASS from homeassistant.components.switchbot.const import ( CONF_ENCRYPTION_KEY, CONF_KEY_ID, DOMAIN, ) from homeassistant.const import ( ATTR_FRIENDLY_NAME, ATTR_UNIT_OF_MEASUREMENT, CONF_ADDRESS, CONF_NAME, CONF_PASSWORD, CONF_SENSOR_TYPE, ) from homeassistant.core import HomeAssistant from homeassistant.setup import async_setup_component from . import ( LEAK_SERVICE_INFO, REMOTE_SERVICE_INFO, WOHAND_SERVICE_INFO, WOHUB2_SERVICE_INFO, WOMETERTHPC_SERVICE_INFO, WORELAY_SWITCH_1PM_SERVICE_INFO, ) from tests.common import MockConfigEntry from tests.components.bluetooth import inject_bluetooth_service_info @pytest.mark.usefixtures("entity_registry_enabled_by_default") async def test_sensors(hass: HomeAssistant) -> None: """Test setting up creates the sensors.""" await async_setup_component(hass, DOMAIN, {}) inject_bluetooth_service_info(hass, WOHAND_SERVICE_INFO) entry = MockConfigEntry( domain=DOMAIN, data={ CONF_ADDRESS: "aa:bb:cc:dd:ee:ff", CONF_NAME: "test-name", CONF_PASSWORD: "test-password", CONF_SENSOR_TYPE: "bot", }, unique_id="aabbccddeeff", ) entry.add_to_hass(hass) assert await hass.config_entries.async_setup(entry.entry_id) await hass.async_block_till_done() assert len(hass.states.async_all("sensor")) == 2 battery_sensor = hass.states.get("sensor.test_name_battery") battery_sensor_attrs = battery_sensor.attributes assert battery_sensor.state == "89" assert battery_sensor_attrs[ATTR_FRIENDLY_NAME] == "test-name Battery" assert battery_sensor_attrs[ATTR_UNIT_OF_MEASUREMENT] == "%" assert battery_sensor_attrs[ATTR_STATE_CLASS] == "measurement" rssi_sensor = hass.states.get("sensor.test_name_bluetooth_signal") rssi_sensor_attrs = rssi_sensor.attributes assert rssi_sensor.state == "-60" assert rssi_sensor_attrs[ATTR_FRIENDLY_NAME] == "test-name Bluetooth signal" assert rssi_sensor_attrs[ATTR_UNIT_OF_MEASUREMENT] == "dBm" assert await hass.config_entries.async_unload(entry.entry_id) await hass.async_block_till_done() @pytest.mark.usefixtures("entity_registry_enabled_by_default") async def test_co2_sensor(hass: HomeAssistant) -> None: """Test setting up creates the co2 sensor for a WoTHPc.""" await async_setup_component(hass, DOMAIN, {}) inject_bluetooth_service_info(hass, WOMETERTHPC_SERVICE_INFO) entry = MockConfigEntry( domain=DOMAIN, data={ CONF_ADDRESS: "AA:BB:CC:DD:EE:AA", CONF_NAME: "test-name", CONF_PASSWORD: "test-password", CONF_SENSOR_TYPE: "hygrometer_co2", }, unique_id="aabbccddeeaa", ) entry.add_to_hass(hass) assert await hass.config_entries.async_setup(entry.entry_id) await hass.async_block_till_done() assert len(hass.states.async_all("sensor")) == 5 battery_sensor = hass.states.get("sensor.test_name_battery") battery_sensor_attrs = battery_sensor.attributes assert battery_sensor.state == "100" assert battery_sensor_attrs[ATTR_FRIENDLY_NAME] == "test-name Battery" assert battery_sensor_attrs[ATTR_UNIT_OF_MEASUREMENT] == "%" assert battery_sensor_attrs[ATTR_STATE_CLASS] == "measurement" rssi_sensor = hass.states.get("sensor.test_name_bluetooth_signal") rssi_sensor_attrs = rssi_sensor.attributes assert rssi_sensor.state == "-60" assert rssi_sensor_attrs[ATTR_FRIENDLY_NAME] == "test-name Bluetooth signal" assert rssi_sensor_attrs[ATTR_UNIT_OF_MEASUREMENT] == "dBm" co2_sensor = hass.states.get("sensor.test_name_carbon_dioxide") co2_sensor_attrs = co2_sensor.attributes assert co2_sensor.state == "725" assert co2_sensor_attrs[ATTR_FRIENDLY_NAME] == "test-name Carbon dioxide" assert co2_sensor_attrs[ATTR_UNIT_OF_MEASUREMENT] == "ppm" assert await hass.config_entries.async_unload(entry.entry_id) await hass.async_block_till_done() @pytest.mark.usefixtures("entity_registry_enabled_by_default") async def test_relay_switch_1pm_power_sensor(hass: HomeAssistant) -> None: """Test setting up creates the power sensor.""" await async_setup_component(hass, DOMAIN, {}) inject_bluetooth_service_info(hass, WORELAY_SWITCH_1PM_SERVICE_INFO) with patch( "switchbot.SwitchbotRelaySwitch.update", return_value=None, ): entry = MockConfigEntry( domain=DOMAIN, data={ CONF_ADDRESS: "aa:bb:cc:dd:ee:ff", CONF_NAME: "test-name", CONF_SENSOR_TYPE: "relay_switch_1pm", CONF_KEY_ID: "ff", CONF_ENCRYPTION_KEY: "ffffffffffffffffffffffffffffffff", }, unique_id="aabbccddeeaa", ) entry.add_to_hass(hass) assert await hass.config_entries.async_setup(entry.entry_id) await hass.async_block_till_done() power_sensor = hass.states.get("sensor.test_name_power") power_sensor_attrs = power_sensor.attributes assert power_sensor.state == "4.9" assert power_sensor_attrs[ATTR_FRIENDLY_NAME] == "test-name Power" assert power_sensor_attrs[ATTR_UNIT_OF_MEASUREMENT] == "W" assert await hass.config_entries.async_unload(entry.entry_id) await hass.async_block_till_done() @pytest.mark.usefixtures("entity_registry_enabled_by_default") async def test_leak_sensor(hass: HomeAssistant) -> None: """Test setting up the leak detector.""" await async_setup_component(hass, DOMAIN, {}) inject_bluetooth_service_info(hass, LEAK_SERVICE_INFO) entry = MockConfigEntry( domain=DOMAIN, data={ CONF_ADDRESS: "aa:bb:cc:dd:ee:ff", CONF_NAME: "test-name", CONF_SENSOR_TYPE: "leak", }, unique_id="aabbccddeeaa", ) entry.add_to_hass(hass) assert await hass.config_entries.async_setup(entry.entry_id) await hass.async_block_till_done() battery_sensor = hass.states.get("sensor.test_name_battery") battery_sensor_attrs = battery_sensor.attributes assert battery_sensor.state == "86" assert battery_sensor_attrs[ATTR_FRIENDLY_NAME] == "test-name Battery" assert battery_sensor_attrs[ATTR_UNIT_OF_MEASUREMENT] == "%" assert battery_sensor_attrs[ATTR_STATE_CLASS] == "measurement" rssi_sensor = hass.states.get("sensor.test_name_bluetooth_signal") rssi_sensor_attrs = rssi_sensor.attributes assert rssi_sensor.state == "-60" assert rssi_sensor_attrs[ATTR_FRIENDLY_NAME] == "test-name Bluetooth signal" assert rssi_sensor_attrs[ATTR_UNIT_OF_MEASUREMENT] == "dBm" leak_sensor = hass.states.get("binary_sensor.test_name") leak_sensor_attrs = leak_sensor.attributes assert leak_sensor.state == "off" assert leak_sensor_attrs[ATTR_FRIENDLY_NAME] == "test-name" assert await hass.config_entries.async_unload(entry.entry_id) await hass.async_block_till_done() @pytest.mark.usefixtures("entity_registry_enabled_by_default") async def test_remote(hass: HomeAssistant) -> None: """Test setting up the remote sensor.""" await async_setup_component(hass, DOMAIN, {}) inject_bluetooth_service_info(hass, REMOTE_SERVICE_INFO) entry = MockConfigEntry( domain=DOMAIN, data={ CONF_ADDRESS: "aa:bb:cc:dd:ee:ff", CONF_NAME: "test-name", CONF_SENSOR_TYPE: "remote", }, unique_id="aabbccddeeff", ) entry.add_to_hass(hass) assert await hass.config_entries.async_setup(entry.entry_id) await hass.async_block_till_done() assert len(hass.states.async_all("sensor")) == 2 battery_sensor = hass.states.get("sensor.test_name_battery") battery_sensor_attrs = battery_sensor.attributes assert battery_sensor.state == "86" assert battery_sensor_attrs[ATTR_FRIENDLY_NAME] == "test-name Battery" assert battery_sensor_attrs[ATTR_UNIT_OF_MEASUREMENT] == "%" assert battery_sensor_attrs[ATTR_STATE_CLASS] == "measurement" rssi_sensor = hass.states.get("sensor.test_name_bluetooth_signal") rssi_sensor_attrs = rssi_sensor.attributes assert rssi_sensor.state == "-60" assert rssi_sensor_attrs[ATTR_FRIENDLY_NAME] == "test-name Bluetooth signal" assert rssi_sensor_attrs[ATTR_UNIT_OF_MEASUREMENT] == "dBm" assert await hass.config_entries.async_unload(entry.entry_id) await hass.async_block_till_done() @pytest.mark.usefixtures("entity_registry_enabled_by_default") async def test_hub2_sensor(hass: HomeAssistant) -> None: """Test setting up creates the sensor for WoHub2.""" await async_setup_component(hass, DOMAIN, {}) inject_bluetooth_service_info(hass, WOHUB2_SERVICE_INFO) entry = MockConfigEntry( domain=DOMAIN, data={ CONF_ADDRESS: "AA:BB:CC:DD:EE:FF", CONF_NAME: "test-name", CONF_SENSOR_TYPE: "hub2", }, unique_id="aabbccddeeff", ) entry.add_to_hass(hass) assert await hass.config_entries.async_setup(entry.entry_id) await hass.async_block_till_done() assert len(hass.states.async_all("sensor")) == 5 temperature_sensor = hass.states.get("sensor.test_name_temperature") temperature_sensor_attrs = temperature_sensor.attributes assert temperature_sensor.state == "26.4" assert temperature_sensor_attrs[ATTR_FRIENDLY_NAME] == "test-name Temperature" assert temperature_sensor_attrs[ATTR_UNIT_OF_MEASUREMENT] == "°C" assert temperature_sensor_attrs[ATTR_STATE_CLASS] == "measurement" humidity_sensor = hass.states.get("sensor.test_name_humidity") humidity_sensor_attrs = humidity_sensor.attributes assert humidity_sensor.state == "44" assert humidity_sensor_attrs[ATTR_FRIENDLY_NAME] == "test-name Humidity" assert humidity_sensor_attrs[ATTR_UNIT_OF_MEASUREMENT] == "%" assert humidity_sensor_attrs[ATTR_STATE_CLASS] == "measurement" light_level_sensor = hass.states.get("sensor.test_name_light_level") light_level_sensor_attrs = light_level_sensor.attributes assert light_level_sensor.state == "4" assert light_level_sensor_attrs[ATTR_FRIENDLY_NAME] == "test-name Light level" assert light_level_sensor_attrs[ATTR_UNIT_OF_MEASUREMENT] == "Level" light_level_sensor = hass.states.get("sensor.test_name_illuminance") light_level_sensor_attrs = light_level_sensor.attributes assert light_level_sensor.state == "30" assert light_level_sensor_attrs[ATTR_FRIENDLY_NAME] == "test-name Illuminance" assert light_level_sensor_attrs[ATTR_UNIT_OF_MEASUREMENT] == "lx" rssi_sensor = hass.states.get("sensor.test_name_bluetooth_signal") rssi_sensor_attrs = rssi_sensor.attributes assert rssi_sensor.state == "-60" assert rssi_sensor_attrs[ATTR_FRIENDLY_NAME] == "test-name Bluetooth signal" assert rssi_sensor_attrs[ATTR_UNIT_OF_MEASUREMENT] == "dBm" assert await hass.config_entries.async_unload(entry.entry_id) await hass.async_block_till_done()