diff --git a/PyViCare/PyViCare.py b/PyViCare/PyViCare.py index dafcc6d9..ec41d5df 100644 --- a/PyViCare/PyViCare.py +++ b/PyViCare/PyViCare.py @@ -6,8 +6,9 @@ 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 +from PyViCare.PyViCareUtils import PyViCareInvalidDataError, PyViCareNotSupportedFeatureError logger = logging.getLogger(__name__) logger.addHandler(logging.NullHandler()) @@ -49,10 +50,11 @@ 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", - "tcu", "ventilation", + "tcu", "ventilation", "roomControl", ] def __extract_all_devices(self): @@ -67,6 +69,35 @@ 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 (KeyError, IndexError, PyViCareNotSupportedFeatureError): + 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 a6626cf3..b4a64a24 100644 --- a/PyViCare/PyViCareDeviceConfig.py +++ b/PyViCare/PyViCareDeviceConfig.py @@ -4,6 +4,7 @@ from PyViCare.PyViCareFloorHeating import FloorHeating, FloorHeatingChannel from PyViCare.PyViCareFuelCell import FuelCell +from PyViCare.PyViCareRoomControl import RoomControl from PyViCare.PyViCareGazBoiler import GazBoiler from PyViCare.PyViCareHeatingDevice import HeatingDevice from PyViCare.PyViCareHeatPump import HeatPump @@ -22,7 +23,7 @@ class PyViCareDeviceConfig: - # pylint: disable=too-many-arguments,too-many-positional-arguments + # pylint: disable=too-many-arguments,too-many-positional-arguments,too-many-instance-attributes def __init__(self, service, device_id, device_model, status, device_type=None, roles=None): self.service = service self.device_id = device_id @@ -30,6 +31,8 @@ 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) @@ -62,7 +65,18 @@ def asFloorHeatingChannel(self): return FloorHeatingChannel(self.service) def asRoomSensor(self): - return RoomSensor(self.service) + sensor = RoomSensor(self.service) + if self._room_control is not None: + sensor.setRoomControl(self._room_control, self._room_id) + return sensor + + 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) @@ -113,6 +127,7 @@ def asAutoDetectDevice(self): (self.asRadiatorActuator, r"E3_RadiatorActuator", ["type:radiator"]), (self.asFloorHeating, r"Smart_zigbee_fht_main|E3_FloorHeatingCircuitDistributorBox", ["type:fhtMain"]), (self.asFloorHeatingChannel, r"Smart_zigbee_fht_channel", ["type:fhtChannel"]), + (self.asRoomControl, r"E3_RoomControl|Smart_RoomControl", ["type:virtual;smartRoomControl"]), (self.asRoomSensor, r"E3_RoomSensor", ["type:climateSensor"]), (self.asRepeater, r"E3_Repeater", ["type:repeater"]), (self.asGateway, r"E3_TCU41_x04", ["type:gateway;TCU100"]), diff --git a/PyViCare/PyViCareRoomControl.py b/PyViCare/PyViCareRoomControl.py new file mode 100644 index 00000000..018e358c --- /dev/null +++ b/PyViCare/PyViCareRoomControl.py @@ -0,0 +1,136 @@ +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. + Used to enrich physical Zigbee devices with room data. + """ + + @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"]) + + 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"]) + + 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", {}) + + # --- 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 16f9ad04..aaf0e8cd 100644 --- a/PyViCare/PyViCareRoomSensor.py +++ b/PyViCare/PyViCareRoomSensor.py @@ -1,17 +1,132 @@ +from __future__ import annotations + +from typing import Any, TYPE_CHECKING + from PyViCare.PyViCareDevice import ZigbeeBatteryDevice -from PyViCare.PyViCareUtils import handleNotSupported +from PyViCare.PyViCareUtils import handleNotSupported, handleAPICommandErrors + +if TYPE_CHECKING: + from PyViCare.PyViCareRoomControl import RoomControl 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 getSerial(self): - return self.getProperty("device.sensors.temperature")["deviceId"] + 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 getTemperature(self): - return self.getProperty("device.sensors.temperature")["properties"]["value"]["value"] + 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 getHumidity(self): - return self.getProperty("device.sensors.humidity")["properties"]["value"]["value"] + def getSchedule(self) -> dict[str, Any]: + rc, rid = self._getRoomContext() + return rc.getRoomSchedule(rid) diff --git a/tests/response/RoomControl.json b/tests/response/RoomControl.json index 428d764d..1efd3617 100644 --- a/tests/response/RoomControl.json +++ b/tests/response/RoomControl.json @@ -217,203 +217,349 @@ "apiVersion": 1, "commands": {}, "deviceId": "RoomControl-1", - "feature": "rooms.0.sensors.humidity", + "feature": "rooms.0.condensationRisk", "gatewayId": "################", "isEnabled": true, "isReady": true, "properties": { - "status": { - "type": "string", - "value": "connected" - }, "value": { - "type": "number", - "unit": "percent", - "value": 53 + "type": "boolean", + "value": false } }, - "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" + "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": {}, + "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.sensors.temperature", + "feature": "rooms.0.operating.programs.comfortHeating", "gatewayId": "################", "isEnabled": true, "isReady": true, "properties": { - "status": { - "type": "string", - "value": "connected" + "active": { + "type": "boolean", + "value": false }, - "value": { + "temperature": { "type": "number", "unit": "celsius", - "value": 20.7 + "value": 20 } }, - "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" + "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": { - "addActor": { - "constraints": { - "enum": [ - "cs", - "fht", - "trv", - "airQualitySensor", - "remoteControllerSensor" - ] - }, + "setTemperature": { "isExecutable": true, - "name": "addActor", + "name": "setTemperature", "params": { - "actorDeviceId": { - "constraints": {}, - "required": true, - "type": "string" - }, - "heatingCircuit": { + "targetTemperature": { "constraints": { - "max": 3, - "min": 0, - "stepping": 1 + "max": 30, + "min": 8, + "stepping": 0.5 }, - "required": false, + "required": true, "type": "number" } }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.1/commands/addActor" + "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 }, - "moveActor": { + "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": "moveActor", + "name": "setTemperature", "params": { - "actorDeviceId": { - "constraints": {}, - "required": true, - "type": "string" - }, - "heatingCircuit": { - "constraints": { - "max": 3, - "min": 0, - "stepping": 1 - }, - "required": false, - "type": "number" - }, - "newRoomId": { + "targetTemperature": { "constraints": { - "max": 23, - "min": 0, - "stepping": 1 + "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/commands/moveActor" + "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 }, - "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" + "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" }, - "removeActor": { + "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": "removeActor", + "name": "activate", "params": { - "actorDeviceId": { - "constraints": {}, + "temperature": { + "constraints": { + "max": 30, + "min": 8, + "stepping": 0.5 + }, "required": true, - "type": "string" + "type": "number" } }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.1/commands/removeActor" + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.0.quickmodes.manualTillNextSchedule/commands/activate" }, - "setName": { + "deactivate": { "isExecutable": true, - "name": "setName", + "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": { - "name": { + "targetTemperature": { "constraints": { - "maxLength": 39, - "minLength": 1, - "regEx": "^[\\p{L}0-9]+( [\\p{L}0-9]+)*$" + "max": 30, + "min": 8, + "stepping": 0.5 }, "required": true, - "type": "string" + "type": "number" } }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.1/commands/setName" + "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" }, - "setType": { + "setSchedule": { "isExecutable": true, - "name": "setType", + "name": "setSchedule", "params": { - "type": { + "newSchedule": { "constraints": { - "enum": [ - "bathroom", - "bedroom", - "hallway", - "livingroom", - "kitchen", - "office", - "nursery", - "toilet", - "other" - ] + "defaultMode": "reduced", + "maxEntries": 4, + "modes": [ + "normal", + "comfort" + ], + "overlapAllowed": false, + "resolution": 10 }, "required": true, - "type": "string" + "type": "Schedule" } }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.1/commands/setType" + "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.1", + "feature": "rooms.0.schedule", "gatewayId": "################", "isEnabled": true, "isReady": true, "properties": { - "actors": { - "type": "array", - "value": [ - { - "deviceId": "zigbee-################", - "heatingCircuit": 0 - }, - { - "deviceId": "zigbee-################-5" - } - ] - }, - "name": { - "type": "string", - "value": "Bathroom" + "active": { + "type": "boolean", + "value": true }, - "type": { + "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": "bathroom" + "value": "notConnected" } }, - "timestamp": "2026-04-15T21:00:31.581Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.1" + "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.1.sensors.humidity", + "feature": "rooms.0.sensors.humidity", "gatewayId": "################", "isEnabled": true, "isReady": true, @@ -425,17 +571,17 @@ "value": { "type": "number", "unit": "percent", - "value": 58 + "value": 53 } }, - "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" + "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.1.sensors.temperature", + "feature": "rooms.0.sensors.temperature", "gatewayId": "################", "isEnabled": true, "isReady": true, @@ -447,11 +593,11 @@ "value": { "type": "number", "unit": "celsius", - "value": 20.3 + "value": 20.7 } }, - "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" + "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, @@ -484,7 +630,7 @@ "type": "number" } }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.2/commands/addActor" + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.1/commands/addActor" }, "moveActor": { "isExecutable": true, @@ -514,13 +660,13 @@ "type": "number" } }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.2/commands/moveActor" + "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.2/commands/remove" + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.1/commands/remove" }, "removeActor": { "isExecutable": true, @@ -532,7 +678,7 @@ "type": "string" } }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.2/commands/removeActor" + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.1/commands/removeActor" }, "setName": { "isExecutable": true, @@ -548,7 +694,7 @@ "type": "string" } }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.2/commands/setName" + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.1/commands/setName" }, "setType": { "isExecutable": true, @@ -572,11 +718,11 @@ "type": "string" } }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.2/commands/setType" + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.1/commands/setType" } }, "deviceId": "RoomControl-1", - "feature": "rooms.2", + "feature": "rooms.1", "gatewayId": "################", "isEnabled": true, "isReady": true, @@ -589,223 +735,369 @@ "heatingCircuit": 0 }, { - "deviceId": "zigbee-################-4" + "deviceId": "zigbee-################-5" } ] }, "name": { "type": "string", - "value": "Hallway Upper" + "value": "Bathroom" }, "type": { "type": "string", - "value": "hallway" + "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.2" + "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.2.sensors.humidity", + "feature": "rooms.1.condensationRisk", "gatewayId": "################", "isEnabled": true, "isReady": true, "properties": { - "status": { - "type": "string", - "value": "connected" - }, "value": { - "type": "number", - "unit": "percent", - "value": 51 + "type": "boolean", + "value": false } }, - "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" + "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": {}, + "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.2.sensors.temperature", + "feature": "rooms.1.operating.programs.comfortHeating", "gatewayId": "################", "isEnabled": true, "isReady": true, "properties": { - "status": { - "type": "string", - "value": "connected" + "active": { + "type": "boolean", + "value": false }, - "value": { + "temperature": { "type": "number", "unit": "celsius", - "value": 21 + "value": 23 } }, - "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" + "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": { - "addActor": { - "constraints": { - "enum": [ - "cs", - "fht", - "trv", - "airQualitySensor", - "remoteControllerSensor" - ] - }, + "setTemperature": { "isExecutable": true, - "name": "addActor", + "name": "setTemperature", "params": { - "actorDeviceId": { - "constraints": {}, - "required": true, - "type": "string" - }, - "heatingCircuit": { + "targetTemperature": { "constraints": { - "max": 3, - "min": 0, - "stepping": 1 + "max": 30, + "min": 8, + "stepping": 0.5 }, - "required": false, + "required": true, "type": "number" } }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.3/commands/addActor" + "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 }, - "moveActor": { + "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": "moveActor", + "name": "setTemperature", "params": { - "actorDeviceId": { - "constraints": {}, - "required": true, - "type": "string" - }, - "heatingCircuit": { - "constraints": { - "max": 3, - "min": 0, - "stepping": 1 - }, - "required": false, - "type": "number" - }, - "newRoomId": { + "targetTemperature": { "constraints": { - "max": 23, - "min": 0, - "stepping": 1 + "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/commands/moveActor" + "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 }, - "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" + "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" }, - "removeActor": { + "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": "removeActor", + "name": "activate", "params": { - "actorDeviceId": { - "constraints": {}, + "temperature": { + "constraints": { + "max": 30, + "min": 8, + "stepping": 0.5 + }, "required": true, - "type": "string" + "type": "number" } }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.3/commands/removeActor" + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.1.quickmodes.manualTillNextSchedule/commands/activate" }, - "setName": { + "deactivate": { "isExecutable": true, - "name": "setName", + "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": { - "name": { + "targetTemperature": { "constraints": { - "maxLength": 39, - "minLength": 1, - "regEx": "^[\\p{L}0-9]+( [\\p{L}0-9]+)*$" + "max": 30, + "min": 8, + "stepping": 0.5 }, "required": true, - "type": "string" + "type": "number" } }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.3/commands/setName" + "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" }, - "setType": { + "setSchedule": { "isExecutable": true, - "name": "setType", + "name": "setSchedule", "params": { - "type": { + "newSchedule": { "constraints": { - "enum": [ - "bathroom", - "bedroom", - "hallway", - "livingroom", - "kitchen", - "office", - "nursery", - "toilet", - "other" - ] + "defaultMode": "reduced", + "maxEntries": 4, + "modes": [ + "normal", + "comfort" + ], + "overlapAllowed": false, + "resolution": 10 }, "required": true, - "type": "string" + "type": "Schedule" } }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.3/commands/setType" + "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.3", + "feature": "rooms.1.schedule", "gatewayId": "################", "isEnabled": true, "isReady": true, "properties": { - "actors": { - "type": "array", - "value": [ - { - "deviceId": "zigbee-################", - "heatingCircuit": 0 - }, - { - "deviceId": "zigbee-################-2" - } - ] - }, - "name": { - "type": "string", - "value": "Kids Room 1" + "active": { + "type": "boolean", + "value": true }, - "type": { + "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": "nursery" + "value": "notConnected" } }, - "timestamp": "2026-04-15T21:00:31.581Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.3" + "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.3.sensors.humidity", + "feature": "rooms.1.sensors.humidity", "gatewayId": "################", "isEnabled": true, "isReady": true, @@ -817,17 +1109,17 @@ "value": { "type": "number", "unit": "percent", - "value": 46 + "value": 58 } }, - "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" + "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.3.sensors.temperature", + "feature": "rooms.1.sensors.temperature", "gatewayId": "################", "isEnabled": true, "isReady": true, @@ -839,11 +1131,11 @@ "value": { "type": "number", "unit": "celsius", - "value": 21.3 + "value": 20.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" + "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, @@ -876,7 +1168,7 @@ "type": "number" } }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.4/commands/addActor" + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.2/commands/addActor" }, "moveActor": { "isExecutable": true, @@ -906,13 +1198,13 @@ "type": "number" } }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.4/commands/moveActor" + "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.4/commands/remove" + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.2/commands/remove" }, "removeActor": { "isExecutable": true, @@ -924,7 +1216,7 @@ "type": "string" } }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.4/commands/removeActor" + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.2/commands/removeActor" }, "setName": { "isExecutable": true, @@ -940,7 +1232,7 @@ "type": "string" } }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.4/commands/setName" + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.2/commands/setName" }, "setType": { "isExecutable": true, @@ -964,11 +1256,11 @@ "type": "string" } }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.4/commands/setType" + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.2/commands/setType" } }, "deviceId": "RoomControl-1", - "feature": "rooms.4", + "feature": "rooms.2", "gatewayId": "################", "isEnabled": true, "isReady": true, @@ -977,33 +1269,373 @@ "type": "array", "value": [ { - "deviceId": "zigbee-################" - }, - { - "deviceId": "zigbee-################-1" + "deviceId": "zigbee-################", + "heatingCircuit": 0 }, { - "deviceId": "zigbee-################-2" + "deviceId": "zigbee-################-4" } ] }, "name": { "type": "string", - "value": "Living Room" + "value": "Hallway Upper" }, "type": { "type": "string", - "value": "livingroom" + "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.4" + "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.4.sensors.humidity", + "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, @@ -1015,17 +1647,17 @@ "value": { "type": "number", "unit": "percent", - "value": 47 + "value": 51 } }, - "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" + "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.4.sensors.temperature", + "feature": "rooms.2.sensors.temperature", "gatewayId": "################", "isEnabled": true, "isReady": true, @@ -1037,11 +1669,11 @@ "value": { "type": "number", "unit": "celsius", - "value": 24.2 + "value": 21 } }, - "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" + "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, @@ -1074,7 +1706,7 @@ "type": "number" } }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.5/commands/addActor" + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.3/commands/addActor" }, "moveActor": { "isExecutable": true, @@ -1104,13 +1736,13 @@ "type": "number" } }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.5/commands/moveActor" + "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.5/commands/remove" + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.3/commands/remove" }, "removeActor": { "isExecutable": true, @@ -1122,7 +1754,7 @@ "type": "string" } }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.5/commands/removeActor" + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.3/commands/removeActor" }, "setName": { "isExecutable": true, @@ -1138,7 +1770,7 @@ "type": "string" } }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.5/commands/setName" + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.3/commands/setName" }, "setType": { "isExecutable": true, @@ -1162,11 +1794,11 @@ "type": "string" } }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.5/commands/setType" + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.3/commands/setType" } }, "deviceId": "RoomControl-1", - "feature": "rooms.5", + "feature": "rooms.3", "gatewayId": "################", "isEnabled": true, "isReady": true, @@ -1175,30 +1807,2525 @@ "type": "array", "value": [ { - "deviceId": "zigbee-################" + "deviceId": "zigbee-################", + "heatingCircuit": 0 }, { - "deviceId": "zigbee-################-3" + "deviceId": "zigbee-################-2" } ] }, "name": { "type": "string", - "value": "Hallway Ground" + "value": "Kids Room 1" }, "type": { "type": "string", - "value": "hallway" + "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.5" + "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.5.sensors.humidity", + "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, @@ -1210,17 +4337,17 @@ "value": { "type": "number", "unit": "percent", - "value": 50 + "value": 49 } }, - "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" + "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.5.sensors.temperature", + "feature": "rooms.7.sensors.temperature", "gatewayId": "################", "isEnabled": true, "isReady": true, @@ -1232,11 +4359,11 @@ "value": { "type": "number", "unit": "celsius", - "value": 20.4 + "value": 21.1 } }, - "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" + "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, @@ -1269,7 +4396,7 @@ "type": "number" } }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.6/commands/addActor" + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.8/commands/addActor" }, "moveActor": { "isExecutable": true, @@ -1299,13 +4426,13 @@ "type": "number" } }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.6/commands/moveActor" + "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.6/commands/remove" + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.8/commands/remove" }, "removeActor": { "isExecutable": true, @@ -1317,7 +4444,7 @@ "type": "string" } }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.6/commands/removeActor" + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.8/commands/removeActor" }, "setName": { "isExecutable": true, @@ -1333,7 +4460,7 @@ "type": "string" } }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.6/commands/setName" + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.8/commands/setName" }, "setType": { "isExecutable": true, @@ -1357,11 +4484,11 @@ "type": "string" } }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.6/commands/setType" + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.8/commands/setType" } }, "deviceId": "RoomControl-1", - "feature": "rooms.6", + "feature": "rooms.8", "gatewayId": "################", "isEnabled": true, "isReady": true, @@ -1370,226 +4497,373 @@ "type": "array", "value": [ { - "deviceId": "zigbee-################" + "deviceId": "zigbee-################", + "heatingCircuit": 0 }, { - "deviceId": "zigbee-################-4" + "deviceId": "zigbee-################-6" } ] }, "name": { "type": "string", - "value": "Gäste WC" + "value": "Büro" }, "type": { "type": "string", - "value": "toilet" + "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.6" + "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.6.sensors.humidity", + "feature": "rooms.8.condensationRisk", "gatewayId": "################", "isEnabled": true, "isReady": true, "properties": { - "status": { - "type": "string", - "value": "connected" - }, "value": { - "type": "number", - "unit": "percent", - "value": 49 + "type": "boolean", + "value": false } }, - "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" + "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": {}, + "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.6.sensors.temperature", + "feature": "rooms.8.operating.programs.comfortHeating", "gatewayId": "################", "isEnabled": true, "isReady": true, "properties": { - "status": { - "type": "string", - "value": "connected" + "active": { + "type": "boolean", + "value": false }, - "value": { + "temperature": { "type": "number", "unit": "celsius", - "value": 21 + "value": 22 } }, - "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" + "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": { - "addActor": { - "constraints": { - "enum": [ - "cs", - "fht", - "trv", - "airQualitySensor", - "remoteControllerSensor" - ] - }, + "setTemperature": { "isExecutable": true, - "name": "addActor", + "name": "setTemperature", "params": { - "actorDeviceId": { - "constraints": {}, - "required": true, - "type": "string" - }, - "heatingCircuit": { + "targetTemperature": { "constraints": { - "max": 3, - "min": 0, - "stepping": 1 + "max": 30, + "min": 8, + "stepping": 0.5 }, - "required": false, + "required": true, "type": "number" } }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.7/commands/addActor" + "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 }, - "moveActor": { + "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": "moveActor", + "name": "setTemperature", "params": { - "actorDeviceId": { - "constraints": {}, - "required": true, - "type": "string" - }, - "heatingCircuit": { - "constraints": { - "max": 3, - "min": 0, - "stepping": 1 - }, - "required": false, - "type": "number" - }, - "newRoomId": { + "targetTemperature": { "constraints": { - "max": 23, - "min": 0, - "stepping": 1 + "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/commands/moveActor" + "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 }, - "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" + "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" }, - "removeActor": { + "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": "removeActor", + "name": "activate", "params": { - "actorDeviceId": { - "constraints": {}, + "temperature": { + "constraints": { + "max": 30, + "min": 8, + "stepping": 0.5 + }, "required": true, - "type": "string" + "type": "number" } }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.7/commands/removeActor" + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.8.quickmodes.manualTillNextSchedule/commands/activate" }, - "setName": { + "deactivate": { "isExecutable": true, - "name": "setName", + "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": { - "name": { + "targetTemperature": { "constraints": { - "maxLength": 39, - "minLength": 1, - "regEx": "^[\\p{L}0-9]+( [\\p{L}0-9]+)*$" + "max": 30, + "min": 8, + "stepping": 0.5 }, "required": true, - "type": "string" + "type": "number" } }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.7/commands/setName" + "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" }, - "setType": { + "setSchedule": { "isExecutable": true, - "name": "setType", + "name": "setSchedule", "params": { - "type": { + "newSchedule": { "constraints": { - "enum": [ - "bathroom", - "bedroom", - "hallway", - "livingroom", - "kitchen", - "office", - "nursery", - "toilet", - "other" - ] + "defaultMode": "reduced", + "maxEntries": 4, + "modes": [ + "normal", + "comfort" + ], + "overlapAllowed": false, + "resolution": 10 }, "required": true, - "type": "string" + "type": "Schedule" } }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.7/commands/setType" + "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.7", + "feature": "rooms.8.schedule", "gatewayId": "################", "isEnabled": true, "isReady": true, "properties": { - "actors": { - "type": "array", - "value": [ - { - "deviceId": "zigbee-################-3" - }, - { - "deviceId": "zigbee-################", - "heatingCircuit": 0 - } - ] - }, - "name": { - "type": "string", - "value": "Kids Room 2" + "active": { + "type": "boolean", + "value": true }, - "type": { + "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": "nursery" + "value": "notConnected" } }, - "timestamp": "2026-04-15T21:00:31.581Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.7" + "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.7.sensors.humidity", + "feature": "rooms.8.sensors.humidity", "gatewayId": "################", "isEnabled": true, "isReady": true, @@ -1601,17 +4875,17 @@ "value": { "type": "number", "unit": "percent", - "value": 49 + "value": 41 } }, - "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" + "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.7.sensors.temperature", + "feature": "rooms.8.sensors.temperature", "gatewayId": "################", "isEnabled": true, "isReady": true, @@ -1623,11 +4897,11 @@ "value": { "type": "number", "unit": "celsius", - "value": 21.1 + "value": 24.8 } }, - "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" + "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, @@ -1660,7 +4934,7 @@ "type": "number" } }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.8/commands/addActor" + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.9/commands/addActor" }, "moveActor": { "isExecutable": true, @@ -1690,13 +4964,13 @@ "type": "number" } }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.8/commands/moveActor" + "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.8/commands/remove" + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.9/commands/remove" }, "removeActor": { "isExecutable": true, @@ -1708,7 +4982,7 @@ "type": "string" } }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.8/commands/removeActor" + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.9/commands/removeActor" }, "setName": { "isExecutable": true, @@ -1724,7 +4998,7 @@ "type": "string" } }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.8/commands/setName" + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.9/commands/setName" }, "setType": { "isExecutable": true, @@ -1748,11 +5022,11 @@ "type": "string" } }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.8/commands/setType" + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.9/commands/setType" } }, "deviceId": "RoomControl-1", - "feature": "rooms.8", + "feature": "rooms.9", "gatewayId": "################", "isEnabled": true, "isReady": true, @@ -1765,217 +5039,363 @@ "heatingCircuit": 0 }, { - "deviceId": "zigbee-################-6" + "deviceId": "zigbee-################-5" } ] }, "name": { "type": "string", - "value": "Büro" + "value": "Utility" }, "type": { "type": "string", - "value": "office" + "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.8" + "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.8.sensors.humidity", + "feature": "rooms.9.condensationRisk", "gatewayId": "################", "isEnabled": true, "isReady": true, "properties": { - "status": { - "type": "string", - "value": "connected" - }, "value": { - "type": "number", - "unit": "percent", - "value": 41 + "type": "boolean", + "value": false } }, - "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" + "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": {}, + "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.8.sensors.temperature", + "feature": "rooms.9.operating.programs.comfortHeating", "gatewayId": "################", "isEnabled": true, "isReady": true, "properties": { - "status": { - "type": "string", - "value": "connected" + "active": { + "type": "boolean", + "value": false }, - "value": { + "temperature": { "type": "number", "unit": "celsius", - "value": 24.8 + "value": 22 } }, - "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" + "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": { - "addActor": { - "constraints": { - "enum": [ - "cs", - "fht", - "trv", - "airQualitySensor", - "remoteControllerSensor" - ] - }, + "setTemperature": { "isExecutable": true, - "name": "addActor", + "name": "setTemperature", "params": { - "actorDeviceId": { - "constraints": {}, - "required": true, - "type": "string" - }, - "heatingCircuit": { + "targetTemperature": { "constraints": { - "max": 3, - "min": 0, - "stepping": 1 + "max": 30, + "min": 8, + "stepping": 0.5 }, - "required": false, + "required": true, "type": "number" } }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.9/commands/addActor" + "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 }, - "moveActor": { + "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": "moveActor", + "name": "setTemperature", "params": { - "actorDeviceId": { - "constraints": {}, - "required": true, - "type": "string" - }, - "heatingCircuit": { - "constraints": { - "max": 3, - "min": 0, - "stepping": 1 - }, - "required": false, - "type": "number" - }, - "newRoomId": { + "targetTemperature": { "constraints": { - "max": 23, - "min": 0, - "stepping": 1 + "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/commands/moveActor" + "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 }, - "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" + "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" }, - "removeActor": { + "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": "removeActor", + "name": "activate", "params": { - "actorDeviceId": { - "constraints": {}, + "temperature": { + "constraints": { + "max": 30, + "min": 8, + "stepping": 0.5 + }, "required": true, - "type": "string" + "type": "number" } }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.9/commands/removeActor" + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.9.quickmodes.manualTillNextSchedule/commands/activate" }, - "setName": { + "deactivate": { "isExecutable": true, - "name": "setName", + "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": { - "name": { + "targetTemperature": { "constraints": { - "maxLength": 39, - "minLength": 1, - "regEx": "^[\\p{L}0-9]+( [\\p{L}0-9]+)*$" + "max": 30, + "min": 8, + "stepping": 0.5 }, "required": true, - "type": "string" + "type": "number" } }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.9/commands/setName" + "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" }, - "setType": { + "setSchedule": { "isExecutable": true, - "name": "setType", + "name": "setSchedule", "params": { - "type": { + "newSchedule": { "constraints": { - "enum": [ - "bathroom", - "bedroom", - "hallway", - "livingroom", - "kitchen", - "office", - "nursery", - "toilet", - "other" - ] + "defaultMode": "reduced", + "maxEntries": 4, + "modes": [ + "normal", + "comfort" + ], + "overlapAllowed": false, + "resolution": 10 }, "required": true, - "type": "string" + "type": "Schedule" } }, - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.9/commands/setType" + "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", + "feature": "rooms.9.schedule", "gatewayId": "################", "isEnabled": true, "isReady": true, "properties": { - "actors": { - "type": "array", - "value": [ - { - "deviceId": "zigbee-################", - "heatingCircuit": 0 - }, - { - "deviceId": "zigbee-################-5" - } - ] - }, - "name": { - "type": "string", - "value": "Utility" + "active": { + "type": "boolean", + "value": true }, - "type": { + "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": "other" + "value": "notConnected" } }, - "timestamp": "2026-04-15T21:00:31.581Z", - "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/#######/gateways/################/devices/RoomControl-1/features/rooms.9" + "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, diff --git a/tests/test_PyViCareDeviceConfig.py b/tests/test_PyViCareDeviceConfig.py index 79bfe4bf..fc8dc659 100644 --- a/tests/test_PyViCareDeviceConfig.py +++ b/tests/test_PyViCareDeviceConfig.py @@ -89,6 +89,22 @@ def test_autoDetect_RoleESS_asElectricalEnergySystem(self): device_type = c.asAutoDetectDevice() self.assertEqual("ElectricalEnergySystem", type(device_type).__name__) + def test_autoDetect_E3_RoomControl_asRoomControl(self): + c = PyViCareDeviceConfig(self.service, "0", "E3_RoomControl_One_525", "Online") + device_type = c.asAutoDetectDevice() + self.assertEqual("RoomControl", type(device_type).__name__) + + def test_autoDetect_Smart_RoomControl_asRoomControl(self): + c = PyViCareDeviceConfig(self.service, "0", "Smart_RoomControl", "Online") + device_type = c.asAutoDetectDevice() + self.assertEqual("RoomControl", type(device_type).__name__) + + def test_autoDetect_RoleRoomControl_asRoomControl(self): + self.service.hasRoles = has_roles(["type:virtual;smartRoomControl"]) + c = PyViCareDeviceConfig(self.service, "0", "Unknown", "Online") + device_type = c.asAutoDetectDevice() + self.assertEqual("RoomControl", type(device_type).__name__) + def test_autoDetect_Vitocharge05_asElectricalEnergySystem(self): c = PyViCareDeviceConfig(self.service, "0", "E3_VitoCharge_05", "Online") device_type = c.asAutoDetectDevice() diff --git a/tests/test_RoomControl.py b/tests/test_RoomControl.py new file mode 100644 index 00000000..8b431e87 --- /dev/null +++ b/tests/test_RoomControl.py @@ -0,0 +1,141 @@ +import unittest + +from PyViCare.PyViCareRoomControl import RoomControl +from PyViCare.PyViCareRoomSensor import RoomSensor +from PyViCare.PyViCareUtils import ( + PyViCareCommandError, + PyViCareNotSupportedFeatureError, + isSupported, +) +from tests.ViCareServiceMock import ViCareServiceMock + + +class RoomControlTest(unittest.TestCase): + 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) + + def test_getRoomHumidity(self): + self.assertEqual(self.device.getRoomHumidity("0"), 53) + + def test_getRoomCondensationRisk(self): + result = self.device.getRoomCondensationRisk("0") + self.assertIsNotNone(result) + + def test_getRoomOperatingStateLevel(self): + result = self.device.getRoomOperatingStateLevel("0") + self.assertIsNotNone(result) + + 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_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) diff --git a/tests/test_TestForMissingProperties.py b/tests/test_TestForMissingProperties.py index d996bf54..4c4db9bb 100644 --- a/tests/test_TestForMissingProperties.py +++ b/tests/test_TestForMissingProperties.py @@ -300,39 +300,6 @@ def test_missingProperties(self): 'fht.configuration.floorHeatingDamageProtectionThreshold', 'fht.valve', - # RoomControl - room sensor data, used by enrichment (#743) - 'rooms', - 'rooms.0', - 'rooms.0.sensors.humidity', - 'rooms.0.sensors.temperature', - 'rooms.1', - 'rooms.1.sensors.humidity', - 'rooms.1.sensors.temperature', - 'rooms.2', - 'rooms.2.sensors.humidity', - 'rooms.2.sensors.temperature', - 'rooms.3', - 'rooms.3.sensors.humidity', - 'rooms.3.sensors.temperature', - 'rooms.4', - 'rooms.4.sensors.humidity', - 'rooms.4.sensors.temperature', - 'rooms.5', - 'rooms.5.sensors.humidity', - 'rooms.5.sensors.temperature', - 'rooms.6', - 'rooms.6.sensors.humidity', - 'rooms.6.sensors.temperature', - 'rooms.7', - 'rooms.7.sensors.humidity', - 'rooms.7.sensors.temperature', - 'rooms.8', - 'rooms.8.sensors.humidity', - 'rooms.8.sensors.temperature', - 'rooms.9', - 'rooms.9.sensors.humidity', - 'rooms.9.sensors.temperature', - # DEPRECATED - remove once data point is removed and test data is updated 'heating.burner', # deprecated FIXME: remove once test data is updated 'heating.buffer.hysteresis', @@ -430,7 +397,7 @@ def test_unverifiedProperties(self): continue for match in re.findall(r'getProperty\(\s*?f?"(.*)"\s*?\)', all_python_files[python]): - feature_name = re.sub(r'{(self\.)?(circuit|burner|compressor|condensor|evaporator|inverter)}', '0', match) + feature_name = re.sub(r'{(self\.)?(circuit|burner|compressor|condensor|evaporator|inverter|room_id)}', '0', match) feature_name = re.sub(r'{burner}', '0', feature_name) feature_name = re.sub(r'{circuit}', '0', feature_name) # for local variable in loops feature_name = re.sub(r'\.{(quickmode|mode|program|active_program)}', '', feature_name)