diff --git a/homeassistant/components/technove/__init__.py b/homeassistant/components/technove/__init__.py index 12ca604af455212bcb7bfa97772d75128313f349..a235f98433b139367210484ac1cc45fef89b1550 100644 --- a/homeassistant/components/technove/__init__.py +++ b/homeassistant/components/technove/__init__.py @@ -8,7 +8,10 @@ from homeassistant.core import HomeAssistant from .const import DOMAIN from .coordinator import TechnoVEDataUpdateCoordinator -PLATFORMS = [Platform.SENSOR] +PLATFORMS = [ + Platform.BINARY_SENSOR, + Platform.SENSOR, +] async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: diff --git a/homeassistant/components/technove/binary_sensor.py b/homeassistant/components/technove/binary_sensor.py new file mode 100644 index 0000000000000000000000000000000000000000..09bf08baad66fb8fe92c77430dbd0125da0c4912 --- /dev/null +++ b/homeassistant/components/technove/binary_sensor.py @@ -0,0 +1,103 @@ +"""Support for TechnoVE binary sensor.""" +from __future__ import annotations + +from collections.abc import Callable +from dataclasses import dataclass + +from technove import Station as TechnoVEStation + +from homeassistant.components.binary_sensor import ( + BinarySensorDeviceClass, + BinarySensorEntity, + BinarySensorEntityDescription, +) +from homeassistant.config_entries import ConfigEntry +from homeassistant.const import EntityCategory +from homeassistant.core import HomeAssistant +from homeassistant.helpers.entity_platform import AddEntitiesCallback + +from .const import DOMAIN +from .coordinator import TechnoVEDataUpdateCoordinator +from .entity import TechnoVEEntity + + +@dataclass(frozen=True, kw_only=True) +class TechnoVEBinarySensorDescription(BinarySensorEntityDescription): + """Describes TechnoVE binary sensor entity.""" + + value_fn: Callable[[TechnoVEStation], bool | None] + + +BINARY_SENSORS = [ + TechnoVEBinarySensorDescription( + key="conflict_in_sharing_config", + translation_key="conflict_in_sharing_config", + entity_category=EntityCategory.DIAGNOSTIC, + value_fn=lambda station: station.info.conflict_in_sharing_config, + ), + TechnoVEBinarySensorDescription( + key="in_sharing_mode", + translation_key="in_sharing_mode", + entity_category=EntityCategory.DIAGNOSTIC, + value_fn=lambda station: station.info.in_sharing_mode, + ), + TechnoVEBinarySensorDescription( + key="is_battery_protected", + translation_key="is_battery_protected", + entity_category=EntityCategory.DIAGNOSTIC, + value_fn=lambda station: station.info.is_battery_protected, + ), + TechnoVEBinarySensorDescription( + key="is_session_active", + entity_category=EntityCategory.DIAGNOSTIC, + device_class=BinarySensorDeviceClass.BATTERY_CHARGING, + value_fn=lambda station: station.info.is_session_active, + ), + TechnoVEBinarySensorDescription( + key="is_static_ip", + translation_key="is_static_ip", + entity_category=EntityCategory.DIAGNOSTIC, + entity_registry_enabled_default=False, + value_fn=lambda station: station.info.is_static_ip, + ), + TechnoVEBinarySensorDescription( + key="update_available", + entity_category=EntityCategory.DIAGNOSTIC, + device_class=BinarySensorDeviceClass.UPDATE, + value_fn=lambda station: not station.info.is_up_to_date, + ), +] + + +async def async_setup_entry( + hass: HomeAssistant, + entry: ConfigEntry, + async_add_entities: AddEntitiesCallback, +) -> None: + """Set up the binary sensor platform.""" + coordinator: TechnoVEDataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id] + async_add_entities( + TechnoVEBinarySensorEntity(coordinator, description) + for description in BINARY_SENSORS + ) + + +class TechnoVEBinarySensorEntity(TechnoVEEntity, BinarySensorEntity): + """Defines a TechnoVE binary sensor entity.""" + + entity_description: TechnoVEBinarySensorDescription + + def __init__( + self, + coordinator: TechnoVEDataUpdateCoordinator, + description: TechnoVEBinarySensorDescription, + ) -> None: + """Initialize a TechnoVE binary sensor entity.""" + self.entity_description = description + super().__init__(coordinator, description.key) + + @property + def is_on(self) -> bool | None: + """Return the state of the sensor.""" + + return self.entity_description.value_fn(self.coordinator.data) diff --git a/homeassistant/components/technove/strings.json b/homeassistant/components/technove/strings.json index 6f7cb0d9f6b30369c7c2bbf367c52c089ddc5e0a..8a850ee610cd01c4a9a98e31a06e0adea1b20e75 100644 --- a/homeassistant/components/technove/strings.json +++ b/homeassistant/components/technove/strings.json @@ -25,6 +25,20 @@ } }, "entity": { + "binary_sensor": { + "conflict_in_sharing_config": { + "name": "Conflict with power sharing mode" + }, + "in_sharing_mode": { + "name": "Power sharing mode" + }, + "is_battery_protected": { + "name": "Battery protected" + }, + "is_static_ip": { + "name": "Static IP" + } + }, "sensor": { "voltage_in": { "name": "Input voltage" diff --git a/tests/components/technove/__init__.py b/tests/components/technove/__init__.py index e98470b8e2ad90e84c002b64ecc579b2c595f111..2d9f639244f7ed899d9e11bdae11e2dcff88aab4 100644 --- a/tests/components/technove/__init__.py +++ b/tests/components/technove/__init__.py @@ -1 +1,17 @@ """Tests for the TechnoVE integration.""" +from unittest.mock import patch + +from homeassistant.const import Platform +from homeassistant.core import HomeAssistant + +from tests.common import MockConfigEntry + + +async def setup_with_selected_platforms( + hass: HomeAssistant, entry: MockConfigEntry, platforms: list[Platform] +) -> None: + """Set up the TechnoVE integration with the selected platforms.""" + entry.add_to_hass(hass) + with patch("homeassistant.components.technove.PLATFORMS", platforms): + assert await hass.config_entries.async_setup(entry.entry_id) + await hass.async_block_till_done() diff --git a/tests/components/technove/snapshots/test_binary_sensor.ambr b/tests/components/technove/snapshots/test_binary_sensor.ambr new file mode 100644 index 0000000000000000000000000000000000000000..1b54bdda2ce450a27c1d20932f57d450026aea0b --- /dev/null +++ b/tests/components/technove/snapshots/test_binary_sensor.ambr @@ -0,0 +1,261 @@ +# serializer version: 1 +# name: test_sensors[binary_sensor.technove_station_battery_protected-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': <ANY>, + 'device_class': None, + 'device_id': <ANY>, + 'disabled_by': None, + 'domain': 'binary_sensor', + 'entity_category': <EntityCategory.DIAGNOSTIC: 'diagnostic'>, + 'entity_id': 'binary_sensor.technove_station_battery_protected', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': <ANY>, + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Battery protected', + 'platform': 'technove', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': 'is_battery_protected', + 'unique_id': 'AA:AA:AA:AA:AA:BB_is_battery_protected', + 'unit_of_measurement': None, + }) +# --- +# name: test_sensors[binary_sensor.technove_station_battery_protected-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'TechnoVE Station Battery protected', + }), + 'context': <ANY>, + 'entity_id': 'binary_sensor.technove_station_battery_protected', + 'last_changed': <ANY>, + 'last_updated': <ANY>, + 'state': 'off', + }) +# --- +# name: test_sensors[binary_sensor.technove_station_charging-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': <ANY>, + 'device_class': None, + 'device_id': <ANY>, + 'disabled_by': None, + 'domain': 'binary_sensor', + 'entity_category': <EntityCategory.DIAGNOSTIC: 'diagnostic'>, + 'entity_id': 'binary_sensor.technove_station_charging', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': <ANY>, + 'name': None, + 'options': dict({ + }), + 'original_device_class': <BinarySensorDeviceClass.BATTERY_CHARGING: 'battery_charging'>, + 'original_icon': None, + 'original_name': 'Charging', + 'platform': 'technove', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': None, + 'unique_id': 'AA:AA:AA:AA:AA:BB_is_session_active', + 'unit_of_measurement': None, + }) +# --- +# name: test_sensors[binary_sensor.technove_station_charging-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'battery_charging', + 'friendly_name': 'TechnoVE Station Charging', + }), + 'context': <ANY>, + 'entity_id': 'binary_sensor.technove_station_charging', + 'last_changed': <ANY>, + 'last_updated': <ANY>, + 'state': 'on', + }) +# --- +# name: test_sensors[binary_sensor.technove_station_conflict_with_power_sharing_mode-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': <ANY>, + 'device_class': None, + 'device_id': <ANY>, + 'disabled_by': None, + 'domain': 'binary_sensor', + 'entity_category': <EntityCategory.DIAGNOSTIC: 'diagnostic'>, + 'entity_id': 'binary_sensor.technove_station_conflict_with_power_sharing_mode', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': <ANY>, + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Conflict with power sharing mode', + 'platform': 'technove', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': 'conflict_in_sharing_config', + 'unique_id': 'AA:AA:AA:AA:AA:BB_conflict_in_sharing_config', + 'unit_of_measurement': None, + }) +# --- +# name: test_sensors[binary_sensor.technove_station_conflict_with_power_sharing_mode-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'TechnoVE Station Conflict with power sharing mode', + }), + 'context': <ANY>, + 'entity_id': 'binary_sensor.technove_station_conflict_with_power_sharing_mode', + 'last_changed': <ANY>, + 'last_updated': <ANY>, + 'state': 'off', + }) +# --- +# name: test_sensors[binary_sensor.technove_station_power_sharing_mode-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': <ANY>, + 'device_class': None, + 'device_id': <ANY>, + 'disabled_by': None, + 'domain': 'binary_sensor', + 'entity_category': <EntityCategory.DIAGNOSTIC: 'diagnostic'>, + 'entity_id': 'binary_sensor.technove_station_power_sharing_mode', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': <ANY>, + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Power sharing mode', + 'platform': 'technove', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': 'in_sharing_mode', + 'unique_id': 'AA:AA:AA:AA:AA:BB_in_sharing_mode', + 'unit_of_measurement': None, + }) +# --- +# name: test_sensors[binary_sensor.technove_station_power_sharing_mode-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'TechnoVE Station Power sharing mode', + }), + 'context': <ANY>, + 'entity_id': 'binary_sensor.technove_station_power_sharing_mode', + 'last_changed': <ANY>, + 'last_updated': <ANY>, + 'state': 'on', + }) +# --- +# name: test_sensors[binary_sensor.technove_station_static_ip-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': <ANY>, + 'device_class': None, + 'device_id': <ANY>, + 'disabled_by': None, + 'domain': 'binary_sensor', + 'entity_category': <EntityCategory.DIAGNOSTIC: 'diagnostic'>, + 'entity_id': 'binary_sensor.technove_station_static_ip', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': <ANY>, + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Static IP', + 'platform': 'technove', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': 'is_static_ip', + 'unique_id': 'AA:AA:AA:AA:AA:BB_is_static_ip', + 'unit_of_measurement': None, + }) +# --- +# name: test_sensors[binary_sensor.technove_station_static_ip-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'TechnoVE Station Static IP', + }), + 'context': <ANY>, + 'entity_id': 'binary_sensor.technove_station_static_ip', + 'last_changed': <ANY>, + 'last_updated': <ANY>, + 'state': 'off', + }) +# --- +# name: test_sensors[binary_sensor.technove_station_update-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': <ANY>, + 'device_class': None, + 'device_id': <ANY>, + 'disabled_by': None, + 'domain': 'binary_sensor', + 'entity_category': <EntityCategory.DIAGNOSTIC: 'diagnostic'>, + 'entity_id': 'binary_sensor.technove_station_update', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': <ANY>, + 'name': None, + 'options': dict({ + }), + 'original_device_class': <BinarySensorDeviceClass.UPDATE: 'update'>, + 'original_icon': None, + 'original_name': 'Update', + 'platform': 'technove', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': None, + 'unique_id': 'AA:AA:AA:AA:AA:BB_update_available', + 'unit_of_measurement': None, + }) +# --- +# name: test_sensors[binary_sensor.technove_station_update-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'update', + 'friendly_name': 'TechnoVE Station Update', + }), + 'context': <ANY>, + 'entity_id': 'binary_sensor.technove_station_update', + 'last_changed': <ANY>, + 'last_updated': <ANY>, + 'state': 'off', + }) +# --- diff --git a/tests/components/technove/snapshots/test_sensor.ambr b/tests/components/technove/snapshots/test_sensor.ambr index e0549c1dad184a09f20b6dafec1ddf1686c8f22a..d38b08631cc40d66dcade6c07a0e3ba256fbaadb 100644 --- a/tests/components/technove/snapshots/test_sensor.ambr +++ b/tests/components/technove/snapshots/test_sensor.ambr @@ -47,21 +47,6 @@ 'state': '23.75', }) # --- -# name: test_sensors[sensor.technove_station_current] - StateSnapshot({ - 'attributes': ReadOnlyDict({ - 'device_class': 'current', - 'friendly_name': 'TechnoVE Station Current', - 'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>, - 'unit_of_measurement': <UnitOfElectricCurrent.AMPERE: 'A'>, - }), - 'context': <ANY>, - 'entity_id': 'sensor.technove_station_current', - 'last_changed': <ANY>, - 'last_updated': <ANY>, - 'state': '23.75', - }) -# --- # name: test_sensors[sensor.technove_station_input_voltage-entry] EntityRegistryEntrySnapshot({ 'aliases': set({ @@ -110,21 +95,6 @@ 'state': '238', }) # --- -# name: test_sensors[sensor.technove_station_input_voltage] - StateSnapshot({ - 'attributes': ReadOnlyDict({ - 'device_class': 'voltage', - 'friendly_name': 'TechnoVE Station Input voltage', - 'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>, - 'unit_of_measurement': <UnitOfElectricPotential.VOLT: 'V'>, - }), - 'context': <ANY>, - 'entity_id': 'sensor.technove_station_input_voltage', - 'last_changed': <ANY>, - 'last_updated': <ANY>, - 'state': '238', - }) -# --- # name: test_sensors[sensor.technove_station_last_session_energy_usage-entry] EntityRegistryEntrySnapshot({ 'aliases': set({ @@ -173,84 +143,6 @@ 'state': '12.34', }) # --- -# name: test_sensors[sensor.technove_station_last_session_energy_usage] - StateSnapshot({ - 'attributes': ReadOnlyDict({ - 'device_class': 'energy', - 'friendly_name': 'TechnoVE Station Last session energy usage', - 'state_class': <SensorStateClass.TOTAL_INCREASING: 'total_increasing'>, - 'unit_of_measurement': <UnitOfEnergy.KILO_WATT_HOUR: 'kWh'>, - }), - 'context': <ANY>, - 'entity_id': 'sensor.technove_station_last_session_energy_usage', - 'last_changed': <ANY>, - 'last_updated': <ANY>, - 'state': '12.34', - }) -# --- -# name: test_sensors[sensor.technove_station_max_current-entry] - EntityRegistryEntrySnapshot({ - 'aliases': set({ - }), - 'area_id': None, - 'capabilities': dict({ - 'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>, - }), - 'config_entry_id': <ANY>, - 'device_class': None, - 'device_id': <ANY>, - 'disabled_by': None, - 'domain': 'sensor', - 'entity_category': <EntityCategory.DIAGNOSTIC: 'diagnostic'>, - 'entity_id': 'sensor.technove_station_max_current', - 'has_entity_name': True, - 'hidden_by': None, - 'icon': None, - 'id': <ANY>, - 'name': None, - 'options': dict({ - }), - 'original_device_class': <SensorDeviceClass.CURRENT: 'current'>, - 'original_icon': None, - 'original_name': 'Max current', - 'platform': 'technove', - 'previous_unique_id': None, - 'supported_features': 0, - 'translation_key': 'max_current', - 'unique_id': 'AA:AA:AA:AA:AA:BB_max_current', - 'unit_of_measurement': <UnitOfElectricCurrent.AMPERE: 'A'>, - }) -# --- -# name: test_sensors[sensor.technove_station_max_current-state] - StateSnapshot({ - 'attributes': ReadOnlyDict({ - 'device_class': 'current', - 'friendly_name': 'TechnoVE Station Max current', - 'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>, - 'unit_of_measurement': <UnitOfElectricCurrent.AMPERE: 'A'>, - }), - 'context': <ANY>, - 'entity_id': 'sensor.technove_station_max_current', - 'last_changed': <ANY>, - 'last_updated': <ANY>, - 'state': '24', - }) -# --- -# name: test_sensors[sensor.technove_station_max_current] - StateSnapshot({ - 'attributes': ReadOnlyDict({ - 'device_class': 'current', - 'friendly_name': 'TechnoVE Station Max current', - 'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>, - 'unit_of_measurement': <UnitOfElectricCurrent.AMPERE: 'A'>, - }), - 'context': <ANY>, - 'entity_id': 'sensor.technove_station_max_current', - 'last_changed': <ANY>, - 'last_updated': <ANY>, - 'state': '24', - }) -# --- # name: test_sensors[sensor.technove_station_max_station_current-entry] EntityRegistryEntrySnapshot({ 'aliases': set({ @@ -299,21 +191,6 @@ 'state': '32', }) # --- -# name: test_sensors[sensor.technove_station_max_station_current] - StateSnapshot({ - 'attributes': ReadOnlyDict({ - 'device_class': 'current', - 'friendly_name': 'TechnoVE Station Max station current', - 'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>, - 'unit_of_measurement': <UnitOfElectricCurrent.AMPERE: 'A'>, - }), - 'context': <ANY>, - 'entity_id': 'sensor.technove_station_max_station_current', - 'last_changed': <ANY>, - 'last_updated': <ANY>, - 'state': '32', - }) -# --- # name: test_sensors[sensor.technove_station_output_voltage-entry] EntityRegistryEntrySnapshot({ 'aliases': set({ @@ -362,21 +239,6 @@ 'state': '238', }) # --- -# name: test_sensors[sensor.technove_station_output_voltage] - StateSnapshot({ - 'attributes': ReadOnlyDict({ - 'device_class': 'voltage', - 'friendly_name': 'TechnoVE Station Output voltage', - 'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>, - 'unit_of_measurement': <UnitOfElectricPotential.VOLT: 'V'>, - }), - 'context': <ANY>, - 'entity_id': 'sensor.technove_station_output_voltage', - 'last_changed': <ANY>, - 'last_updated': <ANY>, - 'state': '238', - }) -# --- # name: test_sensors[sensor.technove_station_signal_strength-entry] EntityRegistryEntrySnapshot({ 'aliases': set({ @@ -425,21 +287,6 @@ 'state': '-82', }) # --- -# name: test_sensors[sensor.technove_station_signal_strength] - StateSnapshot({ - 'attributes': ReadOnlyDict({ - 'device_class': 'signal_strength', - 'friendly_name': 'TechnoVE Station Signal strength', - 'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>, - 'unit_of_measurement': 'dBm', - }), - 'context': <ANY>, - 'entity_id': 'sensor.technove_station_signal_strength', - 'last_changed': <ANY>, - 'last_updated': <ANY>, - 'state': '-82', - }) -# --- # name: test_sensors[sensor.technove_station_status-entry] EntityRegistryEntrySnapshot({ 'aliases': set({ @@ -495,24 +342,6 @@ 'state': 'plugged_charging', }) # --- -# name: test_sensors[sensor.technove_station_status] - StateSnapshot({ - 'attributes': ReadOnlyDict({ - 'device_class': 'enum', - 'friendly_name': 'TechnoVE Station Status', - 'options': list([ - 'unplugged', - 'plugged_waiting', - 'plugged_charging', - ]), - }), - 'context': <ANY>, - 'entity_id': 'sensor.technove_station_status', - 'last_changed': <ANY>, - 'last_updated': <ANY>, - 'state': 'plugged_charging', - }) -# --- # name: test_sensors[sensor.technove_station_total_energy_usage-entry] EntityRegistryEntrySnapshot({ 'aliases': set({ @@ -561,21 +390,6 @@ 'state': '1234', }) # --- -# name: test_sensors[sensor.technove_station_total_energy_usage] - StateSnapshot({ - 'attributes': ReadOnlyDict({ - 'device_class': 'energy', - 'friendly_name': 'TechnoVE Station Total energy usage', - 'state_class': <SensorStateClass.TOTAL: 'total'>, - 'unit_of_measurement': <UnitOfEnergy.KILO_WATT_HOUR: 'kWh'>, - }), - 'context': <ANY>, - 'entity_id': 'sensor.technove_station_total_energy_usage', - 'last_changed': <ANY>, - 'last_updated': <ANY>, - 'state': '1234', - }) -# --- # name: test_sensors[sensor.technove_station_wi_fi_network_name-entry] EntityRegistryEntrySnapshot({ 'aliases': set({ @@ -620,16 +434,3 @@ 'state': 'Connecting...', }) # --- -# name: test_sensors[sensor.technove_station_wi_fi_network_name] - StateSnapshot({ - 'attributes': ReadOnlyDict({ - 'friendly_name': 'TechnoVE Station Wi-Fi network name', - 'icon': 'mdi:wifi', - }), - 'context': <ANY>, - 'entity_id': 'sensor.technove_station_wi_fi_network_name', - 'last_changed': <ANY>, - 'last_updated': <ANY>, - 'state': 'Connecting...', - }) -# --- diff --git a/tests/components/technove/test_binary_sensor.py b/tests/components/technove/test_binary_sensor.py new file mode 100644 index 0000000000000000000000000000000000000000..5e168ce0760b320f253fcdd128ad3549f80707b4 --- /dev/null +++ b/tests/components/technove/test_binary_sensor.py @@ -0,0 +1,75 @@ +"""Tests for the TechnoVE binary sensor platform.""" +from datetime import timedelta +from unittest.mock import MagicMock + +from freezegun.api import FrozenDateTimeFactory +import pytest +from syrupy import SnapshotAssertion +from technove import TechnoVEError + +from homeassistant.const import STATE_ON, STATE_UNAVAILABLE, Platform +from homeassistant.core import HomeAssistant +from homeassistant.helpers import entity_registry as er + +from . import setup_with_selected_platforms + +from tests.common import MockConfigEntry, async_fire_time_changed + + +@pytest.mark.usefixtures("entity_registry_enabled_by_default", "mock_technove") +async def test_sensors( + hass: HomeAssistant, + snapshot: SnapshotAssertion, + mock_config_entry: MockConfigEntry, + entity_registry: er.EntityRegistry, +) -> None: + """Test the creation and values of the TechnoVE binary sensors.""" + await setup_with_selected_platforms( + hass, mock_config_entry, [Platform.BINARY_SENSOR] + ) + + entity_entries = er.async_entries_for_config_entry( + entity_registry, mock_config_entry.entry_id + ) + + assert entity_entries + for entity_entry in entity_entries: + assert entity_entry == snapshot(name=f"{entity_entry.entity_id}-entry") + assert hass.states.get(entity_entry.entity_id) == snapshot( + name=f"{entity_entry.entity_id}-state" + ) + + +@pytest.mark.parametrize( + "entity_id", + ("binary_sensor.technove_station_static_ip",), +) +@pytest.mark.usefixtures("init_integration") +async def test_disabled_by_default_binary_sensors( + hass: HomeAssistant, entity_registry: er.EntityRegistry, entity_id: str +) -> None: + """Test the disabled by default TechnoVE binary sensors.""" + assert hass.states.get(entity_id) is None + + assert (entry := entity_registry.async_get(entity_id)) + assert entry.disabled + assert entry.disabled_by is er.RegistryEntryDisabler.INTEGRATION + + +@pytest.mark.usefixtures("init_integration") +async def test_binary_sensor_update_failure( + hass: HomeAssistant, + mock_technove: MagicMock, + freezer: FrozenDateTimeFactory, +) -> None: + """Test coordinator update failure.""" + entity_id = "binary_sensor.technove_station_charging" + + assert hass.states.get(entity_id).state == STATE_ON + + mock_technove.update.side_effect = TechnoVEError("Test error") + freezer.tick(timedelta(minutes=5, seconds=1)) + async_fire_time_changed(hass) + await hass.async_block_till_done() + + assert hass.states.get(entity_id).state == STATE_UNAVAILABLE diff --git a/tests/components/technove/test_sensor.py b/tests/components/technove/test_sensor.py index d7010b9451c49c6c9801e4e1d56446e658ddde2d..5215f62c517a44d452de64c19650a8d5ab6edcc5 100644 --- a/tests/components/technove/test_sensor.py +++ b/tests/components/technove/test_sensor.py @@ -7,10 +7,12 @@ import pytest from syrupy import SnapshotAssertion from technove import Status, TechnoVEError -from homeassistant.const import STATE_UNAVAILABLE, STATE_UNKNOWN +from homeassistant.const import STATE_UNAVAILABLE, STATE_UNKNOWN, Platform from homeassistant.core import HomeAssistant from homeassistant.helpers import entity_registry as er +from . import setup_with_selected_platforms + from tests.common import MockConfigEntry, async_fire_time_changed @@ -22,11 +24,7 @@ async def test_sensors( entity_registry: er.EntityRegistry, ) -> None: """Test the creation and values of the TechnoVE sensors.""" - mock_config_entry.add_to_hass(hass) - - await hass.config_entries.async_setup(mock_config_entry.entry_id) - await hass.async_block_till_done() - entity_registry = er.async_get(hass) + await setup_with_selected_platforms(hass, mock_config_entry, [Platform.SENSOR]) entity_entries = er.async_entries_for_config_entry( entity_registry, mock_config_entry.entry_id ) @@ -89,9 +87,9 @@ async def test_sensor_update_failure( assert hass.states.get(entity_id).state == Status.PLUGGED_CHARGING.value + mock_technove.update.side_effect = TechnoVEError("Test error") freezer.tick(timedelta(minutes=5, seconds=1)) async_fire_time_changed(hass) - mock_technove.update.side_effect = TechnoVEError("Test error") await hass.async_block_till_done() assert hass.states.get(entity_id).state == STATE_UNAVAILABLE