diff --git a/PyViCare/PyViCare.py b/PyViCare/PyViCare.py index c4191f89..e744cb38 100644 --- a/PyViCare/PyViCare.py +++ b/PyViCare/PyViCare.py @@ -4,16 +4,29 @@ from PyViCare.PyViCareAbstractOAuthManager import AbstractViCareOAuthManager from PyViCare.PyViCareBrowserOAuthManager import ViCareBrowserOAuthManager from PyViCare.PyViCareCachedService import ViCareCachedService +from PyViCare.PyViCareCachedServiceViaGateway import ViCareCachedServiceViaGateway from PyViCare.PyViCareDeviceConfig import PyViCareDeviceConfig from PyViCare.PyViCareOAuthManager import ViCareOAuthManager from PyViCare.PyViCareService import ViCareDeviceAccessor, ViCareService +from PyViCare.PyViCareServiceViaGateway import ViCareServiceViaGateway from PyViCare.PyViCareUtils import PyViCareInvalidDataError logger = logging.getLogger('ViCare') logger.addHandler(logging.NullHandler()) +def __buildService(oauth_manager, cacheDuration, viaGateway: bool, accessor, roles): + if cacheDuration > 0: + if viaGateway: + return ViCareCachedServiceViaGateway(oauth_manager, accessor, roles, cacheDuration) + return ViCareCachedService(oauth_manager, accessor, roles, cacheDuration) + + if viaGateway: + return ViCareServiceViaGateway(oauth_manager, accessor, roles) + return ViCareService(oauth_manager, accessor, roles) class PyViCare: + viaGateway = False + """"Viessmann ViCare API Python tools""" def __init__(self) -> None: self.cacheDuration = 60 @@ -21,6 +34,9 @@ def __init__(self) -> None: def setCacheDuration(self, cache_duration): self.cacheDuration = int(cache_duration) + def loadViaGateway(self, via_gateway: bool = True) -> None: + self.viaGateway = via_gateway + def initWithCredentials(self, username: str, password: str, client_id: str, token_file: str): self.initWithExternalOAuth(ViCareOAuthManager( username, password, client_id, token_file)) @@ -32,11 +48,6 @@ def initWithExternalOAuth(self, oauth_manager: AbstractViCareOAuthManager) -> No def initWithBrowserOAuth(self, client_id: str, token_file: str) -> None: self.initWithExternalOAuth(ViCareBrowserOAuthManager(client_id, token_file)) - def __buildService(self, accessor, roles): - if self.cacheDuration > 0: - return ViCareCachedService(self.oauth_manager, accessor, roles, self.cacheDuration) - return ViCareService(self.oauth_manager, accessor, roles) - def __loadInstallations(self): installations = self.oauth_manager.get( "/equipment/installations?includeGateways=true") @@ -44,20 +55,22 @@ def __loadInstallations(self): logger.error("Missing 'data' property when fetching installations") raise PyViCareInvalidDataError(installations) - data = installations['data'] - self.installations = Wrap(data) + self.installations = Wrap(installations["data"]) self.devices = list(self.__extract_devices()) def __extract_devices(self): for installation in self.installations: for gateway in installation.gateways: + if self.viaGateway: + service = __buildService + for device in gateway.devices: if device.deviceType not in ["heating", "zigbee", "vitoconnect", "electricityStorage", "tcu", "ventilation"]: continue # we are only interested in heating, photovoltaic, electricityStorage, and ventilation devices accessor = ViCareDeviceAccessor( installation.id, gateway.serial, device.id) - service = self.__buildService(accessor, device.roles) + service = __buildService(self.oauth_manager, self.cacheDuration, self.viaGateway, accessor, device.roles) logger.info("Device found: %s", device.modelId) diff --git a/PyViCare/PyViCareCachedServiceViaGateway.py b/PyViCare/PyViCareCachedServiceViaGateway.py new file mode 100644 index 00000000..2ac2f6ad --- /dev/null +++ b/PyViCare/PyViCareCachedServiceViaGateway.py @@ -0,0 +1,74 @@ +import logging +import threading +from typing import Any, List + +from PyViCare.PyViCareAbstractOAuthManager import AbstractViCareOAuthManager +from PyViCare.PyViCareService import (ViCareDeviceAccessor, ViCareService, ViCareServiceViaGateway, readFeature) +from PyViCare.PyViCareUtils import PyViCareInvalidDataError, PyViCareNotSupportedFeatureError, ViCareTimer + +logger = logging.getLogger('ViCare') +logger.addHandler(logging.NullHandler()) + +class ViCareCache: + def __init__(self, cache_duration: int) -> None: + self.cache_duration = cache_duration + self.data = None + self.cache_time = None + self.lock = threading.Lock() + + def is_valid(self) -> bool: + return self.data is not None and self.cache_time is not None and not (ViCareTimer().now() - self.cache_time).seconds > self.cache_duration + + def clear(self): + with self.lock: + self.data = None + self.cache_time = None + + def set_cache(self, data: Any): + with self.lock: + self.data = data + + +class ViCareCachedServiceViaGateway(ViCareServiceViaGateway): + def __init__(self, oauth_manager: AbstractViCareOAuthManager, accessor: ViCareDeviceAccessor, roles: List[str], cache: ViCareCache) -> None: + ViCareServiceViaGateway.__init__(self, oauth_manager, accessor, roles) + self.__cache = cache + + def getProperty(self, property_name: str) -> Any: + data = self.__get_data() + entities = data["data"] + + # def readFeature(entities, property_name): + feature = next( + (f for f in entities if f["feature"] == property_name), None) + + if feature is None: + raise PyViCareNotSupportedFeatureError(property_name) + + return feature + + # return readFeature(entities, property_name) + + def setProperty(self, property_name, action, data): + response = super().setProperty(property_name, action, data) + self.__cache.clear() + return response + + def fetch_all_features(self) -> Any: + url = f'/features/installations/{self.accessor.id}/gateways/{self.accessor.serial}/features?includeDevicesFeatures=true' + return self.oauth_manager.get(url) + + def __get_data(self): + with self.__cache.lock: + if not self.__cache.is_valid(): + # we always set the cache time before we fetch the data + # to avoid consuming all the api calls if the api is down + # see https://github.com/home-assistant/core/issues/67052 + # we simply return the old cache in this case + self.__cache.cache_time = ViCareTimer().now() + data = self.fetch_all_features() + if "data" not in data: + logger.error("Missing 'data' property when fetching data.") + raise PyViCareInvalidDataError(data) + self.__cache.set(data) + return self.__cache.data diff --git a/PyViCare/PyViCareService.py b/PyViCare/PyViCareService.py index 4416ae1c..fb86400b 100644 --- a/PyViCare/PyViCareService.py +++ b/PyViCare/PyViCareService.py @@ -44,6 +44,9 @@ def buildGetPropertyUrl(self, property_name): return f'/features/installations/{self.accessor.id}/gateways/{self.accessor.serial}/features/{property_name}' return f'/features/installations/{self.accessor.id}/gateways/{self.accessor.serial}/devices/{self.accessor.device_id}/features/{property_name}' + # def buildSetPropertyUrl(self, property_name, action): + # return f'/features/installations/{self.accessor.id}/gateways/{self.accessor.serial}/devices/{self.accessor.device_id}/features/{property_name}/commands/{action}' + def hasRoles(self, requested_roles) -> bool: return hasRoles(requested_roles, self.roles) @@ -67,3 +70,12 @@ def reboot_gateway(self) -> Any: url = f'/equipment/installations/{self.accessor.id}/gateways/{self.accessor.serial}/reboot' data = "{}" return self.oauth_manager.post(url, data) + + +class ViCareGatewayService(ViCareService): + + def getAllFeaturesURL(self) -> str: + return f'/features/installations/{self.accessor.id}/gateways/{self.accessor.serial}/features?includeDevicesFeatures=true' + + def fetch_all_features(self) -> Any: + return self.oauth_manager.get(self.getAllFeaturesURL()) diff --git a/tests/ViCareGatewayServiceMock.py b/tests/ViCareGatewayServiceMock.py new file mode 100644 index 00000000..9728ed93 --- /dev/null +++ b/tests/ViCareGatewayServiceMock.py @@ -0,0 +1,38 @@ +from PyViCare.PyViCareService import (ViCareDeviceAccessor, readFeature) +from tests.helper import readJson + + +def MockCircuitsData(circuits): + return { + "properties": { + "enabled": { + "value": circuits + } + }, + "feature": "heating.circuits", + } + + +class ViCareGatewayServiceMock: + + def __init__(self, filename, rawInput=None): + if rawInput is None: + testData = readJson(filename) + self.testData = testData + else: + self.testData = rawInput + + self.accessor = ViCareDeviceAccessor('[id]', '[serial]', '[deviceid]') + self.setPropertyData = [] + + def getProperty(self, property_name): + entities = self.testData["data"] + return readFeature(entities, property_name) + + # def setProperty(self, property_name, action, data): + # self.setPropertyData.append({ + # "url": buildSetPropertyUrl(self.accessor, property_name, action), + # "property_name": property_name, + # "action": action, + # "data": data + # }) diff --git a/tests/response/gatewayWithDevices/heatbox1/Vitodens-300-W-B3HA.json b/tests/response/gatewayWithDevices/heatbox1/Vitodens-300-W-B3HA.json new file mode 100644 index 00000000..24927011 --- /dev/null +++ b/tests/response/gatewayWithDevices/heatbox1/Vitodens-300-W-B3HA.json @@ -0,0 +1,995 @@ +{ + "data": [ + { + "feature": "gateway.devices", + "gatewayId": "1234567812345678", + "timestamp": "2024-12-30T09:35:39.088Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/features/gateway.devices", + "properties": { + "devices": { + "type": "DeviceList", + "value": [ + { + "id": "gateway", + "fingerprint": "gw:hb1,mj:2,mi:8,p:0", + "modelId": "Heatbox1", + "modelVersion": "Xkoj4ZDilfHcRmW_Cfq18DAFtHw", + "name": "Heatbox 1, Vitoconnect", + "type": "vitoconnect", + "roles": [ + "type:gateway;VitoconnectOpto1", + "type:legacy" + ], + "status": "online" + }, + { + "id": "0", + "fingerprint": "gg:20,gk:cb,si:43,esi:65535", + "modelId": "VScotHO1_40", + "modelVersion": "fgeuENFo7Q2FW2xbH463_tbwzyI", + "name": "VT 200 (HO1A / HO1B)", + "type": "heating", + "roles": [ + "capability:productionReport;electric", + "type:boiler", + "type:dhw;integrated", + "type:heating;integrated", + "type:legacy", + "type:product;VScotHO1" + ], + "status": "online" + } + ] + } + }, + "commands": {} + }, + { + "feature": "gateway.wifi", + "gatewayId": "1234567812345678", + "timestamp": "2024-12-31T00:32:56.737Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/features/gateway.wifi", + "properties": { + "strength": { + "type": "number", + "value": -47, + "unit": "" + } + }, + "commands": {} + }, + { + "feature": "device.messages.errors.raw", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2024-12-30T09:35:46.843Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/device.messages.errors.raw", + "properties": { + "entries": { + "type": "array", + "value": [] + } + }, + "commands": {} + }, + { + "feature": "device.serial", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2024-12-30T09:35:46.843Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/device.serial", + "properties": { + "value": { + "type": "string", + "value": "################" + } + }, + "commands": {} + }, + { + "feature": "heating.boiler.sensors.temperature.main", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2024-12-31T00:36:05.916Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.boiler.sensors.temperature.main", + "properties": { + "value": { + "type": "number", + "value": 35, + "unit": "celsius" + }, + "status": { + "type": "string", + "value": "connected" + } + }, + "commands": {} + }, + { + "feature": "heating.boiler.serial", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2024-12-30T09:35:46.843Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.boiler.serial", + "properties": { + "value": { + "type": "string", + "value": "################" + } + }, + "commands": {} + }, + { + "feature": "heating.boiler.temperature", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2024-12-31T00:10:16.279Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.boiler.temperature", + "properties": { + "value": { + "type": "number", + "value": 36.3, + "unit": "celsius" + } + }, + "commands": {} + }, + { + "feature": "heating.burners", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2024-12-30T09:35:39.269Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.burners", + "properties": { + "enabled": { + "type": "array", + "value": [ + "0" + ] + } + }, + "commands": {} + }, + { + "feature": "heating.burners.0.modulation", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2024-12-31T00:29:26.029Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.burners.0.modulation", + "properties": { + "value": { + "type": "number", + "value": 0, + "unit": "percent" + } + }, + "commands": {} + }, + { + "feature": "heating.burners.0.statistics", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2024-12-31T00:06:22.999Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.burners.0.statistics", + "properties": { + "hours": { + "type": "number", + "value": 49541, + "unit": "hour" + }, + "starts": { + "type": "number", + "value": 218130, + "unit": "" + } + }, + "commands": {} + }, + { + "feature": "heating.burners.0", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2024-12-31T00:29:23.934Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.burners.0", + "properties": { + "active": { + "type": "boolean", + "value": false + } + }, + "commands": {} + }, + { + "feature": "heating.circuits", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2024-12-30T09:35:46.843Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits", + "properties": { + "enabled": { + "type": "array", + "value": [ + "0" + ] + } + }, + "commands": {} + }, + { + "feature": "heating.circuits.0.circulation.pump", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2024-12-30T22:44:32.617Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0.circulation.pump", + "properties": { + "status": { + "type": "string", + "value": "on" + } + }, + "commands": {} + }, + { + "feature": "heating.circuits.0.frostprotection", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2024-12-30T09:35:46.843Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0.frostprotection", + "properties": { + "status": { + "type": "string", + "value": "off" + } + }, + "commands": {} + }, + { + "feature": "heating.circuits.0.heating.curve", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2024-12-30T09:35:47.579Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0.heating.curve", + "properties": { + "shift": { + "type": "number", + "value": 2, + "unit": "" + }, + "slope": { + "type": "number", + "value": 1.4, + "unit": "" + } + }, + "commands": { + "setCurve": { + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0.heating.curve/commands/setCurve", + "name": "setCurve", + "isExecutable": true, + "params": { + "slope": { + "type": "number", + "required": true, + "constraints": { + "min": 0.2, + "max": 3.5, + "stepping": 0.1 + } + }, + "shift": { + "type": "number", + "required": true, + "constraints": { + "min": -13, + "max": 40, + "stepping": 1 + } + } + } + } + } + }, + { + "feature": "heating.circuits.0.heating.schedule", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2024-12-30T09:35:46.843Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0.heating.schedule", + "properties": { + "entries": { + "type": "Schedule", + "value": { + "mon": [ + { + "start": "06:00", + "end": "22:00", + "mode": "normal", + "position": 0 + } + ], + "tue": [ + { + "start": "06:00", + "end": "22:00", + "mode": "normal", + "position": 0 + } + ], + "wed": [ + { + "start": "06:00", + "end": "22:00", + "mode": "normal", + "position": 0 + } + ], + "thu": [ + { + "start": "06:00", + "end": "22:00", + "mode": "normal", + "position": 0 + } + ], + "fri": [ + { + "start": "06:00", + "end": "22:00", + "mode": "normal", + "position": 0 + } + ], + "sat": [ + { + "start": "07:00", + "end": "23:00", + "mode": "normal", + "position": 0 + } + ], + "sun": [ + { + "start": "07:00", + "end": "23:00", + "mode": "normal", + "position": 0 + } + ] + } + }, + "active": { + "type": "boolean", + "value": true + } + }, + "commands": { + "setSchedule": { + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0.heating.schedule/commands/setSchedule", + "name": "setSchedule", + "isExecutable": true, + "params": { + "newSchedule": { + "type": "Schedule", + "required": true, + "constraints": { + "modes": [ + "normal" + ], + "maxEntries": 4, + "resolution": 10, + "defaultMode": "reduced", + "overlapAllowed": true + } + } + } + }, + "resetSchedule": { + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0.heating.schedule/commands/resetSchedule", + "name": "resetSchedule", + "isExecutable": false, + "params": {} + } + } + }, + { + "feature": "heating.circuits.0.operating.modes.active", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2024-12-30T09:35:46.843Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0.operating.modes.active", + "properties": { + "value": { + "type": "string", + "value": "heating" + } + }, + "commands": { + "setMode": { + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0.operating.modes.active/commands/setMode", + "name": "setMode", + "isExecutable": true, + "params": { + "mode": { + "type": "string", + "required": true, + "constraints": { + "enum": [ + "forcedNormal", + "forcedReduced", + "heating", + "standby" + ] + } + } + } + } + } + }, + { + "feature": "heating.circuits.0.operating.modes.forcedNormal", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2024-12-30T09:35:46.843Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0.operating.modes.forcedNormal", + "properties": { + "active": { + "type": "boolean", + "value": false + } + }, + "commands": {} + }, + { + "feature": "heating.circuits.0.operating.modes.forcedReduced", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2024-12-30T09:35:46.843Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0.operating.modes.forcedReduced", + "properties": { + "active": { + "type": "boolean", + "value": false + } + }, + "commands": {} + }, + { + "feature": "heating.circuits.0.operating.modes.heating", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2024-12-30T09:35:46.843Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0.operating.modes.heating", + "properties": { + "active": { + "type": "boolean", + "value": true + } + }, + "commands": {} + }, + { + "feature": "heating.circuits.0.operating.modes.standby", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2024-12-30T09:35:46.843Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0.operating.modes.standby", + "properties": { + "active": { + "type": "boolean", + "value": false + } + }, + "commands": {} + }, + { + "feature": "heating.circuits.0.operating.programs.active", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2024-12-30T20:59:17.072Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0.operating.programs.active", + "properties": { + "value": { + "type": "string", + "value": "reduced" + } + }, + "commands": {} + }, + { + "feature": "heating.circuits.0.operating.programs.comfort", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2024-12-30T09:35:46.843Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0.operating.programs.comfort", + "properties": { + "temperature": { + "type": "number", + "value": 21, + "unit": "celsius" + }, + "active": { + "type": "boolean", + "value": false + }, + "demand": { + "type": "string", + "value": "unknown" + } + }, + "commands": { + "activate": { + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0.operating.programs.comfort/commands/activate", + "name": "activate", + "isExecutable": false, + "params": { + "temperature": { + "type": "number", + "required": false, + "constraints": { + "min": 4, + "max": 37, + "stepping": 1 + } + } + } + }, + "setTemperature": { + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0.operating.programs.comfort/commands/setTemperature", + "name": "setTemperature", + "isExecutable": true, + "params": { + "targetTemperature": { + "type": "number", + "required": true, + "constraints": { + "min": 4, + "max": 37, + "stepping": 1 + } + } + } + }, + "deactivate": { + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0.operating.programs.comfort/commands/deactivate", + "name": "deactivate", + "isExecutable": false, + "params": {} + } + } + }, + { + "feature": "heating.circuits.0.operating.programs.eco", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2024-12-30T20:59:17.072Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0.operating.programs.eco", + "properties": { + "active": { + "type": "boolean", + "value": false + }, + "temperature": { + "type": "number", + "value": 21, + "unit": "celsius" + } + }, + "commands": { + "activate": { + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0.operating.programs.eco/commands/activate", + "name": "activate", + "isExecutable": false, + "params": {} + }, + "deactivate": { + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0.operating.programs.eco/commands/deactivate", + "name": "deactivate", + "isExecutable": false, + "params": {} + } + } + }, + { + "feature": "heating.circuits.0.operating.programs.external", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2024-12-30T09:35:46.843Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0.operating.programs.external", + "properties": { + "active": { + "type": "boolean", + "value": false + }, + "temperature": { + "type": "number", + "value": 0, + "unit": "" + } + }, + "commands": {} + }, + { + "feature": "heating.circuits.0.operating.programs.normal", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2024-12-30T20:59:17.072Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0.operating.programs.normal", + "properties": { + "active": { + "type": "boolean", + "value": false + }, + "demand": { + "type": "string", + "value": "unknown" + }, + "temperature": { + "type": "number", + "value": 21, + "unit": "celsius" + } + }, + "commands": { + "setTemperature": { + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0.operating.programs.normal/commands/setTemperature", + "name": "setTemperature", + "isExecutable": true, + "params": { + "targetTemperature": { + "required": true, + "constraints": { + "min": 3, + "max": 37, + "stepping": 1 + }, + "type": "number" + } + } + } + } + }, + { + "feature": "heating.circuits.0.operating.programs.reduced", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2024-12-30T20:59:17.072Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0.operating.programs.reduced", + "properties": { + "active": { + "type": "boolean", + "value": true + }, + "demand": { + "type": "string", + "value": "unknown" + }, + "temperature": { + "type": "number", + "value": 16, + "unit": "celsius" + } + }, + "commands": { + "setTemperature": { + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0.operating.programs.reduced/commands/setTemperature", + "name": "setTemperature", + "isExecutable": true, + "params": { + "targetTemperature": { + "required": true, + "constraints": { + "min": 3, + "max": 37, + "stepping": 1 + }, + "type": "number" + } + } + } + } + }, + { + "feature": "heating.circuits.0.operating.programs.standby", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2024-12-30T09:35:46.843Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0.operating.programs.standby", + "properties": { + "active": { + "type": "boolean", + "value": false + } + }, + "commands": {} + }, + { + "feature": "heating.circuits.0.sensors.temperature.supply", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2024-12-31T00:35:45.591Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0.sensors.temperature.supply", + "properties": { + "value": { + "type": "number", + "value": 35.5, + "unit": "celsius" + }, + "status": { + "type": "string", + "value": "connected" + } + }, + "commands": {} + }, + { + "feature": "heating.circuits.0", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2024-12-30T09:35:46.843Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0", + "properties": { + "active": { + "type": "boolean", + "value": true + }, + "name": { + "type": "string", + "value": "Heizkreis OG" + }, + "type": { + "type": "string", + "value": "heatingCircuit" + } + }, + "commands": { + "setName": { + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0/commands/setName", + "name": "setName", + "isExecutable": true, + "params": { + "name": { + "type": "string", + "required": true, + "constraints": { + "minLength": 1, + "maxLength": 20 + } + } + } + } + } + }, + { + "feature": "heating.controller.serial", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2024-12-30T09:35:46.843Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.controller.serial", + "properties": { + "value": { + "type": "string", + "value": "" + } + }, + "commands": {} + }, + { + "feature": "heating.operating.programs.holiday", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2024-12-30T09:35:47.579Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.operating.programs.holiday", + "properties": { + "active": { + "type": "boolean", + "value": false + }, + "start": { + "type": "string", + "value": "" + }, + "end": { + "type": "string", + "value": "" + } + }, + "commands": { + "changeEndDate": { + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.operating.programs.holiday/commands/changeEndDate", + "name": "changeEndDate", + "isExecutable": false, + "params": { + "end": { + "type": "string", + "required": true, + "constraints": { + "regEx": "^[\\d]{4}-[\\d]{2}-[\\d]{2}$", + "sameDayAllowed": false + } + } + } + }, + "schedule": { + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.operating.programs.holiday/commands/schedule", + "name": "schedule", + "isExecutable": true, + "params": { + "start": { + "type": "string", + "required": true, + "constraints": { + "regEx": "^[\\d]{4}-[\\d]{2}-[\\d]{2}$" + } + }, + "end": { + "type": "string", + "required": true, + "constraints": { + "regEx": "^[\\d]{4}-[\\d]{2}-[\\d]{2}$", + "sameDayAllowed": false + } + } + } + }, + "unschedule": { + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.operating.programs.holiday/commands/unschedule", + "name": "unschedule", + "isExecutable": true, + "params": {} + } + } + }, + { + "feature": "heating.sensors.temperature.outside", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2024-12-30T22:16:07.625Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.sensors.temperature.outside", + "properties": { + "value": { + "type": "number", + "value": 6.4, + "unit": "celsius" + }, + "status": { + "type": "string", + "value": "connected" + } + }, + "commands": {} + }, + { + "apiVersion": 1, + "isEnabled": true, + "isReady": true, + "timestamp": "2024-12-30T09:35:46.843Z", + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0.name", + "feature": "heating.circuits.0.name", + "deviceId": "0", + "gatewayId": "1234567812345678", + "components": [], + "commands": { + "setName": { + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0.name/commands/setName", + "name": "setName", + "isExecutable": true, + "params": { + "name": { + "type": "string", + "required": true, + "constraints": { + "minLength": 1, + "maxLength": 20 + } + } + } + } + }, + "properties": { + "name": { + "type": "string", + "value": "Heizkreis OG" + } + } + } + ] +} diff --git a/tests/response/gatewayWithDevices/heatbox2/Vitodens-300-W-WB3D-with-TRV.json b/tests/response/gatewayWithDevices/heatbox2/Vitodens-300-W-WB3D-with-TRV.json new file mode 100644 index 00000000..83e99518 --- /dev/null +++ b/tests/response/gatewayWithDevices/heatbox2/Vitodens-300-W-WB3D-with-TRV.json @@ -0,0 +1,2610 @@ +{ + "data": [ + { + "feature": "gateway.devices", + "gatewayId": "1234567812345678", + "timestamp": "2025-10-15T01:22:15.903Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/features/gateway.devices", + "properties": { + "devices": { + "type": "DeviceList", + "value": [ + { + "id": "gateway", + "fingerprint": "gw:hb2,mj:2,mi:51,p:5", + "modelId": "Heatbox2_SRC", + "modelVersion": "4kpuORsfPdzAPz3mRmDbihveTRA", + "name": "Heatbox2_SRC", + "type": "vitoconnect", + "roles": [ + "capability:src", + "type:gateway;VitoconnectOpto2/OT2", + "type:gatewayConfiguration", + "type:hb2", + "type:legacy" + ], + "status": "online" + }, + { + "id": "RoomControl-1", + "fingerprint": "src:hb2:ext,mj:2,mi:51,p:5", + "modelId": "Smart_RoomControl", + "modelVersion": "JL6oCC5_OSGxElBWK5kOOHeL0eI", + "name": "Smart_RoomControl", + "type": "roomControl", + "roles": [ + "capability:monetization;FTDC", + "capability:monetization;OWD", + "capability:src;FTDC", + "capability:src;OWD", + "capability:zigbeeCoordinator", + "type:legacy", + "type:virtual;smartRoomControl" + ], + "status": "online" + }, + { + "id": "0", + "fingerprint": "gg:20,gk:cb,si:43,esi:65535", + "modelId": "VScotHO1_40", + "modelVersion": "M5va9BMCLzvTp6q3kD5NIOS25oU", + "name": "VScotHO1", + "type": "heating", + "roles": [ + "capability:productionReport;electric", + "type:boiler", + "type:brand;Viessmann", + "type:dhw;integrated", + "type:heating;integrated", + "type:legacy", + "type:product;VScotHO1" + ], + "status": "online" + }, + { + "id": "zigbee-1234567890abcdef", + "fingerprint": "zigbee:trv,mj:2,mi:51,p:5", + "modelId": "Smart_Device_eTRV_generic_50", + "modelVersion": "ryss_zsbny6eKZG3frt9O4XRuS8", + "name": "Smart_Device_eTRV_generic", + "type": "zigbee", + "roles": [ + "type:actuator", + "type:legacy", + "type:radiator", + "type:smartRoomDevice" + ], + "status": "online" + } + ] + } + }, + "commands": {} + }, + { + "feature": "gateway.bmuconnection", + "gatewayId": "1234567812345678", + "timestamp": "2025-10-15T01:07:41.773Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/features/gateway.bmuconnection", + "properties": { + "status": { + "type": "string", + "value": "OK" + } + }, + "commands": {} + }, + { + "feature": "gateway.wifi", + "gatewayId": "1234567812345678", + "timestamp": "2025-10-16T11:26:55.930Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/features/gateway.wifi", + "properties": { + "strength": { + "type": "number", + "value": -72, + "unit": "" + } + }, + "commands": {} + }, + { + "feature": "device.timezone", + "gatewayId": "1234567812345678", + "deviceId": "gateway", + "timestamp": "2025-10-15T01:22:16.368Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/gateway/features/device.timezone", + "properties": { + "value": { + "type": "string", + "value": "Europe/Berlin" + } + }, + "commands": {} + }, + { + "feature": "tcu.wifi", + "gatewayId": "1234567812345678", + "deviceId": "gateway", + "timestamp": "2025-10-16T11:26:55.873Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/gateway/features/tcu.wifi", + "properties": { + "strength": { + "type": "number", + "value": -72, + "unit": "" + } + }, + "commands": {} + }, + { + "feature": "rooms", + "gatewayId": "1234567812345678", + "deviceId": "RoomControl-1", + "timestamp": "2025-10-15T01:22:16.385Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms", + "properties": { + "enabled": { + "type": "array", + "value": [ + "0" + ] + } + }, + "commands": { + "add": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms/commands/add", + "name": "add", + "isExecutable": true, + "params": { + "name": { + "type": "string", + "required": true, + "constraints": { + "minLength": 1, + "maxLength": 40, + "regEx": "^[\\p{L}0-9]+( [\\p{L}0-9]+)*$" + } + }, + "type": { + "type": "string", + "required": true, + "constraints": { + "enum": [ + "bathroom", + "bedroom", + "hallway", + "livingroom", + "kitchen", + "office", + "nursery", + "toilet", + "other" + ] + } + } + } + } + } + }, + { + "feature": "rooms.0", + "gatewayId": "1234567812345678", + "deviceId": "RoomControl-1", + "timestamp": "2025-10-15T01:22:16.385Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.0", + "properties": { + "name": { + "type": "string", + "value": "Arbeitszimmer" + }, + "type": { + "type": "string", + "value": "office" + }, + "actors": { + "type": "array", + "value": [ + { + "deviceId": "zigbee-1234567890abcdef", + "heatingCircuit": 0 + } + ] + } + }, + "commands": { + "addActor": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.0/commands/addActor", + "name": "addActor", + "isExecutable": true, + "params": { + "actorDeviceId": { + "type": "string", + "constraints": {}, + "required": true + }, + "heatingCircuit": { + "type": "number", + "constraints": { + "min": 0, + "max": 3, + "stepping": 1 + }, + "required": false + } + }, + "constraints": { + "enum": [ + "cs", + "fht", + "trv", + "airQualitySensor", + "remoteControllerSensor" + ] + } + }, + "moveActor": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.0/commands/moveActor", + "name": "moveActor", + "isExecutable": true, + "params": { + "actorDeviceId": { + "type": "string", + "constraints": {}, + "required": true + }, + "heatingCircuit": { + "type": "number", + "constraints": { + "min": 0, + "max": 3, + "stepping": 1 + }, + "required": false + }, + "newRoomId": { + "type": "number", + "constraints": { + "min": 0, + "max": 23, + "stepping": 1 + }, + "required": true + } + } + }, + "setName": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.0/commands/setName", + "name": "setName", + "isExecutable": true, + "params": { + "name": { + "type": "string", + "required": true, + "constraints": { + "regEx": "^[\\p{L}0-9]+( [\\p{L}0-9]+)*$", + "minLength": 1, + "maxLength": 40 + } + } + } + }, + "setType": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.0/commands/setType", + "name": "setType", + "isExecutable": true, + "params": { + "type": { + "type": "string", + "required": true, + "constraints": { + "enum": [ + "bathroom", + "bedroom", + "hallway", + "livingroom", + "kitchen", + "office", + "nursery", + "toilet", + "other" + ] + } + } + } + }, + "removeActor": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.0/commands/removeActor", + "name": "removeActor", + "isExecutable": true, + "params": { + "actorDeviceId": { + "type": "string", + "constraints": {}, + "required": true + } + } + }, + "remove": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.0/commands/remove", + "name": "remove", + "isExecutable": true, + "params": {} + } + } + }, + { + "feature": "rooms.0.algorithm", + "gatewayId": "1234567812345678", + "deviceId": "RoomControl-1", + "timestamp": "2025-10-15T01:22:16.385Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.0.algorithm", + "properties": { + "configuration": { + "type": "object", + "value": { + "hydraulicBalance": true, + "heatupSpeed": "normal", + "trvAlgoActive": false, + "openPointDetection": true, + "virtualClimateSensor": false, + "etrvSync": true, + "useTrvOpenWindow": true, + "heatOnTime": false + } + } + }, + "commands": {} + }, + { + "feature": "rooms.0.childLock", + "gatewayId": "1234567812345678", + "deviceId": "RoomControl-1", + "timestamp": "2025-10-15T01:22:16.385Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.0.childLock", + "properties": { + "status": { + "type": "string", + "value": "inactive" + }, + "active": { + "type": "boolean", + "value": false + } + }, + "commands": { + "activate": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.0.childLock/commands/activate", + "name": "activate", + "isExecutable": true, + "params": {} + }, + "deactivate": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.0.childLock/commands/deactivate", + "name": "deactivate", + "isExecutable": true, + "params": {} + }, + "setActive": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.0.childLock/commands/setActive", + "name": "setActive", + "isExecutable": true, + "params": { + "active": { + "type": "boolean", + "required": true, + "constraints": {} + } + } + } + } + }, + { + "feature": "rooms.0.condensationRisk", + "gatewayId": "1234567812345678", + "deviceId": "RoomControl-1", + "timestamp": "2025-10-15T01:22:16.385Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.0.condensationRisk", + "properties": { + "value": { + "type": "boolean", + "value": false + } + }, + "commands": {} + }, + { + "feature": "rooms.0.configuration.hydraulicBalancing", + "gatewayId": "1234567812345678", + "deviceId": "RoomControl-1", + "timestamp": "2025-10-15T01:22:16.385Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.0.configuration.hydraulicBalancing", + "properties": { + "value": { + "type": "boolean", + "value": true + } + }, + "commands": {} + }, + { + "feature": "rooms.0.configuration.openWindow", + "gatewayId": "1234567812345678", + "deviceId": "RoomControl-1", + "timestamp": "2025-10-15T01:22:16.385Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.0.configuration.openWindow", + "properties": { + "active": { + "type": "boolean", + "value": true + } + }, + "commands": {} + }, + { + "feature": "rooms.0.configuration.trvAlgorithmActive", + "gatewayId": "1234567812345678", + "deviceId": "RoomControl-1", + "timestamp": "2025-10-15T01:22:16.385Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.0.configuration.trvAlgorithmActive", + "properties": { + "value": { + "type": "boolean", + "value": false + } + }, + "commands": {} + }, + { + "feature": "rooms.0.configuration.window.openState", + "gatewayId": "1234567812345678", + "deviceId": "RoomControl-1", + "timestamp": "2025-10-15T01:22:16.385Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.0.configuration.window.openState", + "properties": { + "active": { + "type": "boolean", + "value": true + } + }, + "commands": {}, + "deprecated": { + "removalDate": "2024-09-15", + "info": "none" + } + }, + { + "feature": "rooms.0.operating.programs.normalHeating", + "gatewayId": "1234567812345678", + "deviceId": "RoomControl-1", + "timestamp": "2025-10-16T04:01:13.325Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.0.operating.programs.normalHeating", + "properties": { + "active": { + "type": "boolean", + "value": true + }, + "temperature": { + "type": "number", + "value": 20, + "unit": "celsius" + } + }, + "commands": { + "setTemperature": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.0.operating.programs.normalHeating/commands/setTemperature", + "name": "setTemperature", + "isExecutable": true, + "params": { + "targetTemperature": { + "type": "number", + "required": true, + "constraints": { + "min": 8, + "max": 30, + "stepping": 0.5 + } + } + } + } + } + }, + { + "feature": "rooms.0.operating.programs.reducedHeating", + "gatewayId": "1234567812345678", + "deviceId": "RoomControl-1", + "timestamp": "2025-10-16T03:15:12.758Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.0.operating.programs.reducedHeating", + "properties": { + "active": { + "type": "boolean", + "value": false + }, + "temperature": { + "type": "number", + "value": 18, + "unit": "celsius" + } + }, + "commands": { + "setTemperature": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.0.operating.programs.reducedHeating/commands/setTemperature", + "name": "setTemperature", + "isExecutable": true, + "params": { + "targetTemperature": { + "type": "number", + "required": true, + "constraints": { + "min": 8, + "max": 30, + "stepping": 0.5 + } + } + } + } + } + }, + { + "feature": "rooms.0.operating.state", + "gatewayId": "1234567812345678", + "deviceId": "RoomControl-1", + "timestamp": "2025-10-16T04:01:13.325Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.0.operating.state", + "properties": { + "level": { + "type": "string", + "value": "normal" + }, + "demand": { + "type": "string", + "value": "heating" + }, + "reason": { + "type": "string", + "value": "schedule" + }, + "modifier": { + "type": "string", + "value": "none" + } + }, + "commands": {} + }, + { + "feature": "rooms.0.quickmodes.manual", + "gatewayId": "1234567812345678", + "deviceId": "RoomControl-1", + "timestamp": "2025-10-16T04:00:12.181Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.0.quickmodes.manual", + "properties": { + "active": { + "type": "boolean", + "value": false + }, + "defaultDuration": { + "type": "number", + "value": 120, + "unit": "" + } + }, + "commands": { + "activate": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.0.quickmodes.manual/commands/activate", + "name": "activate", + "isExecutable": true, + "params": { + "temperature": { + "type": "number", + "required": true, + "constraints": { + "min": 8, + "max": 30, + "stepping": 0.5 + } + }, + "duration": { + "type": "number", + "required": true, + "constraints": { + "enum": [ + 30, + 60, + 90, + 120, + 180, + 210, + 240, + 360 + ] + } + } + } + }, + "setTemperature": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.0.quickmodes.manual/commands/setTemperature", + "name": "setTemperature", + "isExecutable": true, + "params": { + "targetTemperature": { + "type": "number", + "required": true, + "constraints": { + "min": 8, + "max": 30, + "stepping": 0.5 + } + } + } + }, + "deactivate": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.0.quickmodes.manual/commands/deactivate", + "name": "deactivate", + "isExecutable": true, + "params": {} + } + } + }, + { + "feature": "rooms.0.schedule", + "gatewayId": "1234567812345678", + "deviceId": "RoomControl-1", + "timestamp": "2025-10-15T01:22:16.385Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.0.schedule", + "properties": { + "active": { + "type": "boolean", + "value": true + }, + "entries": { + "type": "Schedule", + "value": { + "mon": [ + { + "position": 0, + "mode": "normal", + "start": "06:00", + "end": "22:00" + } + ], + "tue": [ + { + "position": 0, + "mode": "normal", + "start": "06:00", + "end": "22:00" + } + ], + "wed": [ + { + "position": 0, + "mode": "normal", + "start": "06:00", + "end": "22:00" + } + ], + "thu": [ + { + "position": 0, + "mode": "normal", + "start": "06:00", + "end": "22:00" + } + ], + "fri": [ + { + "position": 0, + "mode": "normal", + "start": "06:00", + "end": "22:00" + } + ], + "sat": [ + { + "position": 0, + "mode": "normal", + "start": "06:00", + "end": "22:00" + } + ], + "sun": [ + { + "position": 0, + "mode": "normal", + "start": "06:00", + "end": "22:00" + } + ] + } + } + }, + "commands": { + "setSchedule": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.0.schedule/commands/setSchedule", + "name": "setSchedule", + "isExecutable": true, + "params": { + "newSchedule": { + "type": "Schedule", + "required": true, + "constraints": { + "modes": [ + "normal" + ], + "maxEntries": 4, + "resolution": 10, + "defaultMode": "reduced", + "overlapAllowed": false + } + } + } + }, + "resetSchedule": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.0.schedule/commands/resetSchedule", + "name": "resetSchedule", + "isExecutable": true, + "params": {} + } + } + }, + { + "feature": "rooms.0.sensors.co2", + "gatewayId": "1234567812345678", + "deviceId": "RoomControl-1", + "timestamp": "2025-10-15T01:22:16.385Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.0.sensors.co2", + "properties": { + "status": { + "type": "string", + "value": "notConnected" + } + }, + "commands": {} + }, + { + "feature": "rooms.0.sensors.humidity", + "gatewayId": "1234567812345678", + "deviceId": "RoomControl-1", + "timestamp": "2025-10-15T01:22:16.385Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.0.sensors.humidity", + "properties": { + "status": { + "type": "string", + "value": "notConnected" + } + }, + "commands": {} + }, + { + "feature": "rooms.0.sensors.openWindow", + "gatewayId": "1234567812345678", + "deviceId": "RoomControl-1", + "timestamp": "2025-10-15T11:11:12.476Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.0.sensors.openWindow", + "properties": { + "value": { + "type": "boolean", + "value": false + } + }, + "commands": {} + }, + { + "feature": "rooms.0.sensors.temperature", + "gatewayId": "1234567812345678", + "deviceId": "RoomControl-1", + "timestamp": "2025-10-16T11:26:13.133Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.0.sensors.temperature", + "properties": { + "status": { + "type": "string", + "value": "connected" + }, + "value": { + "type": "number", + "value": 20.6, + "unit": "celsius" + } + }, + "commands": {} + }, + { + "feature": "rooms.0.sensors.window.openState", + "gatewayId": "1234567812345678", + "deviceId": "RoomControl-1", + "timestamp": "2025-10-15T11:11:12.476Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.0.sensors.window.openState", + "properties": { + "value": { + "type": "boolean", + "value": false + } + }, + "commands": {}, + "deprecated": { + "removalDate": "2024-09-15", + "info": "none" + } + }, + { + "feature": "rooms.0.temperature.levels.normal.heating", + "gatewayId": "1234567812345678", + "deviceId": "RoomControl-1", + "timestamp": "2025-10-15T01:22:16.385Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.0.temperature.levels.normal.heating", + "properties": { + "temperature": { + "type": "number", + "value": 20, + "unit": "celsius" + } + }, + "commands": {} + }, + { + "feature": "rooms.0.temperature.levels.normal.perceived", + "gatewayId": "1234567812345678", + "deviceId": "RoomControl-1", + "timestamp": "2025-10-15T01:22:16.385Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.0.temperature.levels.normal.perceived", + "properties": { + "temperature": { + "type": "number", + "value": 20, + "unit": "celsius" + } + }, + "commands": {} + }, + { + "feature": "rooms.0.temperature.levels.reduced.heating", + "gatewayId": "1234567812345678", + "deviceId": "RoomControl-1", + "timestamp": "2025-10-15T01:22:16.385Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.0.temperature.levels.reduced.heating", + "properties": { + "temperature": { + "type": "number", + "value": 18, + "unit": "celsius" + } + }, + "commands": {} + }, + { + "feature": "rooms.0.temperature.reference", + "gatewayId": "1234567812345678", + "deviceId": "RoomControl-1", + "timestamp": "2025-10-15T01:22:16.385Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.0.temperature.reference", + "properties": {}, + "commands": {} + }, + { + "feature": "rooms.features.supplyChannel0FTDC", + "gatewayId": "1234567812345678", + "deviceId": "RoomControl-1", + "timestamp": "2025-10-15T01:22:16.385Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.features.supplyChannel0FTDC", + "properties": { + "active": { + "type": "boolean", + "value": false + } + }, + "commands": {} + }, + { + "feature": "rooms.features.supplyChannel0FTDCUseValveInformation", + "gatewayId": "1234567812345678", + "deviceId": "RoomControl-1", + "timestamp": "2025-10-15T01:22:16.385Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.features.supplyChannel0FTDCUseValveInformation", + "properties": { + "active": { + "type": "boolean", + "value": false + } + }, + "commands": {}, + "deprecated": { + "removalDate": "2025-09-09", + "info": "replaced by rooms.features.supplyChannel0PumpControl" + } + }, + { + "feature": "rooms.features.supplyChannel0PumpControl", + "gatewayId": "1234567812345678", + "deviceId": "RoomControl-1", + "timestamp": "2025-10-15T01:22:16.385Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.features.supplyChannel0PumpControl", + "properties": { + "active": { + "type": "boolean", + "value": false + } + }, + "commands": {} + }, + { + "feature": "rooms.features.supplyChannel1FTDC", + "gatewayId": "1234567812345678", + "deviceId": "RoomControl-1", + "timestamp": "2025-10-15T01:22:16.385Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.features.supplyChannel1FTDC", + "properties": { + "active": { + "type": "boolean", + "value": false + } + }, + "commands": {} + }, + { + "feature": "rooms.features.supplyChannel1FTDCUseValveInformation", + "gatewayId": "1234567812345678", + "deviceId": "RoomControl-1", + "timestamp": "2025-10-15T01:22:16.385Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.features.supplyChannel1FTDCUseValveInformation", + "properties": { + "active": { + "type": "boolean", + "value": true + } + }, + "commands": {}, + "deprecated": { + "removalDate": "2025-09-09", + "info": "replaced by rooms.features.supplyChannel1PumpControl" + } + }, + { + "feature": "rooms.features.supplyChannel1PumpControl", + "gatewayId": "1234567812345678", + "deviceId": "RoomControl-1", + "timestamp": "2025-10-15T01:22:16.385Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.features.supplyChannel1PumpControl", + "properties": { + "active": { + "type": "boolean", + "value": true + } + }, + "commands": {} + }, + { + "feature": "rooms.features.supplyChannel2FTDC", + "gatewayId": "1234567812345678", + "deviceId": "RoomControl-1", + "timestamp": "2025-10-15T01:22:16.385Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.features.supplyChannel2FTDC", + "properties": { + "active": { + "type": "boolean", + "value": false + } + }, + "commands": {} + }, + { + "feature": "rooms.features.supplyChannel2FTDCUseValveInformation", + "gatewayId": "1234567812345678", + "deviceId": "RoomControl-1", + "timestamp": "2025-10-15T01:22:16.385Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.features.supplyChannel2FTDCUseValveInformation", + "properties": { + "active": { + "type": "boolean", + "value": true + } + }, + "commands": {}, + "deprecated": { + "removalDate": "2025-09-09", + "info": "replaced by rooms.features.supplyChannel2PumpControl" + } + }, + { + "feature": "rooms.features.supplyChannel2PumpControl", + "gatewayId": "1234567812345678", + "deviceId": "RoomControl-1", + "timestamp": "2025-10-15T01:22:16.385Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.features.supplyChannel2PumpControl", + "properties": { + "active": { + "type": "boolean", + "value": true + } + }, + "commands": {} + }, + { + "feature": "rooms.features.supplyChannel3FTDC", + "gatewayId": "1234567812345678", + "deviceId": "RoomControl-1", + "timestamp": "2025-10-15T01:22:16.385Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.features.supplyChannel3FTDC", + "properties": { + "active": { + "type": "boolean", + "value": false + } + }, + "commands": {} + }, + { + "feature": "rooms.features.supplyChannel3FTDCUseValveInformation", + "gatewayId": "1234567812345678", + "deviceId": "RoomControl-1", + "timestamp": "2025-10-15T01:22:16.385Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.features.supplyChannel3FTDCUseValveInformation", + "properties": { + "active": { + "type": "boolean", + "value": true + } + }, + "commands": {}, + "deprecated": { + "removalDate": "2025-09-09", + "info": "replaced by rooms.features.supplyChannel3PumpControl" + } + }, + { + "feature": "rooms.features.supplyChannel3PumpControl", + "gatewayId": "1234567812345678", + "deviceId": "RoomControl-1", + "timestamp": "2025-10-15T01:22:16.385Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.features.supplyChannel3PumpControl", + "properties": { + "active": { + "type": "boolean", + "value": true + } + }, + "commands": {} + }, + { + "feature": "rooms.others", + "gatewayId": "1234567812345678", + "deviceId": "RoomControl-1", + "timestamp": "2025-10-15T01:22:16.385Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.others", + "properties": { + "enabled": { + "type": "array", + "value": [] + } + }, + "commands": { + "add": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.others/commands/add", + "name": "add", + "isExecutable": true, + "params": { + "name": { + "type": "string", + "required": true, + "constraints": { + "minLength": 1, + "maxLength": 40 + } + }, + "heatingCircuit": { + "type": "number", + "required": true, + "constraints": { + "enum": [ + 0 + ] + } + } + } + } + } + }, + { + "feature": "rooms.status", + "gatewayId": "1234567812345678", + "deviceId": "RoomControl-1", + "timestamp": "2025-10-15T01:22:16.385Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.status", + "properties": { + "active": { + "type": "boolean", + "value": true + }, + "variant": { + "type": "string", + "value": "full" + } + }, + "commands": { + "activate": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.status/commands/activate", + "name": "activate", + "isExecutable": true, + "params": {} + }, + "deactivate": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.status/commands/deactivate", + "name": "deactivate", + "isExecutable": true, + "params": {} + }, + "setActive": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.status/commands/setActive", + "name": "setActive", + "isExecutable": true, + "params": { + "active": { + "type": "boolean", + "required": true, + "constraints": {} + } + } + } + } + }, + { + "feature": "device.serial", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-15T01:22:16.351Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/device.serial", + "properties": { + "value": { + "type": "string", + "value": "################" + } + }, + "commands": {} + }, + { + "feature": "heating.boiler.pumps.internal", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-15T01:22:16.351Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.boiler.pumps.internal", + "properties": { + "status": { + "type": "string", + "value": "on" + } + }, + "commands": {} + }, + { + "feature": "heating.boiler.sensors.temperature.main", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-16T11:27:42.672Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.boiler.sensors.temperature.main", + "properties": { + "value": { + "type": "number", + "value": 26, + "unit": "celsius" + }, + "status": { + "type": "string", + "value": "connected" + } + }, + "commands": {} + }, + { + "feature": "heating.boiler.serial", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-15T01:22:16.351Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.boiler.serial", + "properties": { + "value": { + "type": "string", + "value": "################" + } + }, + "commands": {} + }, + { + "feature": "heating.boiler.temperature", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-16T11:16:34.131Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.boiler.temperature", + "properties": { + "value": { + "type": "number", + "value": 33, + "unit": "celsius" + } + }, + "commands": {} + }, + { + "feature": "heating.burners", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-15T01:22:16.351Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.burners", + "properties": { + "enabled": { + "type": "array", + "value": [ + "0" + ] + } + }, + "commands": {} + }, + { + "feature": "heating.burners.0.modulation", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-16T11:04:10.719Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.burners.0.modulation", + "properties": { + "value": { + "type": "number", + "value": 0, + "unit": "percent" + } + }, + "commands": {} + }, + { + "feature": "heating.burners.0.statistics", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-16T11:03:38.222Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.burners.0.statistics", + "properties": { + "hours": { + "type": "number", + "value": 51146, + "unit": "hour" + }, + "starts": { + "type": "number", + "value": 229928, + "unit": "" + } + }, + "commands": {} + }, + { + "feature": "heating.burners.0", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-16T11:03:58.752Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.burners.0", + "properties": { + "active": { + "type": "boolean", + "value": false + } + }, + "commands": {} + }, + { + "feature": "heating.burners.0.automatic", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-15T01:22:16.351Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.burners.0.automatic", + "properties": { + "status": { + "type": "string", + "value": "ok" + }, + "errorCode": { + "type": "number", + "value": 0, + "unit": "" + }, + "errorDetails": { + "type": "string", + "value": "error" + }, + "audience": { + "type": "string", + "value": "internal" + } + }, + "commands": {}, + "deprecated": { + "removalDate": "2024-09-15", + "info": "none" + } + }, + { + "feature": "heating.burners.0.errorStatus", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-15T01:22:16.351Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.burners.0.errorStatus", + "properties": { + "status": { + "type": "string", + "value": "ok" + }, + "errorCode": { + "type": "number", + "value": 0, + "unit": "" + }, + "errorDetails": { + "type": "string", + "value": "error" + }, + "audience": { + "type": "string", + "value": "internal" + } + }, + "commands": {} + }, + { + "feature": "heating.circuits", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-15T01:22:16.351Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits", + "properties": { + "enabled": { + "type": "array", + "value": [ + "0" + ] + } + }, + "commands": {} + }, + { + "feature": "heating.circuits.0.circulation.pump", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-15T01:22:16.351Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0.circulation.pump", + "properties": { + "status": { + "type": "string", + "value": "on" + } + }, + "commands": {} + }, + { + "feature": "heating.circuits.0.frostprotection", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-15T01:22:16.351Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0.frostprotection", + "properties": { + "status": { + "type": "string", + "value": "off" + } + }, + "commands": {} + }, + { + "feature": "heating.circuits.0.heating.curve", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-15T01:22:16.351Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0.heating.curve", + "properties": { + "shift": { + "type": "number", + "value": 2, + "unit": "" + }, + "slope": { + "type": "number", + "value": 1.4, + "unit": "" + } + }, + "commands": { + "setCurve": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0.heating.curve/commands/setCurve", + "name": "setCurve", + "isExecutable": true, + "params": { + "slope": { + "type": "number", + "required": true, + "constraints": { + "min": 0.2, + "max": 3.5, + "stepping": 0.1 + } + }, + "shift": { + "type": "number", + "required": true, + "constraints": { + "min": -13, + "max": 40, + "stepping": 1 + } + } + } + } + } + }, + { + "feature": "heating.circuits.0.heating.schedule", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-15T01:22:16.351Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0.heating.schedule", + "properties": { + "entries": { + "type": "Schedule", + "value": { + "mon": [ + { + "start": "06:00", + "end": "22:00", + "mode": "normal", + "position": 0 + } + ], + "tue": [ + { + "start": "06:00", + "end": "22:00", + "mode": "normal", + "position": 0 + } + ], + "wed": [ + { + "start": "06:00", + "end": "22:00", + "mode": "normal", + "position": 0 + } + ], + "thu": [ + { + "start": "06:00", + "end": "22:00", + "mode": "normal", + "position": 0 + } + ], + "fri": [ + { + "start": "06:00", + "end": "22:00", + "mode": "normal", + "position": 0 + } + ], + "sat": [ + { + "start": "06:00", + "end": "22:00", + "mode": "normal", + "position": 0 + } + ], + "sun": [ + { + "start": "06:00", + "end": "22:00", + "mode": "normal", + "position": 0 + } + ] + } + }, + "active": { + "type": "boolean", + "value": true + } + }, + "commands": { + "setSchedule": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0.heating.schedule/commands/setSchedule", + "name": "setSchedule", + "isExecutable": true, + "params": { + "newSchedule": { + "type": "Schedule", + "required": true, + "constraints": { + "modes": [ + "normal" + ], + "maxEntries": 4, + "resolution": 10, + "defaultMode": "reduced", + "overlapAllowed": true + } + } + } + }, + "resetSchedule": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0.heating.schedule/commands/resetSchedule", + "name": "resetSchedule", + "isExecutable": true, + "params": {} + } + } + }, + { + "feature": "heating.circuits.0.operating.modes.active", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-15T01:22:16.351Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0.operating.modes.active", + "properties": { + "value": { + "type": "string", + "value": "heating" + } + }, + "commands": { + "setMode": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0.operating.modes.active/commands/setMode", + "name": "setMode", + "isExecutable": true, + "params": { + "mode": { + "type": "string", + "required": true, + "constraints": { + "enum": [ + "heating", + "standby" + ] + } + } + } + } + } + }, + { + "feature": "heating.circuits.0.operating.modes.forcedNormal", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-15T01:22:16.351Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0.operating.modes.forcedNormal", + "properties": { + "active": { + "type": "boolean", + "value": false + } + }, + "commands": {} + }, + { + "feature": "heating.circuits.0.operating.modes.forcedReduced", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-15T01:22:16.351Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0.operating.modes.forcedReduced", + "properties": { + "active": { + "type": "boolean", + "value": false + } + }, + "commands": {} + }, + { + "feature": "heating.circuits.0.operating.modes.heating", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-15T01:22:16.351Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0.operating.modes.heating", + "properties": { + "active": { + "type": "boolean", + "value": true + } + }, + "commands": {} + }, + { + "feature": "heating.circuits.0.operating.modes.standby", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-15T01:22:16.351Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0.operating.modes.standby", + "properties": { + "active": { + "type": "boolean", + "value": false + } + }, + "commands": {} + }, + { + "feature": "heating.circuits.0.operating.programs.active", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-16T11:19:42.996Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0.operating.programs.active", + "properties": { + "value": { + "type": "string", + "value": "normal" + } + }, + "commands": {} + }, + { + "feature": "heating.circuits.0.operating.programs.comfort", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-15T01:22:16.351Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0.operating.programs.comfort", + "properties": { + "temperature": { + "type": "number", + "value": 21, + "unit": "celsius" + }, + "active": { + "type": "boolean", + "value": false + }, + "demand": { + "type": "string", + "value": "unknown" + } + }, + "commands": { + "activate": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0.operating.programs.comfort/commands/activate", + "name": "activate", + "isExecutable": false, + "params": { + "temperature": { + "type": "number", + "required": false, + "constraints": { + "min": 4, + "max": 37, + "stepping": 1 + } + } + } + }, + "setTemperature": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0.operating.programs.comfort/commands/setTemperature", + "name": "setTemperature", + "isExecutable": true, + "params": { + "targetTemperature": { + "type": "number", + "required": true, + "constraints": { + "min": 4, + "max": 37, + "stepping": 1 + } + } + } + }, + "deactivate": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0.operating.programs.comfort/commands/deactivate", + "name": "deactivate", + "isExecutable": false, + "params": {} + } + } + }, + { + "feature": "heating.circuits.0.operating.programs.eco", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-16T04:00:14.298Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0.operating.programs.eco", + "properties": { + "active": { + "type": "boolean", + "value": false + }, + "temperature": { + "type": "number", + "value": 20, + "unit": "celsius" + } + }, + "commands": { + "activate": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0.operating.programs.eco/commands/activate", + "name": "activate", + "isExecutable": false, + "params": {} + }, + "deactivate": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0.operating.programs.eco/commands/deactivate", + "name": "deactivate", + "isExecutable": false, + "params": {} + } + } + }, + { + "feature": "heating.circuits.0.operating.programs.external", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-16T11:19:42.996Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0.operating.programs.external", + "properties": { + "active": { + "type": "boolean", + "value": false + }, + "temperature": { + "type": "number", + "value": 0, + "unit": "" + } + }, + "commands": {} + }, + { + "feature": "heating.circuits.0.operating.programs.normal", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-16T04:00:14.298Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0.operating.programs.normal", + "properties": { + "active": { + "type": "boolean", + "value": true + }, + "demand": { + "type": "string", + "value": "unknown" + }, + "temperature": { + "type": "number", + "value": 20, + "unit": "celsius" + } + }, + "commands": { + "setTemperature": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0.operating.programs.normal/commands/setTemperature", + "name": "setTemperature", + "isExecutable": true, + "params": { + "targetTemperature": { + "required": true, + "constraints": { + "min": 3, + "max": 37, + "stepping": 1 + }, + "type": "number" + } + } + } + } + }, + { + "feature": "heating.circuits.0.operating.programs.reduced", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-16T04:00:14.298Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0.operating.programs.reduced", + "properties": { + "active": { + "type": "boolean", + "value": false + }, + "demand": { + "type": "string", + "value": "unknown" + }, + "temperature": { + "type": "number", + "value": 20, + "unit": "celsius" + } + }, + "commands": { + "setTemperature": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0.operating.programs.reduced/commands/setTemperature", + "name": "setTemperature", + "isExecutable": true, + "params": { + "targetTemperature": { + "required": true, + "constraints": { + "min": 3, + "max": 37, + "stepping": 1 + }, + "type": "number" + } + } + } + } + }, + { + "feature": "heating.circuits.0.operating.programs.standby", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-15T01:22:16.351Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0.operating.programs.standby", + "properties": { + "active": { + "type": "boolean", + "value": false + } + }, + "commands": {} + }, + { + "feature": "heating.circuits.0.sensors.temperature.supply", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-16T11:27:32.993Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0.sensors.temperature.supply", + "properties": { + "value": { + "type": "number", + "value": 26, + "unit": "celsius" + }, + "status": { + "type": "string", + "value": "connected" + } + }, + "commands": {} + }, + { + "feature": "heating.circuits.0", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-15T01:22:16.351Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0", + "properties": { + "active": { + "type": "boolean", + "value": true + }, + "name": { + "type": "string", + "value": "Heizkreis OG" + }, + "type": { + "type": "string", + "value": "heatingCircuit" + } + }, + "commands": { + "setName": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0/commands/setName", + "name": "setName", + "isExecutable": true, + "params": { + "name": { + "type": "string", + "required": true, + "constraints": { + "minLength": 1, + "maxLength": 20 + } + } + } + } + } + }, + { + "feature": "heating.controller.serial", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-15T01:22:16.351Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.controller.serial", + "properties": { + "value": { + "type": "string", + "value": "" + } + }, + "commands": {} + }, + { + "feature": "heating.flue.sensors.temperature.main", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-16T11:08:48.027Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.flue.sensors.temperature.main", + "properties": { + "status": { + "type": "string", + "value": "connected" + }, + "value": { + "type": "number", + "value": 27.3, + "unit": "celsius" + } + }, + "commands": {} + }, + { + "feature": "heating.operating.programs.holiday", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-15T01:22:16.351Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.operating.programs.holiday", + "properties": { + "active": { + "type": "boolean", + "value": false + }, + "start": { + "type": "string", + "value": "" + }, + "end": { + "type": "string", + "value": "" + } + }, + "commands": { + "changeEndDate": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.operating.programs.holiday/commands/changeEndDate", + "name": "changeEndDate", + "isExecutable": false, + "params": { + "end": { + "type": "string", + "required": true, + "constraints": { + "regEx": "^[\\d]{4}-[\\d]{2}-[\\d]{2}$", + "sameDayAllowed": false + } + } + } + }, + "schedule": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.operating.programs.holiday/commands/schedule", + "name": "schedule", + "isExecutable": true, + "params": { + "start": { + "type": "string", + "required": true, + "constraints": { + "regEx": "^[\\d]{4}-[\\d]{2}-[\\d]{2}$" + } + }, + "end": { + "type": "string", + "required": true, + "constraints": { + "regEx": "^[\\d]{4}-[\\d]{2}-[\\d]{2}$", + "sameDayAllowed": false + } + } + } + }, + "unschedule": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.operating.programs.holiday/commands/unschedule", + "name": "unschedule", + "isExecutable": true, + "params": {} + } + } + }, + { + "feature": "heating.sensors.temperature.outside", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-16T11:27:12.141Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.sensors.temperature.outside", + "properties": { + "value": { + "type": "number", + "value": 18.2, + "unit": "celsius" + }, + "status": { + "type": "string", + "value": "connected" + } + }, + "commands": {} + }, + { + "feature": "device.configuration.measurementWeight", + "gatewayId": "1234567812345678", + "deviceId": "zigbee-1234567890abcdef", + "timestamp": "2025-10-15T01:22:16.561Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/zigbee-1234567890abcdef/features/device.configuration.measurementWeight", + "properties": { + "weight": { + "type": "number", + "value": 20, + "unit": "" + } + }, + "commands": {} + }, + { + "feature": "device.heatingCircuitId", + "gatewayId": "1234567812345678", + "deviceId": "zigbee-1234567890abcdef", + "timestamp": "2025-10-15T01:25:32.977Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/zigbee-1234567890abcdef/features/device.heatingCircuitId", + "properties": { + "value": { + "type": "number", + "value": 0, + "unit": "" + } + }, + "commands": {} + }, + { + "feature": "device.identification", + "gatewayId": "1234567812345678", + "deviceId": "zigbee-1234567890abcdef", + "timestamp": "2025-10-15T01:25:32.977Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/zigbee-1234567890abcdef/features/device.identification", + "properties": { + "triggered": { + "type": "boolean", + "value": false + } + }, + "commands": {} + }, + { + "feature": "device.information", + "gatewayId": "1234567812345678", + "deviceId": "zigbee-1234567890abcdef", + "timestamp": "2025-10-15T01:22:16.561Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/zigbee-1234567890abcdef/features/device.information", + "properties": { + "manufacturer": { + "type": "string", + "value": "Viessmann" + }, + "modelId": { + "type": "string", + "value": "7637434" + } + }, + "commands": {} + }, + { + "feature": "device.messages.status.raw", + "gatewayId": "1234567812345678", + "deviceId": "zigbee-1234567890abcdef", + "timestamp": "2025-10-15T01:25:32.977Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/zigbee-1234567890abcdef/features/device.messages.status.raw", + "properties": { + "entries": { + "type": "array", + "value": [] + } + }, + "commands": {} + }, + { + "feature": "device.name", + "gatewayId": "1234567812345678", + "deviceId": "zigbee-1234567890abcdef", + "timestamp": "2025-10-15T01:25:32.977Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/zigbee-1234567890abcdef/features/device.name", + "properties": { + "name": { + "type": "string", + "value": "" + } + }, + "commands": { + "setName": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/zigbee-1234567890abcdef/features/device.name/commands/setName", + "name": "setName", + "isExecutable": true, + "params": { + "name": { + "type": "string", + "required": true, + "constraints": { + "regEx": "^[\\p{L}0-9]+( [\\p{L}0-9]+)*$", + "minLength": 1, + "maxLength": 40 + } + } + } + } + } + }, + { + "feature": "device.power.battery", + "gatewayId": "1234567812345678", + "deviceId": "zigbee-1234567890abcdef", + "timestamp": "2025-10-15T01:25:32.977Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/zigbee-1234567890abcdef/features/device.power.battery", + "properties": { + "level": { + "type": "number", + "value": 92, + "unit": "percent" + } + }, + "commands": {} + }, + { + "feature": "device.sensors.temperature", + "gatewayId": "1234567812345678", + "deviceId": "zigbee-1234567890abcdef", + "timestamp": "2025-10-16T11:20:55.446Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/zigbee-1234567890abcdef/features/device.sensors.temperature", + "properties": { + "status": { + "type": "string", + "value": "connected" + }, + "value": { + "type": "number", + "value": 20.8, + "unit": "celsius" + } + }, + "commands": {} + }, + { + "feature": "device.zigbee.lqi", + "gatewayId": "1234567812345678", + "deviceId": "zigbee-1234567890abcdef", + "timestamp": "2025-10-16T11:19:12.569Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/zigbee-1234567890abcdef/features/device.zigbee.lqi", + "properties": { + "strength": { + "type": "number", + "value": 21, + "unit": "percent" + } + }, + "commands": {} + }, + { + "feature": "device.zigbee.parent.id", + "gatewayId": "1234567812345678", + "deviceId": "zigbee-1234567890abcdef", + "timestamp": "2025-10-15T01:25:32.977Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/zigbee-1234567890abcdef/features/device.zigbee.parent.id", + "properties": { + "value": { + "type": "string", + "value": "fedcba0987654321" + } + }, + "commands": {} + }, + { + "feature": "device.zigbee.parent.rx", + "gatewayId": "1234567812345678", + "deviceId": "zigbee-1234567890abcdef", + "timestamp": "2025-10-16T11:26:13.735Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/zigbee-1234567890abcdef/features/device.zigbee.parent.rx", + "properties": { + "value": { + "type": "number", + "value": 58, + "unit": "" + } + }, + "commands": {} + }, + { + "feature": "device.zigbee.parent.tx", + "gatewayId": "1234567812345678", + "deviceId": "zigbee-1234567890abcdef", + "timestamp": "2025-10-16T11:25:57.826Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/zigbee-1234567890abcdef/features/device.zigbee.parent.tx", + "properties": { + "value": { + "type": "number", + "value": 76, + "unit": "" + } + }, + "commands": {} + }, + { + "feature": "trv.childLock", + "gatewayId": "1234567812345678", + "deviceId": "zigbee-1234567890abcdef", + "timestamp": "2025-10-15T01:25:32.977Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/zigbee-1234567890abcdef/features/trv.childLock", + "properties": { + "status": { + "type": "string", + "value": "inactive" + } + }, + "commands": {} + }, + { + "feature": "trv.mountingMode", + "gatewayId": "1234567812345678", + "deviceId": "zigbee-1234567890abcdef", + "timestamp": "2025-10-15T01:25:32.977Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/zigbee-1234567890abcdef/features/trv.mountingMode", + "properties": { + "active": { + "type": "boolean", + "value": false + } + }, + "commands": {} + }, + { + "feature": "trv.temperature", + "gatewayId": "1234567812345678", + "deviceId": "zigbee-1234567890abcdef", + "timestamp": "2025-10-16T04:00:12.215Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/zigbee-1234567890abcdef/features/trv.temperature", + "properties": { + "value": { + "type": "number", + "value": 20, + "unit": "celsius" + } + }, + "commands": { + "setTargetTemperature": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/zigbee-1234567890abcdef/features/trv.temperature/commands/setTargetTemperature", + "name": "setTargetTemperature", + "isExecutable": true, + "params": { + "temperature": { + "type": "number", + "required": true, + "constraints": { + "min": 8, + "max": 30, + "stepping": 0.5 + } + } + } + } + } + }, + { + "feature": "trv.valve.position", + "gatewayId": "1234567812345678", + "deviceId": "zigbee-1234567890abcdef", + "timestamp": "2025-10-16T11:25:12.316Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/zigbee-1234567890abcdef/features/trv.valve.position", + "properties": { + "position": { + "type": "number", + "value": 17, + "unit": "percent" + } + }, + "commands": {} + }, + { + "apiVersion": 1, + "isEnabled": true, + "isReady": true, + "timestamp": "2025-10-15T01:22:16.351Z", + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0.name", + "feature": "heating.circuits.0.name", + "deviceId": "0", + "gatewayId": "1234567812345678", + "components": [], + "commands": { + "setName": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0.name/commands/setName", + "name": "setName", + "isExecutable": true, + "params": { + "name": { + "type": "string", + "required": true, + "constraints": { + "minLength": 1, + "maxLength": 20 + } + } + } + } + }, + "properties": { + "name": { + "type": "string", + "value": "Heizkreis OG" + } + } + } + ] +} diff --git a/tests/response/gatewayWithDevices/tcu1/Vitopure-350.json b/tests/response/gatewayWithDevices/tcu1/Vitopure-350.json new file mode 100644 index 00000000..08e6d13c --- /dev/null +++ b/tests/response/gatewayWithDevices/tcu1/Vitopure-350.json @@ -0,0 +1,1845 @@ +{ + "data": [ + { + "feature": "gateway.devices", + "gatewayId": "1234567812345678", + "timestamp": "2025-10-15T01:07:15.076Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/features/gateway.devices", + "properties": { + "devices": { + "type": "DeviceList", + "value": [ + { + "id": "0", + "fingerprint": "ecu;7973843400382125;0099.0500.2413.0002;0099.0500.2408.0001", + "modelId": "E3_VitoPure", + "modelVersion": "bIuvE8S0ArAZWWYWjdcI-WOSAjk", + "name": "E3_VitoPure", + "type": "ventilation", + "roles": [ + "type:B2C", + "type:E3", + "type:brand;Viessmann", + "type:gatewayConfiguration", + "type:product;Vitopure", + "type:ventilation;purifier" + ], + "status": "online" + }, + { + "id": "TCU", + "fingerprint": "tcu:0041;33.325.2314.86;0041.0506.2409.0067", + "modelId": "E3_TCU41_x04", + "modelVersion": "yWzDUlv5aCHhVF4y5nlSCOBvkuQ", + "name": "E3_TCU41_x04", + "type": "tcu", + "roles": [ + "capability:src", + "capability:zigbeeCoordinator", + "type:E3", + "type:gateway;TCU100" + ], + "status": "online" + }, + { + "id": "RoomControl-1", + "fingerprint": "src:0041;33.325.2314.86;0046.0503.2341.0017", + "modelId": "E3_RoomControl_One_03", + "modelVersion": "RY6b3QmbAaLt4mDbfXghuwEaPAw", + "name": "E3_RoomControl_One_03", + "type": "roomControl", + "roles": [ + "capability:monetization;FTDC", + "capability:monetization;OWD", + "capability:src;FTDC", + "capability:src;OWD", + "capability:zigbeeCoordinator", + "type:E3", + "type:virtual;smartRoomControl" + ], + "status": "online" + } + ] + } + }, + "commands": {} + }, + { + "feature": "gateway.wifi", + "gatewayId": "1234567812345678", + "timestamp": "2025-10-16T11:25:59.041Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/features/gateway.wifi", + "properties": { + "strength": { + "type": "number", + "value": -67, + "unit": "" + } + }, + "commands": {} + }, + { + "feature": "ventilation", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-15T12:08:11.935Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/ventilation", + "properties": { + "active": { + "type": "boolean", + "value": true + } + }, + "commands": {} + }, + { + "feature": "ventilation.control.filterChange", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-15T12:08:11.935Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/ventilation.control.filterChange", + "properties": { + "active": { + "type": "boolean", + "value": false + } + }, + "commands": {} + }, + { + "feature": "ventilation.fan.supply", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-15T12:08:11.935Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/ventilation.fan.supply", + "properties": { + "current": { + "type": "number", + "value": 555, + "unit": "rotationPerMinute" + }, + "target": { + "type": "number", + "value": 585, + "unit": "rotationPerMinute" + }, + "status": { + "type": "string", + "value": "connected" + } + }, + "commands": {} + }, + { + "feature": "ventilation.fan.supply.runtime", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-15T12:08:11.935Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/ventilation.fan.supply.runtime", + "properties": { + "value": { + "type": "number", + "value": 797, + "unit": "hour" + } + }, + "commands": {} + }, + { + "feature": "ventilation.filter.pollution.blocked", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-15T12:08:11.935Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/ventilation.filter.pollution.blocked", + "properties": { + "value": { + "type": "number", + "value": 5, + "unit": "percent" + }, + "status": { + "type": "string", + "value": "connected" + } + }, + "commands": {} + }, + { + "feature": "ventilation.filter.runtime", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-16T10:54:24.735Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/ventilation.filter.runtime", + "properties": { + "operatingHours": { + "type": "number", + "value": 5368, + "unit": "hours" + }, + "remainingHours": { + "type": "number", + "value": 3392, + "unit": "hours" + }, + "overdueHours": { + "type": "number", + "value": 0, + "unit": "hours" + } + }, + "commands": {} + }, + { + "feature": "ventilation.operating.modes.filterChange", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-15T12:08:11.935Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/ventilation.operating.modes.filterChange", + "properties": { + "active": { + "type": "boolean", + "value": false + } + }, + "commands": {} + }, + { + "feature": "ventilation.operating.modes.permanent", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-15T12:08:11.935Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/ventilation.operating.modes.permanent", + "properties": { + "active": { + "type": "boolean", + "value": false + } + }, + "commands": { + "setLevel": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/ventilation.operating.modes.permanent/commands/setLevel", + "name": "setLevel", + "isExecutable": true, + "params": { + "level": { + "type": "string", + "required": true, + "constraints": { + "enum": [ + "levelOne", + "levelTwo", + "levelThree", + "levelFour" + ] + } + } + } + } + } + }, + { + "feature": "ventilation.operating.modes.sensorDriven", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-15T12:08:11.935Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/ventilation.operating.modes.sensorDriven", + "properties": { + "active": { + "type": "boolean", + "value": true + } + }, + "commands": {} + }, + { + "feature": "ventilation.operating.modes.ventilation", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-15T12:08:11.935Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/ventilation.operating.modes.ventilation", + "properties": { + "active": { + "type": "boolean", + "value": false + } + }, + "commands": {} + }, + { + "feature": "ventilation.operating.programs.active", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-15T12:08:11.935Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/ventilation.operating.programs.active", + "properties": { + "value": { + "type": "string", + "value": "levelTwo" + } + }, + "commands": {} + }, + { + "feature": "ventilation.quickmodes.forcedLevelFour", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-15T12:08:11.935Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/ventilation.quickmodes.forcedLevelFour", + "properties": { + "active": { + "type": "boolean", + "value": false + }, + "defaultRuntime": { + "type": "number", + "value": 30, + "unit": "minutes" + }, + "isCommandExecutable": { + "type": "boolean", + "value": true + } + }, + "commands": { + "activate": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/ventilation.quickmodes.forcedLevelFour/commands/activate", + "name": "activate", + "isExecutable": true, + "params": { + "timeout": { + "type": "number", + "required": false, + "constraints": { + "min": 1, + "max": 1440, + "stepping": 1 + } + } + } + }, + "deactivate": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/ventilation.quickmodes.forcedLevelFour/commands/deactivate", + "name": "deactivate", + "isExecutable": true, + "params": {} + }, + "setTimeout": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/ventilation.quickmodes.forcedLevelFour/commands/setTimeout", + "name": "setTimeout", + "isExecutable": true, + "params": { + "timeout": { + "type": "number", + "required": true, + "constraints": { + "min": 1, + "max": 1440, + "stepping": 1 + } + } + } + }, + "setDefaultRuntime": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/ventilation.quickmodes.forcedLevelFour/commands/setDefaultRuntime", + "name": "setDefaultRuntime", + "isExecutable": true, + "params": { + "defaultRuntime": { + "type": "number", + "required": true, + "constraints": { + "min": 1, + "max": 1440, + "stepping": 1 + } + } + } + } + } + }, + { + "feature": "ventilation.quickmodes.silent", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-15T12:08:11.935Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/ventilation.quickmodes.silent", + "properties": { + "active": { + "type": "boolean", + "value": false + }, + "defaultRuntime": { + "type": "number", + "value": 30, + "unit": "minutes" + }, + "isCommandExecutable": { + "type": "boolean", + "value": true + } + }, + "commands": { + "activate": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/ventilation.quickmodes.silent/commands/activate", + "name": "activate", + "isExecutable": true, + "params": { + "timeout": { + "type": "number", + "required": false, + "constraints": { + "min": 1, + "max": 1440, + "stepping": 1 + } + } + } + }, + "deactivate": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/ventilation.quickmodes.silent/commands/deactivate", + "name": "deactivate", + "isExecutable": true, + "params": {} + }, + "setTimeout": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/ventilation.quickmodes.silent/commands/setTimeout", + "name": "setTimeout", + "isExecutable": true, + "params": { + "timeout": { + "type": "number", + "required": true, + "constraints": { + "min": 1, + "max": 1440, + "stepping": 1 + } + } + } + }, + "setDefaultRuntime": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/ventilation.quickmodes.silent/commands/setDefaultRuntime", + "name": "setDefaultRuntime", + "isExecutable": true, + "params": { + "defaultRuntime": { + "type": "number", + "required": true, + "constraints": { + "min": 1, + "max": 1440, + "stepping": 1 + } + } + } + } + } + }, + { + "feature": "ventilation.quickmodes.standby", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-15T12:08:11.935Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/ventilation.quickmodes.standby", + "properties": { + "active": { + "type": "boolean", + "value": true + } + }, + "commands": { + "activate": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/ventilation.quickmodes.standby/commands/activate", + "name": "activate", + "isExecutable": true, + "params": {} + }, + "deactivate": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/ventilation.quickmodes.standby/commands/deactivate", + "name": "deactivate", + "isExecutable": true, + "params": {} + }, + "setActive": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/ventilation.quickmodes.standby/commands/setActive", + "name": "setActive", + "isExecutable": true, + "params": { + "active": { + "type": "boolean", + "required": true, + "constraints": {} + } + } + } + } + }, + { + "feature": "ventilation.sensors.airBorneDust.pm1", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-16T11:38:33.443Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/ventilation.sensors.airBorneDust.pm1", + "properties": { + "value": { + "type": "number", + "value": 0, + "unit": "microgrammsPerCubicMeter" + }, + "status": { + "type": "string", + "value": "connected" + } + }, + "commands": {} + }, + { + "feature": "ventilation.sensors.airBorneDust.pm10", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-16T11:38:48.339Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/ventilation.sensors.airBorneDust.pm10", + "properties": { + "value": { + "type": "number", + "value": 0, + "unit": "microgrammsPerCubicMeter" + }, + "status": { + "type": "string", + "value": "connected" + } + }, + "commands": {} + }, + { + "feature": "ventilation.sensors.airBorneDust.pm2d5", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-16T11:38:48.339Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/ventilation.sensors.airBorneDust.pm2d5", + "properties": { + "value": { + "type": "number", + "value": 0, + "unit": "microgrammsPerCubicMeter" + }, + "status": { + "type": "string", + "value": "connected" + } + }, + "commands": {} + }, + { + "feature": "ventilation.sensors.airBorneDust.pm4", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-16T11:38:48.339Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/ventilation.sensors.airBorneDust.pm4", + "properties": { + "value": { + "type": "number", + "value": 0, + "unit": "microgrammsPerCubicMeter" + }, + "status": { + "type": "string", + "value": "connected" + } + }, + "commands": {} + }, + { + "feature": "ventilation.sensors.airQuality", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-16T06:14:18.430Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/ventilation.sensors.airQuality", + "properties": { + "value": { + "type": "number", + "value": 24, + "unit": "" + }, + "status": { + "type": "string", + "value": "connected" + } + }, + "commands": {}, + "deprecated": { + "removalDate": "2024-09-15", + "info": "replaced by ventilation.airQuality.abstract" + } + }, + { + "feature": "ventilation.sensors.humidity.supply", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-16T11:36:20.830Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/ventilation.sensors.humidity.supply", + "properties": { + "value": { + "type": "number", + "value": 56, + "unit": "percent" + }, + "status": { + "type": "string", + "value": "connected" + } + }, + "commands": {} + }, + { + "feature": "ventilation.sensors.temperature.supply", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-16T11:22:18.481Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/ventilation.sensors.temperature.supply", + "properties": { + "status": { + "type": "string", + "value": "connected" + }, + "value": { + "type": "number", + "value": 21.6, + "unit": "celsius" + } + }, + "commands": {} + }, + { + "feature": "ventilation.sensors.volatileOrganicCompounds", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-16T11:16:55.392Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/ventilation.sensors.volatileOrganicCompounds", + "properties": { + "value": { + "type": "number", + "value": 73, + "unit": "" + }, + "status": { + "type": "string", + "value": "connected" + } + }, + "commands": {} + }, + { + "feature": "tcu.wifi", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-16T11:25:58.825Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/tcu.wifi", + "properties": { + "strength": { + "type": "number", + "value": -67, + "unit": "" + } + }, + "commands": {} + }, + { + "feature": "device.productIdentification", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-15T12:08:11.935Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/device.productIdentification", + "properties": { + "product": { + "type": "object", + "value": { + "busType": "OwnBus", + "busAddress": 0, + "viessmannIdentificationNumber": "7973843400382125", + "productFamily": "B_00059_VP300" + } + } + }, + "commands": {} + }, + { + "feature": "device.messages.info.raw", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-15T12:08:11.935Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/device.messages.info.raw", + "properties": { + "entries": { + "type": "array", + "value": [] + } + }, + "commands": {} + }, + { + "feature": "device.messages.service.raw", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-15T12:08:11.935Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/device.messages.service.raw", + "properties": { + "entries": { + "type": "array", + "value": [] + } + }, + "commands": {} + }, + { + "feature": "device.messages.status.raw", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-15T12:08:11.935Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/device.messages.status.raw", + "properties": { + "entries": { + "type": "array", + "value": [] + } + }, + "commands": {} + }, + { + "feature": "device.setDefaultValues", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-15T12:08:11.935Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/device.setDefaultValues", + "properties": {}, + "commands": {} + }, + { + "feature": "device.time.daylightSaving", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-15T12:08:11.935Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/device.time.daylightSaving", + "properties": { + "active": { + "type": "boolean", + "value": false + } + }, + "commands": { + "activate": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/device.time.daylightSaving/commands/activate", + "name": "activate", + "isExecutable": true, + "params": { + "begin": { + "type": "string", + "required": true, + "constraints": { + "regEx": "^[\\d]{2}-[\\d]{2}$" + } + }, + "end": { + "type": "string", + "required": true, + "constraints": { + "regEx": "^[\\d]{2}-[\\d]{2}$" + } + } + } + }, + "deactivate": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/device.time.daylightSaving/commands/deactivate", + "name": "deactivate", + "isExecutable": true, + "params": {} + } + } + }, + { + "feature": "heating.boiler.serial", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-15T12:08:11.935Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.boiler.serial", + "properties": { + "value": { + "type": "string", + "value": "################" + } + }, + "commands": {} + }, + { + "feature": "heating.device.time", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-16T11:44:08.618Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.device.time", + "properties": {}, + "commands": { + "setTime": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.device.time/commands/setTime", + "name": "setTime", + "isExecutable": true, + "params": { + "value": { + "type": "string", + "required": true, + "constraints": { + "regEx": "^[0-9]{4}-((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01])|(0[469]|11)-(0[1-9]|[12][0-9]|30)|(02)-(0[1-9]|[12][0-9]))T(0[0-9]|1[0-9]|2[0-3]):(0[0-9]|[1-5][0-9]):(0[0-9]|[1-5][0-9])$" + } + } + } + } + } + }, + { + "feature": "device.variant", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-15T12:08:11.935Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/device.variant", + "properties": { + "value": { + "type": "string", + "value": "Vitopure350" + } + }, + "commands": {} + }, + { + "feature": "heating.device.variant", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-15T12:08:11.935Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.device.variant", + "properties": { + "value": { + "type": "string", + "value": "Vitopure350" + } + }, + "commands": {}, + "deprecated": { + "removalDate": "2025-03-15", + "info": "replaced by device.variant" + } + }, + { + "feature": "ventilation.operating.modes.active", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-15T12:08:11.935Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/ventilation.operating.modes.active", + "properties": { + "value": { + "type": "string", + "value": "sensorDriven" + } + }, + "commands": { + "setMode": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/ventilation.operating.modes.active/commands/setMode", + "name": "setMode", + "isExecutable": true, + "params": { + "mode": { + "type": "string", + "required": true, + "constraints": { + "enum": [ + "permanent", + "ventilation", + "sensorDriven" + ] + } + } + } + }, + "setModeContinuousSensorOverride": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/ventilation.operating.modes.active/commands/setModeContinuousSensorOverride", + "name": "setModeContinuousSensorOverride", + "isExecutable": false, + "params": {} + } + } + }, + { + "feature": "ventilation.operating.state", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-15T12:08:11.935Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/ventilation.operating.state", + "properties": { + "level": { + "type": "string", + "value": "unknown" + }, + "demand": { + "type": "string", + "value": "unknown" + }, + "reason": { + "type": "string", + "value": "standby" + } + }, + "commands": {} + }, + { + "feature": "ventilation.schedule", + "gatewayId": "1234567812345678", + "deviceId": "0", + "timestamp": "2025-10-15T12:08:11.935Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/ventilation.schedule", + "properties": { + "entries": { + "type": "Schedule", + "value": { + "mon": [ + { + "mode": "levelTwo", + "start": "06:00", + "end": "22:00", + "position": 0 + } + ], + "tue": [ + { + "mode": "levelTwo", + "start": "06:00", + "end": "22:00", + "position": 0 + } + ], + "wed": [ + { + "mode": "levelTwo", + "start": "06:00", + "end": "22:00", + "position": 0 + } + ], + "thu": [ + { + "mode": "levelTwo", + "start": "06:00", + "end": "22:00", + "position": 0 + } + ], + "fri": [ + { + "mode": "levelTwo", + "start": "06:00", + "end": "22:00", + "position": 0 + } + ], + "sat": [ + { + "mode": "levelTwo", + "start": "06:00", + "end": "22:00", + "position": 0 + } + ], + "sun": [ + { + "mode": "levelTwo", + "start": "06:00", + "end": "22:00", + "position": 0 + } + ] + } + }, + "active": { + "type": "boolean", + "value": true + } + }, + "commands": { + "setSchedule": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/ventilation.schedule/commands/setSchedule", + "name": "setSchedule", + "isExecutable": true, + "params": { + "newSchedule": { + "type": "Schedule", + "required": true, + "constraints": { + "modes": [ + "levelOne", + "levelTwo", + "levelThree", + "levelFour" + ], + "maxEntries": 4, + "resolution": 10, + "defaultMode": "standby", + "overlapAllowed": false + } + } + } + }, + "resetSchedule": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/ventilation.schedule/commands/resetSchedule", + "name": "resetSchedule", + "isExecutable": true, + "params": {} + } + } + }, + { + "feature": "tcu.features.wirelessRemoteController", + "gatewayId": "1234567812345678", + "deviceId": "TCU", + "timestamp": "2025-10-15T12:08:11.975Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/TCU/features/tcu.features.wirelessRemoteController", + "properties": { + "active": { + "type": "boolean", + "value": true + } + }, + "commands": {} + }, + { + "feature": "rooms.0.condensationRisk", + "gatewayId": "1234567812345678", + "deviceId": "RoomControl-1", + "timestamp": "2025-10-15T12:08:12.006Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.0.condensationRisk", + "properties": { + "value": { + "type": "boolean", + "value": false + } + }, + "commands": {} + }, + { + "feature": "rooms.1.condensationRisk", + "gatewayId": "1234567812345678", + "deviceId": "RoomControl-1", + "timestamp": "2025-10-15T12:08:12.006Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.1.condensationRisk", + "properties": { + "value": { + "type": "boolean", + "value": false + } + }, + "commands": {} + }, + { + "feature": "rooms.0.configuration.hydraulicBalancing", + "gatewayId": "1234567812345678", + "deviceId": "RoomControl-1", + "timestamp": "2025-10-15T12:08:12.006Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.0.configuration.hydraulicBalancing", + "properties": { + "value": { + "type": "boolean", + "value": true + } + }, + "commands": {} + }, + { + "feature": "rooms.1.configuration.hydraulicBalancing", + "gatewayId": "1234567812345678", + "deviceId": "RoomControl-1", + "timestamp": "2025-10-15T12:08:12.006Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.1.configuration.hydraulicBalancing", + "properties": { + "value": { + "type": "boolean", + "value": true + } + }, + "commands": {} + }, + { + "feature": "rooms.0.configuration.trvAlgorithmActive", + "gatewayId": "1234567812345678", + "deviceId": "RoomControl-1", + "timestamp": "2025-10-15T12:08:12.006Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.0.configuration.trvAlgorithmActive", + "properties": { + "value": { + "type": "boolean", + "value": false + } + }, + "commands": {} + }, + { + "feature": "rooms.1.configuration.trvAlgorithmActive", + "gatewayId": "1234567812345678", + "deviceId": "RoomControl-1", + "timestamp": "2025-10-15T12:08:12.006Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.1.configuration.trvAlgorithmActive", + "properties": { + "value": { + "type": "boolean", + "value": false + } + }, + "commands": {} + }, + { + "feature": "rooms.0.sensors.co2", + "gatewayId": "1234567812345678", + "deviceId": "RoomControl-1", + "timestamp": "2025-10-15T12:08:12.006Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.0.sensors.co2", + "properties": { + "status": { + "type": "string", + "value": "notConnected" + } + }, + "commands": {} + }, + { + "feature": "rooms.1.sensors.co2", + "gatewayId": "1234567812345678", + "deviceId": "RoomControl-1", + "timestamp": "2025-10-15T12:08:12.006Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.1.sensors.co2", + "properties": { + "status": { + "type": "string", + "value": "notConnected" + } + }, + "commands": {} + }, + { + "feature": "rooms.0.sensors.humidity", + "gatewayId": "1234567812345678", + "deviceId": "RoomControl-1", + "timestamp": "2025-10-15T12:08:12.006Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.0.sensors.humidity", + "properties": { + "status": { + "type": "string", + "value": "notConnected" + } + }, + "commands": {} + }, + { + "feature": "rooms.1.sensors.humidity", + "gatewayId": "1234567812345678", + "deviceId": "RoomControl-1", + "timestamp": "2025-10-15T12:08:12.006Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.1.sensors.humidity", + "properties": { + "status": { + "type": "string", + "value": "notConnected" + } + }, + "commands": {} + }, + { + "feature": "rooms.0.sensors.temperature", + "gatewayId": "1234567812345678", + "deviceId": "RoomControl-1", + "timestamp": "2025-10-15T12:08:12.006Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.0.sensors.temperature", + "properties": { + "status": { + "type": "string", + "value": "notConnected" + } + }, + "commands": {} + }, + { + "feature": "rooms.1.sensors.temperature", + "gatewayId": "1234567812345678", + "deviceId": "RoomControl-1", + "timestamp": "2025-10-15T12:08:12.006Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.1.sensors.temperature", + "properties": { + "status": { + "type": "string", + "value": "notConnected" + } + }, + "commands": {} + }, + { + "feature": "rooms.features.remotePresenceProbability", + "gatewayId": "1234567812345678", + "deviceId": "RoomControl-1", + "timestamp": "2025-10-15T12:08:12.006Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.features.remotePresenceProbability", + "properties": { + "active": { + "type": "boolean", + "value": false + } + }, + "commands": {} + }, + { + "feature": "rooms.features.supplyChannel0FTDC", + "gatewayId": "1234567812345678", + "deviceId": "RoomControl-1", + "timestamp": "2025-10-15T12:08:12.006Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.features.supplyChannel0FTDC", + "properties": { + "active": { + "type": "boolean", + "value": false + } + }, + "commands": {} + }, + { + "feature": "rooms.features.supplyChannel1FTDC", + "gatewayId": "1234567812345678", + "deviceId": "RoomControl-1", + "timestamp": "2025-10-15T12:08:12.006Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.features.supplyChannel1FTDC", + "properties": { + "active": { + "type": "boolean", + "value": false + } + }, + "commands": {} + }, + { + "feature": "rooms.features.supplyChannel2FTDC", + "gatewayId": "1234567812345678", + "deviceId": "RoomControl-1", + "timestamp": "2025-10-15T12:08:12.006Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.features.supplyChannel2FTDC", + "properties": { + "active": { + "type": "boolean", + "value": false + } + }, + "commands": {} + }, + { + "feature": "rooms.features.supplyChannel3FTDC", + "gatewayId": "1234567812345678", + "deviceId": "RoomControl-1", + "timestamp": "2025-10-15T12:08:12.006Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.features.supplyChannel3FTDC", + "properties": { + "active": { + "type": "boolean", + "value": false + } + }, + "commands": {} + }, + { + "feature": "rooms", + "gatewayId": "1234567812345678", + "deviceId": "RoomControl-1", + "timestamp": "2025-10-15T12:08:12.006Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms", + "properties": { + "enabled": { + "type": "array", + "value": [ + "0", + "1" + ] + } + }, + "commands": { + "add": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms/commands/add", + "name": "add", + "isExecutable": true, + "params": { + "name": { + "type": "string", + "required": true, + "constraints": { + "minLength": 1, + "maxLength": 39, + "regEx": "^[\\p{L}0-9]+( [\\p{L}0-9]+)*$" + } + }, + "type": { + "type": "string", + "required": true, + "constraints": { + "enum": [ + "bathroom", + "bedroom", + "hallway", + "livingroom", + "kitchen", + "office", + "nursery", + "toilet", + "other" + ] + } + } + } + } + } + }, + { + "feature": "rooms.0", + "gatewayId": "1234567812345678", + "deviceId": "RoomControl-1", + "timestamp": "2025-10-15T12:08:12.006Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.0", + "properties": { + "name": { + "type": "string", + "value": "Badezimmer" + }, + "type": { + "type": "string", + "value": "bathroom" + }, + "actors": { + "type": "array", + "value": [] + } + }, + "commands": { + "addActor": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.0/commands/addActor", + "name": "addActor", + "isExecutable": true, + "params": { + "actorDeviceId": { + "type": "string", + "constraints": {}, + "required": true + }, + "heatingCircuit": { + "type": "number", + "constraints": { + "min": 0, + "max": 3, + "stepping": 1 + }, + "required": false + } + }, + "constraints": { + "enum": [ + "cs", + "fht", + "trv", + "airQualitySensor", + "remoteControllerSensor" + ] + } + }, + "moveActor": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.0/commands/moveActor", + "name": "moveActor", + "isExecutable": true, + "params": { + "actorDeviceId": { + "type": "string", + "constraints": {}, + "required": true + }, + "heatingCircuit": { + "type": "number", + "constraints": { + "min": 0, + "max": 3, + "stepping": 1 + }, + "required": false + }, + "newRoomId": { + "type": "number", + "constraints": { + "min": 0, + "max": 23, + "stepping": 1 + }, + "required": true + } + } + }, + "setName": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.0/commands/setName", + "name": "setName", + "isExecutable": true, + "params": { + "name": { + "type": "string", + "required": true, + "constraints": { + "regEx": "^[\\p{L}0-9]+( [\\p{L}0-9]+)*$", + "minLength": 1, + "maxLength": 39 + } + } + } + }, + "setType": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.0/commands/setType", + "name": "setType", + "isExecutable": true, + "params": { + "type": { + "type": "string", + "required": true, + "constraints": { + "enum": [ + "bathroom", + "bedroom", + "hallway", + "livingroom", + "kitchen", + "office", + "nursery", + "toilet", + "other" + ] + } + } + } + }, + "removeActor": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.0/commands/removeActor", + "name": "removeActor", + "isExecutable": true, + "params": { + "actorDeviceId": { + "type": "string", + "constraints": {}, + "required": true + } + } + }, + "remove": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.0/commands/remove", + "name": "remove", + "isExecutable": true, + "params": {} + } + } + }, + { + "feature": "rooms.1", + "gatewayId": "1234567812345678", + "deviceId": "RoomControl-1", + "timestamp": "2025-10-15T12:08:12.006Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.1", + "properties": { + "name": { + "type": "string", + "value": "Treppenhaus" + }, + "type": { + "type": "string", + "value": "other" + }, + "actors": { + "type": "array", + "value": [] + } + }, + "commands": { + "addActor": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.1/commands/addActor", + "name": "addActor", + "isExecutable": true, + "params": { + "actorDeviceId": { + "type": "string", + "constraints": {}, + "required": true + }, + "heatingCircuit": { + "type": "number", + "constraints": { + "min": 0, + "max": 3, + "stepping": 1 + }, + "required": false + } + }, + "constraints": { + "enum": [ + "cs", + "fht", + "trv", + "airQualitySensor", + "remoteControllerSensor" + ] + } + }, + "moveActor": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.1/commands/moveActor", + "name": "moveActor", + "isExecutable": true, + "params": { + "actorDeviceId": { + "type": "string", + "constraints": {}, + "required": true + }, + "heatingCircuit": { + "type": "number", + "constraints": { + "min": 0, + "max": 3, + "stepping": 1 + }, + "required": false + }, + "newRoomId": { + "type": "number", + "constraints": { + "min": 0, + "max": 23, + "stepping": 1 + }, + "required": true + } + } + }, + "setName": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.1/commands/setName", + "name": "setName", + "isExecutable": true, + "params": { + "name": { + "type": "string", + "required": true, + "constraints": { + "regEx": "^[\\p{L}0-9]+( [\\p{L}0-9]+)*$", + "minLength": 1, + "maxLength": 39 + } + } + } + }, + "setType": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.1/commands/setType", + "name": "setType", + "isExecutable": true, + "params": { + "type": { + "type": "string", + "required": true, + "constraints": { + "enum": [ + "bathroom", + "bedroom", + "hallway", + "livingroom", + "kitchen", + "office", + "nursery", + "toilet", + "other" + ] + } + } + } + }, + "removeActor": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.1/commands/removeActor", + "name": "removeActor", + "isExecutable": true, + "params": { + "actorDeviceId": { + "type": "string", + "constraints": {}, + "required": true + } + } + }, + "remove": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.1/commands/remove", + "name": "remove", + "isExecutable": true, + "params": {} + } + } + }, + { + "feature": "rooms.others", + "gatewayId": "1234567812345678", + "deviceId": "RoomControl-1", + "timestamp": "2025-10-15T12:08:12.006Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.others", + "properties": { + "enabled": { + "type": "array", + "value": [] + } + }, + "commands": { + "add": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.others/commands/add", + "name": "add", + "isExecutable": false, + "params": { + "name": { + "type": "string", + "required": true, + "constraints": { + "minLength": 1, + "maxLength": 39 + } + }, + "heatingCircuit": { + "type": "number", + "required": true, + "constraints": { + "enum": [] + } + } + } + } + } + }, + { + "feature": "rooms.status", + "gatewayId": "1234567812345678", + "deviceId": "RoomControl-1", + "timestamp": "2025-10-15T12:08:12.006Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.status", + "properties": { + "active": { + "type": "boolean", + "value": false + }, + "variant": { + "type": "string", + "value": "full" + } + }, + "commands": { + "activate": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.status/commands/activate", + "name": "activate", + "isExecutable": true, + "params": {} + }, + "deactivate": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.status/commands/deactivate", + "name": "deactivate", + "isExecutable": true, + "params": {} + }, + "setActive": { + "uri": "https://api.viessmann-climatesolutions.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/RoomControl-1/features/rooms.status/commands/setActive", + "name": "setActive", + "isExecutable": true, + "params": { + "active": { + "type": "boolean", + "required": true, + "constraints": {} + } + } + } + } + } + ] +} diff --git a/tests/test_Vitopure350.py b/tests/test_Vitopure350.py index ed741bc5..8d32ed5f 100644 --- a/tests/test_Vitopure350.py +++ b/tests/test_Vitopure350.py @@ -2,9 +2,21 @@ from PyViCare.PyViCareUtils import PyViCareNotSupportedFeatureError from PyViCare.PyViCareVentilationDevice import VentilationDevice +from PyViCare.PyViCareGateway import Gateway from tests.ViCareServiceMock import ViCareServiceMock +from tests.ViCareGatewayServiceMock import ViCareGatewayServiceMock +class Vitopure350ViaGateway(unittest.TestCase): + def setUp(self): + self.service = ViCareGatewayServiceMock('response/gatewayWithDevices/tcu1/Vitopure-350.json') + self.device1 = VentilationDevice(self.service) + self.device2 = Gateway(self.service) + + def test_getFromDifferentDevicesViaSameService(self): + self.assertEqual("sensorDriven", self.device1.getActiveVentilationMode()) + self.assertEqual(-67, self.device2.getWifiSignalStrength()) + class Vitopure350(unittest.TestCase): def setUp(self): self.service = ViCareServiceMock('response/Vitopure350.json')