From 403a421eb85cd1c938ce06262ee887a9c1ee8bec Mon Sep 17 00:00:00 2001 From: Christian Lackas Date: Thu, 7 May 2026 20:41:52 +0200 Subject: [PATCH 1/6] feat!: remove non-functional Zigbee room enrichment The RoomControl-driven Zigbee enrichment introduced in #743 does not work in practice: the rooms.{id}.actors mapping that drives buildActorRoomMap() is not returned by the API for end users, so the enrichment is silently no-op and the lib has no reliable path to associate physical Zigbee devices with rooms. Removes the enrichment plumbing and reverts RoomSensor to direct sensor reads (device.sensors.temperature, device.sensors.humidity). RoomControl itself stays for direct per-room access. BREAKING CHANGE: RoomSensor no longer exposes hybrid getters that required RoomControl context (getRoomName, getRoomType, getCondensationRisk, getOperatingState*, getNormal/Reduced/Comfort HeatingTemperature, getManualTillNextSchedule*, getSchedule). Use the corresponding RoomControl methods with a room_id directly. --- PyViCare/PyViCare.py | 31 -------- PyViCare/PyViCareDeviceConfig.py | 12 +--- PyViCare/PyViCareRoomControl.py | 18 +---- PyViCare/PyViCareRoomSensor.py | 117 +------------------------------ tests/test_RoomControl.py | 78 --------------------- 5 files changed, 3 insertions(+), 253 deletions(-) diff --git a/PyViCare/PyViCare.py b/PyViCare/PyViCare.py index b408eea8..64115a7d 100644 --- a/PyViCare/PyViCare.py +++ b/PyViCare/PyViCare.py @@ -6,7 +6,6 @@ from PyViCare.PyViCareCachedService import ViCareCachedService from PyViCare.PyViCareDeviceConfig import PyViCareDeviceConfig from PyViCare.PyViCareOAuthManager import ViCareOAuthManager -from PyViCare.PyViCareRoomControl import RoomControl from PyViCare.PyViCareService import ViCareDeviceAccessor, ViCareService from PyViCare.PyViCareUtils import PyViCareInvalidDataError @@ -50,7 +49,6 @@ def __loadInstallations(self): self.all_devices = list(self.__extract_all_devices()) self.devices = [d for d in self.all_devices if d.device_type in self.SUPPORTED_DEVICE_TYPES] - self.__enrichZigbeeDevices() SUPPORTED_DEVICE_TYPES = [ "heating", "zigbee", "vitoconnect", "electricityStorage", @@ -69,35 +67,6 @@ def __extract_all_devices(self): yield PyViCareDeviceConfig(service, device.id, device.modelId, device.status, device.deviceType, device.roles) - def __enrichZigbeeDevices(self): - """Enrich Zigbee devices with sensor data from RoomControl. - - Viessmann moved temperature/humidity data from physical Zigbee - sensors to the RoomControl virtual device. This reverses that - mapping by cross-referencing RoomControl actors with Zigbee - device IDs. - """ - devices_by_id = {device_config.device_id: device_config for device_config in self.devices} - - for device_config in self.devices: - if device_config.device_type != "roomControl": - continue - - room_control = RoomControl(device_config.service) - try: - actor_map = room_control.buildActorRoomMap() - except Exception: # pylint: disable=broad-exception-caught - logger.debug("Could not build actor map for %s", device_config.getModel(), exc_info=True) - continue - - for device_id, room_id in actor_map.items(): - zigbee_config = devices_by_id.get(device_id) - if zigbee_config is None: - continue - zigbee_config.setRoomControlEnrichment(room_control, room_id) - logger.info("Enriched %s with room %s data from %s", - zigbee_config.device_id, room_id, device_config.getModel()) - class DictWrap(object): def __init__(self, d): diff --git a/PyViCare/PyViCareDeviceConfig.py b/PyViCare/PyViCareDeviceConfig.py index b4a64a24..364193fa 100644 --- a/PyViCare/PyViCareDeviceConfig.py +++ b/PyViCare/PyViCareDeviceConfig.py @@ -31,8 +31,6 @@ def __init__(self, service, device_id, device_model, status, device_type=None, r self.status = status self.device_type = device_type self.roles = roles if roles is not None else [] - self._room_control = None - self._room_id = None def asGeneric(self): return HeatingDevice(self.service) @@ -65,19 +63,11 @@ def asFloorHeatingChannel(self): return FloorHeatingChannel(self.service) def asRoomSensor(self): - sensor = RoomSensor(self.service) - if self._room_control is not None: - sensor.setRoomControl(self._room_control, self._room_id) - return sensor + return RoomSensor(self.service) def asRoomControl(self): return RoomControl(self.service) - def setRoomControlEnrichment(self, room_control, room_id): - """Store RoomControl enrichment data to apply when creating a RoomSensor.""" - self._room_control = room_control - self._room_id = room_id - def asRepeater(self): return Repeater(self.service) diff --git a/PyViCare/PyViCareRoomControl.py b/PyViCare/PyViCareRoomControl.py index 018e358c..2a5127ed 100644 --- a/PyViCare/PyViCareRoomControl.py +++ b/PyViCare/PyViCareRoomControl.py @@ -11,8 +11,7 @@ class RoomControl(Device): """Viessmann RoomControl virtual device. - Aggregates room sensor data and heating programs. - Used to enrich physical Zigbee devices with room data. + Aggregates room sensor data and heating programs per room. """ @handleNotSupported @@ -119,18 +118,3 @@ def activateRoomManualTillNextSchedule(self, room_id: str, temperature: float) - @handleAPICommandErrors def deactivateRoomManualTillNextSchedule(self, room_id: str) -> None: self.service.setProperty(f"rooms.{room_id}.quickmodes.manualTillNextSchedule", "deactivate", {}) - - # --- Mapping --- - - def buildActorRoomMap(self) -> dict[str, str]: - """Build a mapping of actor device ID -> room ID.""" - actor_map: dict[str, str] = {} - try: - rooms = self.getAvailableRooms() - except PyViCareNotSupportedFeatureError: - return actor_map - - for room_id in rooms: - for actor_id in self.getRoomActorIds(room_id): - actor_map[actor_id] = room_id - return actor_map diff --git a/PyViCare/PyViCareRoomSensor.py b/PyViCare/PyViCareRoomSensor.py index aaf0e8cd..4713bc91 100644 --- a/PyViCare/PyViCareRoomSensor.py +++ b/PyViCare/PyViCareRoomSensor.py @@ -1,132 +1,17 @@ -from __future__ import annotations - -from typing import Any, TYPE_CHECKING - from PyViCare.PyViCareDevice import ZigbeeBatteryDevice -from PyViCare.PyViCareUtils import handleNotSupported, handleAPICommandErrors - -if TYPE_CHECKING: - from PyViCare.PyViCareRoomControl import RoomControl +from PyViCare.PyViCareUtils import handleNotSupported class RoomSensor(ZigbeeBatteryDevice): - _room_control: RoomControl | None = None - _room_id: str | None = None - - def setRoomControl(self, room_control: RoomControl, room_id: str) -> None: - """Enrich this sensor with data from a RoomControl device.""" - self._room_control = room_control - self._room_id = room_id - - def _getRoomContext(self) -> tuple[RoomControl, str]: - """Return (room_control, room_id), raising if not enriched.""" - if self._room_control is None or self._room_id is None: - raise KeyError("roomControl") - return self._room_control, self._room_id - @handleNotSupported def getSerial(self) -> str: return str(self.getProperty("device.sensors.temperature")["deviceId"]) - # --- Sensors (enriched from RoomControl) --- - @handleNotSupported def getTemperature(self) -> float: - if self._room_control is not None and self._room_id is not None: - return self._room_control.getRoomTemperature(self._room_id) return float(self.getProperty("device.sensors.temperature")["properties"]["value"]["value"]) @handleNotSupported def getHumidity(self) -> float: - if self._room_control is not None and self._room_id is not None: - return self._room_control.getRoomHumidity(self._room_id) return float(self.getProperty("device.sensors.humidity")["properties"]["value"]["value"]) - - @handleNotSupported - def getCO2(self) -> int: - rc, rid = self._getRoomContext() - return rc.getRoomCO2(rid) - - @handleNotSupported - def getRoomName(self) -> str | None: - rc, rid = self._getRoomContext() - return rc.getRoomName(rid) - - @handleNotSupported - def getRoomType(self) -> str | None: - rc, rid = self._getRoomContext() - return rc.getRoomType(rid) - - @handleNotSupported - def getCondensationRisk(self) -> bool: - rc, rid = self._getRoomContext() - return rc.getRoomCondensationRisk(rid) - - # --- Operating state --- - - @handleNotSupported - def getOperatingStateLevel(self) -> str: - rc, rid = self._getRoomContext() - return rc.getRoomOperatingStateLevel(rid) - - @handleNotSupported - def getOperatingStateDemand(self) -> str: - rc, rid = self._getRoomContext() - return rc.getRoomOperatingStateDemand(rid) - - # --- Heating programs --- - - @handleNotSupported - def getNormalHeatingTemperature(self) -> float: - rc, rid = self._getRoomContext() - return rc.getRoomNormalHeatingTemperature(rid) - - @handleAPICommandErrors - def setNormalHeatingTemperature(self, temperature: float) -> None: - rc, rid = self._getRoomContext() - rc.setRoomNormalHeatingTemperature(rid, temperature) - - @handleNotSupported - def getReducedHeatingTemperature(self) -> float: - rc, rid = self._getRoomContext() - return rc.getRoomReducedHeatingTemperature(rid) - - @handleAPICommandErrors - def setReducedHeatingTemperature(self, temperature: float) -> None: - rc, rid = self._getRoomContext() - rc.setRoomReducedHeatingTemperature(rid, temperature) - - @handleNotSupported - def getComfortHeatingTemperature(self) -> float: - rc, rid = self._getRoomContext() - return rc.getRoomComfortHeatingTemperature(rid) - - @handleAPICommandErrors - def setComfortHeatingTemperature(self, temperature: float) -> None: - rc, rid = self._getRoomContext() - rc.setRoomComfortHeatingTemperature(rid, temperature) - - # --- Quick modes --- - - @handleNotSupported - def getManualTillNextScheduleActive(self) -> bool: - rc, rid = self._getRoomContext() - return rc.getRoomManualTillNextScheduleActive(rid) - - @handleAPICommandErrors - def activateManualTillNextSchedule(self, temperature: float) -> None: - rc, rid = self._getRoomContext() - rc.activateRoomManualTillNextSchedule(rid, temperature) - - @handleAPICommandErrors - def deactivateManualTillNextSchedule(self) -> None: - rc, rid = self._getRoomContext() - rc.deactivateRoomManualTillNextSchedule(rid) - - # --- Schedule --- - - @handleNotSupported - def getSchedule(self) -> dict[str, Any]: - rc, rid = self._getRoomContext() - return rc.getRoomSchedule(rid) diff --git a/tests/test_RoomControl.py b/tests/test_RoomControl.py index 8b431e87..9c5b9611 100644 --- a/tests/test_RoomControl.py +++ b/tests/test_RoomControl.py @@ -1,12 +1,6 @@ import unittest from PyViCare.PyViCareRoomControl import RoomControl -from PyViCare.PyViCareRoomSensor import RoomSensor -from PyViCare.PyViCareUtils import ( - PyViCareCommandError, - PyViCareNotSupportedFeatureError, - isSupported, -) from tests.ViCareServiceMock import ViCareServiceMock @@ -67,75 +61,3 @@ def test_getRoomSchedule(self): def test_getRoomManualTillNextScheduleActive(self): result = self.device.getRoomManualTillNextScheduleActive("0") self.assertIsInstance(result, bool) - - def test_buildActorRoomMap(self): - actor_map = self.device.buildActorRoomMap() - self.assertIsInstance(actor_map, dict) - self.assertTrue(len(actor_map) > 0) - for room_id in actor_map.values(): - self.assertIsInstance(room_id, str) - - -class RoomSensorEnrichmentTest(unittest.TestCase): - def setUp(self): - self.room_control_service = ViCareServiceMock('response/RoomControl.json') - self.room_control = RoomControl(self.room_control_service) - self.sensor_service = ViCareServiceMock('response/RoomControl.json', - rawInput={"data": []}) - self.sensor = RoomSensor(self.sensor_service) - self.sensor.setRoomControl(self.room_control, "0") - - def test_getTemperature(self): - self.assertAlmostEqual(self.sensor.getTemperature(), 20.7) - - def test_getHumidity(self): - self.assertEqual(self.sensor.getHumidity(), 53) - - def test_getRoomName(self): - self.assertEqual(self.sensor.getRoomName(), "Bedroom") - - def test_getRoomType(self): - self.assertEqual(self.sensor.getRoomType(), "bedroom") - - def test_getCondensationRisk(self): - result = self.sensor.getCondensationRisk() - self.assertIsNotNone(result) - - def test_getOperatingStateLevel(self): - result = self.sensor.getOperatingStateLevel() - self.assertIsNotNone(result) - - def test_getNormalHeatingTemperature(self): - temp = self.sensor.getNormalHeatingTemperature() - self.assertIsInstance(temp, (int, float)) - - def test_getReducedHeatingTemperature(self): - temp = self.sensor.getReducedHeatingTemperature() - self.assertIsInstance(temp, (int, float)) - - def test_getComfortHeatingTemperature(self): - temp = self.sensor.getComfortHeatingTemperature() - self.assertIsInstance(temp, (int, float)) - - def test_getSchedule(self): - schedule = self.sensor.getSchedule() - self.assertIn("active", schedule) - self.assertIn("mon", schedule) - - def test_getManualTillNextScheduleActive(self): - result = self.sensor.getManualTillNextScheduleActive() - self.assertIsInstance(result, bool) - - def test_without_enrichment_reports_not_supported(self): - sensor = RoomSensor(self.sensor_service) - self.assertFalse(isSupported(sensor.getRoomName)) - self.assertFalse(isSupported(sensor.getNormalHeatingTemperature)) - - with self.assertRaises(PyViCareNotSupportedFeatureError): - sensor.getRoomName() - - with self.assertRaises(PyViCareNotSupportedFeatureError): - sensor.getNormalHeatingTemperature() - - with self.assertRaises(PyViCareCommandError): - sensor.setNormalHeatingTemperature(20) From 60880e1a0f2054194c902669c1f8bbd0b3802b95 Mon Sep 17 00:00:00 2001 From: Christian Lackas Date: Thu, 7 May 2026 21:07:39 +0200 Subject: [PATCH 2/6] chore: drop Internal-scope RoomControl test fixture The previous fixture was an Internal-scope dump with features that the public IoT scope does not return (rooms parent, room metadata, schedules, operating programs, quickmodes). Removing it as a clean cut before bringing in a real IoT-scope fixture in the next commit. --- tests/response/RoomControl.json | 5445 ------------------------------- 1 file changed, 5445 deletions(-) delete mode 100644 tests/response/RoomControl.json diff --git a/tests/response/RoomControl.json b/tests/response/RoomControl.json deleted file mode 100644 index 1efd3617..00000000 --- a/tests/response/RoomControl.json +++ /dev/null @@ -1,5445 +0,0 @@ -{ - "data": [ - { - "apiVersion": 1, - "commands": { - "add": { - "isExecutable": true, - "name": "add", - "params": { - "name": { - "constraints": { - "maxLength": 39, - "minLength": 1, - "regEx": "^[\\p{L}0-9]+( [\\p{L}0-9]+)*$" - }, - "required": true, - "type": "string" - }, - "type": { - "constraints": { - "enum": [ - "bathroom", - "bedroom", - "hallway", - "livingroom", - "kitchen", - "office", - "nursery", - "toilet", - "other" - ] - }, - "required": true, - "type": "string" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms/commands/add" - } - }, - "deviceId": "RoomControl-1", - "feature": "rooms", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "enabled": { - "type": "array", - "value": [ - "0", - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9" - ] - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms" - }, - { - "apiVersion": 1, - "commands": { - "addActor": { - "constraints": { - "enum": [ - "cs", - "fht", - "trv", - "airQualitySensor", - "remoteControllerSensor" - ] - }, - "isExecutable": true, - "name": "addActor", - "params": { - "actorDeviceId": { - "constraints": {}, - "required": true, - "type": "string" - }, - "heatingCircuit": { - "constraints": { - "max": 3, - "min": 0, - "stepping": 1 - }, - "required": false, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.0/commands/addActor" - }, - "moveActor": { - "isExecutable": true, - "name": "moveActor", - "params": { - "actorDeviceId": { - "constraints": {}, - "required": true, - "type": "string" - }, - "heatingCircuit": { - "constraints": { - "max": 3, - "min": 0, - "stepping": 1 - }, - "required": false, - "type": "number" - }, - "newRoomId": { - "constraints": { - "max": 23, - "min": 0, - "stepping": 1 - }, - "required": true, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.0/commands/moveActor" - }, - "remove": { - "isExecutable": true, - "name": "remove", - "params": {}, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.0/commands/remove" - }, - "removeActor": { - "isExecutable": true, - "name": "removeActor", - "params": { - "actorDeviceId": { - "constraints": {}, - "required": true, - "type": "string" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.0/commands/removeActor" - }, - "setName": { - "isExecutable": true, - "name": "setName", - "params": { - "name": { - "constraints": { - "maxLength": 39, - "minLength": 1, - "regEx": "^[\\p{L}0-9]+( [\\p{L}0-9]+)*$" - }, - "required": true, - "type": "string" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.0/commands/setName" - }, - "setType": { - "isExecutable": true, - "name": "setType", - "params": { - "type": { - "constraints": { - "enum": [ - "bathroom", - "bedroom", - "hallway", - "livingroom", - "kitchen", - "office", - "nursery", - "toilet", - "other" - ] - }, - "required": true, - "type": "string" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.0/commands/setType" - } - }, - "deviceId": "RoomControl-1", - "feature": "rooms.0", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "actors": { - "type": "array", - "value": [ - { - "deviceId": "zigbee-################" - }, - { - "deviceId": "zigbee-################-1" - } - ] - }, - "name": { - "type": "string", - "value": "Bedroom" - }, - "type": { - "type": "string", - "value": "bedroom" - } - }, - "timestamp": "2026-04-15T21:00:31.581Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.0" - }, - { - "apiVersion": 1, - "commands": {}, - "deviceId": "RoomControl-1", - "feature": "rooms.0.condensationRisk", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "value": { - "type": "boolean", - "value": false - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.0.condensationRisk" - }, - { - "apiVersion": 1, - "commands": { - "setTemperature": { - "isExecutable": true, - "name": "setTemperature", - "params": { - "targetTemperature": { - "constraints": { - "max": 30, - "min": 8, - "stepping": 0.5 - }, - "required": true, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.0.operating.programs.comfortHeating/commands/setTemperature" - } - }, - "deviceId": "RoomControl-1", - "feature": "rooms.0.operating.programs.comfortHeating", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "active": { - "type": "boolean", - "value": false - }, - "temperature": { - "type": "number", - "unit": "celsius", - "value": 20 - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.0.operating.programs.comfortHeating" - }, - { - "apiVersion": 1, - "commands": { - "setTemperature": { - "isExecutable": true, - "name": "setTemperature", - "params": { - "targetTemperature": { - "constraints": { - "max": 30, - "min": 8, - "stepping": 0.5 - }, - "required": true, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.0.operating.programs.normalHeating/commands/setTemperature" - } - }, - "deviceId": "RoomControl-1", - "feature": "rooms.0.operating.programs.normalHeating", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "active": { - "type": "boolean", - "value": false - }, - "temperature": { - "type": "number", - "unit": "celsius", - "value": 18 - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.0.operating.programs.normalHeating" - }, - { - "apiVersion": 1, - "commands": { - "setTemperature": { - "isExecutable": true, - "name": "setTemperature", - "params": { - "targetTemperature": { - "constraints": { - "max": 30, - "min": 8, - "stepping": 0.5 - }, - "required": true, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.0.operating.programs.reducedHeating/commands/setTemperature" - } - }, - "deviceId": "RoomControl-1", - "feature": "rooms.0.operating.programs.reducedHeating", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "active": { - "type": "boolean", - "value": false - }, - "temperature": { - "type": "number", - "unit": "celsius", - "value": 16 - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.0.operating.programs.reducedHeating" - }, - { - "apiVersion": 1, - "commands": {}, - "deviceId": "RoomControl-1", - "feature": "rooms.0.operating.state", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "demand": { - "type": "string", - "value": "energySaving" - }, - "level": { - "type": "string", - "value": "normal" - }, - "modifier": { - "type": "string", - "value": "none" - }, - "reason": { - "type": "string", - "value": "schedule" - } - }, - "timestamp": "2026-04-16T03:58:48.070Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.0.operating.state" - }, - { - "apiVersion": 1, - "commands": { - "activate": { - "isExecutable": true, - "name": "activate", - "params": { - "temperature": { - "constraints": { - "max": 30, - "min": 8, - "stepping": 0.5 - }, - "required": true, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.0.quickmodes.manualTillNextSchedule/commands/activate" - }, - "deactivate": { - "isExecutable": true, - "name": "deactivate", - "params": {}, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.0.quickmodes.manualTillNextSchedule/commands/deactivate" - }, - "setTemperature": { - "isExecutable": false, - "name": "setTemperature", - "params": { - "targetTemperature": { - "constraints": { - "max": 30, - "min": 8, - "stepping": 0.5 - }, - "required": true, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.0.quickmodes.manualTillNextSchedule/commands/setTemperature" - } - }, - "deviceId": "RoomControl-1", - "feature": "rooms.0.quickmodes.manualTillNextSchedule", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "active": { - "type": "boolean", - "value": false - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.0.quickmodes.manualTillNextSchedule" - }, - { - "apiVersion": 1, - "commands": { - "resetSchedule": { - "isExecutable": true, - "name": "resetSchedule", - "params": {}, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.0.schedule/commands/resetSchedule" - }, - "setSchedule": { - "isExecutable": true, - "name": "setSchedule", - "params": { - "newSchedule": { - "constraints": { - "defaultMode": "reduced", - "maxEntries": 4, - "modes": [ - "normal", - "comfort" - ], - "overlapAllowed": false, - "resolution": 10 - }, - "required": true, - "type": "Schedule" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.0.schedule/commands/setSchedule" - } - }, - "deviceId": "RoomControl-1", - "feature": "rooms.0.schedule", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "active": { - "type": "boolean", - "value": true - }, - "entries": { - "type": "Schedule", - "value": { - "fri": [ - { - "end": "22:00", - "mode": "normal", - "position": 0, - "start": "06:00" - } - ], - "mon": [ - { - "end": "22:00", - "mode": "normal", - "position": 0, - "start": "06:00" - } - ], - "sat": [ - { - "end": "22:00", - "mode": "normal", - "position": 0, - "start": "06:00" - } - ], - "sun": [ - { - "end": "22:00", - "mode": "normal", - "position": 0, - "start": "06:00" - } - ], - "thu": [ - { - "end": "22:00", - "mode": "normal", - "position": 0, - "start": "06:00" - } - ], - "tue": [ - { - "end": "22:00", - "mode": "normal", - "position": 0, - "start": "06:00" - } - ], - "wed": [ - { - "end": "22:00", - "mode": "normal", - "position": 0, - "start": "06:00" - } - ] - } - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.0.schedule" - }, - { - "apiVersion": 1, - "commands": {}, - "deviceId": "RoomControl-1", - "feature": "rooms.0.sensors.co2", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "status": { - "type": "string", - "value": "notConnected" - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.0.sensors.co2" - }, - { - "apiVersion": 1, - "commands": {}, - "deviceId": "RoomControl-1", - "feature": "rooms.0.sensors.humidity", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "status": { - "type": "string", - "value": "connected" - }, - "value": { - "type": "number", - "unit": "percent", - "value": 53 - } - }, - "timestamp": "2026-04-16T12:00:58.387Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.0.sensors.humidity" - }, - { - "apiVersion": 1, - "commands": {}, - "deviceId": "RoomControl-1", - "feature": "rooms.0.sensors.temperature", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "status": { - "type": "string", - "value": "connected" - }, - "value": { - "type": "number", - "unit": "celsius", - "value": 20.7 - } - }, - "timestamp": "2026-04-16T12:00:58.387Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.0.sensors.temperature" - }, - { - "apiVersion": 1, - "commands": { - "addActor": { - "constraints": { - "enum": [ - "cs", - "fht", - "trv", - "airQualitySensor", - "remoteControllerSensor" - ] - }, - "isExecutable": true, - "name": "addActor", - "params": { - "actorDeviceId": { - "constraints": {}, - "required": true, - "type": "string" - }, - "heatingCircuit": { - "constraints": { - "max": 3, - "min": 0, - "stepping": 1 - }, - "required": false, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.1/commands/addActor" - }, - "moveActor": { - "isExecutable": true, - "name": "moveActor", - "params": { - "actorDeviceId": { - "constraints": {}, - "required": true, - "type": "string" - }, - "heatingCircuit": { - "constraints": { - "max": 3, - "min": 0, - "stepping": 1 - }, - "required": false, - "type": "number" - }, - "newRoomId": { - "constraints": { - "max": 23, - "min": 0, - "stepping": 1 - }, - "required": true, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.1/commands/moveActor" - }, - "remove": { - "isExecutable": true, - "name": "remove", - "params": {}, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.1/commands/remove" - }, - "removeActor": { - "isExecutable": true, - "name": "removeActor", - "params": { - "actorDeviceId": { - "constraints": {}, - "required": true, - "type": "string" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.1/commands/removeActor" - }, - "setName": { - "isExecutable": true, - "name": "setName", - "params": { - "name": { - "constraints": { - "maxLength": 39, - "minLength": 1, - "regEx": "^[\\p{L}0-9]+( [\\p{L}0-9]+)*$" - }, - "required": true, - "type": "string" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.1/commands/setName" - }, - "setType": { - "isExecutable": true, - "name": "setType", - "params": { - "type": { - "constraints": { - "enum": [ - "bathroom", - "bedroom", - "hallway", - "livingroom", - "kitchen", - "office", - "nursery", - "toilet", - "other" - ] - }, - "required": true, - "type": "string" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.1/commands/setType" - } - }, - "deviceId": "RoomControl-1", - "feature": "rooms.1", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "actors": { - "type": "array", - "value": [ - { - "deviceId": "zigbee-################", - "heatingCircuit": 0 - }, - { - "deviceId": "zigbee-################-5" - } - ] - }, - "name": { - "type": "string", - "value": "Bathroom" - }, - "type": { - "type": "string", - "value": "bathroom" - } - }, - "timestamp": "2026-04-15T21:00:31.581Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.1" - }, - { - "apiVersion": 1, - "commands": {}, - "deviceId": "RoomControl-1", - "feature": "rooms.1.condensationRisk", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "value": { - "type": "boolean", - "value": false - } - }, - "timestamp": "2026-04-16T06:01:59.789Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.1.condensationRisk" - }, - { - "apiVersion": 1, - "commands": { - "setTemperature": { - "isExecutable": true, - "name": "setTemperature", - "params": { - "targetTemperature": { - "constraints": { - "max": 30, - "min": 8, - "stepping": 0.5 - }, - "required": true, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.1.operating.programs.comfortHeating/commands/setTemperature" - } - }, - "deviceId": "RoomControl-1", - "feature": "rooms.1.operating.programs.comfortHeating", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "active": { - "type": "boolean", - "value": false - }, - "temperature": { - "type": "number", - "unit": "celsius", - "value": 23 - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.1.operating.programs.comfortHeating" - }, - { - "apiVersion": 1, - "commands": { - "setTemperature": { - "isExecutable": true, - "name": "setTemperature", - "params": { - "targetTemperature": { - "constraints": { - "max": 30, - "min": 8, - "stepping": 0.5 - }, - "required": true, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.1.operating.programs.normalHeating/commands/setTemperature" - } - }, - "deviceId": "RoomControl-1", - "feature": "rooms.1.operating.programs.normalHeating", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "active": { - "type": "boolean", - "value": false - }, - "temperature": { - "type": "number", - "unit": "celsius", - "value": 22 - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.1.operating.programs.normalHeating" - }, - { - "apiVersion": 1, - "commands": { - "setTemperature": { - "isExecutable": true, - "name": "setTemperature", - "params": { - "targetTemperature": { - "constraints": { - "max": 30, - "min": 8, - "stepping": 0.5 - }, - "required": true, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.1.operating.programs.reducedHeating/commands/setTemperature" - } - }, - "deviceId": "RoomControl-1", - "feature": "rooms.1.operating.programs.reducedHeating", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "active": { - "type": "boolean", - "value": false - }, - "temperature": { - "type": "number", - "unit": "celsius", - "value": 21 - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.1.operating.programs.reducedHeating" - }, - { - "apiVersion": 1, - "commands": {}, - "deviceId": "RoomControl-1", - "feature": "rooms.1.operating.state", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "demand": { - "type": "string", - "value": "energySaving" - }, - "level": { - "type": "string", - "value": "normal" - }, - "modifier": { - "type": "string", - "value": "none" - }, - "reason": { - "type": "string", - "value": "schedule" - } - }, - "timestamp": "2026-04-16T03:58:48.070Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.1.operating.state" - }, - { - "apiVersion": 1, - "commands": { - "activate": { - "isExecutable": true, - "name": "activate", - "params": { - "temperature": { - "constraints": { - "max": 30, - "min": 8, - "stepping": 0.5 - }, - "required": true, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.1.quickmodes.manualTillNextSchedule/commands/activate" - }, - "deactivate": { - "isExecutable": true, - "name": "deactivate", - "params": {}, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.1.quickmodes.manualTillNextSchedule/commands/deactivate" - }, - "setTemperature": { - "isExecutable": false, - "name": "setTemperature", - "params": { - "targetTemperature": { - "constraints": { - "max": 30, - "min": 8, - "stepping": 0.5 - }, - "required": true, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.1.quickmodes.manualTillNextSchedule/commands/setTemperature" - } - }, - "deviceId": "RoomControl-1", - "feature": "rooms.1.quickmodes.manualTillNextSchedule", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "active": { - "type": "boolean", - "value": false - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.1.quickmodes.manualTillNextSchedule" - }, - { - "apiVersion": 1, - "commands": { - "resetSchedule": { - "isExecutable": true, - "name": "resetSchedule", - "params": {}, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.1.schedule/commands/resetSchedule" - }, - "setSchedule": { - "isExecutable": true, - "name": "setSchedule", - "params": { - "newSchedule": { - "constraints": { - "defaultMode": "reduced", - "maxEntries": 4, - "modes": [ - "normal", - "comfort" - ], - "overlapAllowed": false, - "resolution": 10 - }, - "required": true, - "type": "Schedule" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.1.schedule/commands/setSchedule" - } - }, - "deviceId": "RoomControl-1", - "feature": "rooms.1.schedule", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "active": { - "type": "boolean", - "value": true - }, - "entries": { - "type": "Schedule", - "value": { - "fri": [ - { - "end": "22:00", - "mode": "normal", - "position": 0, - "start": "06:00" - } - ], - "mon": [ - { - "end": "22:00", - "mode": "normal", - "position": 0, - "start": "06:00" - } - ], - "sat": [ - { - "end": "22:00", - "mode": "normal", - "position": 0, - "start": "06:00" - } - ], - "sun": [ - { - "end": "22:00", - "mode": "normal", - "position": 0, - "start": "06:00" - } - ], - "thu": [ - { - "end": "22:00", - "mode": "normal", - "position": 0, - "start": "06:00" - } - ], - "tue": [ - { - "end": "22:00", - "mode": "normal", - "position": 0, - "start": "06:00" - } - ], - "wed": [ - { - "end": "22:00", - "mode": "normal", - "position": 0, - "start": "06:00" - } - ] - } - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.1.schedule" - }, - { - "apiVersion": 1, - "commands": {}, - "deviceId": "RoomControl-1", - "feature": "rooms.1.sensors.co2", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "status": { - "type": "string", - "value": "notConnected" - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.1.sensors.co2" - }, - { - "apiVersion": 1, - "commands": {}, - "deviceId": "RoomControl-1", - "feature": "rooms.1.sensors.humidity", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "status": { - "type": "string", - "value": "connected" - }, - "value": { - "type": "number", - "unit": "percent", - "value": 58 - } - }, - "timestamp": "2026-04-16T12:04:59.029Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.1.sensors.humidity" - }, - { - "apiVersion": 1, - "commands": {}, - "deviceId": "RoomControl-1", - "feature": "rooms.1.sensors.temperature", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "status": { - "type": "string", - "value": "connected" - }, - "value": { - "type": "number", - "unit": "celsius", - "value": 20.3 - } - }, - "timestamp": "2026-04-16T11:46:58.867Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.1.sensors.temperature" - }, - { - "apiVersion": 1, - "commands": { - "addActor": { - "constraints": { - "enum": [ - "cs", - "fht", - "trv", - "airQualitySensor", - "remoteControllerSensor" - ] - }, - "isExecutable": true, - "name": "addActor", - "params": { - "actorDeviceId": { - "constraints": {}, - "required": true, - "type": "string" - }, - "heatingCircuit": { - "constraints": { - "max": 3, - "min": 0, - "stepping": 1 - }, - "required": false, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.2/commands/addActor" - }, - "moveActor": { - "isExecutable": true, - "name": "moveActor", - "params": { - "actorDeviceId": { - "constraints": {}, - "required": true, - "type": "string" - }, - "heatingCircuit": { - "constraints": { - "max": 3, - "min": 0, - "stepping": 1 - }, - "required": false, - "type": "number" - }, - "newRoomId": { - "constraints": { - "max": 23, - "min": 0, - "stepping": 1 - }, - "required": true, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.2/commands/moveActor" - }, - "remove": { - "isExecutable": true, - "name": "remove", - "params": {}, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.2/commands/remove" - }, - "removeActor": { - "isExecutable": true, - "name": "removeActor", - "params": { - "actorDeviceId": { - "constraints": {}, - "required": true, - "type": "string" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.2/commands/removeActor" - }, - "setName": { - "isExecutable": true, - "name": "setName", - "params": { - "name": { - "constraints": { - "maxLength": 39, - "minLength": 1, - "regEx": "^[\\p{L}0-9]+( [\\p{L}0-9]+)*$" - }, - "required": true, - "type": "string" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.2/commands/setName" - }, - "setType": { - "isExecutable": true, - "name": "setType", - "params": { - "type": { - "constraints": { - "enum": [ - "bathroom", - "bedroom", - "hallway", - "livingroom", - "kitchen", - "office", - "nursery", - "toilet", - "other" - ] - }, - "required": true, - "type": "string" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.2/commands/setType" - } - }, - "deviceId": "RoomControl-1", - "feature": "rooms.2", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "actors": { - "type": "array", - "value": [ - { - "deviceId": "zigbee-################", - "heatingCircuit": 0 - }, - { - "deviceId": "zigbee-################-4" - } - ] - }, - "name": { - "type": "string", - "value": "Hallway Upper" - }, - "type": { - "type": "string", - "value": "hallway" - } - }, - "timestamp": "2026-04-15T21:00:31.581Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.2" - }, - { - "apiVersion": 1, - "commands": {}, - "deviceId": "RoomControl-1", - "feature": "rooms.2.condensationRisk", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "value": { - "type": "boolean", - "value": false - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.2.condensationRisk" - }, - { - "apiVersion": 1, - "commands": { - "setTemperature": { - "isExecutable": true, - "name": "setTemperature", - "params": { - "targetTemperature": { - "constraints": { - "max": 30, - "min": 8, - "stepping": 0.5 - }, - "required": true, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.2.operating.programs.comfortHeating/commands/setTemperature" - } - }, - "deviceId": "RoomControl-1", - "feature": "rooms.2.operating.programs.comfortHeating", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "active": { - "type": "boolean", - "value": false - }, - "temperature": { - "type": "number", - "unit": "celsius", - "value": 22 - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.2.operating.programs.comfortHeating" - }, - { - "apiVersion": 1, - "commands": { - "setTemperature": { - "isExecutable": true, - "name": "setTemperature", - "params": { - "targetTemperature": { - "constraints": { - "max": 30, - "min": 8, - "stepping": 0.5 - }, - "required": true, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.2.operating.programs.normalHeating/commands/setTemperature" - } - }, - "deviceId": "RoomControl-1", - "feature": "rooms.2.operating.programs.normalHeating", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "active": { - "type": "boolean", - "value": false - }, - "temperature": { - "type": "number", - "unit": "celsius", - "value": 20 - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.2.operating.programs.normalHeating" - }, - { - "apiVersion": 1, - "commands": { - "setTemperature": { - "isExecutable": true, - "name": "setTemperature", - "params": { - "targetTemperature": { - "constraints": { - "max": 30, - "min": 8, - "stepping": 0.5 - }, - "required": true, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.2.operating.programs.reducedHeating/commands/setTemperature" - } - }, - "deviceId": "RoomControl-1", - "feature": "rooms.2.operating.programs.reducedHeating", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "active": { - "type": "boolean", - "value": false - }, - "temperature": { - "type": "number", - "unit": "celsius", - "value": 19.5 - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.2.operating.programs.reducedHeating" - }, - { - "apiVersion": 1, - "commands": {}, - "deviceId": "RoomControl-1", - "feature": "rooms.2.operating.state", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "demand": { - "type": "string", - "value": "energySaving" - }, - "level": { - "type": "string", - "value": "normal" - }, - "modifier": { - "type": "string", - "value": "none" - }, - "reason": { - "type": "string", - "value": "schedule" - } - }, - "timestamp": "2026-04-16T03:58:48.070Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.2.operating.state" - }, - { - "apiVersion": 1, - "commands": { - "activate": { - "isExecutable": true, - "name": "activate", - "params": { - "temperature": { - "constraints": { - "max": 30, - "min": 8, - "stepping": 0.5 - }, - "required": true, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.2.quickmodes.manualTillNextSchedule/commands/activate" - }, - "deactivate": { - "isExecutable": true, - "name": "deactivate", - "params": {}, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.2.quickmodes.manualTillNextSchedule/commands/deactivate" - }, - "setTemperature": { - "isExecutable": false, - "name": "setTemperature", - "params": { - "targetTemperature": { - "constraints": { - "max": 30, - "min": 8, - "stepping": 0.5 - }, - "required": true, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.2.quickmodes.manualTillNextSchedule/commands/setTemperature" - } - }, - "deviceId": "RoomControl-1", - "feature": "rooms.2.quickmodes.manualTillNextSchedule", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "active": { - "type": "boolean", - "value": false - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.2.quickmodes.manualTillNextSchedule" - }, - { - "apiVersion": 1, - "commands": { - "resetSchedule": { - "isExecutable": true, - "name": "resetSchedule", - "params": {}, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.2.schedule/commands/resetSchedule" - }, - "setSchedule": { - "isExecutable": true, - "name": "setSchedule", - "params": { - "newSchedule": { - "constraints": { - "defaultMode": "reduced", - "maxEntries": 4, - "modes": [ - "normal", - "comfort" - ], - "overlapAllowed": false, - "resolution": 10 - }, - "required": true, - "type": "Schedule" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.2.schedule/commands/setSchedule" - } - }, - "deviceId": "RoomControl-1", - "feature": "rooms.2.schedule", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "active": { - "type": "boolean", - "value": true - }, - "entries": { - "type": "Schedule", - "value": { - "fri": [ - { - "end": "22:00", - "mode": "normal", - "position": 0, - "start": "06:00" - } - ], - "mon": [ - { - "end": "22:00", - "mode": "normal", - "position": 0, - "start": "06:00" - } - ], - "sat": [ - { - "end": "22:00", - "mode": "normal", - "position": 0, - "start": "06:00" - } - ], - "sun": [ - { - "end": "22:00", - "mode": "normal", - "position": 0, - "start": "06:00" - } - ], - "thu": [ - { - "end": "22:00", - "mode": "normal", - "position": 0, - "start": "06:00" - } - ], - "tue": [ - { - "end": "22:00", - "mode": "normal", - "position": 0, - "start": "06:00" - } - ], - "wed": [ - { - "end": "22:00", - "mode": "normal", - "position": 0, - "start": "06:00" - } - ] - } - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.2.schedule" - }, - { - "apiVersion": 1, - "commands": {}, - "deviceId": "RoomControl-1", - "feature": "rooms.2.sensors.co2", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "status": { - "type": "string", - "value": "notConnected" - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.2.sensors.co2" - }, - { - "apiVersion": 1, - "commands": {}, - "deviceId": "RoomControl-1", - "feature": "rooms.2.sensors.humidity", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "status": { - "type": "string", - "value": "connected" - }, - "value": { - "type": "number", - "unit": "percent", - "value": 51 - } - }, - "timestamp": "2026-04-16T12:02:59.972Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.2.sensors.humidity" - }, - { - "apiVersion": 1, - "commands": {}, - "deviceId": "RoomControl-1", - "feature": "rooms.2.sensors.temperature", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "status": { - "type": "string", - "value": "connected" - }, - "value": { - "type": "number", - "unit": "celsius", - "value": 21 - } - }, - "timestamp": "2026-04-16T11:31:59.761Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.2.sensors.temperature" - }, - { - "apiVersion": 1, - "commands": { - "addActor": { - "constraints": { - "enum": [ - "cs", - "fht", - "trv", - "airQualitySensor", - "remoteControllerSensor" - ] - }, - "isExecutable": true, - "name": "addActor", - "params": { - "actorDeviceId": { - "constraints": {}, - "required": true, - "type": "string" - }, - "heatingCircuit": { - "constraints": { - "max": 3, - "min": 0, - "stepping": 1 - }, - "required": false, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.3/commands/addActor" - }, - "moveActor": { - "isExecutable": true, - "name": "moveActor", - "params": { - "actorDeviceId": { - "constraints": {}, - "required": true, - "type": "string" - }, - "heatingCircuit": { - "constraints": { - "max": 3, - "min": 0, - "stepping": 1 - }, - "required": false, - "type": "number" - }, - "newRoomId": { - "constraints": { - "max": 23, - "min": 0, - "stepping": 1 - }, - "required": true, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.3/commands/moveActor" - }, - "remove": { - "isExecutable": true, - "name": "remove", - "params": {}, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.3/commands/remove" - }, - "removeActor": { - "isExecutable": true, - "name": "removeActor", - "params": { - "actorDeviceId": { - "constraints": {}, - "required": true, - "type": "string" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.3/commands/removeActor" - }, - "setName": { - "isExecutable": true, - "name": "setName", - "params": { - "name": { - "constraints": { - "maxLength": 39, - "minLength": 1, - "regEx": "^[\\p{L}0-9]+( [\\p{L}0-9]+)*$" - }, - "required": true, - "type": "string" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.3/commands/setName" - }, - "setType": { - "isExecutable": true, - "name": "setType", - "params": { - "type": { - "constraints": { - "enum": [ - "bathroom", - "bedroom", - "hallway", - "livingroom", - "kitchen", - "office", - "nursery", - "toilet", - "other" - ] - }, - "required": true, - "type": "string" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.3/commands/setType" - } - }, - "deviceId": "RoomControl-1", - "feature": "rooms.3", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "actors": { - "type": "array", - "value": [ - { - "deviceId": "zigbee-################", - "heatingCircuit": 0 - }, - { - "deviceId": "zigbee-################-2" - } - ] - }, - "name": { - "type": "string", - "value": "Kids Room 1" - }, - "type": { - "type": "string", - "value": "nursery" - } - }, - "timestamp": "2026-04-15T21:00:31.581Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.3" - }, - { - "apiVersion": 1, - "commands": {}, - "deviceId": "RoomControl-1", - "feature": "rooms.3.condensationRisk", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "value": { - "type": "boolean", - "value": false - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.3.condensationRisk" - }, - { - "apiVersion": 1, - "commands": { - "setTemperature": { - "isExecutable": true, - "name": "setTemperature", - "params": { - "targetTemperature": { - "constraints": { - "max": 30, - "min": 8, - "stepping": 0.5 - }, - "required": true, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.3.operating.programs.comfortHeating/commands/setTemperature" - } - }, - "deviceId": "RoomControl-1", - "feature": "rooms.3.operating.programs.comfortHeating", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "active": { - "type": "boolean", - "value": false - }, - "temperature": { - "type": "number", - "unit": "celsius", - "value": 22 - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.3.operating.programs.comfortHeating" - }, - { - "apiVersion": 1, - "commands": { - "setTemperature": { - "isExecutable": true, - "name": "setTemperature", - "params": { - "targetTemperature": { - "constraints": { - "max": 30, - "min": 8, - "stepping": 0.5 - }, - "required": true, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.3.operating.programs.normalHeating/commands/setTemperature" - } - }, - "deviceId": "RoomControl-1", - "feature": "rooms.3.operating.programs.normalHeating", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "active": { - "type": "boolean", - "value": false - }, - "temperature": { - "type": "number", - "unit": "celsius", - "value": 20 - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.3.operating.programs.normalHeating" - }, - { - "apiVersion": 1, - "commands": { - "setTemperature": { - "isExecutable": true, - "name": "setTemperature", - "params": { - "targetTemperature": { - "constraints": { - "max": 30, - "min": 8, - "stepping": 0.5 - }, - "required": true, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.3.operating.programs.reducedHeating/commands/setTemperature" - } - }, - "deviceId": "RoomControl-1", - "feature": "rooms.3.operating.programs.reducedHeating", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "active": { - "type": "boolean", - "value": false - }, - "temperature": { - "type": "number", - "unit": "celsius", - "value": 18 - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.3.operating.programs.reducedHeating" - }, - { - "apiVersion": 1, - "commands": {}, - "deviceId": "RoomControl-1", - "feature": "rooms.3.operating.state", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "demand": { - "type": "string", - "value": "energySaving" - }, - "level": { - "type": "string", - "value": "normal" - }, - "modifier": { - "type": "string", - "value": "none" - }, - "reason": { - "type": "string", - "value": "schedule" - } - }, - "timestamp": "2026-04-16T03:58:48.070Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.3.operating.state" - }, - { - "apiVersion": 1, - "commands": { - "activate": { - "isExecutable": true, - "name": "activate", - "params": { - "temperature": { - "constraints": { - "max": 30, - "min": 8, - "stepping": 0.5 - }, - "required": true, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.3.quickmodes.manualTillNextSchedule/commands/activate" - }, - "deactivate": { - "isExecutable": true, - "name": "deactivate", - "params": {}, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.3.quickmodes.manualTillNextSchedule/commands/deactivate" - }, - "setTemperature": { - "isExecutable": false, - "name": "setTemperature", - "params": { - "targetTemperature": { - "constraints": { - "max": 30, - "min": 8, - "stepping": 0.5 - }, - "required": true, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.3.quickmodes.manualTillNextSchedule/commands/setTemperature" - } - }, - "deviceId": "RoomControl-1", - "feature": "rooms.3.quickmodes.manualTillNextSchedule", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "active": { - "type": "boolean", - "value": false - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.3.quickmodes.manualTillNextSchedule" - }, - { - "apiVersion": 1, - "commands": { - "resetSchedule": { - "isExecutable": true, - "name": "resetSchedule", - "params": {}, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.3.schedule/commands/resetSchedule" - }, - "setSchedule": { - "isExecutable": true, - "name": "setSchedule", - "params": { - "newSchedule": { - "constraints": { - "defaultMode": "reduced", - "maxEntries": 4, - "modes": [ - "normal", - "comfort" - ], - "overlapAllowed": false, - "resolution": 10 - }, - "required": true, - "type": "Schedule" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.3.schedule/commands/setSchedule" - } - }, - "deviceId": "RoomControl-1", - "feature": "rooms.3.schedule", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "active": { - "type": "boolean", - "value": true - }, - "entries": { - "type": "Schedule", - "value": { - "fri": [ - { - "end": "22:00", - "mode": "normal", - "position": 0, - "start": "06:00" - } - ], - "mon": [ - { - "end": "22:00", - "mode": "normal", - "position": 0, - "start": "06:00" - } - ], - "sat": [ - { - "end": "22:00", - "mode": "normal", - "position": 0, - "start": "06:00" - } - ], - "sun": [ - { - "end": "22:00", - "mode": "normal", - "position": 0, - "start": "06:00" - } - ], - "thu": [ - { - "end": "22:00", - "mode": "normal", - "position": 0, - "start": "06:00" - } - ], - "tue": [ - { - "end": "22:00", - "mode": "normal", - "position": 0, - "start": "06:00" - } - ], - "wed": [ - { - "end": "22:00", - "mode": "normal", - "position": 0, - "start": "06:00" - } - ] - } - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.3.schedule" - }, - { - "apiVersion": 1, - "commands": {}, - "deviceId": "RoomControl-1", - "feature": "rooms.3.sensors.co2", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "status": { - "type": "string", - "value": "notConnected" - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.3.sensors.co2" - }, - { - "apiVersion": 1, - "commands": {}, - "deviceId": "RoomControl-1", - "feature": "rooms.3.sensors.humidity", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "status": { - "type": "string", - "value": "connected" - }, - "value": { - "type": "number", - "unit": "percent", - "value": 46 - } - }, - "timestamp": "2026-04-16T11:40:59.103Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.3.sensors.humidity" - }, - { - "apiVersion": 1, - "commands": {}, - "deviceId": "RoomControl-1", - "feature": "rooms.3.sensors.temperature", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "status": { - "type": "string", - "value": "connected" - }, - "value": { - "type": "number", - "unit": "celsius", - "value": 21.3 - } - }, - "timestamp": "2026-04-16T11:40:59.103Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.3.sensors.temperature" - }, - { - "apiVersion": 1, - "commands": { - "addActor": { - "constraints": { - "enum": [ - "cs", - "fht", - "trv", - "airQualitySensor", - "remoteControllerSensor" - ] - }, - "isExecutable": true, - "name": "addActor", - "params": { - "actorDeviceId": { - "constraints": {}, - "required": true, - "type": "string" - }, - "heatingCircuit": { - "constraints": { - "max": 3, - "min": 0, - "stepping": 1 - }, - "required": false, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.4/commands/addActor" - }, - "moveActor": { - "isExecutable": true, - "name": "moveActor", - "params": { - "actorDeviceId": { - "constraints": {}, - "required": true, - "type": "string" - }, - "heatingCircuit": { - "constraints": { - "max": 3, - "min": 0, - "stepping": 1 - }, - "required": false, - "type": "number" - }, - "newRoomId": { - "constraints": { - "max": 23, - "min": 0, - "stepping": 1 - }, - "required": true, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.4/commands/moveActor" - }, - "remove": { - "isExecutable": true, - "name": "remove", - "params": {}, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.4/commands/remove" - }, - "removeActor": { - "isExecutable": true, - "name": "removeActor", - "params": { - "actorDeviceId": { - "constraints": {}, - "required": true, - "type": "string" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.4/commands/removeActor" - }, - "setName": { - "isExecutable": true, - "name": "setName", - "params": { - "name": { - "constraints": { - "maxLength": 39, - "minLength": 1, - "regEx": "^[\\p{L}0-9]+( [\\p{L}0-9]+)*$" - }, - "required": true, - "type": "string" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.4/commands/setName" - }, - "setType": { - "isExecutable": true, - "name": "setType", - "params": { - "type": { - "constraints": { - "enum": [ - "bathroom", - "bedroom", - "hallway", - "livingroom", - "kitchen", - "office", - "nursery", - "toilet", - "other" - ] - }, - "required": true, - "type": "string" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.4/commands/setType" - } - }, - "deviceId": "RoomControl-1", - "feature": "rooms.4", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "actors": { - "type": "array", - "value": [ - { - "deviceId": "zigbee-################" - }, - { - "deviceId": "zigbee-################-1" - }, - { - "deviceId": "zigbee-################-2" - } - ] - }, - "name": { - "type": "string", - "value": "Living Room" - }, - "type": { - "type": "string", - "value": "livingroom" - } - }, - "timestamp": "2026-04-15T21:00:31.581Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.4" - }, - { - "apiVersion": 1, - "commands": {}, - "deviceId": "RoomControl-1", - "feature": "rooms.4.condensationRisk", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "value": { - "type": "boolean", - "value": false - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.4.condensationRisk" - }, - { - "apiVersion": 1, - "commands": { - "setTemperature": { - "isExecutable": true, - "name": "setTemperature", - "params": { - "targetTemperature": { - "constraints": { - "max": 30, - "min": 8, - "stepping": 0.5 - }, - "required": true, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.4.operating.programs.comfortHeating/commands/setTemperature" - } - }, - "deviceId": "RoomControl-1", - "feature": "rooms.4.operating.programs.comfortHeating", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "active": { - "type": "boolean", - "value": false - }, - "temperature": { - "type": "number", - "unit": "celsius", - "value": 22 - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.4.operating.programs.comfortHeating" - }, - { - "apiVersion": 1, - "commands": { - "setTemperature": { - "isExecutable": true, - "name": "setTemperature", - "params": { - "targetTemperature": { - "constraints": { - "max": 30, - "min": 8, - "stepping": 0.5 - }, - "required": true, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.4.operating.programs.normalHeating/commands/setTemperature" - } - }, - "deviceId": "RoomControl-1", - "feature": "rooms.4.operating.programs.normalHeating", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "active": { - "type": "boolean", - "value": false - }, - "temperature": { - "type": "number", - "unit": "celsius", - "value": 22 - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.4.operating.programs.normalHeating" - }, - { - "apiVersion": 1, - "commands": { - "setTemperature": { - "isExecutable": true, - "name": "setTemperature", - "params": { - "targetTemperature": { - "constraints": { - "max": 30, - "min": 8, - "stepping": 0.5 - }, - "required": true, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.4.operating.programs.reducedHeating/commands/setTemperature" - } - }, - "deviceId": "RoomControl-1", - "feature": "rooms.4.operating.programs.reducedHeating", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "active": { - "type": "boolean", - "value": false - }, - "temperature": { - "type": "number", - "unit": "celsius", - "value": 21 - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.4.operating.programs.reducedHeating" - }, - { - "apiVersion": 1, - "commands": {}, - "deviceId": "RoomControl-1", - "feature": "rooms.4.operating.state", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "demand": { - "type": "string", - "value": "energySaving" - }, - "level": { - "type": "string", - "value": "comfort" - }, - "modifier": { - "type": "string", - "value": "none" - }, - "reason": { - "type": "string", - "value": "schedule" - } - }, - "timestamp": "2026-04-16T03:58:48.070Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.4.operating.state" - }, - { - "apiVersion": 1, - "commands": { - "activate": { - "isExecutable": true, - "name": "activate", - "params": { - "temperature": { - "constraints": { - "max": 30, - "min": 8, - "stepping": 0.5 - }, - "required": true, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.4.quickmodes.manualTillNextSchedule/commands/activate" - }, - "deactivate": { - "isExecutable": true, - "name": "deactivate", - "params": {}, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.4.quickmodes.manualTillNextSchedule/commands/deactivate" - }, - "setTemperature": { - "isExecutable": false, - "name": "setTemperature", - "params": { - "targetTemperature": { - "constraints": { - "max": 30, - "min": 8, - "stepping": 0.5 - }, - "required": true, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.4.quickmodes.manualTillNextSchedule/commands/setTemperature" - } - }, - "deviceId": "RoomControl-1", - "feature": "rooms.4.quickmodes.manualTillNextSchedule", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "active": { - "type": "boolean", - "value": false - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.4.quickmodes.manualTillNextSchedule" - }, - { - "apiVersion": 1, - "commands": { - "resetSchedule": { - "isExecutable": true, - "name": "resetSchedule", - "params": {}, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.4.schedule/commands/resetSchedule" - }, - "setSchedule": { - "isExecutable": true, - "name": "setSchedule", - "params": { - "newSchedule": { - "constraints": { - "defaultMode": "reduced", - "maxEntries": 4, - "modes": [ - "normal", - "comfort" - ], - "overlapAllowed": false, - "resolution": 10 - }, - "required": true, - "type": "Schedule" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.4.schedule/commands/setSchedule" - } - }, - "deviceId": "RoomControl-1", - "feature": "rooms.4.schedule", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "active": { - "type": "boolean", - "value": true - }, - "entries": { - "type": "Schedule", - "value": { - "fri": [ - { - "end": "22:00", - "mode": "comfort", - "position": 0, - "start": "06:00" - } - ], - "mon": [ - { - "end": "20:00", - "mode": "comfort", - "position": 0, - "start": "06:00" - } - ], - "sat": [ - { - "end": "22:00", - "mode": "comfort", - "position": 0, - "start": "06:00" - } - ], - "sun": [ - { - "end": "22:00", - "mode": "comfort", - "position": 0, - "start": "06:00" - } - ], - "thu": [ - { - "end": "22:00", - "mode": "comfort", - "position": 0, - "start": "06:00" - } - ], - "tue": [ - { - "end": "22:00", - "mode": "comfort", - "position": 0, - "start": "06:00" - } - ], - "wed": [ - { - "end": "22:00", - "mode": "comfort", - "position": 0, - "start": "06:00" - } - ] - } - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.4.schedule" - }, - { - "apiVersion": 1, - "commands": {}, - "deviceId": "RoomControl-1", - "feature": "rooms.4.sensors.co2", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "status": { - "type": "string", - "value": "notConnected" - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.4.sensors.co2" - }, - { - "apiVersion": 1, - "commands": {}, - "deviceId": "RoomControl-1", - "feature": "rooms.4.sensors.humidity", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "status": { - "type": "string", - "value": "connected" - }, - "value": { - "type": "number", - "unit": "percent", - "value": 47 - } - }, - "timestamp": "2026-04-16T11:54:00.030Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.4.sensors.humidity" - }, - { - "apiVersion": 1, - "commands": {}, - "deviceId": "RoomControl-1", - "feature": "rooms.4.sensors.temperature", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "status": { - "type": "string", - "value": "connected" - }, - "value": { - "type": "number", - "unit": "celsius", - "value": 24.2 - } - }, - "timestamp": "2026-04-16T12:05:58.225Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.4.sensors.temperature" - }, - { - "apiVersion": 1, - "commands": { - "addActor": { - "constraints": { - "enum": [ - "cs", - "fht", - "trv", - "airQualitySensor", - "remoteControllerSensor" - ] - }, - "isExecutable": true, - "name": "addActor", - "params": { - "actorDeviceId": { - "constraints": {}, - "required": true, - "type": "string" - }, - "heatingCircuit": { - "constraints": { - "max": 3, - "min": 0, - "stepping": 1 - }, - "required": false, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.5/commands/addActor" - }, - "moveActor": { - "isExecutable": true, - "name": "moveActor", - "params": { - "actorDeviceId": { - "constraints": {}, - "required": true, - "type": "string" - }, - "heatingCircuit": { - "constraints": { - "max": 3, - "min": 0, - "stepping": 1 - }, - "required": false, - "type": "number" - }, - "newRoomId": { - "constraints": { - "max": 23, - "min": 0, - "stepping": 1 - }, - "required": true, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.5/commands/moveActor" - }, - "remove": { - "isExecutable": true, - "name": "remove", - "params": {}, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.5/commands/remove" - }, - "removeActor": { - "isExecutable": true, - "name": "removeActor", - "params": { - "actorDeviceId": { - "constraints": {}, - "required": true, - "type": "string" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.5/commands/removeActor" - }, - "setName": { - "isExecutable": true, - "name": "setName", - "params": { - "name": { - "constraints": { - "maxLength": 39, - "minLength": 1, - "regEx": "^[\\p{L}0-9]+( [\\p{L}0-9]+)*$" - }, - "required": true, - "type": "string" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.5/commands/setName" - }, - "setType": { - "isExecutable": true, - "name": "setType", - "params": { - "type": { - "constraints": { - "enum": [ - "bathroom", - "bedroom", - "hallway", - "livingroom", - "kitchen", - "office", - "nursery", - "toilet", - "other" - ] - }, - "required": true, - "type": "string" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.5/commands/setType" - } - }, - "deviceId": "RoomControl-1", - "feature": "rooms.5", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "actors": { - "type": "array", - "value": [ - { - "deviceId": "zigbee-################" - }, - { - "deviceId": "zigbee-################-3" - } - ] - }, - "name": { - "type": "string", - "value": "Hallway Ground" - }, - "type": { - "type": "string", - "value": "hallway" - } - }, - "timestamp": "2026-04-15T21:00:31.581Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.5" - }, - { - "apiVersion": 1, - "commands": {}, - "deviceId": "RoomControl-1", - "feature": "rooms.5.condensationRisk", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "value": { - "type": "boolean", - "value": false - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.5.condensationRisk" - }, - { - "apiVersion": 1, - "commands": { - "setTemperature": { - "isExecutable": true, - "name": "setTemperature", - "params": { - "targetTemperature": { - "constraints": { - "max": 30, - "min": 8, - "stepping": 0.5 - }, - "required": true, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.5.operating.programs.comfortHeating/commands/setTemperature" - } - }, - "deviceId": "RoomControl-1", - "feature": "rooms.5.operating.programs.comfortHeating", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "active": { - "type": "boolean", - "value": false - }, - "temperature": { - "type": "number", - "unit": "celsius", - "value": 22 - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.5.operating.programs.comfortHeating" - }, - { - "apiVersion": 1, - "commands": { - "setTemperature": { - "isExecutable": true, - "name": "setTemperature", - "params": { - "targetTemperature": { - "constraints": { - "max": 30, - "min": 8, - "stepping": 0.5 - }, - "required": true, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.5.operating.programs.normalHeating/commands/setTemperature" - } - }, - "deviceId": "RoomControl-1", - "feature": "rooms.5.operating.programs.normalHeating", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "active": { - "type": "boolean", - "value": false - }, - "temperature": { - "type": "number", - "unit": "celsius", - "value": 20.5 - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.5.operating.programs.normalHeating" - }, - { - "apiVersion": 1, - "commands": { - "setTemperature": { - "isExecutable": true, - "name": "setTemperature", - "params": { - "targetTemperature": { - "constraints": { - "max": 30, - "min": 8, - "stepping": 0.5 - }, - "required": true, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.5.operating.programs.reducedHeating/commands/setTemperature" - } - }, - "deviceId": "RoomControl-1", - "feature": "rooms.5.operating.programs.reducedHeating", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "active": { - "type": "boolean", - "value": false - }, - "temperature": { - "type": "number", - "unit": "celsius", - "value": 20 - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.5.operating.programs.reducedHeating" - }, - { - "apiVersion": 1, - "commands": {}, - "deviceId": "RoomControl-1", - "feature": "rooms.5.operating.state", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "demand": { - "type": "string", - "value": "energySaving" - }, - "level": { - "type": "string", - "value": "normal" - }, - "modifier": { - "type": "string", - "value": "none" - }, - "reason": { - "type": "string", - "value": "schedule" - } - }, - "timestamp": "2026-04-16T03:58:48.070Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.5.operating.state" - }, - { - "apiVersion": 1, - "commands": { - "activate": { - "isExecutable": true, - "name": "activate", - "params": { - "temperature": { - "constraints": { - "max": 30, - "min": 8, - "stepping": 0.5 - }, - "required": true, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.5.quickmodes.manualTillNextSchedule/commands/activate" - }, - "deactivate": { - "isExecutable": true, - "name": "deactivate", - "params": {}, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.5.quickmodes.manualTillNextSchedule/commands/deactivate" - }, - "setTemperature": { - "isExecutable": false, - "name": "setTemperature", - "params": { - "targetTemperature": { - "constraints": { - "max": 30, - "min": 8, - "stepping": 0.5 - }, - "required": true, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.5.quickmodes.manualTillNextSchedule/commands/setTemperature" - } - }, - "deviceId": "RoomControl-1", - "feature": "rooms.5.quickmodes.manualTillNextSchedule", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "active": { - "type": "boolean", - "value": false - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.5.quickmodes.manualTillNextSchedule" - }, - { - "apiVersion": 1, - "commands": { - "resetSchedule": { - "isExecutable": true, - "name": "resetSchedule", - "params": {}, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.5.schedule/commands/resetSchedule" - }, - "setSchedule": { - "isExecutable": true, - "name": "setSchedule", - "params": { - "newSchedule": { - "constraints": { - "defaultMode": "reduced", - "maxEntries": 4, - "modes": [ - "normal", - "comfort" - ], - "overlapAllowed": false, - "resolution": 10 - }, - "required": true, - "type": "Schedule" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.5.schedule/commands/setSchedule" - } - }, - "deviceId": "RoomControl-1", - "feature": "rooms.5.schedule", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "active": { - "type": "boolean", - "value": true - }, - "entries": { - "type": "Schedule", - "value": { - "fri": [ - { - "end": "22:00", - "mode": "normal", - "position": 0, - "start": "06:00" - } - ], - "mon": [ - { - "end": "22:00", - "mode": "normal", - "position": 0, - "start": "06:00" - } - ], - "sat": [ - { - "end": "22:00", - "mode": "normal", - "position": 0, - "start": "06:00" - } - ], - "sun": [ - { - "end": "22:00", - "mode": "normal", - "position": 0, - "start": "06:00" - } - ], - "thu": [ - { - "end": "22:00", - "mode": "normal", - "position": 0, - "start": "06:00" - } - ], - "tue": [ - { - "end": "22:00", - "mode": "normal", - "position": 0, - "start": "06:00" - } - ], - "wed": [ - { - "end": "22:00", - "mode": "normal", - "position": 0, - "start": "06:00" - } - ] - } - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.5.schedule" - }, - { - "apiVersion": 1, - "commands": {}, - "deviceId": "RoomControl-1", - "feature": "rooms.5.sensors.co2", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "status": { - "type": "string", - "value": "notConnected" - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.5.sensors.co2" - }, - { - "apiVersion": 1, - "commands": {}, - "deviceId": "RoomControl-1", - "feature": "rooms.5.sensors.humidity", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "status": { - "type": "string", - "value": "connected" - }, - "value": { - "type": "number", - "unit": "percent", - "value": 50 - } - }, - "timestamp": "2026-04-16T12:02:59.972Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.5.sensors.humidity" - }, - { - "apiVersion": 1, - "commands": {}, - "deviceId": "RoomControl-1", - "feature": "rooms.5.sensors.temperature", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "status": { - "type": "string", - "value": "connected" - }, - "value": { - "type": "number", - "unit": "celsius", - "value": 20.4 - } - }, - "timestamp": "2026-04-16T12:00:58.387Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.5.sensors.temperature" - }, - { - "apiVersion": 1, - "commands": { - "addActor": { - "constraints": { - "enum": [ - "cs", - "fht", - "trv", - "airQualitySensor", - "remoteControllerSensor" - ] - }, - "isExecutable": true, - "name": "addActor", - "params": { - "actorDeviceId": { - "constraints": {}, - "required": true, - "type": "string" - }, - "heatingCircuit": { - "constraints": { - "max": 3, - "min": 0, - "stepping": 1 - }, - "required": false, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.6/commands/addActor" - }, - "moveActor": { - "isExecutable": true, - "name": "moveActor", - "params": { - "actorDeviceId": { - "constraints": {}, - "required": true, - "type": "string" - }, - "heatingCircuit": { - "constraints": { - "max": 3, - "min": 0, - "stepping": 1 - }, - "required": false, - "type": "number" - }, - "newRoomId": { - "constraints": { - "max": 23, - "min": 0, - "stepping": 1 - }, - "required": true, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.6/commands/moveActor" - }, - "remove": { - "isExecutable": true, - "name": "remove", - "params": {}, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.6/commands/remove" - }, - "removeActor": { - "isExecutable": true, - "name": "removeActor", - "params": { - "actorDeviceId": { - "constraints": {}, - "required": true, - "type": "string" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.6/commands/removeActor" - }, - "setName": { - "isExecutable": true, - "name": "setName", - "params": { - "name": { - "constraints": { - "maxLength": 39, - "minLength": 1, - "regEx": "^[\\p{L}0-9]+( [\\p{L}0-9]+)*$" - }, - "required": true, - "type": "string" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.6/commands/setName" - }, - "setType": { - "isExecutable": true, - "name": "setType", - "params": { - "type": { - "constraints": { - "enum": [ - "bathroom", - "bedroom", - "hallway", - "livingroom", - "kitchen", - "office", - "nursery", - "toilet", - "other" - ] - }, - "required": true, - "type": "string" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.6/commands/setType" - } - }, - "deviceId": "RoomControl-1", - "feature": "rooms.6", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "actors": { - "type": "array", - "value": [ - { - "deviceId": "zigbee-################" - }, - { - "deviceId": "zigbee-################-4" - } - ] - }, - "name": { - "type": "string", - "value": "Gäste WC" - }, - "type": { - "type": "string", - "value": "toilet" - } - }, - "timestamp": "2026-04-15T21:00:31.581Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.6" - }, - { - "apiVersion": 1, - "commands": {}, - "deviceId": "RoomControl-1", - "feature": "rooms.6.condensationRisk", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "value": { - "type": "boolean", - "value": false - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.6.condensationRisk" - }, - { - "apiVersion": 1, - "commands": { - "setTemperature": { - "isExecutable": true, - "name": "setTemperature", - "params": { - "targetTemperature": { - "constraints": { - "max": 30, - "min": 8, - "stepping": 0.5 - }, - "required": true, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.6.operating.programs.comfortHeating/commands/setTemperature" - } - }, - "deviceId": "RoomControl-1", - "feature": "rooms.6.operating.programs.comfortHeating", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "active": { - "type": "boolean", - "value": false - }, - "temperature": { - "type": "number", - "unit": "celsius", - "value": 22 - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.6.operating.programs.comfortHeating" - }, - { - "apiVersion": 1, - "commands": { - "setTemperature": { - "isExecutable": true, - "name": "setTemperature", - "params": { - "targetTemperature": { - "constraints": { - "max": 30, - "min": 8, - "stepping": 0.5 - }, - "required": true, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.6.operating.programs.normalHeating/commands/setTemperature" - } - }, - "deviceId": "RoomControl-1", - "feature": "rooms.6.operating.programs.normalHeating", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "active": { - "type": "boolean", - "value": false - }, - "temperature": { - "type": "number", - "unit": "celsius", - "value": 20 - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.6.operating.programs.normalHeating" - }, - { - "apiVersion": 1, - "commands": { - "setTemperature": { - "isExecutable": true, - "name": "setTemperature", - "params": { - "targetTemperature": { - "constraints": { - "max": 30, - "min": 8, - "stepping": 0.5 - }, - "required": true, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.6.operating.programs.reducedHeating/commands/setTemperature" - } - }, - "deviceId": "RoomControl-1", - "feature": "rooms.6.operating.programs.reducedHeating", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "active": { - "type": "boolean", - "value": false - }, - "temperature": { - "type": "number", - "unit": "celsius", - "value": 19.5 - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.6.operating.programs.reducedHeating" - }, - { - "apiVersion": 1, - "commands": {}, - "deviceId": "RoomControl-1", - "feature": "rooms.6.operating.state", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "demand": { - "type": "string", - "value": "energySaving" - }, - "level": { - "type": "string", - "value": "normal" - }, - "modifier": { - "type": "string", - "value": "none" - }, - "reason": { - "type": "string", - "value": "schedule" - } - }, - "timestamp": "2026-04-16T03:58:48.070Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.6.operating.state" - }, - { - "apiVersion": 1, - "commands": { - "activate": { - "isExecutable": true, - "name": "activate", - "params": { - "temperature": { - "constraints": { - "max": 30, - "min": 8, - "stepping": 0.5 - }, - "required": true, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.6.quickmodes.manualTillNextSchedule/commands/activate" - }, - "deactivate": { - "isExecutable": true, - "name": "deactivate", - "params": {}, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.6.quickmodes.manualTillNextSchedule/commands/deactivate" - }, - "setTemperature": { - "isExecutable": false, - "name": "setTemperature", - "params": { - "targetTemperature": { - "constraints": { - "max": 30, - "min": 8, - "stepping": 0.5 - }, - "required": true, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.6.quickmodes.manualTillNextSchedule/commands/setTemperature" - } - }, - "deviceId": "RoomControl-1", - "feature": "rooms.6.quickmodes.manualTillNextSchedule", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "active": { - "type": "boolean", - "value": false - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.6.quickmodes.manualTillNextSchedule" - }, - { - "apiVersion": 1, - "commands": { - "resetSchedule": { - "isExecutable": true, - "name": "resetSchedule", - "params": {}, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.6.schedule/commands/resetSchedule" - }, - "setSchedule": { - "isExecutable": true, - "name": "setSchedule", - "params": { - "newSchedule": { - "constraints": { - "defaultMode": "reduced", - "maxEntries": 4, - "modes": [ - "normal", - "comfort" - ], - "overlapAllowed": false, - "resolution": 10 - }, - "required": true, - "type": "Schedule" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.6.schedule/commands/setSchedule" - } - }, - "deviceId": "RoomControl-1", - "feature": "rooms.6.schedule", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "active": { - "type": "boolean", - "value": true - }, - "entries": { - "type": "Schedule", - "value": { - "fri": [ - { - "end": "22:00", - "mode": "normal", - "position": 0, - "start": "06:00" - } - ], - "mon": [ - { - "end": "22:00", - "mode": "normal", - "position": 0, - "start": "06:00" - } - ], - "sat": [ - { - "end": "22:00", - "mode": "normal", - "position": 0, - "start": "06:00" - } - ], - "sun": [ - { - "end": "22:00", - "mode": "normal", - "position": 0, - "start": "06:00" - } - ], - "thu": [ - { - "end": "22:00", - "mode": "normal", - "position": 0, - "start": "06:00" - } - ], - "tue": [ - { - "end": "22:00", - "mode": "normal", - "position": 0, - "start": "06:00" - } - ], - "wed": [ - { - "end": "22:00", - "mode": "normal", - "position": 0, - "start": "06:00" - } - ] - } - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.6.schedule" - }, - { - "apiVersion": 1, - "commands": {}, - "deviceId": "RoomControl-1", - "feature": "rooms.6.sensors.co2", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "status": { - "type": "string", - "value": "notConnected" - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.6.sensors.co2" - }, - { - "apiVersion": 1, - "commands": {}, - "deviceId": "RoomControl-1", - "feature": "rooms.6.sensors.humidity", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "status": { - "type": "string", - "value": "connected" - }, - "value": { - "type": "number", - "unit": "percent", - "value": 49 - } - }, - "timestamp": "2026-04-16T11:48:59.239Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.6.sensors.humidity" - }, - { - "apiVersion": 1, - "commands": {}, - "deviceId": "RoomControl-1", - "feature": "rooms.6.sensors.temperature", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "status": { - "type": "string", - "value": "connected" - }, - "value": { - "type": "number", - "unit": "celsius", - "value": 21 - } - }, - "timestamp": "2026-04-16T11:18:59.714Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.6.sensors.temperature" - }, - { - "apiVersion": 1, - "commands": { - "addActor": { - "constraints": { - "enum": [ - "cs", - "fht", - "trv", - "airQualitySensor", - "remoteControllerSensor" - ] - }, - "isExecutable": true, - "name": "addActor", - "params": { - "actorDeviceId": { - "constraints": {}, - "required": true, - "type": "string" - }, - "heatingCircuit": { - "constraints": { - "max": 3, - "min": 0, - "stepping": 1 - }, - "required": false, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.7/commands/addActor" - }, - "moveActor": { - "isExecutable": true, - "name": "moveActor", - "params": { - "actorDeviceId": { - "constraints": {}, - "required": true, - "type": "string" - }, - "heatingCircuit": { - "constraints": { - "max": 3, - "min": 0, - "stepping": 1 - }, - "required": false, - "type": "number" - }, - "newRoomId": { - "constraints": { - "max": 23, - "min": 0, - "stepping": 1 - }, - "required": true, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.7/commands/moveActor" - }, - "remove": { - "isExecutable": true, - "name": "remove", - "params": {}, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.7/commands/remove" - }, - "removeActor": { - "isExecutable": true, - "name": "removeActor", - "params": { - "actorDeviceId": { - "constraints": {}, - "required": true, - "type": "string" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.7/commands/removeActor" - }, - "setName": { - "isExecutable": true, - "name": "setName", - "params": { - "name": { - "constraints": { - "maxLength": 39, - "minLength": 1, - "regEx": "^[\\p{L}0-9]+( [\\p{L}0-9]+)*$" - }, - "required": true, - "type": "string" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.7/commands/setName" - }, - "setType": { - "isExecutable": true, - "name": "setType", - "params": { - "type": { - "constraints": { - "enum": [ - "bathroom", - "bedroom", - "hallway", - "livingroom", - "kitchen", - "office", - "nursery", - "toilet", - "other" - ] - }, - "required": true, - "type": "string" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.7/commands/setType" - } - }, - "deviceId": "RoomControl-1", - "feature": "rooms.7", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "actors": { - "type": "array", - "value": [ - { - "deviceId": "zigbee-################-3" - }, - { - "deviceId": "zigbee-################", - "heatingCircuit": 0 - } - ] - }, - "name": { - "type": "string", - "value": "Kids Room 2" - }, - "type": { - "type": "string", - "value": "nursery" - } - }, - "timestamp": "2026-04-15T21:00:31.581Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.7" - }, - { - "apiVersion": 1, - "commands": {}, - "deviceId": "RoomControl-1", - "feature": "rooms.7.condensationRisk", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "value": { - "type": "boolean", - "value": false - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.7.condensationRisk" - }, - { - "apiVersion": 1, - "commands": { - "setTemperature": { - "isExecutable": true, - "name": "setTemperature", - "params": { - "targetTemperature": { - "constraints": { - "max": 30, - "min": 8, - "stepping": 0.5 - }, - "required": true, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.7.operating.programs.comfortHeating/commands/setTemperature" - } - }, - "deviceId": "RoomControl-1", - "feature": "rooms.7.operating.programs.comfortHeating", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "active": { - "type": "boolean", - "value": false - }, - "temperature": { - "type": "number", - "unit": "celsius", - "value": 22 - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.7.operating.programs.comfortHeating" - }, - { - "apiVersion": 1, - "commands": { - "setTemperature": { - "isExecutable": true, - "name": "setTemperature", - "params": { - "targetTemperature": { - "constraints": { - "max": 30, - "min": 8, - "stepping": 0.5 - }, - "required": true, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.7.operating.programs.normalHeating/commands/setTemperature" - } - }, - "deviceId": "RoomControl-1", - "feature": "rooms.7.operating.programs.normalHeating", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "active": { - "type": "boolean", - "value": false - }, - "temperature": { - "type": "number", - "unit": "celsius", - "value": 20 - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.7.operating.programs.normalHeating" - }, - { - "apiVersion": 1, - "commands": { - "setTemperature": { - "isExecutable": true, - "name": "setTemperature", - "params": { - "targetTemperature": { - "constraints": { - "max": 30, - "min": 8, - "stepping": 0.5 - }, - "required": true, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.7.operating.programs.reducedHeating/commands/setTemperature" - } - }, - "deviceId": "RoomControl-1", - "feature": "rooms.7.operating.programs.reducedHeating", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "active": { - "type": "boolean", - "value": false - }, - "temperature": { - "type": "number", - "unit": "celsius", - "value": 18 - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.7.operating.programs.reducedHeating" - }, - { - "apiVersion": 1, - "commands": {}, - "deviceId": "RoomControl-1", - "feature": "rooms.7.operating.state", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "demand": { - "type": "string", - "value": "energySaving" - }, - "level": { - "type": "string", - "value": "normal" - }, - "modifier": { - "type": "string", - "value": "none" - }, - "reason": { - "type": "string", - "value": "schedule" - } - }, - "timestamp": "2026-04-16T03:58:48.070Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.7.operating.state" - }, - { - "apiVersion": 1, - "commands": { - "activate": { - "isExecutable": true, - "name": "activate", - "params": { - "temperature": { - "constraints": { - "max": 30, - "min": 8, - "stepping": 0.5 - }, - "required": true, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.7.quickmodes.manualTillNextSchedule/commands/activate" - }, - "deactivate": { - "isExecutable": true, - "name": "deactivate", - "params": {}, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.7.quickmodes.manualTillNextSchedule/commands/deactivate" - }, - "setTemperature": { - "isExecutable": false, - "name": "setTemperature", - "params": { - "targetTemperature": { - "constraints": { - "max": 30, - "min": 8, - "stepping": 0.5 - }, - "required": true, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.7.quickmodes.manualTillNextSchedule/commands/setTemperature" - } - }, - "deviceId": "RoomControl-1", - "feature": "rooms.7.quickmodes.manualTillNextSchedule", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "active": { - "type": "boolean", - "value": false - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.7.quickmodes.manualTillNextSchedule" - }, - { - "apiVersion": 1, - "commands": { - "resetSchedule": { - "isExecutable": true, - "name": "resetSchedule", - "params": {}, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.7.schedule/commands/resetSchedule" - }, - "setSchedule": { - "isExecutable": true, - "name": "setSchedule", - "params": { - "newSchedule": { - "constraints": { - "defaultMode": "reduced", - "maxEntries": 4, - "modes": [ - "normal", - "comfort" - ], - "overlapAllowed": false, - "resolution": 10 - }, - "required": true, - "type": "Schedule" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.7.schedule/commands/setSchedule" - } - }, - "deviceId": "RoomControl-1", - "feature": "rooms.7.schedule", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "active": { - "type": "boolean", - "value": true - }, - "entries": { - "type": "Schedule", - "value": { - "fri": [ - { - "end": "22:00", - "mode": "normal", - "position": 0, - "start": "06:00" - } - ], - "mon": [ - { - "end": "22:00", - "mode": "normal", - "position": 0, - "start": "06:00" - } - ], - "sat": [ - { - "end": "22:00", - "mode": "normal", - "position": 0, - "start": "06:00" - } - ], - "sun": [ - { - "end": "22:00", - "mode": "normal", - "position": 0, - "start": "06:00" - } - ], - "thu": [ - { - "end": "22:00", - "mode": "normal", - "position": 0, - "start": "06:00" - } - ], - "tue": [ - { - "end": "22:00", - "mode": "normal", - "position": 0, - "start": "06:00" - } - ], - "wed": [ - { - "end": "22:00", - "mode": "normal", - "position": 0, - "start": "06:00" - } - ] - } - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.7.schedule" - }, - { - "apiVersion": 1, - "commands": {}, - "deviceId": "RoomControl-1", - "feature": "rooms.7.sensors.co2", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "status": { - "type": "string", - "value": "notConnected" - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.7.sensors.co2" - }, - { - "apiVersion": 1, - "commands": {}, - "deviceId": "RoomControl-1", - "feature": "rooms.7.sensors.humidity", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "status": { - "type": "string", - "value": "connected" - }, - "value": { - "type": "number", - "unit": "percent", - "value": 49 - } - }, - "timestamp": "2026-04-16T11:21:59.613Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.7.sensors.humidity" - }, - { - "apiVersion": 1, - "commands": {}, - "deviceId": "RoomControl-1", - "feature": "rooms.7.sensors.temperature", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "status": { - "type": "string", - "value": "connected" - }, - "value": { - "type": "number", - "unit": "celsius", - "value": 21.1 - } - }, - "timestamp": "2026-04-16T11:21:59.613Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.7.sensors.temperature" - }, - { - "apiVersion": 1, - "commands": { - "addActor": { - "constraints": { - "enum": [ - "cs", - "fht", - "trv", - "airQualitySensor", - "remoteControllerSensor" - ] - }, - "isExecutable": true, - "name": "addActor", - "params": { - "actorDeviceId": { - "constraints": {}, - "required": true, - "type": "string" - }, - "heatingCircuit": { - "constraints": { - "max": 3, - "min": 0, - "stepping": 1 - }, - "required": false, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.8/commands/addActor" - }, - "moveActor": { - "isExecutable": true, - "name": "moveActor", - "params": { - "actorDeviceId": { - "constraints": {}, - "required": true, - "type": "string" - }, - "heatingCircuit": { - "constraints": { - "max": 3, - "min": 0, - "stepping": 1 - }, - "required": false, - "type": "number" - }, - "newRoomId": { - "constraints": { - "max": 23, - "min": 0, - "stepping": 1 - }, - "required": true, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.8/commands/moveActor" - }, - "remove": { - "isExecutable": true, - "name": "remove", - "params": {}, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.8/commands/remove" - }, - "removeActor": { - "isExecutable": true, - "name": "removeActor", - "params": { - "actorDeviceId": { - "constraints": {}, - "required": true, - "type": "string" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.8/commands/removeActor" - }, - "setName": { - "isExecutable": true, - "name": "setName", - "params": { - "name": { - "constraints": { - "maxLength": 39, - "minLength": 1, - "regEx": "^[\\p{L}0-9]+( [\\p{L}0-9]+)*$" - }, - "required": true, - "type": "string" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.8/commands/setName" - }, - "setType": { - "isExecutable": true, - "name": "setType", - "params": { - "type": { - "constraints": { - "enum": [ - "bathroom", - "bedroom", - "hallway", - "livingroom", - "kitchen", - "office", - "nursery", - "toilet", - "other" - ] - }, - "required": true, - "type": "string" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.8/commands/setType" - } - }, - "deviceId": "RoomControl-1", - "feature": "rooms.8", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "actors": { - "type": "array", - "value": [ - { - "deviceId": "zigbee-################", - "heatingCircuit": 0 - }, - { - "deviceId": "zigbee-################-6" - } - ] - }, - "name": { - "type": "string", - "value": "Büro" - }, - "type": { - "type": "string", - "value": "office" - } - }, - "timestamp": "2026-04-15T21:00:31.581Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.8" - }, - { - "apiVersion": 1, - "commands": {}, - "deviceId": "RoomControl-1", - "feature": "rooms.8.condensationRisk", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "value": { - "type": "boolean", - "value": false - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.8.condensationRisk" - }, - { - "apiVersion": 1, - "commands": { - "setTemperature": { - "isExecutable": true, - "name": "setTemperature", - "params": { - "targetTemperature": { - "constraints": { - "max": 30, - "min": 8, - "stepping": 0.5 - }, - "required": true, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.8.operating.programs.comfortHeating/commands/setTemperature" - } - }, - "deviceId": "RoomControl-1", - "feature": "rooms.8.operating.programs.comfortHeating", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "active": { - "type": "boolean", - "value": false - }, - "temperature": { - "type": "number", - "unit": "celsius", - "value": 22 - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.8.operating.programs.comfortHeating" - }, - { - "apiVersion": 1, - "commands": { - "setTemperature": { - "isExecutable": true, - "name": "setTemperature", - "params": { - "targetTemperature": { - "constraints": { - "max": 30, - "min": 8, - "stepping": 0.5 - }, - "required": true, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.8.operating.programs.normalHeating/commands/setTemperature" - } - }, - "deviceId": "RoomControl-1", - "feature": "rooms.8.operating.programs.normalHeating", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "active": { - "type": "boolean", - "value": false - }, - "temperature": { - "type": "number", - "unit": "celsius", - "value": 20 - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.8.operating.programs.normalHeating" - }, - { - "apiVersion": 1, - "commands": { - "setTemperature": { - "isExecutable": true, - "name": "setTemperature", - "params": { - "targetTemperature": { - "constraints": { - "max": 30, - "min": 8, - "stepping": 0.5 - }, - "required": true, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.8.operating.programs.reducedHeating/commands/setTemperature" - } - }, - "deviceId": "RoomControl-1", - "feature": "rooms.8.operating.programs.reducedHeating", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "active": { - "type": "boolean", - "value": false - }, - "temperature": { - "type": "number", - "unit": "celsius", - "value": 18 - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.8.operating.programs.reducedHeating" - }, - { - "apiVersion": 1, - "commands": {}, - "deviceId": "RoomControl-1", - "feature": "rooms.8.operating.state", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "demand": { - "type": "string", - "value": "energySaving" - }, - "level": { - "type": "string", - "value": "normal" - }, - "modifier": { - "type": "string", - "value": "none" - }, - "reason": { - "type": "string", - "value": "schedule" - } - }, - "timestamp": "2026-04-16T03:58:48.070Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.8.operating.state" - }, - { - "apiVersion": 1, - "commands": { - "activate": { - "isExecutable": true, - "name": "activate", - "params": { - "temperature": { - "constraints": { - "max": 30, - "min": 8, - "stepping": 0.5 - }, - "required": true, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.8.quickmodes.manualTillNextSchedule/commands/activate" - }, - "deactivate": { - "isExecutable": true, - "name": "deactivate", - "params": {}, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.8.quickmodes.manualTillNextSchedule/commands/deactivate" - }, - "setTemperature": { - "isExecutable": false, - "name": "setTemperature", - "params": { - "targetTemperature": { - "constraints": { - "max": 30, - "min": 8, - "stepping": 0.5 - }, - "required": true, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.8.quickmodes.manualTillNextSchedule/commands/setTemperature" - } - }, - "deviceId": "RoomControl-1", - "feature": "rooms.8.quickmodes.manualTillNextSchedule", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "active": { - "type": "boolean", - "value": false - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.8.quickmodes.manualTillNextSchedule" - }, - { - "apiVersion": 1, - "commands": { - "resetSchedule": { - "isExecutable": true, - "name": "resetSchedule", - "params": {}, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.8.schedule/commands/resetSchedule" - }, - "setSchedule": { - "isExecutable": true, - "name": "setSchedule", - "params": { - "newSchedule": { - "constraints": { - "defaultMode": "reduced", - "maxEntries": 4, - "modes": [ - "normal", - "comfort" - ], - "overlapAllowed": false, - "resolution": 10 - }, - "required": true, - "type": "Schedule" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.8.schedule/commands/setSchedule" - } - }, - "deviceId": "RoomControl-1", - "feature": "rooms.8.schedule", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "active": { - "type": "boolean", - "value": true - }, - "entries": { - "type": "Schedule", - "value": { - "fri": [ - { - "end": "22:00", - "mode": "normal", - "position": 0, - "start": "06:00" - } - ], - "mon": [ - { - "end": "22:00", - "mode": "normal", - "position": 0, - "start": "06:00" - } - ], - "sat": [ - { - "end": "22:00", - "mode": "normal", - "position": 0, - "start": "06:00" - } - ], - "sun": [ - { - "end": "22:00", - "mode": "normal", - "position": 0, - "start": "06:00" - } - ], - "thu": [ - { - "end": "22:00", - "mode": "normal", - "position": 0, - "start": "06:00" - } - ], - "tue": [ - { - "end": "22:00", - "mode": "normal", - "position": 0, - "start": "06:00" - } - ], - "wed": [ - { - "end": "22:00", - "mode": "normal", - "position": 0, - "start": "06:00" - } - ] - } - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.8.schedule" - }, - { - "apiVersion": 1, - "commands": {}, - "deviceId": "RoomControl-1", - "feature": "rooms.8.sensors.co2", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "status": { - "type": "string", - "value": "notConnected" - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.8.sensors.co2" - }, - { - "apiVersion": 1, - "commands": {}, - "deviceId": "RoomControl-1", - "feature": "rooms.8.sensors.humidity", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "status": { - "type": "string", - "value": "connected" - }, - "value": { - "type": "number", - "unit": "percent", - "value": 41 - } - }, - "timestamp": "2026-04-16T12:00:58.387Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.8.sensors.humidity" - }, - { - "apiVersion": 1, - "commands": {}, - "deviceId": "RoomControl-1", - "feature": "rooms.8.sensors.temperature", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "status": { - "type": "string", - "value": "connected" - }, - "value": { - "type": "number", - "unit": "celsius", - "value": 24.8 - } - }, - "timestamp": "2026-04-16T12:00:58.387Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.8.sensors.temperature" - }, - { - "apiVersion": 1, - "commands": { - "addActor": { - "constraints": { - "enum": [ - "cs", - "fht", - "trv", - "airQualitySensor", - "remoteControllerSensor" - ] - }, - "isExecutable": true, - "name": "addActor", - "params": { - "actorDeviceId": { - "constraints": {}, - "required": true, - "type": "string" - }, - "heatingCircuit": { - "constraints": { - "max": 3, - "min": 0, - "stepping": 1 - }, - "required": false, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.9/commands/addActor" - }, - "moveActor": { - "isExecutable": true, - "name": "moveActor", - "params": { - "actorDeviceId": { - "constraints": {}, - "required": true, - "type": "string" - }, - "heatingCircuit": { - "constraints": { - "max": 3, - "min": 0, - "stepping": 1 - }, - "required": false, - "type": "number" - }, - "newRoomId": { - "constraints": { - "max": 23, - "min": 0, - "stepping": 1 - }, - "required": true, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.9/commands/moveActor" - }, - "remove": { - "isExecutable": true, - "name": "remove", - "params": {}, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.9/commands/remove" - }, - "removeActor": { - "isExecutable": true, - "name": "removeActor", - "params": { - "actorDeviceId": { - "constraints": {}, - "required": true, - "type": "string" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.9/commands/removeActor" - }, - "setName": { - "isExecutable": true, - "name": "setName", - "params": { - "name": { - "constraints": { - "maxLength": 39, - "minLength": 1, - "regEx": "^[\\p{L}0-9]+( [\\p{L}0-9]+)*$" - }, - "required": true, - "type": "string" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.9/commands/setName" - }, - "setType": { - "isExecutable": true, - "name": "setType", - "params": { - "type": { - "constraints": { - "enum": [ - "bathroom", - "bedroom", - "hallway", - "livingroom", - "kitchen", - "office", - "nursery", - "toilet", - "other" - ] - }, - "required": true, - "type": "string" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.9/commands/setType" - } - }, - "deviceId": "RoomControl-1", - "feature": "rooms.9", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "actors": { - "type": "array", - "value": [ - { - "deviceId": "zigbee-################", - "heatingCircuit": 0 - }, - { - "deviceId": "zigbee-################-5" - } - ] - }, - "name": { - "type": "string", - "value": "Utility" - }, - "type": { - "type": "string", - "value": "other" - } - }, - "timestamp": "2026-04-15T21:00:31.581Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.9" - }, - { - "apiVersion": 1, - "commands": {}, - "deviceId": "RoomControl-1", - "feature": "rooms.9.condensationRisk", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "value": { - "type": "boolean", - "value": false - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.9.condensationRisk" - }, - { - "apiVersion": 1, - "commands": { - "setTemperature": { - "isExecutable": true, - "name": "setTemperature", - "params": { - "targetTemperature": { - "constraints": { - "max": 30, - "min": 8, - "stepping": 0.5 - }, - "required": true, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.9.operating.programs.comfortHeating/commands/setTemperature" - } - }, - "deviceId": "RoomControl-1", - "feature": "rooms.9.operating.programs.comfortHeating", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "active": { - "type": "boolean", - "value": false - }, - "temperature": { - "type": "number", - "unit": "celsius", - "value": 22 - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.9.operating.programs.comfortHeating" - }, - { - "apiVersion": 1, - "commands": { - "setTemperature": { - "isExecutable": true, - "name": "setTemperature", - "params": { - "targetTemperature": { - "constraints": { - "max": 30, - "min": 8, - "stepping": 0.5 - }, - "required": true, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.9.operating.programs.normalHeating/commands/setTemperature" - } - }, - "deviceId": "RoomControl-1", - "feature": "rooms.9.operating.programs.normalHeating", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "active": { - "type": "boolean", - "value": false - }, - "temperature": { - "type": "number", - "unit": "celsius", - "value": 20 - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.9.operating.programs.normalHeating" - }, - { - "apiVersion": 1, - "commands": { - "setTemperature": { - "isExecutable": true, - "name": "setTemperature", - "params": { - "targetTemperature": { - "constraints": { - "max": 30, - "min": 8, - "stepping": 0.5 - }, - "required": true, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.9.operating.programs.reducedHeating/commands/setTemperature" - } - }, - "deviceId": "RoomControl-1", - "feature": "rooms.9.operating.programs.reducedHeating", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "active": { - "type": "boolean", - "value": false - }, - "temperature": { - "type": "number", - "unit": "celsius", - "value": 18 - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.9.operating.programs.reducedHeating" - }, - { - "apiVersion": 1, - "commands": {}, - "deviceId": "RoomControl-1", - "feature": "rooms.9.operating.state", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "demand": { - "type": "string", - "value": "energySaving" - }, - "level": { - "type": "string", - "value": "normal" - }, - "modifier": { - "type": "string", - "value": "none" - }, - "reason": { - "type": "string", - "value": "schedule" - } - }, - "timestamp": "2026-04-16T03:58:48.070Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.9.operating.state" - }, - { - "apiVersion": 1, - "commands": { - "activate": { - "isExecutable": true, - "name": "activate", - "params": { - "temperature": { - "constraints": { - "max": 30, - "min": 8, - "stepping": 0.5 - }, - "required": true, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.9.quickmodes.manualTillNextSchedule/commands/activate" - }, - "deactivate": { - "isExecutable": true, - "name": "deactivate", - "params": {}, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.9.quickmodes.manualTillNextSchedule/commands/deactivate" - }, - "setTemperature": { - "isExecutable": false, - "name": "setTemperature", - "params": { - "targetTemperature": { - "constraints": { - "max": 30, - "min": 8, - "stepping": 0.5 - }, - "required": true, - "type": "number" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.9.quickmodes.manualTillNextSchedule/commands/setTemperature" - } - }, - "deviceId": "RoomControl-1", - "feature": "rooms.9.quickmodes.manualTillNextSchedule", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "active": { - "type": "boolean", - "value": false - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.9.quickmodes.manualTillNextSchedule" - }, - { - "apiVersion": 1, - "commands": { - "resetSchedule": { - "isExecutable": true, - "name": "resetSchedule", - "params": {}, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.9.schedule/commands/resetSchedule" - }, - "setSchedule": { - "isExecutable": true, - "name": "setSchedule", - "params": { - "newSchedule": { - "constraints": { - "defaultMode": "reduced", - "maxEntries": 4, - "modes": [ - "normal", - "comfort" - ], - "overlapAllowed": false, - "resolution": 10 - }, - "required": true, - "type": "Schedule" - } - }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.9.schedule/commands/setSchedule" - } - }, - "deviceId": "RoomControl-1", - "feature": "rooms.9.schedule", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "active": { - "type": "boolean", - "value": true - }, - "entries": { - "type": "Schedule", - "value": { - "fri": [ - { - "end": "22:00", - "mode": "normal", - "position": 0, - "start": "06:00" - } - ], - "mon": [ - { - "end": "22:00", - "mode": "normal", - "position": 0, - "start": "06:00" - } - ], - "sat": [ - { - "end": "22:00", - "mode": "normal", - "position": 0, - "start": "06:00" - } - ], - "sun": [ - { - "end": "22:00", - "mode": "normal", - "position": 0, - "start": "06:00" - } - ], - "thu": [ - { - "end": "22:00", - "mode": "normal", - "position": 0, - "start": "06:00" - } - ], - "tue": [ - { - "end": "22:00", - "mode": "normal", - "position": 0, - "start": "06:00" - } - ], - "wed": [ - { - "end": "22:00", - "mode": "normal", - "position": 0, - "start": "06:00" - } - ] - } - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.9.schedule" - }, - { - "apiVersion": 1, - "commands": {}, - "deviceId": "RoomControl-1", - "feature": "rooms.9.sensors.co2", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "status": { - "type": "string", - "value": "notConnected" - } - }, - "timestamp": "2026-04-14T09:32:06.873Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.9.sensors.co2" - }, - { - "apiVersion": 1, - "commands": {}, - "deviceId": "RoomControl-1", - "feature": "rooms.9.sensors.humidity", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "status": { - "type": "string", - "value": "connected" - }, - "value": { - "type": "number", - "unit": "percent", - "value": 30 - } - }, - "timestamp": "2026-04-16T11:57:58.672Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.9.sensors.humidity" - }, - { - "apiVersion": 1, - "commands": {}, - "deviceId": "RoomControl-1", - "feature": "rooms.9.sensors.temperature", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "status": { - "type": "string", - "value": "connected" - }, - "value": { - "type": "number", - "unit": "celsius", - "value": 28.7 - } - }, - "timestamp": "2026-04-16T11:57:58.672Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.9.sensors.temperature" - } - ] -} From c07d4f4dc0cfd7c7a8d9eadc436e28c3b9b5b302 Mon Sep 17 00:00:00 2001 From: Christian Lackas Date: Thu, 7 May 2026 21:07:56 +0200 Subject: [PATCH 3/6] feat!: prune RoomControl to IoT-scope methods, rebuild fixture The previous fixture and the matching RoomControl methods were sourced from an Internal-scope dump. The features they relied on (rooms parent, room metadata, schedules, operating programs, quickmodes) are not returned by the public IoT scope used by all developer-portal client_ids, so those methods silently fail for end users. This commit cuts the loss to what actually works on IoT: - New tests/response/RoomControl.json: 2 rooms, 8 features (sensors.temperature, sensors.humidity, co2, condensationRisk per room) sourced from a real IoT-scope dump. - RoomControl reduced to four methods: getRoomTemperature, getRoomHumidity, getRoomCO2, getRoomCondensationRisk. - Bug fix: getRoomCO2 now reads rooms.{id}.co2 with property concentration. Previously it read rooms.{id}.sensors.co2.value, which the IoT scope does not return. - Tests adjusted to the new fixture and surviving method set. BREAKING CHANGE: Removed from RoomControl: getAvailableRooms, getRoomActorIds, getRoomName, getRoomType, getRoomOperatingState{Level,Demand,Reason}, getRoom{Normal,Reduced,Comfort}HeatingTemperature plus setters, getRoomSchedule, getRoomManualTillNextScheduleActive plus activate/deactivateRoomManualTillNextSchedule. These all relied on features the IoT scope does not return. --- PyViCare/PyViCareRoomControl.py | 106 +-------------------- tests/response/RoomControl.json | 162 ++++++++++++++++++++++++++++++++ tests/test_RoomControl.py | 57 ++--------- 3 files changed, 176 insertions(+), 149 deletions(-) create mode 100644 tests/response/RoomControl.json diff --git a/PyViCare/PyViCareRoomControl.py b/PyViCare/PyViCareRoomControl.py index 2a5127ed..d2406717 100644 --- a/PyViCare/PyViCareRoomControl.py +++ b/PyViCare/PyViCareRoomControl.py @@ -1,45 +1,14 @@ -import logging -from typing import Any, cast - from PyViCare.PyViCareDevice import Device -from PyViCare.PyViCareUtils import PyViCareNotSupportedFeatureError, handleNotSupported, handleAPICommandErrors - -logger = logging.getLogger(__name__) -logger.addHandler(logging.NullHandler()) class RoomControl(Device): """Viessmann RoomControl virtual device. - Aggregates room sensor data and heating programs per room. + Exposes per-room sensor readings. The IoT scope only returns sensor + data; room metadata, schedules and operating programs are not + available to public client_ids. """ - @handleNotSupported - def getAvailableRooms(self) -> list[str]: - return cast(list[str], self.service.getProperty("rooms")["properties"]["enabled"]["value"]) - - def getRoomActorIds(self, room_id: str) -> list[str]: - """Return list of actor device IDs for a room.""" - try: - actors = self.service.getProperty(f"rooms.{room_id}")["properties"]["actors"]["value"] - return [str(a["deviceId"]) for a in actors] - except (PyViCareNotSupportedFeatureError, KeyError): - return [] - - def getRoomName(self, room_id: str) -> str | None: - try: - return str(self.service.getProperty(f"rooms.{room_id}")["properties"]["name"]["value"]) - except (PyViCareNotSupportedFeatureError, KeyError): - return None - - def getRoomType(self, room_id: str) -> str | None: - try: - return str(self.service.getProperty(f"rooms.{room_id}")["properties"]["type"]["value"]) - except (PyViCareNotSupportedFeatureError, KeyError): - return None - - # --- Sensors --- - def getRoomTemperature(self, room_id: str) -> float: return float(self.service.getProperty(f"rooms.{room_id}.sensors.temperature")["properties"]["value"]["value"]) @@ -47,74 +16,7 @@ def getRoomHumidity(self, room_id: str) -> float: return float(self.service.getProperty(f"rooms.{room_id}.sensors.humidity")["properties"]["value"]["value"]) def getRoomCO2(self, room_id: str) -> int: - return int(self.service.getProperty(f"rooms.{room_id}.sensors.co2")["properties"]["value"]["value"]) + return int(self.service.getProperty(f"rooms.{room_id}.co2")["properties"]["concentration"]["value"]) def getRoomCondensationRisk(self, room_id: str) -> bool: return bool(self.service.getProperty(f"rooms.{room_id}.condensationRisk")["properties"]["value"]["value"]) - - # --- Operating state --- - - def getRoomOperatingStateLevel(self, room_id: str) -> str: - return str(self.service.getProperty(f"rooms.{room_id}.operating.state")["properties"]["level"]["value"]) - - def getRoomOperatingStateDemand(self, room_id: str) -> str: - return str(self.service.getProperty(f"rooms.{room_id}.operating.state")["properties"]["demand"]["value"]) - - def getRoomOperatingStateReason(self, room_id: str) -> str: - return str(self.service.getProperty(f"rooms.{room_id}.operating.state")["properties"]["reason"]["value"]) - - # --- Heating programs --- - - def getRoomNormalHeatingTemperature(self, room_id: str) -> float: - return float(self.service.getProperty(f"rooms.{room_id}.operating.programs.normalHeating")["properties"]["temperature"]["value"]) - - @handleAPICommandErrors - def setRoomNormalHeatingTemperature(self, room_id: str, temperature: float) -> None: - self.service.setProperty(f"rooms.{room_id}.operating.programs.normalHeating", "setTemperature", - {"targetTemperature": temperature}) - - def getRoomReducedHeatingTemperature(self, room_id: str) -> float: - return float(self.service.getProperty(f"rooms.{room_id}.operating.programs.reducedHeating")["properties"]["temperature"]["value"]) - - @handleAPICommandErrors - def setRoomReducedHeatingTemperature(self, room_id: str, temperature: float) -> None: - self.service.setProperty(f"rooms.{room_id}.operating.programs.reducedHeating", "setTemperature", - {"targetTemperature": temperature}) - - def getRoomComfortHeatingTemperature(self, room_id: str) -> float: - return float(self.service.getProperty(f"rooms.{room_id}.operating.programs.comfortHeating")["properties"]["temperature"]["value"]) - - @handleAPICommandErrors - def setRoomComfortHeatingTemperature(self, room_id: str, temperature: float) -> None: - self.service.setProperty(f"rooms.{room_id}.operating.programs.comfortHeating", "setTemperature", - {"targetTemperature": temperature}) - - # --- Schedule --- - - def getRoomSchedule(self, room_id: str) -> dict[str, Any]: - props = self.service.getProperty(f"rooms.{room_id}.schedule")["properties"] - return { - "active": props["active"]["value"], - "mon": props["entries"]["value"]["mon"], - "tue": props["entries"]["value"]["tue"], - "wed": props["entries"]["value"]["wed"], - "thu": props["entries"]["value"]["thu"], - "fri": props["entries"]["value"]["fri"], - "sat": props["entries"]["value"]["sat"], - "sun": props["entries"]["value"]["sun"], - } - - # --- Quick modes --- - - def getRoomManualTillNextScheduleActive(self, room_id: str) -> bool: - return bool(self.service.getProperty( - f"rooms.{room_id}.quickmodes.manualTillNextSchedule")["properties"]["active"]["value"]) - - @handleAPICommandErrors - def activateRoomManualTillNextSchedule(self, room_id: str, temperature: float) -> None: - self.service.setProperty(f"rooms.{room_id}.quickmodes.manualTillNextSchedule", "activate", - {"temperature": temperature}) - - @handleAPICommandErrors - def deactivateRoomManualTillNextSchedule(self, room_id: str) -> None: - self.service.setProperty(f"rooms.{room_id}.quickmodes.manualTillNextSchedule", "deactivate", {}) diff --git a/tests/response/RoomControl.json b/tests/response/RoomControl.json new file mode 100644 index 00000000..bce4cbac --- /dev/null +++ b/tests/response/RoomControl.json @@ -0,0 +1,162 @@ +{ + "data": [ + { + "apiVersion": 1, + "commands": {}, + "deviceId": "RoomControl-1", + "feature": "rooms.0.sensors.temperature", + "gatewayId": "################", + "isEnabled": true, + "isReady": true, + "properties": { + "status": { + "type": "string", + "value": "connected" + }, + "value": { + "type": "number", + "unit": "celsius", + "value": 23.4 + } + }, + "timestamp": "2026-05-07T00:00:00.000Z", + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/0/gateways/################/devices/RoomControl-1/features/rooms.0.sensors.temperature" + }, + { + "apiVersion": 1, + "commands": {}, + "deviceId": "RoomControl-1", + "feature": "rooms.0.sensors.humidity", + "gatewayId": "################", + "isEnabled": true, + "isReady": true, + "properties": { + "status": { + "type": "string", + "value": "connected" + }, + "value": { + "type": "number", + "unit": "percent", + "value": 49 + } + }, + "timestamp": "2026-05-07T00:00:00.000Z", + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/0/gateways/################/devices/RoomControl-1/features/rooms.0.sensors.humidity" + }, + { + "apiVersion": 1, + "commands": {}, + "deviceId": "RoomControl-1", + "feature": "rooms.0.co2", + "gatewayId": "################", + "isEnabled": true, + "isReady": true, + "properties": { + "concentration": { + "type": "number", + "unit": "partsPerMillion", + "value": 1000 + } + }, + "timestamp": "2026-05-07T00:00:00.000Z", + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/0/gateways/################/devices/RoomControl-1/features/rooms.0.co2" + }, + { + "apiVersion": 1, + "commands": {}, + "deviceId": "RoomControl-1", + "feature": "rooms.0.condensationRisk", + "gatewayId": "################", + "isEnabled": true, + "isReady": true, + "properties": { + "value": { + "type": "boolean", + "value": false + } + }, + "timestamp": "2026-05-07T00:00:00.000Z", + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/0/gateways/################/devices/RoomControl-1/features/rooms.0.condensationRisk" + }, + { + "apiVersion": 1, + "commands": {}, + "deviceId": "RoomControl-1", + "feature": "rooms.1.sensors.temperature", + "gatewayId": "################", + "isEnabled": true, + "isReady": true, + "properties": { + "status": { + "type": "string", + "value": "connected" + }, + "value": { + "type": "number", + "unit": "celsius", + "value": 22.8 + } + }, + "timestamp": "2026-05-07T00:00:00.000Z", + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/0/gateways/################/devices/RoomControl-1/features/rooms.1.sensors.temperature" + }, + { + "apiVersion": 1, + "commands": {}, + "deviceId": "RoomControl-1", + "feature": "rooms.1.sensors.humidity", + "gatewayId": "################", + "isEnabled": true, + "isReady": true, + "properties": { + "status": { + "type": "string", + "value": "connected" + }, + "value": { + "type": "number", + "unit": "percent", + "value": 56 + } + }, + "timestamp": "2026-05-07T00:00:00.000Z", + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/0/gateways/################/devices/RoomControl-1/features/rooms.1.sensors.humidity" + }, + { + "apiVersion": 1, + "commands": {}, + "deviceId": "RoomControl-1", + "feature": "rooms.1.co2", + "gatewayId": "################", + "isEnabled": true, + "isReady": true, + "properties": { + "concentration": { + "type": "number", + "unit": "partsPerMillion", + "value": 850 + } + }, + "timestamp": "2026-05-07T00:00:00.000Z", + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/0/gateways/################/devices/RoomControl-1/features/rooms.1.co2" + }, + { + "apiVersion": 1, + "commands": {}, + "deviceId": "RoomControl-1", + "feature": "rooms.1.condensationRisk", + "gatewayId": "################", + "isEnabled": true, + "isReady": true, + "properties": { + "value": { + "type": "boolean", + "value": false + } + }, + "timestamp": "2026-05-07T00:00:00.000Z", + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/0/gateways/################/devices/RoomControl-1/features/rooms.1.condensationRisk" + } + ] +} \ No newline at end of file diff --git a/tests/test_RoomControl.py b/tests/test_RoomControl.py index 9c5b9611..1fdbbe27 100644 --- a/tests/test_RoomControl.py +++ b/tests/test_RoomControl.py @@ -9,55 +9,18 @@ def setUp(self): self.service = ViCareServiceMock('response/RoomControl.json') self.device = RoomControl(self.service) - def test_getAvailableRooms(self): - rooms = self.device.getAvailableRooms() - self.assertIn("0", rooms) - self.assertEqual(len(rooms), 10) - - def test_getRoomActorIds(self): - actors = self.device.getRoomActorIds("0") - self.assertIsInstance(actors, list) - self.assertTrue(len(actors) > 0) - - def test_getRoomName(self): - self.assertEqual(self.device.getRoomName("0"), "Bedroom") - self.assertEqual(self.device.getRoomName("4"), "Living Room") - - def test_getRoomType(self): - self.assertEqual(self.device.getRoomType("0"), "bedroom") - self.assertEqual(self.device.getRoomType("4"), "livingroom") - def test_getRoomTemperature(self): - self.assertAlmostEqual(self.device.getRoomTemperature("0"), 20.7) + self.assertAlmostEqual(self.device.getRoomTemperature("0"), 23.4) + self.assertAlmostEqual(self.device.getRoomTemperature("1"), 22.8) def test_getRoomHumidity(self): - self.assertEqual(self.device.getRoomHumidity("0"), 53) - - def test_getRoomCondensationRisk(self): - result = self.device.getRoomCondensationRisk("0") - self.assertIsNotNone(result) + self.assertEqual(self.device.getRoomHumidity("0"), 49) + self.assertEqual(self.device.getRoomHumidity("1"), 56) - def test_getRoomOperatingStateLevel(self): - result = self.device.getRoomOperatingStateLevel("0") - self.assertIsNotNone(result) + def test_getRoomCO2(self): + self.assertEqual(self.device.getRoomCO2("0"), 1000) + self.assertEqual(self.device.getRoomCO2("1"), 850) - def test_getRoomNormalHeatingTemperature(self): - temp = self.device.getRoomNormalHeatingTemperature("0") - self.assertIsInstance(temp, (int, float)) - - def test_getRoomReducedHeatingTemperature(self): - temp = self.device.getRoomReducedHeatingTemperature("0") - self.assertIsInstance(temp, (int, float)) - - def test_getRoomComfortHeatingTemperature(self): - temp = self.device.getRoomComfortHeatingTemperature("0") - self.assertIsInstance(temp, (int, float)) - - def test_getRoomSchedule(self): - schedule = self.device.getRoomSchedule("0") - self.assertIn("active", schedule) - self.assertIn("mon", schedule) - - def test_getRoomManualTillNextScheduleActive(self): - result = self.device.getRoomManualTillNextScheduleActive("0") - self.assertIsInstance(result, bool) + def test_getRoomCondensationRisk(self): + self.assertFalse(self.device.getRoomCondensationRisk("0")) + self.assertFalse(self.device.getRoomCondensationRisk("1")) From ec514679b869efb8139d48920b3e35ab6cd70f0c Mon Sep 17 00:00:00 2001 From: Christian Lackas Date: Fri, 8 May 2026 12:05:52 +0200 Subject: [PATCH 4/6] fix: sort RoomControl.json by feature key for sort-testdata CI --- tests/response/RoomControl.json | 102 ++++++++++++++++---------------- 1 file changed, 51 insertions(+), 51 deletions(-) diff --git a/tests/response/RoomControl.json b/tests/response/RoomControl.json index bce4cbac..8090901a 100644 --- a/tests/response/RoomControl.json +++ b/tests/response/RoomControl.json @@ -4,23 +4,36 @@ "apiVersion": 1, "commands": {}, "deviceId": "RoomControl-1", - "feature": "rooms.0.sensors.temperature", + "feature": "rooms.0.co2", "gatewayId": "################", "isEnabled": true, "isReady": true, "properties": { - "status": { - "type": "string", - "value": "connected" - }, - "value": { + "concentration": { "type": "number", - "unit": "celsius", - "value": 23.4 + "unit": "partsPerMillion", + "value": 1000 } }, "timestamp": "2026-05-07T00:00:00.000Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/0/gateways/################/devices/RoomControl-1/features/rooms.0.sensors.temperature" + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/0/gateways/################/devices/RoomControl-1/features/rooms.0.co2" + }, + { + "apiVersion": 1, + "commands": {}, + "deviceId": "RoomControl-1", + "feature": "rooms.0.condensationRisk", + "gatewayId": "################", + "isEnabled": true, + "isReady": true, + "properties": { + "value": { + "type": "boolean", + "value": false + } + }, + "timestamp": "2026-05-07T00:00:00.000Z", + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/0/gateways/################/devices/RoomControl-1/features/rooms.0.condensationRisk" }, { "apiVersion": 1, @@ -48,58 +61,58 @@ "apiVersion": 1, "commands": {}, "deviceId": "RoomControl-1", - "feature": "rooms.0.co2", + "feature": "rooms.0.sensors.temperature", "gatewayId": "################", "isEnabled": true, "isReady": true, "properties": { - "concentration": { + "status": { + "type": "string", + "value": "connected" + }, + "value": { "type": "number", - "unit": "partsPerMillion", - "value": 1000 + "unit": "celsius", + "value": 23.4 } }, "timestamp": "2026-05-07T00:00:00.000Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/0/gateways/################/devices/RoomControl-1/features/rooms.0.co2" + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/0/gateways/################/devices/RoomControl-1/features/rooms.0.sensors.temperature" }, { "apiVersion": 1, "commands": {}, "deviceId": "RoomControl-1", - "feature": "rooms.0.condensationRisk", + "feature": "rooms.1.co2", "gatewayId": "################", "isEnabled": true, "isReady": true, "properties": { - "value": { - "type": "boolean", - "value": false + "concentration": { + "type": "number", + "unit": "partsPerMillion", + "value": 850 } }, "timestamp": "2026-05-07T00:00:00.000Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/0/gateways/################/devices/RoomControl-1/features/rooms.0.condensationRisk" + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/0/gateways/################/devices/RoomControl-1/features/rooms.1.co2" }, { "apiVersion": 1, "commands": {}, "deviceId": "RoomControl-1", - "feature": "rooms.1.sensors.temperature", + "feature": "rooms.1.condensationRisk", "gatewayId": "################", "isEnabled": true, "isReady": true, "properties": { - "status": { - "type": "string", - "value": "connected" - }, "value": { - "type": "number", - "unit": "celsius", - "value": 22.8 + "type": "boolean", + "value": false } }, "timestamp": "2026-05-07T00:00:00.000Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/0/gateways/################/devices/RoomControl-1/features/rooms.1.sensors.temperature" + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/0/gateways/################/devices/RoomControl-1/features/rooms.1.condensationRisk" }, { "apiVersion": 1, @@ -127,36 +140,23 @@ "apiVersion": 1, "commands": {}, "deviceId": "RoomControl-1", - "feature": "rooms.1.co2", - "gatewayId": "################", - "isEnabled": true, - "isReady": true, - "properties": { - "concentration": { - "type": "number", - "unit": "partsPerMillion", - "value": 850 - } - }, - "timestamp": "2026-05-07T00:00:00.000Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/0/gateways/################/devices/RoomControl-1/features/rooms.1.co2" - }, - { - "apiVersion": 1, - "commands": {}, - "deviceId": "RoomControl-1", - "feature": "rooms.1.condensationRisk", + "feature": "rooms.1.sensors.temperature", "gatewayId": "################", "isEnabled": true, "isReady": true, "properties": { + "status": { + "type": "string", + "value": "connected" + }, "value": { - "type": "boolean", - "value": false + "type": "number", + "unit": "celsius", + "value": 22.8 } }, "timestamp": "2026-05-07T00:00:00.000Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/0/gateways/################/devices/RoomControl-1/features/rooms.1.condensationRisk" + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/0/gateways/################/devices/RoomControl-1/features/rooms.1.sensors.temperature" } ] -} \ No newline at end of file +} From ecb45556d9062a68680897abbfd70dad75b1e8a7 Mon Sep 17 00:00:00 2001 From: Christian Lackas Date: Fri, 8 May 2026 14:04:49 +0200 Subject: [PATCH 5/6] feat: add RoomControl getters for setpoints and configuration Extends the IoT-scope-only RoomControl class with the read-only accessors needed by Home Assistant for per-room climate device entities: - getAvailableRoomIds() discovers active room indices via prefix scan - temperature setpoints per program-level (comfort/normal/reduced for heating + cooling, normal/comfort for perceived) - room state flags (childLock active+status, window-open sensor) - room configuration flags (open-window detection, hydraulic balancing, TRV algorithm) The existing getRoomWindowOpen uses the modern sensors.openWindow path; the legacy sensors.window.openState alternative is in the deprecation database with removal date 2024-09-15. Fixture extended from 8 to 32 entries covering all new features for both rooms; ViCareServiceMock.fetch_all_features() added to support the room-id discovery. --- PyViCare/PyViCareRoomControl.py | 94 +++++++- tests/ViCareServiceMock.py | 3 + tests/response/RoomControl.json | 406 ++++++++++++++++++++++++++++++++ tests/test_RoomControl.py | 47 ++++ 4 files changed, 547 insertions(+), 3 deletions(-) diff --git a/PyViCare/PyViCareRoomControl.py b/PyViCare/PyViCareRoomControl.py index d2406717..a987c74c 100644 --- a/PyViCare/PyViCareRoomControl.py +++ b/PyViCare/PyViCareRoomControl.py @@ -1,22 +1,110 @@ +import re + from PyViCare.PyViCareDevice import Device +from PyViCare.PyViCareUtils import handleNotSupported class RoomControl(Device): """Viessmann RoomControl virtual device. - Exposes per-room sensor readings. The IoT scope only returns sensor - data; room metadata, schedules and operating programs are not - available to public client_ids. + Exposes per-room sensor readings, setpoints and configuration flags + on the public IoT scope. All accessors are read-only; the API does + not return write commands for room features on this scope. """ + @handleNotSupported + def getAvailableRoomIds(self) -> list[str]: + """Return the list of room indices for which the API returns data. + + IoT scope no longer exposes a `rooms` parent feature, so we scan + the full feature list for `rooms..*` prefixes and report the + unique numeric indices, sorted numerically. + """ + features = self.service.fetch_all_features().get("data", []) + ids = set() + pattern = re.compile(r"^rooms\.(\d+)\.") + for feature in features: + name = feature.get("feature", "") + match = pattern.match(name) + if match: + ids.add(match.group(1)) + return sorted(ids, key=int) + + # --- sensor readings --- + + @handleNotSupported def getRoomTemperature(self, room_id: str) -> float: return float(self.service.getProperty(f"rooms.{room_id}.sensors.temperature")["properties"]["value"]["value"]) + @handleNotSupported def getRoomHumidity(self, room_id: str) -> float: return float(self.service.getProperty(f"rooms.{room_id}.sensors.humidity")["properties"]["value"]["value"]) + @handleNotSupported def getRoomCO2(self, room_id: str) -> int: return int(self.service.getProperty(f"rooms.{room_id}.co2")["properties"]["concentration"]["value"]) + @handleNotSupported def getRoomCondensationRisk(self, room_id: str) -> bool: return bool(self.service.getProperty(f"rooms.{room_id}.condensationRisk")["properties"]["value"]["value"]) + + # --- temperature setpoints per program-level (°C) --- + + @handleNotSupported + def getRoomSetpointComfortHeating(self, room_id: str) -> float: + return float(self.service.getProperty(f"rooms.{room_id}.temperature.levels.comfort.heating")["properties"]["temperature"]["value"]) + + @handleNotSupported + def getRoomSetpointNormalHeating(self, room_id: str) -> float: + return float(self.service.getProperty(f"rooms.{room_id}.temperature.levels.normal.heating")["properties"]["temperature"]["value"]) + + @handleNotSupported + def getRoomSetpointReducedHeating(self, room_id: str) -> float: + return float(self.service.getProperty(f"rooms.{room_id}.temperature.levels.reduced.heating")["properties"]["temperature"]["value"]) + + @handleNotSupported + def getRoomSetpointNormalCooling(self, room_id: str) -> float: + return float(self.service.getProperty(f"rooms.{room_id}.temperature.levels.normal.cooling")["properties"]["temperature"]["value"]) + + @handleNotSupported + def getRoomSetpointReducedCooling(self, room_id: str) -> float: + return float(self.service.getProperty(f"rooms.{room_id}.temperature.levels.reduced.cooling")["properties"]["temperature"]["value"]) + + @handleNotSupported + def getRoomSetpointNormalPerceived(self, room_id: str) -> float: + return float(self.service.getProperty(f"rooms.{room_id}.temperature.levels.normal.perceived")["properties"]["temperature"]["value"]) + + @handleNotSupported + def getRoomSetpointComfortPerceived(self, room_id: str) -> float: + return float(self.service.getProperty(f"rooms.{room_id}.temperature.levels.comfort.perceived")["properties"]["temperature"]["value"]) + + # --- room state flags --- + + @handleNotSupported + def getRoomChildLockActive(self, room_id: str) -> bool: + return bool(self.service.getProperty(f"rooms.{room_id}.childLock")["properties"]["active"]["value"]) + + @handleNotSupported + def getRoomChildLockStatus(self, room_id: str) -> str: + return str(self.service.getProperty(f"rooms.{room_id}.childLock")["properties"]["status"]["value"]) + + @handleNotSupported + def getRoomWindowOpen(self, room_id: str) -> bool: + # Uses the modern `rooms.X.sensors.openWindow` feature; the legacy + # `rooms.X.sensors.window.openState` path is in the deprecation + # database (removal date 2024-09-15). + return bool(self.service.getProperty(f"rooms.{room_id}.sensors.openWindow")["properties"]["value"]["value"]) + + # --- room configuration flags (whether a feature is enabled, not its value) --- + + @handleNotSupported + def getRoomOpenWindowDetectionEnabled(self, room_id: str) -> bool: + return bool(self.service.getProperty(f"rooms.{room_id}.configuration.openWindow")["properties"]["active"]["value"]) + + @handleNotSupported + def getRoomHydraulicBalancingEnabled(self, room_id: str) -> bool: + return bool(self.service.getProperty(f"rooms.{room_id}.configuration.hydraulicBalancing")["properties"]["value"]["value"]) + + @handleNotSupported + def getRoomTrvAlgorithmEnabled(self, room_id: str) -> bool: + return bool(self.service.getProperty(f"rooms.{room_id}.configuration.trvAlgorithmActive")["properties"]["value"]["value"]) diff --git a/tests/ViCareServiceMock.py b/tests/ViCareServiceMock.py index 0594b409..aca05171 100644 --- a/tests/ViCareServiceMock.py +++ b/tests/ViCareServiceMock.py @@ -31,6 +31,9 @@ def getProperty(self, property_name): entities = self.testData["data"] return readFeature(entities, property_name) + def fetch_all_features(self): + return self.testData + def setProperty(self, property_name, action, data): self.setPropertyData.append({ "url": buildSetPropertyUrl(self.accessor, property_name, action), diff --git a/tests/response/RoomControl.json b/tests/response/RoomControl.json index 8090901a..5ed85bb5 100644 --- a/tests/response/RoomControl.json +++ b/tests/response/RoomControl.json @@ -1,5 +1,26 @@ { "data": [ + { + "apiVersion": 1, + "commands": {}, + "deviceId": "RoomControl-1", + "feature": "rooms.0.childLock", + "gatewayId": "################", + "isEnabled": true, + "isReady": true, + "properties": { + "active": { + "type": "boolean", + "value": false + }, + "status": { + "type": "string", + "value": "inactive" + } + }, + "timestamp": "2026-05-07T00:00:00.000Z", + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/0/gateways/################/devices/RoomControl-1/features/rooms.0.childLock" + }, { "apiVersion": 1, "commands": {}, @@ -35,6 +56,57 @@ "timestamp": "2026-05-07T00:00:00.000Z", "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/0/gateways/################/devices/RoomControl-1/features/rooms.0.condensationRisk" }, + { + "apiVersion": 1, + "commands": {}, + "deviceId": "RoomControl-1", + "feature": "rooms.0.configuration.hydraulicBalancing", + "gatewayId": "################", + "isEnabled": true, + "isReady": true, + "properties": { + "value": { + "type": "boolean", + "value": true + } + }, + "timestamp": "2026-05-07T00:00:00.000Z", + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/0/gateways/################/devices/RoomControl-1/features/rooms.0.configuration.hydraulicBalancing" + }, + { + "apiVersion": 1, + "commands": {}, + "deviceId": "RoomControl-1", + "feature": "rooms.0.configuration.openWindow", + "gatewayId": "################", + "isEnabled": true, + "isReady": true, + "properties": { + "active": { + "type": "boolean", + "value": true + } + }, + "timestamp": "2026-05-07T00:00:00.000Z", + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/0/gateways/################/devices/RoomControl-1/features/rooms.0.configuration.openWindow" + }, + { + "apiVersion": 1, + "commands": {}, + "deviceId": "RoomControl-1", + "feature": "rooms.0.configuration.trvAlgorithmActive", + "gatewayId": "################", + "isEnabled": true, + "isReady": true, + "properties": { + "value": { + "type": "boolean", + "value": false + } + }, + "timestamp": "2026-05-07T00:00:00.000Z", + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/0/gateways/################/devices/RoomControl-1/features/rooms.0.configuration.trvAlgorithmActive" + }, { "apiVersion": 1, "commands": {}, @@ -57,6 +129,23 @@ "timestamp": "2026-05-07T00:00:00.000Z", "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/0/gateways/################/devices/RoomControl-1/features/rooms.0.sensors.humidity" }, + { + "apiVersion": 1, + "commands": {}, + "deviceId": "RoomControl-1", + "feature": "rooms.0.sensors.openWindow", + "gatewayId": "################", + "isEnabled": true, + "isReady": true, + "properties": { + "value": { + "type": "boolean", + "value": false + } + }, + "timestamp": "2026-05-07T00:00:00.000Z", + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/0/gateways/################/devices/RoomControl-1/features/rooms.0.sensors.openWindow" + }, { "apiVersion": 1, "commands": {}, @@ -79,6 +168,141 @@ "timestamp": "2026-05-07T00:00:00.000Z", "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/0/gateways/################/devices/RoomControl-1/features/rooms.0.sensors.temperature" }, + { + "apiVersion": 1, + "commands": {}, + "deviceId": "RoomControl-1", + "feature": "rooms.0.temperature.levels.comfort.heating", + "gatewayId": "################", + "isEnabled": true, + "isReady": true, + "properties": { + "temperature": { + "type": "number", + "unit": "celsius", + "value": 22 + } + }, + "timestamp": "2026-05-07T00:00:00.000Z", + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/0/gateways/################/devices/RoomControl-1/features/rooms.0.temperature.levels.comfort.heating" + }, + { + "apiVersion": 1, + "commands": {}, + "deviceId": "RoomControl-1", + "feature": "rooms.0.temperature.levels.comfort.perceived", + "gatewayId": "################", + "isEnabled": true, + "isReady": true, + "properties": { + "temperature": { + "type": "number", + "unit": "celsius", + "value": 22 + } + }, + "timestamp": "2026-05-07T00:00:00.000Z", + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/0/gateways/################/devices/RoomControl-1/features/rooms.0.temperature.levels.comfort.perceived" + }, + { + "apiVersion": 1, + "commands": {}, + "deviceId": "RoomControl-1", + "feature": "rooms.0.temperature.levels.normal.cooling", + "gatewayId": "################", + "isEnabled": false, + "isReady": true, + "properties": {}, + "timestamp": "2026-05-07T00:00:00.000Z", + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/0/gateways/################/devices/RoomControl-1/features/rooms.0.temperature.levels.normal.cooling" + }, + { + "apiVersion": 1, + "commands": {}, + "deviceId": "RoomControl-1", + "feature": "rooms.0.temperature.levels.normal.heating", + "gatewayId": "################", + "isEnabled": true, + "isReady": true, + "properties": { + "temperature": { + "type": "number", + "unit": "celsius", + "value": 21 + } + }, + "timestamp": "2026-05-07T00:00:00.000Z", + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/0/gateways/################/devices/RoomControl-1/features/rooms.0.temperature.levels.normal.heating" + }, + { + "apiVersion": 1, + "commands": {}, + "deviceId": "RoomControl-1", + "feature": "rooms.0.temperature.levels.normal.perceived", + "gatewayId": "################", + "isEnabled": true, + "isReady": true, + "properties": { + "temperature": { + "type": "number", + "unit": "celsius", + "value": 21 + } + }, + "timestamp": "2026-05-07T00:00:00.000Z", + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/0/gateways/################/devices/RoomControl-1/features/rooms.0.temperature.levels.normal.perceived" + }, + { + "apiVersion": 1, + "commands": {}, + "deviceId": "RoomControl-1", + "feature": "rooms.0.temperature.levels.reduced.cooling", + "gatewayId": "################", + "isEnabled": false, + "isReady": true, + "properties": {}, + "timestamp": "2026-05-07T00:00:00.000Z", + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/0/gateways/################/devices/RoomControl-1/features/rooms.0.temperature.levels.reduced.cooling" + }, + { + "apiVersion": 1, + "commands": {}, + "deviceId": "RoomControl-1", + "feature": "rooms.0.temperature.levels.reduced.heating", + "gatewayId": "################", + "isEnabled": true, + "isReady": true, + "properties": { + "temperature": { + "type": "number", + "unit": "celsius", + "value": 19 + } + }, + "timestamp": "2026-05-07T00:00:00.000Z", + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/0/gateways/################/devices/RoomControl-1/features/rooms.0.temperature.levels.reduced.heating" + }, + { + "apiVersion": 1, + "commands": {}, + "deviceId": "RoomControl-1", + "feature": "rooms.1.childLock", + "gatewayId": "################", + "isEnabled": true, + "isReady": true, + "properties": { + "active": { + "type": "boolean", + "value": true + }, + "status": { + "type": "string", + "value": "active" + } + }, + "timestamp": "2026-05-07T00:00:00.000Z", + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/0/gateways/################/devices/RoomControl-1/features/rooms.1.childLock" + }, { "apiVersion": 1, "commands": {}, @@ -114,6 +338,57 @@ "timestamp": "2026-05-07T00:00:00.000Z", "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/0/gateways/################/devices/RoomControl-1/features/rooms.1.condensationRisk" }, + { + "apiVersion": 1, + "commands": {}, + "deviceId": "RoomControl-1", + "feature": "rooms.1.configuration.hydraulicBalancing", + "gatewayId": "################", + "isEnabled": true, + "isReady": true, + "properties": { + "value": { + "type": "boolean", + "value": false + } + }, + "timestamp": "2026-05-07T00:00:00.000Z", + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/0/gateways/################/devices/RoomControl-1/features/rooms.1.configuration.hydraulicBalancing" + }, + { + "apiVersion": 1, + "commands": {}, + "deviceId": "RoomControl-1", + "feature": "rooms.1.configuration.openWindow", + "gatewayId": "################", + "isEnabled": true, + "isReady": true, + "properties": { + "active": { + "type": "boolean", + "value": false + } + }, + "timestamp": "2026-05-07T00:00:00.000Z", + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/0/gateways/################/devices/RoomControl-1/features/rooms.1.configuration.openWindow" + }, + { + "apiVersion": 1, + "commands": {}, + "deviceId": "RoomControl-1", + "feature": "rooms.1.configuration.trvAlgorithmActive", + "gatewayId": "################", + "isEnabled": true, + "isReady": true, + "properties": { + "value": { + "type": "boolean", + "value": true + } + }, + "timestamp": "2026-05-07T00:00:00.000Z", + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/0/gateways/################/devices/RoomControl-1/features/rooms.1.configuration.trvAlgorithmActive" + }, { "apiVersion": 1, "commands": {}, @@ -136,6 +411,23 @@ "timestamp": "2026-05-07T00:00:00.000Z", "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/0/gateways/################/devices/RoomControl-1/features/rooms.1.sensors.humidity" }, + { + "apiVersion": 1, + "commands": {}, + "deviceId": "RoomControl-1", + "feature": "rooms.1.sensors.openWindow", + "gatewayId": "################", + "isEnabled": true, + "isReady": true, + "properties": { + "value": { + "type": "boolean", + "value": true + } + }, + "timestamp": "2026-05-07T00:00:00.000Z", + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/0/gateways/################/devices/RoomControl-1/features/rooms.1.sensors.openWindow" + }, { "apiVersion": 1, "commands": {}, @@ -157,6 +449,120 @@ }, "timestamp": "2026-05-07T00:00:00.000Z", "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/0/gateways/################/devices/RoomControl-1/features/rooms.1.sensors.temperature" + }, + { + "apiVersion": 1, + "commands": {}, + "deviceId": "RoomControl-1", + "feature": "rooms.1.temperature.levels.comfort.heating", + "gatewayId": "################", + "isEnabled": true, + "isReady": true, + "properties": { + "temperature": { + "type": "number", + "unit": "celsius", + "value": 23 + } + }, + "timestamp": "2026-05-07T00:00:00.000Z", + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/0/gateways/################/devices/RoomControl-1/features/rooms.1.temperature.levels.comfort.heating" + }, + { + "apiVersion": 1, + "commands": {}, + "deviceId": "RoomControl-1", + "feature": "rooms.1.temperature.levels.comfort.perceived", + "gatewayId": "################", + "isEnabled": true, + "isReady": true, + "properties": { + "temperature": { + "type": "number", + "unit": "celsius", + "value": 23 + } + }, + "timestamp": "2026-05-07T00:00:00.000Z", + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/0/gateways/################/devices/RoomControl-1/features/rooms.1.temperature.levels.comfort.perceived" + }, + { + "apiVersion": 1, + "commands": {}, + "deviceId": "RoomControl-1", + "feature": "rooms.1.temperature.levels.normal.cooling", + "gatewayId": "################", + "isEnabled": false, + "isReady": true, + "properties": {}, + "timestamp": "2026-05-07T00:00:00.000Z", + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/0/gateways/################/devices/RoomControl-1/features/rooms.1.temperature.levels.normal.cooling" + }, + { + "apiVersion": 1, + "commands": {}, + "deviceId": "RoomControl-1", + "feature": "rooms.1.temperature.levels.normal.heating", + "gatewayId": "################", + "isEnabled": true, + "isReady": true, + "properties": { + "temperature": { + "type": "number", + "unit": "celsius", + "value": 20 + } + }, + "timestamp": "2026-05-07T00:00:00.000Z", + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/0/gateways/################/devices/RoomControl-1/features/rooms.1.temperature.levels.normal.heating" + }, + { + "apiVersion": 1, + "commands": {}, + "deviceId": "RoomControl-1", + "feature": "rooms.1.temperature.levels.normal.perceived", + "gatewayId": "################", + "isEnabled": true, + "isReady": true, + "properties": { + "temperature": { + "type": "number", + "unit": "celsius", + "value": 20 + } + }, + "timestamp": "2026-05-07T00:00:00.000Z", + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/0/gateways/################/devices/RoomControl-1/features/rooms.1.temperature.levels.normal.perceived" + }, + { + "apiVersion": 1, + "commands": {}, + "deviceId": "RoomControl-1", + "feature": "rooms.1.temperature.levels.reduced.cooling", + "gatewayId": "################", + "isEnabled": false, + "isReady": true, + "properties": {}, + "timestamp": "2026-05-07T00:00:00.000Z", + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/0/gateways/################/devices/RoomControl-1/features/rooms.1.temperature.levels.reduced.cooling" + }, + { + "apiVersion": 1, + "commands": {}, + "deviceId": "RoomControl-1", + "feature": "rooms.1.temperature.levels.reduced.heating", + "gatewayId": "################", + "isEnabled": true, + "isReady": true, + "properties": { + "temperature": { + "type": "number", + "unit": "celsius", + "value": 17 + } + }, + "timestamp": "2026-05-07T00:00:00.000Z", + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/0/gateways/################/devices/RoomControl-1/features/rooms.1.temperature.levels.reduced.heating" } ] } diff --git a/tests/test_RoomControl.py b/tests/test_RoomControl.py index 1fdbbe27..cd795835 100644 --- a/tests/test_RoomControl.py +++ b/tests/test_RoomControl.py @@ -9,6 +9,9 @@ def setUp(self): self.service = ViCareServiceMock('response/RoomControl.json') self.device = RoomControl(self.service) + def test_getAvailableRoomIds(self): + self.assertEqual(self.device.getAvailableRoomIds(), ["0", "1"]) + def test_getRoomTemperature(self): self.assertAlmostEqual(self.device.getRoomTemperature("0"), 23.4) self.assertAlmostEqual(self.device.getRoomTemperature("1"), 22.8) @@ -24,3 +27,47 @@ def test_getRoomCO2(self): def test_getRoomCondensationRisk(self): self.assertFalse(self.device.getRoomCondensationRisk("0")) self.assertFalse(self.device.getRoomCondensationRisk("1")) + + def test_getRoomSetpointComfortHeating(self): + self.assertEqual(self.device.getRoomSetpointComfortHeating("0"), 22) + self.assertEqual(self.device.getRoomSetpointComfortHeating("1"), 23) + + def test_getRoomSetpointNormalHeating(self): + self.assertEqual(self.device.getRoomSetpointNormalHeating("0"), 21) + self.assertEqual(self.device.getRoomSetpointNormalHeating("1"), 20) + + def test_getRoomSetpointReducedHeating(self): + self.assertEqual(self.device.getRoomSetpointReducedHeating("0"), 19) + self.assertEqual(self.device.getRoomSetpointReducedHeating("1"), 17) + + def test_getRoomSetpointNormalPerceived(self): + self.assertEqual(self.device.getRoomSetpointNormalPerceived("0"), 21) + self.assertEqual(self.device.getRoomSetpointNormalPerceived("1"), 20) + + def test_getRoomSetpointComfortPerceived(self): + self.assertEqual(self.device.getRoomSetpointComfortPerceived("0"), 22) + self.assertEqual(self.device.getRoomSetpointComfortPerceived("1"), 23) + + def test_getRoomChildLockActive(self): + self.assertFalse(self.device.getRoomChildLockActive("0")) + self.assertTrue(self.device.getRoomChildLockActive("1")) + + def test_getRoomChildLockStatus(self): + self.assertEqual(self.device.getRoomChildLockStatus("0"), "inactive") + self.assertEqual(self.device.getRoomChildLockStatus("1"), "active") + + def test_getRoomWindowOpen(self): + self.assertFalse(self.device.getRoomWindowOpen("0")) + self.assertTrue(self.device.getRoomWindowOpen("1")) + + def test_getRoomOpenWindowDetectionEnabled(self): + self.assertTrue(self.device.getRoomOpenWindowDetectionEnabled("0")) + self.assertFalse(self.device.getRoomOpenWindowDetectionEnabled("1")) + + def test_getRoomHydraulicBalancingEnabled(self): + self.assertTrue(self.device.getRoomHydraulicBalancingEnabled("0")) + self.assertFalse(self.device.getRoomHydraulicBalancingEnabled("1")) + + def test_getRoomTrvAlgorithmEnabled(self): + self.assertFalse(self.device.getRoomTrvAlgorithmEnabled("0")) + self.assertTrue(self.device.getRoomTrvAlgorithmEnabled("1")) From 34b1fe283cda10ca6f9bc297f39e8722caf2c960 Mon Sep 17 00:00:00 2001 From: Christian Lackas Date: Fri, 8 May 2026 14:44:01 +0200 Subject: [PATCH 6/6] feat: add getRoomHeatOnTimeEnabled Adds the rooms.X.configuration.heatOnTime configuration flag exposed by the IoT API on RoomControl-equipped systems. Found in CFenner's account diagnostic dump but not in the smaller test setup, so it was missed in the initial PR. --- PyViCare/PyViCareRoomControl.py | 4 ++++ tests/response/RoomControl.json | 34 +++++++++++++++++++++++++++++++++ tests/test_RoomControl.py | 4 ++++ 3 files changed, 42 insertions(+) diff --git a/PyViCare/PyViCareRoomControl.py b/PyViCare/PyViCareRoomControl.py index a987c74c..8ec5dc63 100644 --- a/PyViCare/PyViCareRoomControl.py +++ b/PyViCare/PyViCareRoomControl.py @@ -108,3 +108,7 @@ def getRoomHydraulicBalancingEnabled(self, room_id: str) -> bool: @handleNotSupported def getRoomTrvAlgorithmEnabled(self, room_id: str) -> bool: return bool(self.service.getProperty(f"rooms.{room_id}.configuration.trvAlgorithmActive")["properties"]["value"]["value"]) + + @handleNotSupported + def getRoomHeatOnTimeEnabled(self, room_id: str) -> bool: + return bool(self.service.getProperty(f"rooms.{room_id}.configuration.heatOnTime")["properties"]["active"]["value"]) diff --git a/tests/response/RoomControl.json b/tests/response/RoomControl.json index 5ed85bb5..8fd2cb77 100644 --- a/tests/response/RoomControl.json +++ b/tests/response/RoomControl.json @@ -56,6 +56,23 @@ "timestamp": "2026-05-07T00:00:00.000Z", "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/0/gateways/################/devices/RoomControl-1/features/rooms.0.condensationRisk" }, + { + "apiVersion": 1, + "commands": {}, + "deviceId": "RoomControl-1", + "feature": "rooms.0.configuration.heatOnTime", + "gatewayId": "################", + "isEnabled": true, + "isReady": true, + "properties": { + "active": { + "type": "boolean", + "value": false + } + }, + "timestamp": "2026-05-07T00:00:00.000Z", + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/0/gateways/################/devices/RoomControl-1/features/rooms.0.configuration.heatOnTime" + }, { "apiVersion": 1, "commands": {}, @@ -338,6 +355,23 @@ "timestamp": "2026-05-07T00:00:00.000Z", "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/0/gateways/################/devices/RoomControl-1/features/rooms.1.condensationRisk" }, + { + "apiVersion": 1, + "commands": {}, + "deviceId": "RoomControl-1", + "feature": "rooms.1.configuration.heatOnTime", + "gatewayId": "################", + "isEnabled": true, + "isReady": true, + "properties": { + "active": { + "type": "boolean", + "value": true + } + }, + "timestamp": "2026-05-07T00:00:00.000Z", + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/0/gateways/################/devices/RoomControl-1/features/rooms.1.configuration.heatOnTime" + }, { "apiVersion": 1, "commands": {}, diff --git a/tests/test_RoomControl.py b/tests/test_RoomControl.py index cd795835..9837e6d0 100644 --- a/tests/test_RoomControl.py +++ b/tests/test_RoomControl.py @@ -71,3 +71,7 @@ def test_getRoomHydraulicBalancingEnabled(self): def test_getRoomTrvAlgorithmEnabled(self): self.assertFalse(self.device.getRoomTrvAlgorithmEnabled("0")) self.assertTrue(self.device.getRoomTrvAlgorithmEnabled("1")) + + def test_getRoomHeatOnTimeEnabled(self): + self.assertFalse(self.device.getRoomHeatOnTimeEnabled("0")) + self.assertTrue(self.device.getRoomHeatOnTimeEnabled("1"))