Bump plugwise to v1.7.1 and adapt (#137599)

* Bump plugwise v1.7.1

* Refresh test-fixtures

* Adapt integration code

* Adapt test code

* Fixes

* Save updated snapshot

* Ruff fixes

* More ruff fixes
This commit is contained in:
Bouwe Westerdijk 2025-02-08 16:02:24 +01:00 committed by GitHub
parent 303ab750ab
commit 7f6855045a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
35 changed files with 2738 additions and 747 deletions

View File

@ -82,7 +82,7 @@ def migrate_sensor_entities(
# Migrating opentherm_outdoor_temperature # Migrating opentherm_outdoor_temperature
# to opentherm_outdoor_air_temperature sensor # to opentherm_outdoor_air_temperature sensor
for device_id, device in coordinator.data.devices.items(): for device_id, device in coordinator.data.items():
if device["dev_class"] != "heater_central": if device["dev_class"] != "heater_central":
continue continue

View File

@ -100,11 +100,7 @@ async def async_setup_entry(
async_add_entities( async_add_entities(
PlugwiseBinarySensorEntity(coordinator, device_id, description) PlugwiseBinarySensorEntity(coordinator, device_id, description)
for device_id in coordinator.new_devices for device_id in coordinator.new_devices
if ( if (binary_sensors := coordinator.data[device_id].get("binary_sensors"))
binary_sensors := coordinator.data.devices[device_id].get(
"binary_sensors"
)
)
for description in BINARY_SENSORS for description in BINARY_SENSORS
if description.key in binary_sensors if description.key in binary_sensors
) )
@ -141,7 +137,8 @@ class PlugwiseBinarySensorEntity(PlugwiseEntity, BinarySensorEntity):
return None return None
attrs: dict[str, list[str]] = {f"{severity}_msg": [] for severity in SEVERITIES} attrs: dict[str, list[str]] = {f"{severity}_msg": [] for severity in SEVERITIES}
if notify := self.coordinator.data.gateway["notifications"]: gateway_id = self.coordinator.api.gateway_id
if notify := self.coordinator.data[gateway_id]["notifications"]:
for details in notify.values(): for details in notify.values():
for msg_type, msg in details.items(): for msg_type, msg in details.items():
msg_type = msg_type.lower() msg_type = msg_type.lower()

View File

@ -8,7 +8,7 @@ from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from . import PlugwiseConfigEntry from . import PlugwiseConfigEntry
from .const import GATEWAY_ID, REBOOT from .const import REBOOT
from .coordinator import PlugwiseDataUpdateCoordinator from .coordinator import PlugwiseDataUpdateCoordinator
from .entity import PlugwiseEntity from .entity import PlugwiseEntity
from .util import plugwise_command from .util import plugwise_command
@ -24,11 +24,10 @@ async def async_setup_entry(
"""Set up the Plugwise buttons from a ConfigEntry.""" """Set up the Plugwise buttons from a ConfigEntry."""
coordinator = entry.runtime_data coordinator = entry.runtime_data
gateway = coordinator.data.gateway
async_add_entities( async_add_entities(
PlugwiseButtonEntity(coordinator, device_id) PlugwiseButtonEntity(coordinator, device_id)
for device_id in coordinator.data.devices for device_id in coordinator.data
if device_id == gateway[GATEWAY_ID] and REBOOT in gateway if device_id == coordinator.api.gateway_id and coordinator.api.reboot
) )

View File

@ -41,18 +41,17 @@ async def async_setup_entry(
if not coordinator.new_devices: if not coordinator.new_devices:
return return
if coordinator.data.gateway["smile_name"] == "Adam": if coordinator.api.smile_name == "Adam":
async_add_entities( async_add_entities(
PlugwiseClimateEntity(coordinator, device_id) PlugwiseClimateEntity(coordinator, device_id)
for device_id in coordinator.new_devices for device_id in coordinator.new_devices
if coordinator.data.devices[device_id]["dev_class"] == "climate" if coordinator.data[device_id]["dev_class"] == "climate"
) )
else: else:
async_add_entities( async_add_entities(
PlugwiseClimateEntity(coordinator, device_id) PlugwiseClimateEntity(coordinator, device_id)
for device_id in coordinator.new_devices for device_id in coordinator.new_devices
if coordinator.data.devices[device_id]["dev_class"] if coordinator.data[device_id]["dev_class"] in MASTER_THERMOSTATS
in MASTER_THERMOSTATS
) )
_add_entities() _add_entities()
@ -77,10 +76,8 @@ class PlugwiseClimateEntity(PlugwiseEntity, ClimateEntity):
super().__init__(coordinator, device_id) super().__init__(coordinator, device_id)
self._attr_unique_id = f"{device_id}-climate" self._attr_unique_id = f"{device_id}-climate"
self._devices = coordinator.data.devices gateway_id: str = coordinator.api.gateway_id
self._gateway = coordinator.data.gateway self._gateway_data = coordinator.data[gateway_id]
gateway_id: str = self._gateway["gateway_id"]
self._gateway_data = self._devices[gateway_id]
self._location = device_id self._location = device_id
if (location := self.device.get("location")) is not None: if (location := self.device.get("location")) is not None:
@ -88,7 +85,10 @@ class PlugwiseClimateEntity(PlugwiseEntity, ClimateEntity):
# Determine supported features # Determine supported features
self._attr_supported_features = ClimateEntityFeature.TARGET_TEMPERATURE self._attr_supported_features = ClimateEntityFeature.TARGET_TEMPERATURE
if self._gateway["cooling_present"] and self._gateway["smile_name"] != "Adam": if (
self.coordinator.api.cooling_present
and coordinator.api.smile_name != "Adam"
):
self._attr_supported_features = ( self._attr_supported_features = (
ClimateEntityFeature.TARGET_TEMPERATURE_RANGE ClimateEntityFeature.TARGET_TEMPERATURE_RANGE
) )
@ -170,7 +170,7 @@ class PlugwiseClimateEntity(PlugwiseEntity, ClimateEntity):
if "available_schedules" in self.device: if "available_schedules" in self.device:
hvac_modes.append(HVACMode.AUTO) hvac_modes.append(HVACMode.AUTO)
if self._gateway["cooling_present"]: if self.coordinator.api.cooling_present:
if "regulation_modes" in self._gateway_data: if "regulation_modes" in self._gateway_data:
if self._gateway_data["select_regulation_mode"] == "cooling": if self._gateway_data["select_regulation_mode"] == "cooling":
hvac_modes.append(HVACMode.COOL) hvac_modes.append(HVACMode.COOL)

View File

@ -17,7 +17,6 @@ FLOW_SMILE: Final = "smile (Adam/Anna/P1)"
FLOW_STRETCH: Final = "stretch (Stretch)" FLOW_STRETCH: Final = "stretch (Stretch)"
FLOW_TYPE: Final = "flow_type" FLOW_TYPE: Final = "flow_type"
GATEWAY: Final = "gateway" GATEWAY: Final = "gateway"
GATEWAY_ID: Final = "gateway_id"
LOCATION: Final = "location" LOCATION: Final = "location"
PW_TYPE: Final = "plugwise_type" PW_TYPE: Final = "plugwise_type"
REBOOT: Final = "reboot" REBOOT: Final = "reboot"

View File

@ -3,7 +3,7 @@
from datetime import timedelta from datetime import timedelta
from packaging.version import Version from packaging.version import Version
from plugwise import PlugwiseData, Smile from plugwise import GwEntityData, Smile
from plugwise.exceptions import ( from plugwise.exceptions import (
ConnectionFailedError, ConnectionFailedError,
InvalidAuthentication, InvalidAuthentication,
@ -22,10 +22,10 @@ from homeassistant.helpers.aiohttp_client import async_get_clientsession
from homeassistant.helpers.debounce import Debouncer from homeassistant.helpers.debounce import Debouncer
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
from .const import DEFAULT_PORT, DEFAULT_USERNAME, DOMAIN, GATEWAY_ID, LOGGER from .const import DEFAULT_PORT, DEFAULT_USERNAME, DOMAIN, LOGGER
class PlugwiseDataUpdateCoordinator(DataUpdateCoordinator[PlugwiseData]): class PlugwiseDataUpdateCoordinator(DataUpdateCoordinator[dict[str, GwEntityData]]):
"""Class to manage fetching Plugwise data from single endpoint.""" """Class to manage fetching Plugwise data from single endpoint."""
_connected: bool = False _connected: bool = False
@ -63,10 +63,8 @@ class PlugwiseDataUpdateCoordinator(DataUpdateCoordinator[PlugwiseData]):
"""Connect to the Plugwise Smile.""" """Connect to the Plugwise Smile."""
version = await self.api.connect() version = await self.api.connect()
self._connected = isinstance(version, Version) self._connected = isinstance(version, Version)
if self._connected:
self.api.get_all_gateway_entities()
async def _async_update_data(self) -> PlugwiseData: async def _async_update_data(self) -> dict[str, GwEntityData]:
"""Fetch data from Plugwise.""" """Fetch data from Plugwise."""
try: try:
if not self._connected: if not self._connected:
@ -101,26 +99,28 @@ class PlugwiseDataUpdateCoordinator(DataUpdateCoordinator[PlugwiseData]):
self._async_add_remove_devices(data, self.config_entry) self._async_add_remove_devices(data, self.config_entry)
return data return data
def _async_add_remove_devices(self, data: PlugwiseData, entry: ConfigEntry) -> None: def _async_add_remove_devices(
self, data: dict[str, GwEntityData], entry: ConfigEntry
) -> None:
"""Add new Plugwise devices, remove non-existing devices.""" """Add new Plugwise devices, remove non-existing devices."""
# Check for new or removed devices # Check for new or removed devices
self.new_devices = set(data.devices) - self._current_devices self.new_devices = set(data) - self._current_devices
removed_devices = self._current_devices - set(data.devices) removed_devices = self._current_devices - set(data)
self._current_devices = set(data.devices) self._current_devices = set(data)
if removed_devices: if removed_devices:
self._async_remove_devices(data, entry) self._async_remove_devices(data, entry)
def _async_remove_devices(self, data: PlugwiseData, entry: ConfigEntry) -> None: def _async_remove_devices(
self, data: dict[str, GwEntityData], entry: ConfigEntry
) -> None:
"""Clean registries when removed devices found.""" """Clean registries when removed devices found."""
device_reg = dr.async_get(self.hass) device_reg = dr.async_get(self.hass)
device_list = dr.async_entries_for_config_entry( device_list = dr.async_entries_for_config_entry(
device_reg, self.config_entry.entry_id device_reg, self.config_entry.entry_id
) )
# First find the Plugwise via_device # First find the Plugwise via_device
gateway_device = device_reg.async_get_device( gateway_device = device_reg.async_get_device({(DOMAIN, self.api.gateway_id)})
{(DOMAIN, data.gateway[GATEWAY_ID])}
)
assert gateway_device is not None assert gateway_device is not None
via_device_id = gateway_device.id via_device_id = gateway_device.id
@ -130,7 +130,7 @@ class PlugwiseDataUpdateCoordinator(DataUpdateCoordinator[PlugwiseData]):
if identifier[0] == DOMAIN: if identifier[0] == DOMAIN:
if ( if (
device_entry.via_device_id == via_device_id device_entry.via_device_id == via_device_id
and identifier[1] not in data.devices and identifier[1] not in data
): ):
device_reg.async_update_device( device_reg.async_update_device(
device_entry.id, remove_config_entry_id=entry.entry_id device_entry.id, remove_config_entry_id=entry.entry_id

View File

@ -14,7 +14,4 @@ async def async_get_config_entry_diagnostics(
) -> dict[str, Any]: ) -> dict[str, Any]:
"""Return diagnostics for a config entry.""" """Return diagnostics for a config entry."""
coordinator = entry.runtime_data coordinator = entry.runtime_data
return { return coordinator.data
"devices": coordinator.data.devices,
"gateway": coordinator.data.gateway,
}

View File

@ -34,7 +34,7 @@ class PlugwiseEntity(CoordinatorEntity[PlugwiseDataUpdateCoordinator]):
if entry := self.coordinator.config_entry: if entry := self.coordinator.config_entry:
configuration_url = f"http://{entry.data[CONF_HOST]}" configuration_url = f"http://{entry.data[CONF_HOST]}"
data = coordinator.data.devices[device_id] data = coordinator.data[device_id]
connections = set() connections = set()
if mac := data.get("mac_address"): if mac := data.get("mac_address"):
connections.add((CONNECTION_NETWORK_MAC, mac)) connections.add((CONNECTION_NETWORK_MAC, mac))
@ -48,18 +48,18 @@ class PlugwiseEntity(CoordinatorEntity[PlugwiseDataUpdateCoordinator]):
manufacturer=data.get("vendor"), manufacturer=data.get("vendor"),
model=data.get("model"), model=data.get("model"),
model_id=data.get("model_id"), model_id=data.get("model_id"),
name=coordinator.data.gateway["smile_name"], name=coordinator.api.smile_name,
sw_version=data.get("firmware"), sw_version=data.get("firmware"),
hw_version=data.get("hardware"), hw_version=data.get("hardware"),
) )
if device_id != coordinator.data.gateway["gateway_id"]: if device_id != coordinator.api.gateway_id:
self._attr_device_info.update( self._attr_device_info.update(
{ {
ATTR_NAME: data.get("name"), ATTR_NAME: data.get("name"),
ATTR_VIA_DEVICE: ( ATTR_VIA_DEVICE: (
DOMAIN, DOMAIN,
str(self.coordinator.data.gateway["gateway_id"]), str(self.coordinator.api.gateway_id),
), ),
} }
) )
@ -68,7 +68,7 @@ class PlugwiseEntity(CoordinatorEntity[PlugwiseDataUpdateCoordinator]):
def available(self) -> bool: def available(self) -> bool:
"""Return if entity is available.""" """Return if entity is available."""
return ( return (
self._dev_id in self.coordinator.data.devices self._dev_id in self.coordinator.data
and ("available" not in self.device or self.device["available"] is True) and ("available" not in self.device or self.device["available"] is True)
and super().available and super().available
) )
@ -76,4 +76,4 @@ class PlugwiseEntity(CoordinatorEntity[PlugwiseDataUpdateCoordinator]):
@property @property
def device(self) -> GwEntityData: def device(self) -> GwEntityData:
"""Return data for this device.""" """Return data for this device."""
return self.coordinator.data.devices[self._dev_id] return self.coordinator.data[self._dev_id]

View File

@ -8,6 +8,6 @@
"iot_class": "local_polling", "iot_class": "local_polling",
"loggers": ["plugwise"], "loggers": ["plugwise"],
"quality_scale": "platinum", "quality_scale": "platinum",
"requirements": ["plugwise==1.6.4"], "requirements": ["plugwise==1.7.1"],
"zeroconf": ["_plugwise._tcp.local."] "zeroconf": ["_plugwise._tcp.local."]
} }

View File

@ -73,7 +73,7 @@ async def async_setup_entry(
PlugwiseNumberEntity(coordinator, device_id, description) PlugwiseNumberEntity(coordinator, device_id, description)
for device_id in coordinator.new_devices for device_id in coordinator.new_devices
for description in NUMBER_TYPES for description in NUMBER_TYPES
if description.key in coordinator.data.devices[device_id] if description.key in coordinator.data[device_id]
) )
_add_entities() _add_entities()

View File

@ -71,7 +71,7 @@ async def async_setup_entry(
PlugwiseSelectEntity(coordinator, device_id, description) PlugwiseSelectEntity(coordinator, device_id, description)
for device_id in coordinator.new_devices for device_id in coordinator.new_devices
for description in SELECT_TYPES for description in SELECT_TYPES
if description.options_key in coordinator.data.devices[device_id] if description.options_key in coordinator.data[device_id]
) )
_add_entities() _add_entities()

View File

@ -420,7 +420,7 @@ async def async_setup_entry(
async_add_entities( async_add_entities(
PlugwiseSensorEntity(coordinator, device_id, description) PlugwiseSensorEntity(coordinator, device_id, description)
for device_id in coordinator.new_devices for device_id in coordinator.new_devices
if (sensors := coordinator.data.devices[device_id].get("sensors")) if (sensors := coordinator.data[device_id].get("sensors"))
for description in SENSORS for description in SENSORS
if description.key in sensors if description.key in sensors
) )

View File

@ -72,7 +72,7 @@ async def async_setup_entry(
async_add_entities( async_add_entities(
PlugwiseSwitchEntity(coordinator, device_id, description) PlugwiseSwitchEntity(coordinator, device_id, description)
for device_id in coordinator.new_devices for device_id in coordinator.new_devices
if (switches := coordinator.data.devices[device_id].get("switches")) if (switches := coordinator.data[device_id].get("switches"))
for description in SWITCHES for description in SWITCHES
if description.key in switches if description.key in switches
) )

2
requirements_all.txt generated
View File

@ -1663,7 +1663,7 @@ plexauth==0.0.6
plexwebsocket==0.0.14 plexwebsocket==0.0.14
# homeassistant.components.plugwise # homeassistant.components.plugwise
plugwise==1.6.4 plugwise==1.7.1
# homeassistant.components.plum_lightpad # homeassistant.components.plum_lightpad
plumlightpad==0.0.11 plumlightpad==0.0.11

View File

@ -1376,7 +1376,7 @@ plexauth==0.0.6
plexwebsocket==0.0.14 plexwebsocket==0.0.14
# homeassistant.components.plugwise # homeassistant.components.plugwise
plugwise==1.6.4 plugwise==1.7.1
# homeassistant.components.plum_lightpad # homeassistant.components.plum_lightpad
plumlightpad==0.0.11 plumlightpad==0.0.11

View File

@ -8,7 +8,6 @@ from typing import Any
from unittest.mock import AsyncMock, MagicMock, patch from unittest.mock import AsyncMock, MagicMock, patch
from packaging.version import Version from packaging.version import Version
from plugwise import PlugwiseData
import pytest import pytest
from homeassistant.components.plugwise.const import DOMAIN from homeassistant.components.plugwise.const import DOMAIN
@ -30,6 +29,15 @@ def _read_json(environment: str, call: str) -> dict[str, Any]:
return json.loads(fixture) return json.loads(fixture)
@pytest.fixture
def cooling_present(request: pytest.FixtureRequest) -> str:
"""Pass the cooling_present boolean.
Used with fixtures that require parametrization of the cooling capability.
"""
return request.param
@pytest.fixture @pytest.fixture
def chosen_env(request: pytest.FixtureRequest) -> str: def chosen_env(request: pytest.FixtureRequest) -> str:
"""Pass the chosen_env string. """Pass the chosen_env string.
@ -48,6 +56,24 @@ def gateway_id(request: pytest.FixtureRequest) -> str:
return request.param return request.param
@pytest.fixture
def heater_id(request: pytest.FixtureRequest) -> str:
"""Pass the heater_idstring.
Used with fixtures that require parametrization of the heater_id.
"""
return request.param
@pytest.fixture
def reboot(request: pytest.FixtureRequest) -> str:
"""Pass the reboot boolean.
Used with fixtures that require parametrization of the reboot capability.
"""
return request.param
@pytest.fixture @pytest.fixture
def mock_config_entry() -> MockConfigEntry: def mock_config_entry() -> MockConfigEntry:
"""Return the default mocked config entry.""" """Return the default mocked config entry."""
@ -82,11 +108,14 @@ def mock_smile_config_flow() -> Generator[MagicMock]:
autospec=True, autospec=True,
) as smile_mock: ) as smile_mock:
smile = smile_mock.return_value smile = smile_mock.return_value
smile.connect.return_value = Version("4.3.2")
smile.smile_hostname = "smile12345" smile.smile_hostname = "smile12345"
smile.smile_model = "Test Model" smile.smile_model = "Test Model"
smile.smile_model_id = "Test Model ID" smile.smile_model_id = "Test Model ID"
smile.smile_name = "Test Smile Name" smile.smile_name = "Test Smile Name"
smile.connect.return_value = Version("4.3.2") smile.smile_version = "4.3.2"
yield smile yield smile
@ -94,7 +123,7 @@ def mock_smile_config_flow() -> Generator[MagicMock]:
def mock_smile_adam() -> Generator[MagicMock]: def mock_smile_adam() -> Generator[MagicMock]:
"""Create a Mock Adam environment for testing exceptions.""" """Create a Mock Adam environment for testing exceptions."""
chosen_env = "m_adam_multiple_devices_per_zone" chosen_env = "m_adam_multiple_devices_per_zone"
all_data = _read_json(chosen_env, "all_data") data = _read_json(chosen_env, "data")
with ( with (
patch( patch(
"homeassistant.components.plugwise.coordinator.Smile", autospec=True "homeassistant.components.plugwise.coordinator.Smile", autospec=True
@ -106,43 +135,45 @@ def mock_smile_adam() -> Generator[MagicMock]:
): ):
smile = smile_mock.return_value smile = smile_mock.return_value
smile.async_update.return_value = data
smile.cooling_present = False
smile.connect.return_value = Version("3.0.15")
smile.gateway_id = "fe799307f1624099878210aa0b9f1475" smile.gateway_id = "fe799307f1624099878210aa0b9f1475"
smile.heater_id = "90986d591dcd426cae3ec3e8111ff730" smile.heater_id = "90986d591dcd426cae3ec3e8111ff730"
smile.smile_version = "3.0.15" smile.reboot = True
smile.smile_type = "thermostat"
smile.smile_hostname = "smile98765" smile.smile_hostname = "smile98765"
smile.smile_model = "Gateway" smile.smile_model = "Gateway"
smile.smile_model_id = "smile_open_therm" smile.smile_model_id = "smile_open_therm"
smile.smile_name = "Adam" smile.smile_name = "Adam"
smile.connect.return_value = Version("3.0.15") smile.smile_type = "thermostat"
smile.async_update.return_value = PlugwiseData( smile.smile_version = "3.0.15"
all_data["devices"], all_data["gateway"]
)
yield smile yield smile
@pytest.fixture @pytest.fixture
def mock_smile_adam_heat_cool(chosen_env: str) -> Generator[MagicMock]: def mock_smile_adam_heat_cool(
chosen_env: str, cooling_present: bool
) -> Generator[MagicMock]:
"""Create a special base Mock Adam type for testing with different datasets.""" """Create a special base Mock Adam type for testing with different datasets."""
all_data = _read_json(chosen_env, "all_data") data = _read_json(chosen_env, "data")
with patch( with patch(
"homeassistant.components.plugwise.coordinator.Smile", autospec=True "homeassistant.components.plugwise.coordinator.Smile", autospec=True
) as smile_mock: ) as smile_mock:
smile = smile_mock.return_value smile = smile_mock.return_value
smile.async_update.return_value = PlugwiseData( smile.async_update.return_value = data
all_data["devices"], all_data["gateway"]
)
smile.connect.return_value = Version("3.6.4") smile.connect.return_value = Version("3.6.4")
smile.cooling_present = cooling_present
smile.gateway_id = "da224107914542988a88561b4452b0f6" smile.gateway_id = "da224107914542988a88561b4452b0f6"
smile.heater_id = "056ee145a816487eaa69243c3280f8bf" smile.heater_id = "056ee145a816487eaa69243c3280f8bf"
smile.smile_version = "3.6.4" smile.reboot = True
smile.smile_type = "thermostat"
smile.smile_hostname = "smile98765" smile.smile_hostname = "smile98765"
smile.smile_model = "Gateway" smile.smile_model = "Gateway"
smile.smile_model_id = "smile_open_therm" smile.smile_model_id = "smile_open_therm"
smile.smile_name = "Adam" smile.smile_name = "Adam"
smile.smile_type = "thermostat"
smile.smile_version = "3.6.4"
yield smile yield smile
@ -151,49 +182,49 @@ def mock_smile_adam_heat_cool(chosen_env: str) -> Generator[MagicMock]:
def mock_smile_adam_jip() -> Generator[MagicMock]: def mock_smile_adam_jip() -> Generator[MagicMock]:
"""Create a Mock adam-jip type for testing exceptions.""" """Create a Mock adam-jip type for testing exceptions."""
chosen_env = "m_adam_jip" chosen_env = "m_adam_jip"
all_data = _read_json(chosen_env, "all_data") data = _read_json(chosen_env, "data")
with patch( with patch(
"homeassistant.components.plugwise.coordinator.Smile", autospec=True "homeassistant.components.plugwise.coordinator.Smile", autospec=True
) as smile_mock: ) as smile_mock:
smile = smile_mock.return_value smile = smile_mock.return_value
smile.async_update.return_value = data
smile.connect.return_value = Version("3.2.8")
smile.cooling_present = False
smile.gateway_id = "b5c2386c6f6342669e50fe49dd05b188" smile.gateway_id = "b5c2386c6f6342669e50fe49dd05b188"
smile.heater_id = "e4684553153b44afbef2200885f379dc" smile.heater_id = "e4684553153b44afbef2200885f379dc"
smile.smile_version = "3.2.8" smile.reboot = True
smile.smile_type = "thermostat"
smile.smile_hostname = "smile98765" smile.smile_hostname = "smile98765"
smile.smile_model = "Gateway" smile.smile_model = "Gateway"
smile.smile_model_id = "smile_open_therm" smile.smile_model_id = "smile_open_therm"
smile.smile_name = "Adam" smile.smile_name = "Adam"
smile.connect.return_value = Version("3.2.8") smile.smile_type = "thermostat"
smile.async_update.return_value = PlugwiseData( smile.smile_version = "3.2.8"
all_data["devices"], all_data["gateway"]
)
yield smile yield smile
@pytest.fixture @pytest.fixture
def mock_smile_anna(chosen_env: str) -> Generator[MagicMock]: def mock_smile_anna(chosen_env: str, cooling_present: bool) -> Generator[MagicMock]:
"""Create a Mock Anna type for testing.""" """Create a Mock Anna type for testing."""
all_data = _read_json(chosen_env, "all_data") data = _read_json(chosen_env, "data")
with patch( with patch(
"homeassistant.components.plugwise.coordinator.Smile", autospec=True "homeassistant.components.plugwise.coordinator.Smile", autospec=True
) as smile_mock: ) as smile_mock:
smile = smile_mock.return_value smile = smile_mock.return_value
smile.async_update.return_value = PlugwiseData( smile.async_update.return_value = data
all_data["devices"], all_data["gateway"]
)
smile.connect.return_value = Version("4.0.15") smile.connect.return_value = Version("4.0.15")
smile.cooling_present = cooling_present
smile.gateway_id = "015ae9ea3f964e668e490fa39da3870b" smile.gateway_id = "015ae9ea3f964e668e490fa39da3870b"
smile.heater_id = "1cbf783bb11e4a7c8a6843dee3a86927" smile.heater_id = "1cbf783bb11e4a7c8a6843dee3a86927"
smile.smile_version = "4.0.15" smile.reboot = True
smile.smile_type = "thermostat"
smile.smile_hostname = "smile98765" smile.smile_hostname = "smile98765"
smile.smile_model = "Gateway" smile.smile_model = "Gateway"
smile.smile_model_id = "smile_thermo" smile.smile_model_id = "smile_thermo"
smile.smile_name = "Smile Anna" smile.smile_name = "Smile Anna"
smile.smile_type = "thermostat"
smile.smile_version = "4.0.15"
yield smile yield smile
@ -201,18 +232,17 @@ def mock_smile_anna(chosen_env: str) -> Generator[MagicMock]:
@pytest.fixture @pytest.fixture
def mock_smile_p1(chosen_env: str, gateway_id: str) -> Generator[MagicMock]: def mock_smile_p1(chosen_env: str, gateway_id: str) -> Generator[MagicMock]:
"""Create a base Mock P1 type for testing with different datasets and gateway-ids.""" """Create a base Mock P1 type for testing with different datasets and gateway-ids."""
all_data = _read_json(chosen_env, "all_data") data = _read_json(chosen_env, "data")
with patch( with patch(
"homeassistant.components.plugwise.coordinator.Smile", autospec=True "homeassistant.components.plugwise.coordinator.Smile", autospec=True
) as smile_mock: ) as smile_mock:
smile = smile_mock.return_value smile = smile_mock.return_value
smile.async_update.return_value = PlugwiseData( smile.async_update.return_value = data
all_data["devices"], all_data["gateway"]
)
smile.connect.return_value = Version("4.4.2") smile.connect.return_value = Version("4.4.2")
smile.gateway_id = gateway_id smile.gateway_id = gateway_id
smile.heater_id = None smile.heater_id = None
smile.reboot = True
smile.smile_hostname = "smile98765" smile.smile_hostname = "smile98765"
smile.smile_model = "Gateway" smile.smile_model = "Gateway"
smile.smile_model_id = "smile" smile.smile_model_id = "smile"
@ -227,24 +257,23 @@ def mock_smile_p1(chosen_env: str, gateway_id: str) -> Generator[MagicMock]:
def mock_smile_legacy_anna() -> Generator[MagicMock]: def mock_smile_legacy_anna() -> Generator[MagicMock]:
"""Create a Mock legacy Anna environment for testing exceptions.""" """Create a Mock legacy Anna environment for testing exceptions."""
chosen_env = "legacy_anna" chosen_env = "legacy_anna"
all_data = _read_json(chosen_env, "all_data") data = _read_json(chosen_env, "data")
with patch( with patch(
"homeassistant.components.plugwise.coordinator.Smile", autospec=True "homeassistant.components.plugwise.coordinator.Smile", autospec=True
) as smile_mock: ) as smile_mock:
smile = smile_mock.return_value smile = smile_mock.return_value
smile.async_update.return_value = data
smile.connect.return_value = Version("1.8.22")
smile.gateway_id = "0000aaaa0000aaaa0000aaaa0000aa00" smile.gateway_id = "0000aaaa0000aaaa0000aaaa0000aa00"
smile.heater_id = "04e4cbfe7f4340f090f85ec3b9e6a950" smile.heater_id = "04e4cbfe7f4340f090f85ec3b9e6a950"
smile.smile_version = "1.8.22" smile.reboot = False
smile.smile_type = "thermostat"
smile.smile_hostname = "smile98765" smile.smile_hostname = "smile98765"
smile.smile_model = "Gateway" smile.smile_model = "Gateway"
smile.smile_model_id = None smile.smile_model_id = None
smile.smile_name = "Smile Anna" smile.smile_name = "Smile Anna"
smile.connect.return_value = Version("1.8.22") smile.smile_type = "thermostat"
smile.async_update.return_value = PlugwiseData( smile.smile_version = "1.8.22"
all_data["devices"], all_data["gateway"]
)
yield smile yield smile
@ -253,24 +282,23 @@ def mock_smile_legacy_anna() -> Generator[MagicMock]:
def mock_stretch() -> Generator[MagicMock]: def mock_stretch() -> Generator[MagicMock]:
"""Create a Mock Stretch environment for testing exceptions.""" """Create a Mock Stretch environment for testing exceptions."""
chosen_env = "stretch_v31" chosen_env = "stretch_v31"
all_data = _read_json(chosen_env, "all_data") data = _read_json(chosen_env, "data")
with patch( with patch(
"homeassistant.components.plugwise.coordinator.Smile", autospec=True "homeassistant.components.plugwise.coordinator.Smile", autospec=True
) as smile_mock: ) as smile_mock:
smile = smile_mock.return_value smile = smile_mock.return_value
smile.async_update.return_value = data
smile.connect.return_value = Version("3.1.11")
smile.gateway_id = "259882df3c05415b99c2d962534ce820" smile.gateway_id = "259882df3c05415b99c2d962534ce820"
smile.heater_id = None smile.heater_id = None
smile.smile_version = "3.1.11" smile.reboot = False
smile.smile_type = "stretch"
smile.smile_hostname = "stretch98765" smile.smile_hostname = "stretch98765"
smile.smile_model = "Gateway" smile.smile_model = "Gateway"
smile.smile_model_id = None smile.smile_model_id = None
smile.smile_name = "Stretch" smile.smile_name = "Stretch"
smile.connect.return_value = Version("3.1.11") smile.smile_type = "stretch"
smile.async_update.return_value = PlugwiseData( smile.smile_version = "3.1.11"
all_data["devices"], all_data["gateway"]
)
yield smile yield smile

View File

@ -0,0 +1,97 @@
{
"015ae9ea3f964e668e490fa39da3870b": {
"binary_sensors": {
"plugwise_notification": false
},
"dev_class": "gateway",
"firmware": "4.0.15",
"hardware": "AME Smile 2.0 board",
"location": "a57efe5f145f498c9be62a9b63626fbf",
"mac_address": "012345670001",
"model": "Gateway",
"model_id": "smile_thermo",
"name": "Smile Anna",
"notifications": {},
"sensors": {
"outdoor_temperature": 20.2
},
"vendor": "Plugwise"
},
"1cbf783bb11e4a7c8a6843dee3a86927": {
"available": true,
"binary_sensors": {
"compressor_state": true,
"cooling_enabled": false,
"cooling_state": false,
"dhw_state": false,
"flame_state": false,
"heating_state": true,
"secondary_boiler_state": false
},
"dev_class": "heater_central",
"location": "a57efe5f145f498c9be62a9b63626fbf",
"max_dhw_temperature": {
"lower_bound": 35.0,
"resolution": 0.01,
"setpoint": 53.0,
"upper_bound": 60.0
},
"maximum_boiler_temperature": {
"lower_bound": 0.0,
"resolution": 1.0,
"setpoint": 60.0,
"upper_bound": 100.0
},
"model": "Generic heater/cooler",
"name": "OpenTherm",
"sensors": {
"dhw_temperature": 46.3,
"intended_boiler_temperature": 35.0,
"modulation_level": 52,
"outdoor_air_temperature": 3.0,
"return_temperature": 25.1,
"water_pressure": 1.57,
"water_temperature": 29.1
},
"switches": {
"dhw_cm_switch": false
},
"vendor": "Techneco"
},
"3cb70739631c4d17a86b8b12e8a5161b": {
"active_preset": "home",
"available_schedules": ["standaard", "off"],
"climate_mode": "auto",
"control_state": "heating",
"dev_class": "thermostat",
"firmware": "2018-02-08T11:15:53+01:00",
"hardware": "6539-1301-5002",
"location": "c784ee9fdab44e1395b8dee7d7a497d5",
"model": "ThermoTouch",
"name": "Anna",
"preset_modes": ["no_frost", "home", "away", "asleep", "vacation"],
"select_schedule": "standaard",
"sensors": {
"cooling_activation_outdoor_temperature": 21.0,
"cooling_deactivation_threshold": 4.0,
"illuminance": 86.0,
"setpoint_high": 30.0,
"setpoint_low": 20.5,
"temperature": 19.3
},
"temperature_offset": {
"lower_bound": -2.0,
"resolution": 0.1,
"setpoint": -0.5,
"upper_bound": 2.0
},
"thermostat": {
"lower_bound": 4.0,
"resolution": 0.1,
"setpoint_high": 30.0,
"setpoint_low": 20.5,
"upper_bound": 30.0
},
"vendor": "Plugwise"
}
}

View File

@ -0,0 +1,60 @@
{
"0000aaaa0000aaaa0000aaaa0000aa00": {
"dev_class": "gateway",
"firmware": "1.8.22",
"location": "0000aaaa0000aaaa0000aaaa0000aa00",
"mac_address": "01:23:45:67:89:AB",
"model": "Gateway",
"name": "Smile Anna",
"vendor": "Plugwise"
},
"04e4cbfe7f4340f090f85ec3b9e6a950": {
"binary_sensors": {
"flame_state": true,
"heating_state": true
},
"dev_class": "heater_central",
"location": "0000aaaa0000aaaa0000aaaa0000aa00",
"maximum_boiler_temperature": {
"lower_bound": 50.0,
"resolution": 1.0,
"setpoint": 50.0,
"upper_bound": 90.0
},
"model": "Generic heater",
"name": "OpenTherm",
"sensors": {
"dhw_temperature": 51.2,
"intended_boiler_temperature": 17.0,
"modulation_level": 0.0,
"return_temperature": 21.7,
"water_pressure": 1.2,
"water_temperature": 23.6
},
"vendor": "Bosch Thermotechniek B.V."
},
"0d266432d64443e283b5d708ae98b455": {
"active_preset": "home",
"climate_mode": "heat",
"control_state": "heating",
"dev_class": "thermostat",
"firmware": "2017-03-13T11:54:58+01:00",
"hardware": "6539-1301-500",
"location": "0000aaaa0000aaaa0000aaaa0000aa00",
"model": "ThermoTouch",
"name": "Anna",
"preset_modes": ["away", "vacation", "asleep", "home", "no_frost"],
"sensors": {
"illuminance": 150.8,
"setpoint": 20.5,
"temperature": 20.4
},
"thermostat": {
"lower_bound": 4.0,
"resolution": 0.1,
"setpoint": 20.5,
"upper_bound": 30.0
},
"vendor": "Plugwise"
}
}

View File

@ -0,0 +1,203 @@
{
"056ee145a816487eaa69243c3280f8bf": {
"available": true,
"binary_sensors": {
"cooling_state": true,
"dhw_state": false,
"flame_state": false,
"heating_state": false
},
"dev_class": "heater_central",
"location": "bc93488efab249e5bc54fd7e175a6f91",
"maximum_boiler_temperature": {
"lower_bound": 25.0,
"resolution": 0.01,
"setpoint": 50.0,
"upper_bound": 95.0
},
"model": "Generic heater",
"name": "OpenTherm",
"sensors": {
"intended_boiler_temperature": 17.5,
"water_temperature": 19.0
},
"switches": {
"dhw_cm_switch": false
}
},
"1772a4ea304041adb83f357b751341ff": {
"available": true,
"binary_sensors": {
"low_battery": false
},
"dev_class": "thermostatic_radiator_valve",
"firmware": "2020-11-04T01:00:00+01:00",
"hardware": "1",
"location": "f871b8c4d63549319221e294e4f88074",
"model": "Tom/Floor",
"model_id": "106-03",
"name": "Tom Badkamer",
"sensors": {
"battery": 99,
"setpoint": 18.0,
"temperature": 21.6,
"temperature_difference": -0.2,
"valve_position": 100
},
"temperature_offset": {
"lower_bound": -2.0,
"resolution": 0.1,
"setpoint": 0.1,
"upper_bound": 2.0
},
"vendor": "Plugwise",
"zigbee_mac_address": "000D6F000C8FF5EE"
},
"ad4838d7d35c4d6ea796ee12ae5aedf8": {
"available": true,
"dev_class": "thermostat",
"location": "f2bf9048bef64cc5b6d5110154e33c81",
"model": "ThermoTouch",
"model_id": "143.1",
"name": "Anna",
"sensors": {
"setpoint": 23.5,
"temperature": 25.8
},
"vendor": "Plugwise"
},
"da224107914542988a88561b4452b0f6": {
"binary_sensors": {
"plugwise_notification": false
},
"dev_class": "gateway",
"firmware": "3.7.8",
"gateway_modes": ["away", "full", "vacation"],
"hardware": "AME Smile 2.0 board",
"location": "bc93488efab249e5bc54fd7e175a6f91",
"mac_address": "012345679891",
"model": "Gateway",
"model_id": "smile_open_therm",
"name": "Adam",
"notifications": {},
"regulation_modes": [
"bleeding_hot",
"bleeding_cold",
"off",
"heating",
"cooling"
],
"select_gateway_mode": "full",
"select_regulation_mode": "cooling",
"sensors": {
"outdoor_temperature": 29.65
},
"vendor": "Plugwise",
"zigbee_mac_address": "000D6F000D5A168D"
},
"e2f4322d57924fa090fbbc48b3a140dc": {
"available": true,
"binary_sensors": {
"low_battery": true
},
"dev_class": "zone_thermostat",
"firmware": "2016-10-10T02:00:00+02:00",
"hardware": "255",
"location": "f871b8c4d63549319221e294e4f88074",
"model": "Lisa",
"model_id": "158-01",
"name": "Lisa Badkamer",
"sensors": {
"battery": 14,
"setpoint": 23.5,
"temperature": 23.9
},
"temperature_offset": {
"lower_bound": -2.0,
"resolution": 0.1,
"setpoint": 0.0,
"upper_bound": 2.0
},
"vendor": "Plugwise",
"zigbee_mac_address": "000D6F000C869B61"
},
"e8ef2a01ed3b4139a53bf749204fe6b4": {
"dev_class": "switching",
"members": [
"2568cc4b9c1e401495d4741a5f89bee1",
"29542b2b6a6a4169acecc15c72a599b8"
],
"model": "Switchgroup",
"name": "Test",
"switches": {
"relay": true
},
"vendor": "Plugwise"
},
"f2bf9048bef64cc5b6d5110154e33c81": {
"active_preset": "home",
"available_schedules": [
"Badkamer",
"Test",
"Vakantie",
"Weekschema",
"off"
],
"climate_mode": "cool",
"control_state": "cooling",
"dev_class": "climate",
"model": "ThermoZone",
"name": "Living room",
"preset_modes": ["no_frost", "asleep", "vacation", "home", "away"],
"select_schedule": "off",
"sensors": {
"electricity_consumed": 149.9,
"electricity_produced": 0.0,
"temperature": 25.8
},
"thermostat": {
"lower_bound": 1.0,
"resolution": 0.01,
"setpoint": 23.5,
"upper_bound": 35.0
},
"thermostats": {
"primary": ["ad4838d7d35c4d6ea796ee12ae5aedf8"],
"secondary": []
},
"vendor": "Plugwise"
},
"f871b8c4d63549319221e294e4f88074": {
"active_preset": "home",
"available_schedules": [
"Badkamer",
"Test",
"Vakantie",
"Weekschema",
"off"
],
"climate_mode": "auto",
"control_state": "cooling",
"dev_class": "climate",
"model": "ThermoZone",
"name": "Bathroom",
"preset_modes": ["no_frost", "asleep", "vacation", "home", "away"],
"select_schedule": "Badkamer",
"sensors": {
"electricity_consumed": 0.0,
"electricity_produced": 0.0,
"temperature": 23.9
},
"thermostat": {
"lower_bound": 0.0,
"resolution": 0.01,
"setpoint": 25.0,
"upper_bound": 99.9
},
"thermostats": {
"primary": ["e2f4322d57924fa090fbbc48b3a140dc"],
"secondary": ["1772a4ea304041adb83f357b751341ff"]
},
"vendor": "Plugwise"
}
}

View File

@ -0,0 +1,202 @@
{
"056ee145a816487eaa69243c3280f8bf": {
"available": true,
"binary_sensors": {
"dhw_state": false,
"flame_state": false,
"heating_state": true
},
"dev_class": "heater_central",
"location": "bc93488efab249e5bc54fd7e175a6f91",
"max_dhw_temperature": {
"lower_bound": 40.0,
"resolution": 0.01,
"setpoint": 60.0,
"upper_bound": 60.0
},
"maximum_boiler_temperature": {
"lower_bound": 25.0,
"resolution": 0.01,
"setpoint": 50.0,
"upper_bound": 95.0
},
"model": "Generic heater",
"name": "OpenTherm",
"sensors": {
"intended_boiler_temperature": 38.1,
"water_temperature": 37.0
},
"switches": {
"dhw_cm_switch": false
}
},
"1772a4ea304041adb83f357b751341ff": {
"available": true,
"binary_sensors": {
"low_battery": false
},
"dev_class": "thermostatic_radiator_valve",
"firmware": "2020-11-04T01:00:00+01:00",
"hardware": "1",
"location": "f871b8c4d63549319221e294e4f88074",
"model": "Tom/Floor",
"model_id": "106-03",
"name": "Tom Badkamer",
"sensors": {
"battery": 99,
"setpoint": 18.0,
"temperature": 18.6,
"temperature_difference": -0.2,
"valve_position": 100
},
"temperature_offset": {
"lower_bound": -2.0,
"resolution": 0.1,
"setpoint": 0.1,
"upper_bound": 2.0
},
"vendor": "Plugwise",
"zigbee_mac_address": "000D6F000C8FF5EE"
},
"ad4838d7d35c4d6ea796ee12ae5aedf8": {
"available": true,
"dev_class": "thermostat",
"location": "f2bf9048bef64cc5b6d5110154e33c81",
"model": "ThermoTouch",
"model_id": "143.1",
"name": "Anna",
"sensors": {
"setpoint": 20.0,
"temperature": 19.1
},
"vendor": "Plugwise"
},
"da224107914542988a88561b4452b0f6": {
"binary_sensors": {
"plugwise_notification": false
},
"dev_class": "gateway",
"firmware": "3.7.8",
"gateway_modes": ["away", "full", "vacation"],
"hardware": "AME Smile 2.0 board",
"location": "bc93488efab249e5bc54fd7e175a6f91",
"mac_address": "012345679891",
"model": "Gateway",
"model_id": "smile_open_therm",
"name": "Adam",
"notifications": {},
"regulation_modes": ["bleeding_hot", "bleeding_cold", "off", "heating"],
"select_gateway_mode": "full",
"select_regulation_mode": "heating",
"sensors": {
"outdoor_temperature": -1.25
},
"vendor": "Plugwise",
"zigbee_mac_address": "000D6F000D5A168D"
},
"e2f4322d57924fa090fbbc48b3a140dc": {
"available": true,
"binary_sensors": {
"low_battery": true
},
"dev_class": "zone_thermostat",
"firmware": "2016-10-10T02:00:00+02:00",
"hardware": "255",
"location": "f871b8c4d63549319221e294e4f88074",
"model": "Lisa",
"model_id": "158-01",
"name": "Lisa Badkamer",
"sensors": {
"battery": 14,
"setpoint": 15.0,
"temperature": 17.9
},
"temperature_offset": {
"lower_bound": -2.0,
"resolution": 0.1,
"setpoint": 0.0,
"upper_bound": 2.0
},
"vendor": "Plugwise",
"zigbee_mac_address": "000D6F000C869B61"
},
"e8ef2a01ed3b4139a53bf749204fe6b4": {
"dev_class": "switching",
"members": [
"2568cc4b9c1e401495d4741a5f89bee1",
"29542b2b6a6a4169acecc15c72a599b8"
],
"model": "Switchgroup",
"name": "Test",
"switches": {
"relay": true
},
"vendor": "Plugwise"
},
"f2bf9048bef64cc5b6d5110154e33c81": {
"active_preset": "home",
"available_schedules": [
"Badkamer",
"Test",
"Vakantie",
"Weekschema",
"off"
],
"climate_mode": "heat",
"control_state": "preheating",
"dev_class": "climate",
"model": "ThermoZone",
"name": "Living room",
"preset_modes": ["no_frost", "asleep", "vacation", "home", "away"],
"select_schedule": "off",
"sensors": {
"electricity_consumed": 149.9,
"electricity_produced": 0.0,
"temperature": 19.1
},
"thermostat": {
"lower_bound": 1.0,
"resolution": 0.01,
"setpoint": 20.0,
"upper_bound": 35.0
},
"thermostats": {
"primary": ["ad4838d7d35c4d6ea796ee12ae5aedf8"],
"secondary": []
},
"vendor": "Plugwise"
},
"f871b8c4d63549319221e294e4f88074": {
"active_preset": "home",
"available_schedules": [
"Badkamer",
"Test",
"Vakantie",
"Weekschema",
"off"
],
"climate_mode": "auto",
"control_state": "idle",
"dev_class": "climate",
"model": "ThermoZone",
"name": "Bathroom",
"preset_modes": ["no_frost", "asleep", "vacation", "home", "away"],
"select_schedule": "Badkamer",
"sensors": {
"electricity_consumed": 0.0,
"electricity_produced": 0.0,
"temperature": 17.9
},
"thermostat": {
"lower_bound": 0.0,
"resolution": 0.01,
"setpoint": 15.0,
"upper_bound": 99.9
},
"thermostats": {
"primary": ["e2f4322d57924fa090fbbc48b3a140dc"],
"secondary": ["1772a4ea304041adb83f357b751341ff"]
},
"vendor": "Plugwise"
}
}

View File

@ -0,0 +1,370 @@
{
"06aecb3d00354375924f50c47af36bd2": {
"active_preset": "no_frost",
"climate_mode": "off",
"dev_class": "climate",
"model": "ThermoZone",
"name": "Slaapkamer",
"preset_modes": ["home", "asleep", "away", "vacation", "no_frost"],
"sensors": {
"temperature": 24.2
},
"thermostat": {
"lower_bound": 0.0,
"resolution": 0.01,
"setpoint": 13.0,
"upper_bound": 99.9
},
"thermostats": {
"primary": ["1346fbd8498d4dbcab7e18d51b771f3d"],
"secondary": ["356b65335e274d769c338223e7af9c33"]
},
"vendor": "Plugwise"
},
"13228dab8ce04617af318a2888b3c548": {
"active_preset": "home",
"climate_mode": "heat",
"control_state": "idle",
"dev_class": "climate",
"model": "ThermoZone",
"name": "Woonkamer",
"preset_modes": ["home", "asleep", "away", "vacation", "no_frost"],
"sensors": {
"temperature": 27.4
},
"thermostat": {
"lower_bound": 4.0,
"resolution": 0.01,
"setpoint": 9.0,
"upper_bound": 30.0
},
"thermostats": {
"primary": ["f61f1a2535f54f52ad006a3d18e459ca"],
"secondary": ["833de10f269c4deab58fb9df69901b4e"]
},
"vendor": "Plugwise"
},
"1346fbd8498d4dbcab7e18d51b771f3d": {
"available": true,
"binary_sensors": {
"low_battery": false
},
"dev_class": "zone_thermostat",
"firmware": "2016-10-27T02:00:00+02:00",
"hardware": "255",
"location": "06aecb3d00354375924f50c47af36bd2",
"model": "Lisa",
"model_id": "158-01",
"name": "Slaapkamer",
"sensors": {
"battery": 92,
"setpoint": 13.0,
"temperature": 24.2
},
"temperature_offset": {
"lower_bound": -2.0,
"resolution": 0.1,
"setpoint": 0.0,
"upper_bound": 2.0
},
"vendor": "Plugwise",
"zigbee_mac_address": "ABCD012345670A03"
},
"1da4d325838e4ad8aac12177214505c9": {
"available": true,
"dev_class": "thermostatic_radiator_valve",
"firmware": "2020-11-04T01:00:00+01:00",
"hardware": "1",
"location": "d58fec52899f4f1c92e4f8fad6d8c48c",
"model": "Tom/Floor",
"model_id": "106-03",
"name": "Tom Logeerkamer",
"sensors": {
"setpoint": 13.0,
"temperature": 28.8,
"temperature_difference": 2.0,
"valve_position": 0.0
},
"temperature_offset": {
"lower_bound": -2.0,
"resolution": 0.1,
"setpoint": 0.1,
"upper_bound": 2.0
},
"vendor": "Plugwise",
"zigbee_mac_address": "ABCD012345670A07"
},
"356b65335e274d769c338223e7af9c33": {
"available": true,
"dev_class": "thermostatic_radiator_valve",
"firmware": "2020-11-04T01:00:00+01:00",
"hardware": "1",
"location": "06aecb3d00354375924f50c47af36bd2",
"model": "Tom/Floor",
"model_id": "106-03",
"name": "Tom Slaapkamer",
"sensors": {
"setpoint": 13.0,
"temperature": 24.2,
"temperature_difference": 1.7,
"valve_position": 0.0
},
"temperature_offset": {
"lower_bound": -2.0,
"resolution": 0.1,
"setpoint": 0.1,
"upper_bound": 2.0
},
"vendor": "Plugwise",
"zigbee_mac_address": "ABCD012345670A05"
},
"457ce8414de24596a2d5e7dbc9c7682f": {
"available": true,
"dev_class": "zz_misc_plug",
"location": "9e4433a9d69f40b3aefd15e74395eaec",
"model": "Aqara Smart Plug",
"model_id": "lumi.plug.maeu01",
"name": "Plug",
"sensors": {
"electricity_consumed_interval": 0.0
},
"switches": {
"lock": true,
"relay": false
},
"vendor": "LUMI",
"zigbee_mac_address": "ABCD012345670A06"
},
"6f3e9d7084214c21b9dfa46f6eeb8700": {
"available": true,
"binary_sensors": {
"low_battery": false
},
"dev_class": "zone_thermostat",
"firmware": "2016-10-27T02:00:00+02:00",
"hardware": "255",
"location": "d27aede973b54be484f6842d1b2802ad",
"model": "Lisa",
"model_id": "158-01",
"name": "Kinderkamer",
"sensors": {
"battery": 79,
"setpoint": 13.0,
"temperature": 30.0
},
"temperature_offset": {
"lower_bound": -2.0,
"resolution": 0.1,
"setpoint": 0.0,
"upper_bound": 2.0
},
"vendor": "Plugwise",
"zigbee_mac_address": "ABCD012345670A02"
},
"833de10f269c4deab58fb9df69901b4e": {
"available": true,
"dev_class": "thermostatic_radiator_valve",
"firmware": "2020-11-04T01:00:00+01:00",
"hardware": "1",
"location": "13228dab8ce04617af318a2888b3c548",
"model": "Tom/Floor",
"model_id": "106-03",
"name": "Tom Woonkamer",
"sensors": {
"setpoint": 9.0,
"temperature": 24.0,
"temperature_difference": 1.8,
"valve_position": 100
},
"temperature_offset": {
"lower_bound": -2.0,
"resolution": 0.1,
"setpoint": 0.1,
"upper_bound": 2.0
},
"vendor": "Plugwise",
"zigbee_mac_address": "ABCD012345670A09"
},
"a6abc6a129ee499c88a4d420cc413b47": {
"available": true,
"binary_sensors": {
"low_battery": false
},
"dev_class": "zone_thermostat",
"firmware": "2016-10-27T02:00:00+02:00",
"hardware": "255",
"location": "d58fec52899f4f1c92e4f8fad6d8c48c",
"model": "Lisa",
"model_id": "158-01",
"name": "Logeerkamer",
"sensors": {
"battery": 80,
"setpoint": 13.0,
"temperature": 30.0
},
"temperature_offset": {
"lower_bound": -2.0,
"resolution": 0.1,
"setpoint": 0.0,
"upper_bound": 2.0
},
"vendor": "Plugwise",
"zigbee_mac_address": "ABCD012345670A01"
},
"b5c2386c6f6342669e50fe49dd05b188": {
"binary_sensors": {
"plugwise_notification": false
},
"dev_class": "gateway",
"firmware": "3.2.8",
"gateway_modes": ["away", "full", "vacation"],
"hardware": "AME Smile 2.0 board",
"location": "9e4433a9d69f40b3aefd15e74395eaec",
"mac_address": "012345670001",
"model": "Gateway",
"model_id": "smile_open_therm",
"name": "Adam",
"notifications": {},
"regulation_modes": ["heating", "off", "bleeding_cold", "bleeding_hot"],
"select_gateway_mode": "full",
"select_regulation_mode": "heating",
"sensors": {
"outdoor_temperature": 24.9
},
"vendor": "Plugwise",
"zigbee_mac_address": "ABCD012345670101"
},
"d27aede973b54be484f6842d1b2802ad": {
"active_preset": "home",
"climate_mode": "heat",
"control_state": "idle",
"dev_class": "climate",
"model": "ThermoZone",
"name": "Kinderkamer",
"preset_modes": ["home", "asleep", "away", "vacation", "no_frost"],
"sensors": {
"temperature": 30.0
},
"thermostat": {
"lower_bound": 0.0,
"resolution": 0.01,
"setpoint": 13.0,
"upper_bound": 99.9
},
"thermostats": {
"primary": ["6f3e9d7084214c21b9dfa46f6eeb8700"],
"secondary": ["d4496250d0e942cfa7aea3476e9070d5"]
},
"vendor": "Plugwise"
},
"d4496250d0e942cfa7aea3476e9070d5": {
"available": true,
"dev_class": "thermostatic_radiator_valve",
"firmware": "2020-11-04T01:00:00+01:00",
"hardware": "1",
"location": "d27aede973b54be484f6842d1b2802ad",
"model": "Tom/Floor",
"model_id": "106-03",
"name": "Tom Kinderkamer",
"sensors": {
"setpoint": 13.0,
"temperature": 28.7,
"temperature_difference": 1.9,
"valve_position": 0.0
},
"temperature_offset": {
"lower_bound": -2.0,
"resolution": 0.1,
"setpoint": 0.1,
"upper_bound": 2.0
},
"vendor": "Plugwise",
"zigbee_mac_address": "ABCD012345670A04"
},
"d58fec52899f4f1c92e4f8fad6d8c48c": {
"active_preset": "home",
"climate_mode": "heat",
"control_state": "idle",
"dev_class": "climate",
"model": "ThermoZone",
"name": "Logeerkamer",
"preset_modes": ["home", "asleep", "away", "vacation", "no_frost"],
"sensors": {
"temperature": 30.0
},
"thermostat": {
"lower_bound": 0.0,
"resolution": 0.01,
"setpoint": 13.0,
"upper_bound": 99.9
},
"thermostats": {
"primary": ["a6abc6a129ee499c88a4d420cc413b47"],
"secondary": ["1da4d325838e4ad8aac12177214505c9"]
},
"vendor": "Plugwise"
},
"e4684553153b44afbef2200885f379dc": {
"available": true,
"binary_sensors": {
"dhw_state": false,
"flame_state": false,
"heating_state": false
},
"dev_class": "heater_central",
"location": "9e4433a9d69f40b3aefd15e74395eaec",
"max_dhw_temperature": {
"lower_bound": 40.0,
"resolution": 0.01,
"setpoint": 60.0,
"upper_bound": 60.0
},
"maximum_boiler_temperature": {
"lower_bound": 20.0,
"resolution": 0.01,
"setpoint": 90.0,
"upper_bound": 90.0
},
"model": "Generic heater",
"model_id": "10.20",
"name": "OpenTherm",
"sensors": {
"intended_boiler_temperature": 0.0,
"modulation_level": 0.0,
"return_temperature": 37.1,
"water_pressure": 1.4,
"water_temperature": 37.3
},
"switches": {
"dhw_cm_switch": false
},
"vendor": "Remeha B.V."
},
"f61f1a2535f54f52ad006a3d18e459ca": {
"available": true,
"binary_sensors": {
"low_battery": false
},
"dev_class": "zone_thermometer",
"firmware": "2020-09-01T02:00:00+02:00",
"hardware": "1",
"location": "13228dab8ce04617af318a2888b3c548",
"model": "Jip",
"model_id": "168-01",
"name": "Woonkamer",
"sensors": {
"battery": 100,
"humidity": 56.2,
"setpoint": 9.0,
"temperature": 27.4
},
"temperature_offset": {
"lower_bound": -2.0,
"resolution": 0.1,
"setpoint": 0.0,
"upper_bound": 2.0
},
"vendor": "Plugwise",
"zigbee_mac_address": "ABCD012345670A08"
}
}

View File

@ -0,0 +1,584 @@
{
"02cf28bfec924855854c544690a609ef": {
"available": true,
"dev_class": "vcr_plug",
"firmware": "2019-06-21T02:00:00+02:00",
"location": "cd143c07248f491493cea0533bc3d669",
"model": "Plug",
"model_id": "160-01",
"name": "NVR",
"sensors": {
"electricity_consumed": 34.0,
"electricity_consumed_interval": 9.15,
"electricity_produced": 0.0,
"electricity_produced_interval": 0.0
},
"switches": {
"lock": true,
"relay": true
},
"vendor": "Plugwise",
"zigbee_mac_address": "ABCD012345670A15"
},
"08963fec7c53423ca5680aa4cb502c63": {
"active_preset": "away",
"available_schedules": [
"CV Roan",
"Bios Schema met Film Avond",
"GF7 Woonkamer",
"Badkamer Schema",
"CV Jessie",
"off"
],
"climate_mode": "auto",
"control_state": "idle",
"dev_class": "climate",
"model": "ThermoZone",
"name": "Badkamer",
"preset_modes": ["home", "asleep", "away", "vacation", "no_frost"],
"select_schedule": "Badkamer Schema",
"sensors": {
"temperature": 18.9
},
"thermostat": {
"lower_bound": 0.0,
"resolution": 0.01,
"setpoint": 14.0,
"upper_bound": 100.0
},
"thermostats": {
"primary": [
"f1fee6043d3642a9b0a65297455f008e",
"680423ff840043738f42cc7f1ff97a36"
],
"secondary": []
},
"vendor": "Plugwise"
},
"12493538af164a409c6a1c79e38afe1c": {
"active_preset": "away",
"available_schedules": [
"CV Roan",
"Bios Schema met Film Avond",
"GF7 Woonkamer",
"Badkamer Schema",
"CV Jessie",
"off"
],
"climate_mode": "heat",
"control_state": "idle",
"dev_class": "climate",
"model": "ThermoZone",
"name": "Bios",
"preset_modes": ["home", "asleep", "away", "vacation", "no_frost"],
"select_schedule": "off",
"sensors": {
"electricity_consumed": 0.0,
"electricity_produced": 0.0,
"temperature": 16.5
},
"thermostat": {
"lower_bound": 0.0,
"resolution": 0.01,
"setpoint": 13.0,
"upper_bound": 100.0
},
"thermostats": {
"primary": ["df4a4a8169904cdb9c03d61a21f42140"],
"secondary": ["a2c3583e0a6349358998b760cea82d2a"]
},
"vendor": "Plugwise"
},
"21f2b542c49845e6bb416884c55778d6": {
"available": true,
"dev_class": "game_console_plug",
"firmware": "2019-06-21T02:00:00+02:00",
"location": "cd143c07248f491493cea0533bc3d669",
"model": "Plug",
"model_id": "160-01",
"name": "Playstation Smart Plug",
"sensors": {
"electricity_consumed": 84.1,
"electricity_consumed_interval": 8.6,
"electricity_produced": 0.0,
"electricity_produced_interval": 0.0
},
"switches": {
"lock": false,
"relay": true
},
"vendor": "Plugwise",
"zigbee_mac_address": "ABCD012345670A12"
},
"446ac08dd04d4eff8ac57489757b7314": {
"active_preset": "no_frost",
"climate_mode": "heat",
"control_state": "idle",
"dev_class": "climate",
"model": "ThermoZone",
"name": "Garage",
"preset_modes": ["home", "asleep", "away", "vacation", "no_frost"],
"sensors": {
"temperature": 15.6
},
"thermostat": {
"lower_bound": 0.0,
"resolution": 0.01,
"setpoint": 5.5,
"upper_bound": 100.0
},
"thermostats": {
"primary": ["e7693eb9582644e5b865dba8d4447cf1"],
"secondary": []
},
"vendor": "Plugwise"
},
"4a810418d5394b3f82727340b91ba740": {
"available": true,
"dev_class": "router_plug",
"firmware": "2019-06-21T02:00:00+02:00",
"location": "cd143c07248f491493cea0533bc3d669",
"model": "Plug",
"model_id": "160-01",
"name": "USG Smart Plug",
"sensors": {
"electricity_consumed": 8.5,
"electricity_consumed_interval": 0.0,
"electricity_produced": 0.0,
"electricity_produced_interval": 0.0
},
"switches": {
"lock": true,
"relay": true
},
"vendor": "Plugwise",
"zigbee_mac_address": "ABCD012345670A16"
},
"675416a629f343c495449970e2ca37b5": {
"available": true,
"dev_class": "router_plug",
"firmware": "2019-06-21T02:00:00+02:00",
"location": "cd143c07248f491493cea0533bc3d669",
"model": "Plug",
"model_id": "160-01",
"name": "Ziggo Modem",
"sensors": {
"electricity_consumed": 12.2,
"electricity_consumed_interval": 2.97,
"electricity_produced": 0.0,
"electricity_produced_interval": 0.0
},
"switches": {
"lock": true,
"relay": true
},
"vendor": "Plugwise",
"zigbee_mac_address": "ABCD012345670A01"
},
"680423ff840043738f42cc7f1ff97a36": {
"available": true,
"binary_sensors": {
"low_battery": false
},
"dev_class": "thermostatic_radiator_valve",
"firmware": "2019-03-27T01:00:00+01:00",
"hardware": "1",
"location": "08963fec7c53423ca5680aa4cb502c63",
"model": "Tom/Floor",
"model_id": "106-03",
"name": "Thermostatic Radiator Badkamer 1",
"sensors": {
"battery": 51,
"setpoint": 14.0,
"temperature": 19.1,
"temperature_difference": -0.4,
"valve_position": 0.0
},
"temperature_offset": {
"lower_bound": -2.0,
"resolution": 0.1,
"setpoint": 0.0,
"upper_bound": 2.0
},
"vendor": "Plugwise",
"zigbee_mac_address": "ABCD012345670A17"
},
"6a3bf693d05e48e0b460c815a4fdd09d": {
"available": true,
"binary_sensors": {
"low_battery": false
},
"dev_class": "zone_thermostat",
"firmware": "2016-10-27T02:00:00+02:00",
"hardware": "255",
"location": "82fa13f017d240daa0d0ea1775420f24",
"model": "Lisa",
"model_id": "158-01",
"name": "Zone Thermostat Jessie",
"sensors": {
"battery": 37,
"setpoint": 15.0,
"temperature": 17.2
},
"temperature_offset": {
"lower_bound": -2.0,
"resolution": 0.1,
"setpoint": 0.0,
"upper_bound": 2.0
},
"vendor": "Plugwise",
"zigbee_mac_address": "ABCD012345670A03"
},
"78d1126fc4c743db81b61c20e88342a7": {
"available": true,
"dev_class": "central_heating_pump_plug",
"firmware": "2019-06-21T02:00:00+02:00",
"location": "c50f167537524366a5af7aa3942feb1e",
"model": "Plug",
"model_id": "160-01",
"name": "CV Pomp",
"sensors": {
"electricity_consumed": 35.6,
"electricity_consumed_interval": 7.37,
"electricity_produced": 0.0,
"electricity_produced_interval": 0.0
},
"switches": {
"relay": true
},
"vendor": "Plugwise",
"zigbee_mac_address": "ABCD012345670A05"
},
"82fa13f017d240daa0d0ea1775420f24": {
"active_preset": "asleep",
"available_schedules": [
"CV Roan",
"Bios Schema met Film Avond",
"GF7 Woonkamer",
"Badkamer Schema",
"CV Jessie",
"off"
],
"climate_mode": "auto",
"control_state": "idle",
"dev_class": "climate",
"model": "ThermoZone",
"name": "Jessie",
"preset_modes": ["home", "asleep", "away", "vacation", "no_frost"],
"select_schedule": "CV Jessie",
"sensors": {
"temperature": 17.2
},
"thermostat": {
"lower_bound": 0.0,
"resolution": 0.01,
"setpoint": 15.0,
"upper_bound": 100.0
},
"thermostats": {
"primary": ["6a3bf693d05e48e0b460c815a4fdd09d"],
"secondary": ["d3da73bde12a47d5a6b8f9dad971f2ec"]
},
"vendor": "Plugwise"
},
"90986d591dcd426cae3ec3e8111ff730": {
"binary_sensors": {
"heating_state": true
},
"dev_class": "heater_central",
"location": "1f9dcf83fd4e4b66b72ff787957bfe5d",
"model": "Unknown",
"name": "OnOff",
"sensors": {
"intended_boiler_temperature": 70.0,
"modulation_level": 1,
"water_temperature": 70.0
}
},
"a28f588dc4a049a483fd03a30361ad3a": {
"available": true,
"dev_class": "settop_plug",
"firmware": "2019-06-21T02:00:00+02:00",
"location": "cd143c07248f491493cea0533bc3d669",
"model": "Plug",
"model_id": "160-01",
"name": "Fibaro HC2",
"sensors": {
"electricity_consumed": 12.5,
"electricity_consumed_interval": 3.8,
"electricity_produced": 0.0,
"electricity_produced_interval": 0.0
},
"switches": {
"lock": true,
"relay": true
},
"vendor": "Plugwise",
"zigbee_mac_address": "ABCD012345670A13"
},
"a2c3583e0a6349358998b760cea82d2a": {
"available": true,
"binary_sensors": {
"low_battery": false
},
"dev_class": "thermostatic_radiator_valve",
"firmware": "2019-03-27T01:00:00+01:00",
"hardware": "1",
"location": "12493538af164a409c6a1c79e38afe1c",
"model": "Tom/Floor",
"model_id": "106-03",
"name": "Bios Cv Thermostatic Radiator ",
"sensors": {
"battery": 62,
"setpoint": 13.0,
"temperature": 17.2,
"temperature_difference": -0.2,
"valve_position": 0.0
},
"temperature_offset": {
"lower_bound": -2.0,
"resolution": 0.1,
"setpoint": 0.0,
"upper_bound": 2.0
},
"vendor": "Plugwise",
"zigbee_mac_address": "ABCD012345670A09"
},
"b310b72a0e354bfab43089919b9a88bf": {
"available": true,
"dev_class": "thermostatic_radiator_valve",
"firmware": "2019-03-27T01:00:00+01:00",
"hardware": "1",
"location": "c50f167537524366a5af7aa3942feb1e",
"model": "Tom/Floor",
"model_id": "106-03",
"name": "Floor kraan",
"sensors": {
"setpoint": 21.5,
"temperature": 26.0,
"temperature_difference": 3.5,
"valve_position": 100
},
"temperature_offset": {
"lower_bound": -2.0,
"resolution": 0.1,
"setpoint": 0.0,
"upper_bound": 2.0
},
"vendor": "Plugwise",
"zigbee_mac_address": "ABCD012345670A02"
},
"b59bcebaf94b499ea7d46e4a66fb62d8": {
"available": true,
"binary_sensors": {
"low_battery": false
},
"dev_class": "zone_thermostat",
"firmware": "2016-08-02T02:00:00+02:00",
"hardware": "255",
"location": "c50f167537524366a5af7aa3942feb1e",
"model": "Lisa",
"model_id": "158-01",
"name": "Zone Lisa WK",
"sensors": {
"battery": 34,
"setpoint": 21.5,
"temperature": 20.9
},
"temperature_offset": {
"lower_bound": -2.0,
"resolution": 0.1,
"setpoint": 0.0,
"upper_bound": 2.0
},
"vendor": "Plugwise",
"zigbee_mac_address": "ABCD012345670A07"
},
"c50f167537524366a5af7aa3942feb1e": {
"active_preset": "home",
"available_schedules": [
"CV Roan",
"Bios Schema met Film Avond",
"GF7 Woonkamer",
"Badkamer Schema",
"CV Jessie",
"off"
],
"climate_mode": "auto",
"control_state": "heating",
"dev_class": "climate",
"model": "ThermoZone",
"name": "Woonkamer",
"preset_modes": ["home", "asleep", "away", "vacation", "no_frost"],
"select_schedule": "GF7 Woonkamer",
"sensors": {
"electricity_consumed": 35.6,
"electricity_produced": 0.0,
"temperature": 20.9
},
"thermostat": {
"lower_bound": 0.0,
"resolution": 0.01,
"setpoint": 21.5,
"upper_bound": 100.0
},
"thermostats": {
"primary": ["b59bcebaf94b499ea7d46e4a66fb62d8"],
"secondary": ["b310b72a0e354bfab43089919b9a88bf"]
},
"vendor": "Plugwise"
},
"cd0ddb54ef694e11ac18ed1cbce5dbbd": {
"available": true,
"dev_class": "vcr_plug",
"firmware": "2019-06-21T02:00:00+02:00",
"location": "cd143c07248f491493cea0533bc3d669",
"model": "Plug",
"model_id": "160-01",
"name": "NAS",
"sensors": {
"electricity_consumed": 16.5,
"electricity_consumed_interval": 0.5,
"electricity_produced": 0.0,
"electricity_produced_interval": 0.0
},
"switches": {
"lock": true,
"relay": true
},
"vendor": "Plugwise",
"zigbee_mac_address": "ABCD012345670A14"
},
"d3da73bde12a47d5a6b8f9dad971f2ec": {
"available": true,
"binary_sensors": {
"low_battery": false
},
"dev_class": "thermostatic_radiator_valve",
"firmware": "2019-03-27T01:00:00+01:00",
"hardware": "1",
"location": "82fa13f017d240daa0d0ea1775420f24",
"model": "Tom/Floor",
"model_id": "106-03",
"name": "Thermostatic Radiator Jessie",
"sensors": {
"battery": 62,
"setpoint": 15.0,
"temperature": 17.1,
"temperature_difference": 0.1,
"valve_position": 0.0
},
"temperature_offset": {
"lower_bound": -2.0,
"resolution": 0.1,
"setpoint": 0.0,
"upper_bound": 2.0
},
"vendor": "Plugwise",
"zigbee_mac_address": "ABCD012345670A10"
},
"df4a4a8169904cdb9c03d61a21f42140": {
"available": true,
"binary_sensors": {
"low_battery": false
},
"dev_class": "zone_thermostat",
"firmware": "2016-10-27T02:00:00+02:00",
"hardware": "255",
"location": "12493538af164a409c6a1c79e38afe1c",
"model": "Lisa",
"model_id": "158-01",
"name": "Zone Lisa Bios",
"sensors": {
"battery": 67,
"setpoint": 13.0,
"temperature": 16.5
},
"temperature_offset": {
"lower_bound": -2.0,
"resolution": 0.1,
"setpoint": 0.0,
"upper_bound": 2.0
},
"vendor": "Plugwise",
"zigbee_mac_address": "ABCD012345670A06"
},
"e7693eb9582644e5b865dba8d4447cf1": {
"available": true,
"binary_sensors": {
"low_battery": false
},
"dev_class": "thermostatic_radiator_valve",
"firmware": "2019-03-27T01:00:00+01:00",
"hardware": "1",
"location": "446ac08dd04d4eff8ac57489757b7314",
"model": "Tom/Floor",
"model_id": "106-03",
"name": "CV Kraan Garage",
"sensors": {
"battery": 68,
"setpoint": 5.5,
"temperature": 15.6,
"temperature_difference": 0.0,
"valve_position": 0.0
},
"temperature_offset": {
"lower_bound": -2.0,
"resolution": 0.1,
"setpoint": 0.0,
"upper_bound": 2.0
},
"vendor": "Plugwise",
"zigbee_mac_address": "ABCD012345670A11"
},
"f1fee6043d3642a9b0a65297455f008e": {
"available": true,
"binary_sensors": {
"low_battery": false
},
"dev_class": "thermostatic_radiator_valve",
"firmware": "2016-10-27T02:00:00+02:00",
"hardware": "255",
"location": "08963fec7c53423ca5680aa4cb502c63",
"model": "Lisa",
"model_id": "158-01",
"name": "Thermostatic Radiator Badkamer 2",
"sensors": {
"battery": 92,
"setpoint": 14.0,
"temperature": 18.9
},
"temperature_offset": {
"lower_bound": -2.0,
"resolution": 0.1,
"setpoint": 0.0,
"upper_bound": 2.0
},
"vendor": "Plugwise",
"zigbee_mac_address": "ABCD012345670A08"
},
"fe799307f1624099878210aa0b9f1475": {
"binary_sensors": {
"plugwise_notification": true
},
"dev_class": "gateway",
"firmware": "3.0.15",
"hardware": "AME Smile 2.0 board",
"location": "1f9dcf83fd4e4b66b72ff787957bfe5d",
"mac_address": "012345670001",
"model": "Gateway",
"model_id": "smile_open_therm",
"name": "Adam",
"notifications": {
"af82e4ccf9c548528166d38e560662a4": {
"warning": "Node Plug (with MAC address 000D6F000D13CB01, in room 'n.a.') has been unreachable since 23:03 2020-01-18. Please check the connection and restart the device."
}
},
"select_regulation_mode": "heating",
"sensors": {
"outdoor_temperature": 7.81
},
"vendor": "Plugwise",
"zigbee_mac_address": "ABCD012345670101"
}
}

View File

@ -0,0 +1,97 @@
{
"015ae9ea3f964e668e490fa39da3870b": {
"binary_sensors": {
"plugwise_notification": false
},
"dev_class": "gateway",
"firmware": "4.0.15",
"hardware": "AME Smile 2.0 board",
"location": "a57efe5f145f498c9be62a9b63626fbf",
"mac_address": "012345670001",
"model": "Gateway",
"model_id": "smile_thermo",
"name": "Smile Anna",
"notifications": {},
"sensors": {
"outdoor_temperature": 28.2
},
"vendor": "Plugwise"
},
"1cbf783bb11e4a7c8a6843dee3a86927": {
"available": true,
"binary_sensors": {
"compressor_state": true,
"cooling_enabled": true,
"cooling_state": true,
"dhw_state": false,
"flame_state": false,
"heating_state": false,
"secondary_boiler_state": false
},
"dev_class": "heater_central",
"location": "a57efe5f145f498c9be62a9b63626fbf",
"max_dhw_temperature": {
"lower_bound": 35.0,
"resolution": 0.01,
"setpoint": 53.0,
"upper_bound": 60.0
},
"maximum_boiler_temperature": {
"lower_bound": 0.0,
"resolution": 1.0,
"setpoint": 60.0,
"upper_bound": 100.0
},
"model": "Generic heater/cooler",
"name": "OpenTherm",
"sensors": {
"dhw_temperature": 41.5,
"intended_boiler_temperature": 0.0,
"modulation_level": 40,
"outdoor_air_temperature": 28.0,
"return_temperature": 23.8,
"water_pressure": 1.57,
"water_temperature": 22.7
},
"switches": {
"dhw_cm_switch": false
},
"vendor": "Techneco"
},
"3cb70739631c4d17a86b8b12e8a5161b": {
"active_preset": "home",
"available_schedules": ["standaard", "off"],
"climate_mode": "auto",
"control_state": "cooling",
"dev_class": "thermostat",
"firmware": "2018-02-08T11:15:53+01:00",
"hardware": "6539-1301-5002",
"location": "c784ee9fdab44e1395b8dee7d7a497d5",
"model": "ThermoTouch",
"name": "Anna",
"preset_modes": ["no_frost", "home", "away", "asleep", "vacation"],
"select_schedule": "standaard",
"sensors": {
"cooling_activation_outdoor_temperature": 21.0,
"cooling_deactivation_threshold": 4.0,
"illuminance": 86.0,
"setpoint_high": 30.0,
"setpoint_low": 20.5,
"temperature": 26.3
},
"temperature_offset": {
"lower_bound": -2.0,
"resolution": 0.1,
"setpoint": -0.5,
"upper_bound": 2.0
},
"thermostat": {
"lower_bound": 4.0,
"resolution": 0.1,
"setpoint_high": 30.0,
"setpoint_low": 20.5,
"upper_bound": 30.0
},
"vendor": "Plugwise"
}
}

View File

@ -0,0 +1,97 @@
{
"015ae9ea3f964e668e490fa39da3870b": {
"binary_sensors": {
"plugwise_notification": false
},
"dev_class": "gateway",
"firmware": "4.0.15",
"hardware": "AME Smile 2.0 board",
"location": "a57efe5f145f498c9be62a9b63626fbf",
"mac_address": "012345670001",
"model": "Gateway",
"model_id": "smile_thermo",
"name": "Smile Anna",
"notifications": {},
"sensors": {
"outdoor_temperature": 28.2
},
"vendor": "Plugwise"
},
"1cbf783bb11e4a7c8a6843dee3a86927": {
"available": true,
"binary_sensors": {
"compressor_state": false,
"cooling_enabled": true,
"cooling_state": false,
"dhw_state": false,
"flame_state": false,
"heating_state": false,
"secondary_boiler_state": false
},
"dev_class": "heater_central",
"location": "a57efe5f145f498c9be62a9b63626fbf",
"max_dhw_temperature": {
"lower_bound": 35.0,
"resolution": 0.01,
"setpoint": 53.0,
"upper_bound": 60.0
},
"maximum_boiler_temperature": {
"lower_bound": 0.0,
"resolution": 1.0,
"setpoint": 60.0,
"upper_bound": 100.0
},
"model": "Generic heater/cooler",
"name": "OpenTherm",
"sensors": {
"dhw_temperature": 46.3,
"intended_boiler_temperature": 18.0,
"modulation_level": 0,
"outdoor_air_temperature": 28.2,
"return_temperature": 22.0,
"water_pressure": 1.57,
"water_temperature": 19.1
},
"switches": {
"dhw_cm_switch": false
},
"vendor": "Techneco"
},
"3cb70739631c4d17a86b8b12e8a5161b": {
"active_preset": "home",
"available_schedules": ["standaard", "off"],
"climate_mode": "auto",
"control_state": "idle",
"dev_class": "thermostat",
"firmware": "2018-02-08T11:15:53+01:00",
"hardware": "6539-1301-5002",
"location": "c784ee9fdab44e1395b8dee7d7a497d5",
"model": "ThermoTouch",
"name": "Anna",
"preset_modes": ["no_frost", "home", "away", "asleep", "vacation"],
"select_schedule": "standaard",
"sensors": {
"cooling_activation_outdoor_temperature": 25.0,
"cooling_deactivation_threshold": 4.0,
"illuminance": 86.0,
"setpoint_high": 30.0,
"setpoint_low": 20.5,
"temperature": 23.0
},
"temperature_offset": {
"lower_bound": -2.0,
"resolution": 0.1,
"setpoint": -0.5,
"upper_bound": 2.0
},
"thermostat": {
"lower_bound": 4.0,
"resolution": 0.1,
"setpoint_high": 30.0,
"setpoint_low": 20.5,
"upper_bound": 30.0
},
"vendor": "Plugwise"
}
}

View File

@ -0,0 +1,43 @@
{
"a455b61e52394b2db5081ce025a430f3": {
"binary_sensors": {
"plugwise_notification": false
},
"dev_class": "gateway",
"firmware": "4.4.2",
"hardware": "AME Smile 2.0 board",
"location": "a455b61e52394b2db5081ce025a430f3",
"mac_address": "012345670001",
"model": "Gateway",
"model_id": "smile",
"name": "Smile P1",
"notifications": {},
"vendor": "Plugwise"
},
"ba4de7613517478da82dd9b6abea36af": {
"available": true,
"dev_class": "smartmeter",
"location": "a455b61e52394b2db5081ce025a430f3",
"model": "KFM5KAIFA-METER",
"name": "P1",
"sensors": {
"electricity_consumed_off_peak_cumulative": 17643.423,
"electricity_consumed_off_peak_interval": 15,
"electricity_consumed_off_peak_point": 486,
"electricity_consumed_peak_cumulative": 13966.608,
"electricity_consumed_peak_interval": 0,
"electricity_consumed_peak_point": 0,
"electricity_phase_one_consumed": 486,
"electricity_phase_one_produced": 0,
"electricity_produced_off_peak_cumulative": 0.0,
"electricity_produced_off_peak_interval": 0,
"electricity_produced_off_peak_point": 0,
"electricity_produced_peak_cumulative": 0.0,
"electricity_produced_peak_interval": 0,
"electricity_produced_peak_point": 0,
"net_electricity_cumulative": 31610.031,
"net_electricity_point": 486
},
"vendor": "SHENZHEN KAIFA TECHNOLOGY \uff08CHENGDU\uff09 CO., LTD."
}
}

View File

@ -0,0 +1,56 @@
{
"03e65b16e4b247a29ae0d75a78cb492e": {
"binary_sensors": {
"plugwise_notification": true
},
"dev_class": "gateway",
"firmware": "4.4.2",
"hardware": "AME Smile 2.0 board",
"location": "03e65b16e4b247a29ae0d75a78cb492e",
"mac_address": "012345670001",
"model": "Gateway",
"model_id": "smile",
"name": "Smile P1",
"notifications": {
"97a04c0c263049b29350a660b4cdd01e": {
"warning": "The Smile P1 is not connected to a smart meter."
}
},
"vendor": "Plugwise"
},
"b82b6b3322484f2ea4e25e0bd5f3d61f": {
"available": true,
"dev_class": "smartmeter",
"location": "03e65b16e4b247a29ae0d75a78cb492e",
"model": "XMX5LGF0010453051839",
"name": "P1",
"sensors": {
"electricity_consumed_off_peak_cumulative": 70537.898,
"electricity_consumed_off_peak_interval": 314,
"electricity_consumed_off_peak_point": 5553,
"electricity_consumed_peak_cumulative": 161328.641,
"electricity_consumed_peak_interval": 0,
"electricity_consumed_peak_point": 0,
"electricity_phase_one_consumed": 1763,
"electricity_phase_one_produced": 0,
"electricity_phase_three_consumed": 2080,
"electricity_phase_three_produced": 0,
"electricity_phase_two_consumed": 1703,
"electricity_phase_two_produced": 0,
"electricity_produced_off_peak_cumulative": 0.0,
"electricity_produced_off_peak_interval": 0,
"electricity_produced_off_peak_point": 0,
"electricity_produced_peak_cumulative": 0.0,
"electricity_produced_peak_interval": 0,
"electricity_produced_peak_point": 0,
"gas_consumed_cumulative": 16811.37,
"gas_consumed_interval": 0.06,
"net_electricity_cumulative": 231866.539,
"net_electricity_point": 5553,
"voltage_phase_one": 233.2,
"voltage_phase_three": 234.7,
"voltage_phase_two": 234.4
},
"vendor": "XEMEX NV"
}
}

View File

@ -0,0 +1,34 @@
{
"938696c4bcdb4b8a9a595cb38ed43913": {
"dev_class": "smartmeter",
"location": "938696c4bcdb4b8a9a595cb38ed43913",
"model": "Ene5\\T210-DESMR5.0",
"name": "P1",
"sensors": {
"electricity_consumed_off_peak_cumulative": 1642.74,
"electricity_consumed_off_peak_interval": 0,
"electricity_consumed_peak_cumulative": 1155.195,
"electricity_consumed_peak_interval": 250,
"electricity_consumed_point": 458,
"electricity_produced_off_peak_cumulative": 482.598,
"electricity_produced_off_peak_interval": 0,
"electricity_produced_peak_cumulative": 1296.136,
"electricity_produced_peak_interval": 0,
"electricity_produced_point": 0,
"gas_consumed_cumulative": 584.433,
"gas_consumed_interval": 0.016,
"net_electricity_cumulative": 1019.201,
"net_electricity_point": 458
},
"vendor": "Ene5\\T210-DESMR5.0"
},
"aaaa0000aaaa0000aaaa0000aaaa00aa": {
"dev_class": "gateway",
"firmware": "2.5.9",
"location": "938696c4bcdb4b8a9a595cb38ed43913",
"mac_address": "012345670001",
"model": "Gateway",
"name": "Smile P1",
"vendor": "Plugwise"
}
}

View File

@ -0,0 +1,136 @@
{
"0000aaaa0000aaaa0000aaaa0000aa00": {
"dev_class": "gateway",
"firmware": "3.1.11",
"location": "0000aaaa0000aaaa0000aaaa0000aa00",
"mac_address": "01:23:45:67:89:AB",
"model": "Gateway",
"name": "Stretch",
"vendor": "Plugwise",
"zigbee_mac_address": "ABCD012345670101"
},
"059e4d03c7a34d278add5c7a4a781d19": {
"dev_class": "washingmachine",
"firmware": "2011-06-27T10:52:18+02:00",
"hardware": "0000-0440-0107",
"location": "0000aaaa0000aaaa0000aaaa0000aa00",
"model": "Circle type F",
"name": "Wasmachine (52AC1)",
"sensors": {
"electricity_consumed": 0.0,
"electricity_consumed_interval": 0.0,
"electricity_produced": 0.0
},
"switches": {
"lock": true,
"relay": true
},
"vendor": "Plugwise",
"zigbee_mac_address": "ABCD012345670A01"
},
"5871317346d045bc9f6b987ef25ee638": {
"dev_class": "water_heater_vessel",
"firmware": "2011-06-27T10:52:18+02:00",
"hardware": "6539-0701-4028",
"location": "0000aaaa0000aaaa0000aaaa0000aa00",
"model": "Circle type F",
"name": "Boiler (1EB31)",
"sensors": {
"electricity_consumed": 1.19,
"electricity_consumed_interval": 0.0,
"electricity_produced": 0.0
},
"switches": {
"lock": false,
"relay": true
},
"vendor": "Plugwise",
"zigbee_mac_address": "ABCD012345670A07"
},
"aac7b735042c4832ac9ff33aae4f453b": {
"dev_class": "dishwasher",
"firmware": "2011-06-27T10:52:18+02:00",
"hardware": "6539-0701-4022",
"location": "0000aaaa0000aaaa0000aaaa0000aa00",
"model": "Circle type F",
"name": "Vaatwasser (2a1ab)",
"sensors": {
"electricity_consumed": 0.0,
"electricity_consumed_interval": 0.71,
"electricity_produced": 0.0
},
"switches": {
"lock": false,
"relay": true
},
"vendor": "Plugwise",
"zigbee_mac_address": "ABCD012345670A02"
},
"cfe95cf3de1948c0b8955125bf754614": {
"dev_class": "dryer",
"firmware": "2011-06-27T10:52:18+02:00",
"hardware": "0000-0440-0107",
"location": "0000aaaa0000aaaa0000aaaa0000aa00",
"model": "Circle type F",
"name": "Droger (52559)",
"sensors": {
"electricity_consumed": 0.0,
"electricity_consumed_interval": 0.0,
"electricity_produced": 0.0
},
"switches": {
"lock": false,
"relay": true
},
"vendor": "Plugwise",
"zigbee_mac_address": "ABCD012345670A04"
},
"d03738edfcc947f7b8f4573571d90d2d": {
"dev_class": "switching",
"members": [
"059e4d03c7a34d278add5c7a4a781d19",
"cfe95cf3de1948c0b8955125bf754614"
],
"model": "Switchgroup",
"name": "Schakel",
"switches": {
"relay": true
},
"vendor": "Plugwise"
},
"d950b314e9d8499f968e6db8d82ef78c": {
"dev_class": "report",
"members": [
"059e4d03c7a34d278add5c7a4a781d19",
"5871317346d045bc9f6b987ef25ee638",
"aac7b735042c4832ac9ff33aae4f453b",
"cfe95cf3de1948c0b8955125bf754614",
"e1c884e7dede431dadee09506ec4f859"
],
"model": "Switchgroup",
"name": "Stroomvreters",
"switches": {
"relay": true
},
"vendor": "Plugwise"
},
"e1c884e7dede431dadee09506ec4f859": {
"dev_class": "refrigerator",
"firmware": "2011-06-27T10:47:37+02:00",
"hardware": "6539-0700-7330",
"location": "0000aaaa0000aaaa0000aaaa0000aa00",
"model": "Circle+ type F",
"name": "Koelkast (92C4A)",
"sensors": {
"electricity_consumed": 50.5,
"electricity_consumed_interval": 0.08,
"electricity_produced": 0.0
},
"switches": {
"lock": false,
"relay": true
},
"vendor": "Plugwise",
"zigbee_mac_address": "0123456789AB"
}
}

View File

@ -1,7 +1,6 @@
# serializer version: 1 # serializer version: 1
# name: test_diagnostics # name: test_diagnostics
dict({ dict({
'devices': dict({
'02cf28bfec924855854c544690a609ef': dict({ '02cf28bfec924855854c544690a609ef': dict({
'available': True, 'available': True,
'dev_class': 'vcr_plug', 'dev_class': 'vcr_plug',
@ -618,6 +617,11 @@
'model': 'Gateway', 'model': 'Gateway',
'model_id': 'smile_open_therm', 'model_id': 'smile_open_therm',
'name': 'Adam', 'name': 'Adam',
'notifications': dict({
'af82e4ccf9c548528166d38e560662a4': dict({
'warning': "Node Plug (with MAC address 000D6F000D13CB01, in room 'n.a.') has been unreachable since 23:03 2020-01-18. Please check the connection and restart the device.",
}),
}),
'select_regulation_mode': 'heating', 'select_regulation_mode': 'heating',
'sensors': dict({ 'sensors': dict({
'outdoor_temperature': 7.81, 'outdoor_temperature': 7.81,
@ -625,19 +629,5 @@
'vendor': 'Plugwise', 'vendor': 'Plugwise',
'zigbee_mac_address': 'ABCD012345670101', 'zigbee_mac_address': 'ABCD012345670101',
}), }),
}),
'gateway': dict({
'cooling_present': False,
'gateway_id': 'fe799307f1624099878210aa0b9f1475',
'heater_id': '90986d591dcd426cae3ec3e8111ff730',
'item_count': 369,
'notifications': dict({
'af82e4ccf9c548528166d38e560662a4': dict({
'warning': "Node Plug (with MAC address 000D6F000D13CB01, in room 'n.a.') has been unreachable since 23:03 2020-01-18. Please check the connection and restart the device.",
}),
}),
'reboot': True,
'smile_name': 'Adam',
}),
}) })
# --- # ---

View File

@ -12,6 +12,7 @@ from tests.common import MockConfigEntry
@pytest.mark.parametrize("chosen_env", ["anna_heatpump_heating"], indirect=True) @pytest.mark.parametrize("chosen_env", ["anna_heatpump_heating"], indirect=True)
@pytest.mark.parametrize("cooling_present", [True], indirect=True)
@pytest.mark.parametrize( @pytest.mark.parametrize(
("entity_id", "expected_state"), ("entity_id", "expected_state"),
[ [
@ -35,6 +36,7 @@ async def test_anna_climate_binary_sensor_entities(
@pytest.mark.parametrize("chosen_env", ["anna_heatpump_heating"], indirect=True) @pytest.mark.parametrize("chosen_env", ["anna_heatpump_heating"], indirect=True)
@pytest.mark.parametrize("cooling_present", [True], indirect=True)
async def test_anna_climate_binary_sensor_change( async def test_anna_climate_binary_sensor_change(
hass: HomeAssistant, mock_smile_anna: MagicMock, init_integration: MockConfigEntry hass: HomeAssistant, mock_smile_anna: MagicMock, init_integration: MockConfigEntry
) -> None: ) -> None:

View File

@ -80,6 +80,7 @@ async def test_adam_climate_entity_attributes(
@pytest.mark.parametrize("chosen_env", ["m_adam_heating"], indirect=True) @pytest.mark.parametrize("chosen_env", ["m_adam_heating"], indirect=True)
@pytest.mark.parametrize("cooling_present", [False], indirect=True)
async def test_adam_2_climate_entity_attributes( async def test_adam_2_climate_entity_attributes(
hass: HomeAssistant, hass: HomeAssistant,
mock_smile_adam_heat_cool: MagicMock, mock_smile_adam_heat_cool: MagicMock,
@ -108,6 +109,7 @@ async def test_adam_2_climate_entity_attributes(
@pytest.mark.parametrize("chosen_env", ["m_adam_cooling"], indirect=True) @pytest.mark.parametrize("chosen_env", ["m_adam_cooling"], indirect=True)
@pytest.mark.parametrize("cooling_present", [True], indirect=True)
async def test_adam_3_climate_entity_attributes( async def test_adam_3_climate_entity_attributes(
hass: HomeAssistant, hass: HomeAssistant,
mock_smile_adam_heat_cool: MagicMock, mock_smile_adam_heat_cool: MagicMock,
@ -125,18 +127,10 @@ async def test_adam_3_climate_entity_attributes(
HVACMode.COOL, HVACMode.COOL,
] ]
data = mock_smile_adam_heat_cool.async_update.return_value data = mock_smile_adam_heat_cool.async_update.return_value
data.devices["da224107914542988a88561b4452b0f6"]["select_regulation_mode"] = ( data["da224107914542988a88561b4452b0f6"]["select_regulation_mode"] = "heating"
"heating" data["f2bf9048bef64cc5b6d5110154e33c81"]["control_state"] = HVACAction.HEATING
) data["056ee145a816487eaa69243c3280f8bf"]["binary_sensors"]["cooling_state"] = False
data.devices["f2bf9048bef64cc5b6d5110154e33c81"]["control_state"] = ( data["056ee145a816487eaa69243c3280f8bf"]["binary_sensors"]["heating_state"] = True
HVACAction.HEATING
)
data.devices["056ee145a816487eaa69243c3280f8bf"]["binary_sensors"][
"cooling_state"
] = False
data.devices["056ee145a816487eaa69243c3280f8bf"]["binary_sensors"][
"heating_state"
] = True
with patch(HA_PLUGWISE_SMILE_ASYNC_UPDATE, return_value=data): with patch(HA_PLUGWISE_SMILE_ASYNC_UPDATE, return_value=data):
freezer.tick(timedelta(minutes=1)) freezer.tick(timedelta(minutes=1))
async_fire_time_changed(hass) async_fire_time_changed(hass)
@ -153,18 +147,10 @@ async def test_adam_3_climate_entity_attributes(
] ]
data = mock_smile_adam_heat_cool.async_update.return_value data = mock_smile_adam_heat_cool.async_update.return_value
data.devices["da224107914542988a88561b4452b0f6"]["select_regulation_mode"] = ( data["da224107914542988a88561b4452b0f6"]["select_regulation_mode"] = "cooling"
"cooling" data["f2bf9048bef64cc5b6d5110154e33c81"]["control_state"] = HVACAction.COOLING
) data["056ee145a816487eaa69243c3280f8bf"]["binary_sensors"]["cooling_state"] = True
data.devices["f2bf9048bef64cc5b6d5110154e33c81"]["control_state"] = ( data["056ee145a816487eaa69243c3280f8bf"]["binary_sensors"]["heating_state"] = False
HVACAction.COOLING
)
data.devices["056ee145a816487eaa69243c3280f8bf"]["binary_sensors"][
"cooling_state"
] = True
data.devices["056ee145a816487eaa69243c3280f8bf"]["binary_sensors"][
"heating_state"
] = False
with patch(HA_PLUGWISE_SMILE_ASYNC_UPDATE, return_value=data): with patch(HA_PLUGWISE_SMILE_ASYNC_UPDATE, return_value=data):
freezer.tick(timedelta(minutes=1)) freezer.tick(timedelta(minutes=1))
async_fire_time_changed(hass) async_fire_time_changed(hass)
@ -323,6 +309,7 @@ async def test_adam_climate_off_mode_change(
@pytest.mark.parametrize("chosen_env", ["anna_heatpump_heating"], indirect=True) @pytest.mark.parametrize("chosen_env", ["anna_heatpump_heating"], indirect=True)
@pytest.mark.parametrize("cooling_present", [True], indirect=True)
async def test_anna_climate_entity_attributes( async def test_anna_climate_entity_attributes(
hass: HomeAssistant, hass: HomeAssistant,
mock_smile_anna: MagicMock, mock_smile_anna: MagicMock,
@ -349,6 +336,7 @@ async def test_anna_climate_entity_attributes(
@pytest.mark.parametrize("chosen_env", ["m_anna_heatpump_cooling"], indirect=True) @pytest.mark.parametrize("chosen_env", ["m_anna_heatpump_cooling"], indirect=True)
@pytest.mark.parametrize("cooling_present", [True], indirect=True)
async def test_anna_2_climate_entity_attributes( async def test_anna_2_climate_entity_attributes(
hass: HomeAssistant, hass: HomeAssistant,
mock_smile_anna: MagicMock, mock_smile_anna: MagicMock,
@ -369,6 +357,7 @@ async def test_anna_2_climate_entity_attributes(
@pytest.mark.parametrize("chosen_env", ["m_anna_heatpump_idle"], indirect=True) @pytest.mark.parametrize("chosen_env", ["m_anna_heatpump_idle"], indirect=True)
@pytest.mark.parametrize("cooling_present", [True], indirect=True)
async def test_anna_3_climate_entity_attributes( async def test_anna_3_climate_entity_attributes(
hass: HomeAssistant, hass: HomeAssistant,
mock_smile_anna: MagicMock, mock_smile_anna: MagicMock,
@ -386,6 +375,7 @@ async def test_anna_3_climate_entity_attributes(
@pytest.mark.parametrize("chosen_env", ["anna_heatpump_heating"], indirect=True) @pytest.mark.parametrize("chosen_env", ["anna_heatpump_heating"], indirect=True)
@pytest.mark.parametrize("cooling_present", [True], indirect=True)
async def test_anna_climate_entity_climate_changes( async def test_anna_climate_entity_climate_changes(
hass: HomeAssistant, hass: HomeAssistant,
mock_smile_anna: MagicMock, mock_smile_anna: MagicMock,
@ -441,7 +431,7 @@ async def test_anna_climate_entity_climate_changes(
) )
data = mock_smile_anna.async_update.return_value data = mock_smile_anna.async_update.return_value
data.devices["3cb70739631c4d17a86b8b12e8a5161b"].pop("available_schedules") data["3cb70739631c4d17a86b8b12e8a5161b"].pop("available_schedules")
with patch(HA_PLUGWISE_SMILE_ASYNC_UPDATE, return_value=data): with patch(HA_PLUGWISE_SMILE_ASYNC_UPDATE, return_value=data):
freezer.tick(timedelta(minutes=1)) freezer.tick(timedelta(minutes=1))
async_fire_time_changed(hass) async_fire_time_changed(hass)

View File

@ -62,6 +62,7 @@ TOM = {
@pytest.mark.parametrize("chosen_env", ["anna_heatpump_heating"], indirect=True) @pytest.mark.parametrize("chosen_env", ["anna_heatpump_heating"], indirect=True)
@pytest.mark.parametrize("cooling_present", [True], indirect=True)
async def test_load_unload_config_entry( async def test_load_unload_config_entry(
hass: HomeAssistant, hass: HomeAssistant,
mock_config_entry: MockConfigEntry, mock_config_entry: MockConfigEntry,
@ -82,6 +83,7 @@ async def test_load_unload_config_entry(
@pytest.mark.parametrize("chosen_env", ["anna_heatpump_heating"], indirect=True) @pytest.mark.parametrize("chosen_env", ["anna_heatpump_heating"], indirect=True)
@pytest.mark.parametrize("cooling_present", [True], indirect=True)
@pytest.mark.parametrize( @pytest.mark.parametrize(
("side_effect", "entry_state"), ("side_effect", "entry_state"),
[ [
@ -138,6 +140,7 @@ async def test_device_in_dr(
@pytest.mark.parametrize("chosen_env", ["anna_heatpump_heating"], indirect=True) @pytest.mark.parametrize("chosen_env", ["anna_heatpump_heating"], indirect=True)
@pytest.mark.parametrize("cooling_present", [True], indirect=True)
@pytest.mark.parametrize( @pytest.mark.parametrize(
("entitydata", "old_unique_id", "new_unique_id"), ("entitydata", "old_unique_id", "new_unique_id"),
[ [
@ -232,6 +235,7 @@ async def test_migrate_unique_id_relay(
@pytest.mark.parametrize("chosen_env", ["m_adam_heating"], indirect=True) @pytest.mark.parametrize("chosen_env", ["m_adam_heating"], indirect=True)
@pytest.mark.parametrize("cooling_present", [True], indirect=True)
async def test_update_device( async def test_update_device(
hass: HomeAssistant, hass: HomeAssistant,
mock_config_entry: MockConfigEntry, mock_config_entry: MockConfigEntry,
@ -265,8 +269,8 @@ async def test_update_device(
) )
# Add a 2nd Tom/Floor # Add a 2nd Tom/Floor
data.devices.update(TOM) data.update(TOM)
data.devices["f871b8c4d63549319221e294e4f88074"]["thermostats"].update( data["f871b8c4d63549319221e294e4f88074"]["thermostats"].update(
{ {
"secondary": [ "secondary": [
"01234567890abcdefghijklmnopqrstu", "01234567890abcdefghijklmnopqrstu",
@ -301,10 +305,10 @@ async def test_update_device(
assert "01234567890abcdefghijklmnopqrstu" in item_list assert "01234567890abcdefghijklmnopqrstu" in item_list
# Remove the existing Tom/Floor # Remove the existing Tom/Floor
data.devices["f871b8c4d63549319221e294e4f88074"]["thermostats"].update( data["f871b8c4d63549319221e294e4f88074"]["thermostats"].update(
{"secondary": ["01234567890abcdefghijklmnopqrstu"]} {"secondary": ["01234567890abcdefghijklmnopqrstu"]}
) )
data.devices.pop("1772a4ea304041adb83f357b751341ff") data.pop("1772a4ea304041adb83f357b751341ff")
with patch(HA_PLUGWISE_SMILE_ASYNC_UPDATE, return_value=data): with patch(HA_PLUGWISE_SMILE_ASYNC_UPDATE, return_value=data):
freezer.tick(timedelta(minutes=1)) freezer.tick(timedelta(minutes=1))
async_fire_time_changed(hass) async_fire_time_changed(hass)

View File

@ -17,6 +17,7 @@ from tests.common import MockConfigEntry
@pytest.mark.parametrize("chosen_env", ["anna_heatpump_heating"], indirect=True) @pytest.mark.parametrize("chosen_env", ["anna_heatpump_heating"], indirect=True)
@pytest.mark.parametrize("cooling_present", [True], indirect=True)
async def test_anna_number_entities( async def test_anna_number_entities(
hass: HomeAssistant, mock_smile_anna: MagicMock, init_integration: MockConfigEntry hass: HomeAssistant, mock_smile_anna: MagicMock, init_integration: MockConfigEntry
) -> None: ) -> None:
@ -27,6 +28,7 @@ async def test_anna_number_entities(
@pytest.mark.parametrize("chosen_env", ["anna_heatpump_heating"], indirect=True) @pytest.mark.parametrize("chosen_env", ["anna_heatpump_heating"], indirect=True)
@pytest.mark.parametrize("cooling_present", [True], indirect=True)
async def test_anna_max_boiler_temp_change( async def test_anna_max_boiler_temp_change(
hass: HomeAssistant, mock_smile_anna: MagicMock, init_integration: MockConfigEntry hass: HomeAssistant, mock_smile_anna: MagicMock, init_integration: MockConfigEntry
) -> None: ) -> None:
@ -48,6 +50,7 @@ async def test_anna_max_boiler_temp_change(
@pytest.mark.parametrize("chosen_env", ["m_adam_heating"], indirect=True) @pytest.mark.parametrize("chosen_env", ["m_adam_heating"], indirect=True)
@pytest.mark.parametrize("cooling_present", [False], indirect=True)
async def test_adam_dhw_setpoint_change( async def test_adam_dhw_setpoint_change(
hass: HomeAssistant, hass: HomeAssistant,
mock_smile_adam_heat_cool: MagicMock, mock_smile_adam_heat_cool: MagicMock,

View File

@ -51,6 +51,7 @@ async def test_adam_change_select_entity(
@pytest.mark.parametrize("chosen_env", ["m_adam_cooling"], indirect=True) @pytest.mark.parametrize("chosen_env", ["m_adam_cooling"], indirect=True)
@pytest.mark.parametrize("cooling_present", [True], indirect=True)
async def test_adam_select_regulation_mode( async def test_adam_select_regulation_mode(
hass: HomeAssistant, hass: HomeAssistant,
mock_smile_adam_heat_cool: MagicMock, mock_smile_adam_heat_cool: MagicMock,
@ -95,6 +96,7 @@ async def test_legacy_anna_select_entities(
@pytest.mark.parametrize("chosen_env", ["anna_heatpump_heating"], indirect=True) @pytest.mark.parametrize("chosen_env", ["anna_heatpump_heating"], indirect=True)
@pytest.mark.parametrize("cooling_present", [True], indirect=True)
async def test_adam_select_unavailable_regulation_mode( async def test_adam_select_unavailable_regulation_mode(
hass: HomeAssistant, mock_smile_anna: MagicMock, init_integration: MockConfigEntry hass: HomeAssistant, mock_smile_anna: MagicMock, init_integration: MockConfigEntry
) -> None: ) -> None:

View File

@ -95,6 +95,7 @@ async def test_unique_id_migration_humidity(
@pytest.mark.parametrize("chosen_env", ["anna_heatpump_heating"], indirect=True) @pytest.mark.parametrize("chosen_env", ["anna_heatpump_heating"], indirect=True)
@pytest.mark.parametrize("cooling_present", [True], indirect=True)
async def test_anna_as_smt_climate_sensor_entities( async def test_anna_as_smt_climate_sensor_entities(
hass: HomeAssistant, mock_smile_anna: MagicMock, init_integration: MockConfigEntry hass: HomeAssistant, mock_smile_anna: MagicMock, init_integration: MockConfigEntry
) -> None: ) -> None: