From 9fdb1b10f38d731637ee6df1894f470adf78670a Mon Sep 17 00:00:00 2001 From: Christopher Fenner Date: Mon, 13 Oct 2025 01:04:52 +0200 Subject: [PATCH 1/5] add gateway service --- PyViCare/PyViCare.py | 29 +++++--- PyViCare/PyViCareCachedServiceViaGateway.py | 74 +++++++++++++++++++++ PyViCare/PyViCareServiceViaGateway.py | 63 ++++++++++++++++++ 3 files changed, 158 insertions(+), 8 deletions(-) create mode 100644 PyViCare/PyViCareCachedServiceViaGateway.py create mode 100644 PyViCare/PyViCareServiceViaGateway.py 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/PyViCareServiceViaGateway.py b/PyViCare/PyViCareServiceViaGateway.py new file mode 100644 index 00000000..0124b83c --- /dev/null +++ b/PyViCare/PyViCareServiceViaGateway.py @@ -0,0 +1,63 @@ +import json +import logging +from typing import Any, List + +from PyViCare.PyViCareAbstractOAuthManager import AbstractViCareOAuthManager +from PyViCare.PyViCareService import (ViCareService) +from PyViCare.PyViCareUtils import PyViCareNotSupportedFeatureError + +logger = logging.getLogger('ViCare') +logger.addHandler(logging.NullHandler()) + +# 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 + +# def hasRoles(requested_roles: List[str], existing_roles: List[str]) -> bool: +# return len(requested_roles) > 0 and set(requested_roles).issubset(set(existing_roles)) + +# def buildSetPropertyUrl(accessor, property_name, action): +# return f'/features/installations/{accessor.id}/gateways/{accessor.serial}/devices/{accessor.device_id}/features/{property_name}/commands/{action}' + +# class ViCareDeviceAccessor: +# def __init__(self, _id: int, serial: str, device_id: str) -> None: +# self.id = _id +# self.serial = serial +# self.device_id = device_id + +class ViCareServiceViaGateway(ViCareService): + # def __init__(self, oauth_manager: AbstractViCareOAuthManager, accessor: ViCareDeviceAccessor, roles: List[str]) -> None: + # self.oauth_manager = oauth_manager + # self.accessor = accessor + # self.roles = roles + + # def getProperty(self, property_name: str) -> Any: + # url = self.buildGetPropertyUrl(property_name) + # return self.oauth_manager.get(url) + + # def buildGetPropertyUrl(self, property_name): + # if self._isGateway(): + # 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 hasRoles(self, requested_roles) -> bool: + # return hasRoles(requested_roles, self.roles) + + # def _isGateway(self) -> bool: + # return self.hasRoles(["type:gateway;VitoconnectOpto1"]) or self.hasRoles(["type:gateway;VitoconnectOpto2/OT2"]) or self.hasRoles(["type:gateway;TCU100"]) or self.hasRoles(["type:gateway;TCU200"]) or self.hasRoles(["type:gateway;TCU300"]) + + # def setProperty(self, property_name: str, action: str, data: Any) -> Any: + # url = buildSetPropertyUrl( + # self.accessor, property_name, action) + + # post_data = data if isinstance(data, str) else json.dumps(data) + # return self.oauth_manager.post(url, post_data) + + 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) From 8de839bfe2d6478ec6ceb5ccad707e2964420505 Mon Sep 17 00:00:00 2001 From: Christopher Fenner Date: Mon, 13 Oct 2025 01:08:18 +0200 Subject: [PATCH 2/5] add test data --- .../VitoConnect-1-with-VitoDens-300W.json | 995 ++++++++++++++++++ .../tcu1/TCU-with-VitoPure350.json | 691 ++++++++++++ 2 files changed, 1686 insertions(+) create mode 100644 tests/response/gatewayWithDevices/heatbox1/VitoConnect-1-with-VitoDens-300W.json create mode 100644 tests/response/gatewayWithDevices/tcu1/TCU-with-VitoPure350.json diff --git a/tests/response/gatewayWithDevices/heatbox1/VitoConnect-1-with-VitoDens-300W.json b/tests/response/gatewayWithDevices/heatbox1/VitoConnect-1-with-VitoDens-300W.json new file mode 100644 index 00000000..4abaf307 --- /dev/null +++ b/tests/response/gatewayWithDevices/heatbox1/VitoConnect-1-with-VitoDens-300W.json @@ -0,0 +1,995 @@ +{ + "data": [ + { + "feature": "gateway.devices", + "gatewayId": "gateway-02", + "timestamp": "2024-12-30T09:35:39.088Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-02/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": "gateway-02", + "timestamp": "2024-12-31T00:32:56.737Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-02/features/gateway.wifi", + "properties": { + "strength": { + "type": "number", + "value": -47, + "unit": "" + } + }, + "commands": {} + }, + { + "feature": "device.messages.errors.raw", + "gatewayId": "gateway-02", + "deviceId": "0", + "timestamp": "2024-12-30T09:35:46.843Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-02/devices/0/features/device.messages.errors.raw", + "properties": { + "entries": { + "type": "array", + "value": [] + } + }, + "commands": {} + }, + { + "feature": "device.serial", + "gatewayId": "gateway-02", + "deviceId": "0", + "timestamp": "2024-12-30T09:35:46.843Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-02/devices/0/features/device.serial", + "properties": { + "value": { + "type": "string", + "value": "heating-01" + } + }, + "commands": {} + }, + { + "feature": "heating.boiler.sensors.temperature.main", + "gatewayId": "gateway-02", + "deviceId": "0", + "timestamp": "2024-12-31T00:36:05.916Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-02/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": "gateway-02", + "deviceId": "0", + "timestamp": "2024-12-30T09:35:46.843Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-02/devices/0/features/heating.boiler.serial", + "properties": { + "value": { + "type": "string", + "value": "heating-01" + } + }, + "commands": {} + }, + { + "feature": "heating.boiler.temperature", + "gatewayId": "gateway-02", + "deviceId": "0", + "timestamp": "2024-12-31T00:10:16.279Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-02/devices/0/features/heating.boiler.temperature", + "properties": { + "value": { + "type": "number", + "value": 36.3, + "unit": "celsius" + } + }, + "commands": {} + }, + { + "feature": "heating.burners", + "gatewayId": "gateway-02", + "deviceId": "0", + "timestamp": "2024-12-30T09:35:39.269Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-02/devices/0/features/heating.burners", + "properties": { + "enabled": { + "type": "array", + "value": [ + "0" + ] + } + }, + "commands": {} + }, + { + "feature": "heating.burners.0.modulation", + "gatewayId": "gateway-02", + "deviceId": "0", + "timestamp": "2024-12-31T00:29:26.029Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-02/devices/0/features/heating.burners.0.modulation", + "properties": { + "value": { + "type": "number", + "value": 0, + "unit": "percent" + } + }, + "commands": {} + }, + { + "feature": "heating.burners.0.statistics", + "gatewayId": "gateway-02", + "deviceId": "0", + "timestamp": "2024-12-31T00:06:22.999Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-02/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": "gateway-02", + "deviceId": "0", + "timestamp": "2024-12-31T00:29:23.934Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-02/devices/0/features/heating.burners.0", + "properties": { + "active": { + "type": "boolean", + "value": false + } + }, + "commands": {} + }, + { + "feature": "heating.circuits", + "gatewayId": "gateway-02", + "deviceId": "0", + "timestamp": "2024-12-30T09:35:46.843Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-02/devices/0/features/heating.circuits", + "properties": { + "enabled": { + "type": "array", + "value": [ + "0" + ] + } + }, + "commands": {} + }, + { + "feature": "heating.circuits.0.circulation.pump", + "gatewayId": "gateway-02", + "deviceId": "0", + "timestamp": "2024-12-30T22:44:32.617Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-02/devices/0/features/heating.circuits.0.circulation.pump", + "properties": { + "status": { + "type": "string", + "value": "on" + } + }, + "commands": {} + }, + { + "feature": "heating.circuits.0.frostprotection", + "gatewayId": "gateway-02", + "deviceId": "0", + "timestamp": "2024-12-30T09:35:46.843Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-02/devices/0/features/heating.circuits.0.frostprotection", + "properties": { + "status": { + "type": "string", + "value": "off" + } + }, + "commands": {} + }, + { + "feature": "heating.circuits.0.heating.curve", + "gatewayId": "gateway-02", + "deviceId": "0", + "timestamp": "2024-12-30T09:35:47.579Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-02/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/1999737/gateways/gateway-02/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": "gateway-02", + "deviceId": "0", + "timestamp": "2024-12-30T09:35:46.843Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-02/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/1999737/gateways/gateway-02/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/1999737/gateways/gateway-02/devices/0/features/heating.circuits.0.heating.schedule/commands/resetSchedule", + "name": "resetSchedule", + "isExecutable": false, + "params": {} + } + } + }, + { + "feature": "heating.circuits.0.operating.modes.active", + "gatewayId": "gateway-02", + "deviceId": "0", + "timestamp": "2024-12-30T09:35:46.843Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-02/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/1999737/gateways/gateway-02/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": "gateway-02", + "deviceId": "0", + "timestamp": "2024-12-30T09:35:46.843Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-02/devices/0/features/heating.circuits.0.operating.modes.forcedNormal", + "properties": { + "active": { + "type": "boolean", + "value": false + } + }, + "commands": {} + }, + { + "feature": "heating.circuits.0.operating.modes.forcedReduced", + "gatewayId": "gateway-02", + "deviceId": "0", + "timestamp": "2024-12-30T09:35:46.843Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-02/devices/0/features/heating.circuits.0.operating.modes.forcedReduced", + "properties": { + "active": { + "type": "boolean", + "value": false + } + }, + "commands": {} + }, + { + "feature": "heating.circuits.0.operating.modes.heating", + "gatewayId": "gateway-02", + "deviceId": "0", + "timestamp": "2024-12-30T09:35:46.843Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-02/devices/0/features/heating.circuits.0.operating.modes.heating", + "properties": { + "active": { + "type": "boolean", + "value": true + } + }, + "commands": {} + }, + { + "feature": "heating.circuits.0.operating.modes.standby", + "gatewayId": "gateway-02", + "deviceId": "0", + "timestamp": "2024-12-30T09:35:46.843Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-02/devices/0/features/heating.circuits.0.operating.modes.standby", + "properties": { + "active": { + "type": "boolean", + "value": false + } + }, + "commands": {} + }, + { + "feature": "heating.circuits.0.operating.programs.active", + "gatewayId": "gateway-02", + "deviceId": "0", + "timestamp": "2024-12-30T20:59:17.072Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-02/devices/0/features/heating.circuits.0.operating.programs.active", + "properties": { + "value": { + "type": "string", + "value": "reduced" + } + }, + "commands": {} + }, + { + "feature": "heating.circuits.0.operating.programs.comfort", + "gatewayId": "gateway-02", + "deviceId": "0", + "timestamp": "2024-12-30T09:35:46.843Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-02/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/1999737/gateways/gateway-02/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/1999737/gateways/gateway-02/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/1999737/gateways/gateway-02/devices/0/features/heating.circuits.0.operating.programs.comfort/commands/deactivate", + "name": "deactivate", + "isExecutable": false, + "params": {} + } + } + }, + { + "feature": "heating.circuits.0.operating.programs.eco", + "gatewayId": "gateway-02", + "deviceId": "0", + "timestamp": "2024-12-30T20:59:17.072Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-02/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/1999737/gateways/gateway-02/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/1999737/gateways/gateway-02/devices/0/features/heating.circuits.0.operating.programs.eco/commands/deactivate", + "name": "deactivate", + "isExecutable": false, + "params": {} + } + } + }, + { + "feature": "heating.circuits.0.operating.programs.external", + "gatewayId": "gateway-02", + "deviceId": "0", + "timestamp": "2024-12-30T09:35:46.843Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-02/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": "gateway-02", + "deviceId": "0", + "timestamp": "2024-12-30T20:59:17.072Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-02/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/1999737/gateways/gateway-02/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": "gateway-02", + "deviceId": "0", + "timestamp": "2024-12-30T20:59:17.072Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-02/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/1999737/gateways/gateway-02/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": "gateway-02", + "deviceId": "0", + "timestamp": "2024-12-30T09:35:46.843Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-02/devices/0/features/heating.circuits.0.operating.programs.standby", + "properties": { + "active": { + "type": "boolean", + "value": false + } + }, + "commands": {} + }, + { + "feature": "heating.circuits.0.sensors.temperature.supply", + "gatewayId": "gateway-02", + "deviceId": "0", + "timestamp": "2024-12-31T00:35:45.591Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-02/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": "gateway-02", + "deviceId": "0", + "timestamp": "2024-12-30T09:35:46.843Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-02/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/1999737/gateways/gateway-02/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": "gateway-02", + "deviceId": "0", + "timestamp": "2024-12-30T09:35:46.843Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-02/devices/0/features/heating.controller.serial", + "properties": { + "value": { + "type": "string", + "value": "" + } + }, + "commands": {} + }, + { + "feature": "heating.operating.programs.holiday", + "gatewayId": "gateway-02", + "deviceId": "0", + "timestamp": "2024-12-30T09:35:47.579Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-02/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/1999737/gateways/gateway-02/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/1999737/gateways/gateway-02/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/1999737/gateways/gateway-02/devices/0/features/heating.operating.programs.holiday/commands/unschedule", + "name": "unschedule", + "isExecutable": true, + "params": {} + } + } + }, + { + "feature": "heating.sensors.temperature.outside", + "gatewayId": "gateway-02", + "deviceId": "0", + "timestamp": "2024-12-30T22:16:07.625Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-02/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/1999737/gateways/gateway-02/devices/0/features/heating.circuits.0.name", + "feature": "heating.circuits.0.name", + "deviceId": "0", + "gatewayId": "gateway-02", + "components": [], + "commands": { + "setName": { + "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-02/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/TCU-with-VitoPure350.json b/tests/response/gatewayWithDevices/tcu1/TCU-with-VitoPure350.json new file mode 100644 index 00000000..918cc435 --- /dev/null +++ b/tests/response/gatewayWithDevices/tcu1/TCU-with-VitoPure350.json @@ -0,0 +1,691 @@ +{ + "data": [ + { + "feature": "gateway.devices", + "gatewayId": "gateway-01", + "timestamp": "2024-12-30T11:21:57.697Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-01/features/gateway.devices", + "properties": { + "devices": { + "type": "DeviceList", + "value": [ + { + "id": "0", + "fingerprint": "ecu;purifier-01;0099.0500.2413.0002;0099.0500.2408.0001", + "modelId": "E3_VitoPure", + "modelVersion": "Us8A1u4xvSGqCzY1JrC1Dhp0ChE", + "name": "VitoPure", + "type": "ventilation", + "roles": [ + "type:B2C", + "type:E3", + "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": "5ytIrUQEXTTDm_z5kKYVU-39xVQ", + "name": "TCU", + "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": "5YQQWkBdOSx-KBX_QNqNtS_-1x4", + "name": "E3_RoomControl_One_03", + "type": "roomControl", + "roles": [ + "capability:monetization;FTDC", + "capability:monetization;OWD", + "capability:zigbeeCoordinator", + "type:E3", + "type:virtual;smartRoomControl" + ], + "status": "online" + } + ] + } + }, + "commands": {} + }, + { + "feature": "gateway.wifi", + "gatewayId": "gateway-01", + "timestamp": "2024-12-31T00:17:26.491Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-01/features/gateway.wifi", + "properties": { + "strength": { + "type": "number", + "value": -55, + "unit": "" + } + }, + "commands": {} + }, + { + "feature": "ventilation", + "gatewayId": "gateway-01", + "deviceId": "0", + "timestamp": "2024-12-30T11:21:58.241Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-01/devices/0/features/ventilation", + "properties": { + "active": { + "type": "boolean", + "value": true + } + }, + "commands": {} + }, + { + "feature": "ventilation.operating.modes.filterChange", + "gatewayId": "gateway-01", + "deviceId": "0", + "timestamp": "2024-12-30T11:21:58.241Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-01/devices/0/features/ventilation.operating.modes.filterChange", + "properties": { + "active": { + "type": "boolean", + "value": false + } + }, + "commands": {} + }, + { + "feature": "ventilation.operating.modes.permanent", + "gatewayId": "gateway-01", + "deviceId": "0", + "timestamp": "2024-12-30T20:59:55.849Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-01/devices/0/features/ventilation.operating.modes.permanent", + "properties": { + "active": { + "type": "boolean", + "value": false + } + }, + "commands": { + "setLevel": { + "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-01/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": "gateway-01", + "deviceId": "0", + "timestamp": "2024-12-30T11:34:07.603Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-01/devices/0/features/ventilation.operating.modes.sensorDriven", + "properties": { + "active": { + "type": "boolean", + "value": true + } + }, + "commands": {} + }, + { + "feature": "ventilation.operating.modes.ventilation", + "gatewayId": "gateway-01", + "deviceId": "0", + "timestamp": "2024-12-30T11:34:07.603Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-01/devices/0/features/ventilation.operating.modes.ventilation", + "properties": { + "active": { + "type": "boolean", + "value": false + } + }, + "commands": {} + }, + { + "feature": "ventilation.operating.programs.active", + "gatewayId": "gateway-01", + "deviceId": "0", + "timestamp": "2024-12-30T20:59:55.849Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-01/devices/0/features/ventilation.operating.programs.active", + "properties": { + "value": { + "type": "string", + "value": "automatic" + } + }, + "commands": {} + }, + { + "feature": "ventilation.quickmodes.forcedLevelFour", + "gatewayId": "gateway-01", + "deviceId": "0", + "timestamp": "2024-12-30T11:34:06.535Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-01/devices/0/features/ventilation.quickmodes.forcedLevelFour", + "properties": { + "active": { + "type": "boolean", + "value": false + }, + "defaultRuntime": { + "type": "number", + "value": 30, + "unit": "minutes" + }, + "isActiveWritable": { + "type": "boolean", + "value": true + } + }, + "commands": { + "activate": { + "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-01/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.com/iot/v2/features/installations/1999737/gateways/gateway-01/devices/0/features/ventilation.quickmodes.forcedLevelFour/commands/deactivate", + "name": "deactivate", + "isExecutable": true, + "params": {} + }, + "setTimeout": { + "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-01/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.com/iot/v2/features/installations/1999737/gateways/gateway-01/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": "gateway-01", + "deviceId": "0", + "timestamp": "2024-12-30T11:34:06.535Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-01/devices/0/features/ventilation.quickmodes.silent", + "properties": { + "active": { + "type": "boolean", + "value": false + }, + "defaultRuntime": { + "type": "number", + "value": 30, + "unit": "minutes" + }, + "isActiveWritable": { + "type": "boolean", + "value": true + } + }, + "commands": { + "activate": { + "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-01/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.com/iot/v2/features/installations/1999737/gateways/gateway-01/devices/0/features/ventilation.quickmodes.silent/commands/deactivate", + "name": "deactivate", + "isExecutable": true, + "params": {} + }, + "setTimeout": { + "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-01/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.com/iot/v2/features/installations/1999737/gateways/gateway-01/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": "gateway-01", + "deviceId": "0", + "timestamp": "2024-12-30T11:34:06.535Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-01/devices/0/features/ventilation.quickmodes.standby", + "properties": { + "active": { + "type": "boolean", + "value": false + } + }, + "commands": { + "activate": { + "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-01/devices/0/features/ventilation.quickmodes.standby/commands/activate", + "name": "activate", + "isExecutable": true, + "params": {} + }, + "deactivate": { + "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-01/devices/0/features/ventilation.quickmodes.standby/commands/deactivate", + "name": "deactivate", + "isExecutable": true, + "params": {} + } + } + }, + { + "feature": "device.productIdentification", + "gatewayId": "gateway-01", + "deviceId": "0", + "timestamp": "2024-12-30T11:21:58.241Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-01/devices/0/features/device.productIdentification", + "properties": { + "product": { + "type": "object", + "value": { + "busType": "OwnBus", + "busAddress": 0, + "viessmannIdentificationNumber": "purifier-01", + "productFamily": "B_00059_VP300" + } + } + }, + "commands": {} + }, + { + "feature": "device.messages.errors.raw", + "gatewayId": "gateway-01", + "deviceId": "0", + "timestamp": "2024-12-30T11:21:58.241Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-01/devices/0/features/device.messages.errors.raw", + "properties": { + "entries": { + "type": "array", + "value": [] + } + }, + "commands": {} + }, + { + "feature": "device.time.daylightSaving", + "gatewayId": "gateway-01", + "deviceId": "0", + "timestamp": "2024-12-30T11:21:58.241Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-01/devices/0/features/device.time.daylightSaving", + "properties": { + "active": { + "type": "boolean", + "value": false + } + }, + "commands": { + "activate": { + "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-01/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.com/iot/v2/features/installations/1999737/gateways/gateway-01/devices/0/features/device.time.daylightSaving/commands/deactivate", + "name": "deactivate", + "isExecutable": true, + "params": {} + } + } + }, + { + "feature": "heating.boiler.serial", + "gatewayId": "gateway-01", + "deviceId": "0", + "timestamp": "2024-12-30T11:21:58.241Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-01/devices/0/features/heating.boiler.serial", + "properties": { + "value": { + "type": "string", + "value": "purifier-01" + } + }, + "commands": {} + }, + { + "feature": "heating.device.variant", + "gatewayId": "gateway-01", + "deviceId": "0", + "timestamp": "2024-12-30T11:21:58.241Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-01/devices/0/features/heating.device.variant", + "properties": { + "value": { + "type": "string", + "value": "Vitopure350" + } + }, + "commands": {} + }, + { + "feature": "ventilation.operating.modes.active", + "gatewayId": "gateway-01", + "deviceId": "0", + "timestamp": "2024-12-30T11:34:07.603Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-01/devices/0/features/ventilation.operating.modes.active", + "properties": { + "value": { + "type": "string", + "value": "sensorDriven" + } + }, + "commands": { + "setMode": { + "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-01/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.com/iot/v2/features/installations/1999737/gateways/gateway-01/devices/0/features/ventilation.operating.modes.active/commands/setModeContinuousSensorOverride", + "name": "setModeContinuousSensorOverride", + "isExecutable": false, + "params": {} + } + } + }, + { + "feature": "ventilation.operating.state", + "gatewayId": "gateway-01", + "deviceId": "0", + "timestamp": "2024-12-30T20:59:55.849Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-01/devices/0/features/ventilation.operating.state", + "properties": { + "level": { + "type": "string", + "value": "unknown" + }, + "demand": { + "type": "string", + "value": "unknown" + }, + "reason": { + "type": "string", + "value": "sensorDriven" + } + }, + "commands": {} + }, + { + "feature": "ventilation.schedule", + "gatewayId": "gateway-01", + "deviceId": "0", + "timestamp": "2024-12-30T11:21:58.241Z", + "isEnabled": true, + "isReady": true, + "apiVersion": 1, + "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-01/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.com/iot/v2/features/installations/1999737/gateways/gateway-01/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.com/iot/v2/features/installations/1999737/gateways/gateway-01/devices/0/features/ventilation.schedule/commands/resetSchedule", + "name": "resetSchedule", + "isExecutable": false, + "params": {} + } + } + } + ] +} From dc8282097262dc2b4b36a3e887162fc759838a30 Mon Sep 17 00:00:00 2001 From: Christopher Fenner Date: Thu, 16 Oct 2025 14:02:10 +0200 Subject: [PATCH 3/5] add testdata --- ...ens-300W.json => Vitodens-300-W-B3HA.json} | 172 +- .../Vitodens-300-W-WB3D-with-TRV.json | 2610 +++++++++++++++++ .../tcu1/TCU-with-VitoPure350.json | 691 ----- .../gatewayWithDevices/tcu1/Vitopure-350.json | 1845 ++++++++++++ 4 files changed, 4541 insertions(+), 777 deletions(-) rename tests/response/gatewayWithDevices/heatbox1/{VitoConnect-1-with-VitoDens-300W.json => Vitodens-300-W-B3HA.json} (81%) create mode 100644 tests/response/gatewayWithDevices/heatbox2/Vitodens-300-W-WB3D-with-TRV.json delete mode 100644 tests/response/gatewayWithDevices/tcu1/TCU-with-VitoPure350.json create mode 100644 tests/response/gatewayWithDevices/tcu1/Vitopure-350.json diff --git a/tests/response/gatewayWithDevices/heatbox1/VitoConnect-1-with-VitoDens-300W.json b/tests/response/gatewayWithDevices/heatbox1/Vitodens-300-W-B3HA.json similarity index 81% rename from tests/response/gatewayWithDevices/heatbox1/VitoConnect-1-with-VitoDens-300W.json rename to tests/response/gatewayWithDevices/heatbox1/Vitodens-300-W-B3HA.json index 4abaf307..24927011 100644 --- a/tests/response/gatewayWithDevices/heatbox1/VitoConnect-1-with-VitoDens-300W.json +++ b/tests/response/gatewayWithDevices/heatbox1/Vitodens-300-W-B3HA.json @@ -2,12 +2,12 @@ "data": [ { "feature": "gateway.devices", - "gatewayId": "gateway-02", + "gatewayId": "1234567812345678", "timestamp": "2024-12-30T09:35:39.088Z", "isEnabled": true, "isReady": true, "apiVersion": 1, - "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-02/features/gateway.devices", + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/features/gateway.devices", "properties": { "devices": { "type": "DeviceList", @@ -49,12 +49,12 @@ }, { "feature": "gateway.wifi", - "gatewayId": "gateway-02", + "gatewayId": "1234567812345678", "timestamp": "2024-12-31T00:32:56.737Z", "isEnabled": true, "isReady": true, "apiVersion": 1, - "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-02/features/gateway.wifi", + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/features/gateway.wifi", "properties": { "strength": { "type": "number", @@ -66,13 +66,13 @@ }, { "feature": "device.messages.errors.raw", - "gatewayId": "gateway-02", + "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/1999737/gateways/gateway-02/devices/0/features/device.messages.errors.raw", + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/device.messages.errors.raw", "properties": { "entries": { "type": "array", @@ -83,30 +83,30 @@ }, { "feature": "device.serial", - "gatewayId": "gateway-02", + "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/1999737/gateways/gateway-02/devices/0/features/device.serial", + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/device.serial", "properties": { "value": { "type": "string", - "value": "heating-01" + "value": "################" } }, "commands": {} }, { "feature": "heating.boiler.sensors.temperature.main", - "gatewayId": "gateway-02", + "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/1999737/gateways/gateway-02/devices/0/features/heating.boiler.sensors.temperature.main", + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.boiler.sensors.temperature.main", "properties": { "value": { "type": "number", @@ -122,30 +122,30 @@ }, { "feature": "heating.boiler.serial", - "gatewayId": "gateway-02", + "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/1999737/gateways/gateway-02/devices/0/features/heating.boiler.serial", + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.boiler.serial", "properties": { "value": { "type": "string", - "value": "heating-01" + "value": "################" } }, "commands": {} }, { "feature": "heating.boiler.temperature", - "gatewayId": "gateway-02", + "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/1999737/gateways/gateway-02/devices/0/features/heating.boiler.temperature", + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.boiler.temperature", "properties": { "value": { "type": "number", @@ -157,13 +157,13 @@ }, { "feature": "heating.burners", - "gatewayId": "gateway-02", + "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/1999737/gateways/gateway-02/devices/0/features/heating.burners", + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.burners", "properties": { "enabled": { "type": "array", @@ -176,13 +176,13 @@ }, { "feature": "heating.burners.0.modulation", - "gatewayId": "gateway-02", + "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/1999737/gateways/gateway-02/devices/0/features/heating.burners.0.modulation", + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.burners.0.modulation", "properties": { "value": { "type": "number", @@ -194,13 +194,13 @@ }, { "feature": "heating.burners.0.statistics", - "gatewayId": "gateway-02", + "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/1999737/gateways/gateway-02/devices/0/features/heating.burners.0.statistics", + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.burners.0.statistics", "properties": { "hours": { "type": "number", @@ -217,13 +217,13 @@ }, { "feature": "heating.burners.0", - "gatewayId": "gateway-02", + "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/1999737/gateways/gateway-02/devices/0/features/heating.burners.0", + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.burners.0", "properties": { "active": { "type": "boolean", @@ -234,13 +234,13 @@ }, { "feature": "heating.circuits", - "gatewayId": "gateway-02", + "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/1999737/gateways/gateway-02/devices/0/features/heating.circuits", + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits", "properties": { "enabled": { "type": "array", @@ -253,13 +253,13 @@ }, { "feature": "heating.circuits.0.circulation.pump", - "gatewayId": "gateway-02", + "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/1999737/gateways/gateway-02/devices/0/features/heating.circuits.0.circulation.pump", + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0.circulation.pump", "properties": { "status": { "type": "string", @@ -270,13 +270,13 @@ }, { "feature": "heating.circuits.0.frostprotection", - "gatewayId": "gateway-02", + "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/1999737/gateways/gateway-02/devices/0/features/heating.circuits.0.frostprotection", + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0.frostprotection", "properties": { "status": { "type": "string", @@ -287,13 +287,13 @@ }, { "feature": "heating.circuits.0.heating.curve", - "gatewayId": "gateway-02", + "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/1999737/gateways/gateway-02/devices/0/features/heating.circuits.0.heating.curve", + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0.heating.curve", "properties": { "shift": { "type": "number", @@ -308,7 +308,7 @@ }, "commands": { "setCurve": { - "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-02/devices/0/features/heating.circuits.0.heating.curve/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": { @@ -336,13 +336,13 @@ }, { "feature": "heating.circuits.0.heating.schedule", - "gatewayId": "gateway-02", + "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/1999737/gateways/gateway-02/devices/0/features/heating.circuits.0.heating.schedule", + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0.heating.schedule", "properties": { "entries": { "type": "Schedule", @@ -412,7 +412,7 @@ }, "commands": { "setSchedule": { - "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-02/devices/0/features/heating.circuits.0.heating.schedule/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": { @@ -432,7 +432,7 @@ } }, "resetSchedule": { - "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-02/devices/0/features/heating.circuits.0.heating.schedule/commands/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": {} @@ -441,13 +441,13 @@ }, { "feature": "heating.circuits.0.operating.modes.active", - "gatewayId": "gateway-02", + "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/1999737/gateways/gateway-02/devices/0/features/heating.circuits.0.operating.modes.active", + "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", @@ -456,7 +456,7 @@ }, "commands": { "setMode": { - "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-02/devices/0/features/heating.circuits.0.operating.modes.active/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": { @@ -478,13 +478,13 @@ }, { "feature": "heating.circuits.0.operating.modes.forcedNormal", - "gatewayId": "gateway-02", + "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/1999737/gateways/gateway-02/devices/0/features/heating.circuits.0.operating.modes.forcedNormal", + "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", @@ -495,13 +495,13 @@ }, { "feature": "heating.circuits.0.operating.modes.forcedReduced", - "gatewayId": "gateway-02", + "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/1999737/gateways/gateway-02/devices/0/features/heating.circuits.0.operating.modes.forcedReduced", + "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", @@ -512,13 +512,13 @@ }, { "feature": "heating.circuits.0.operating.modes.heating", - "gatewayId": "gateway-02", + "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/1999737/gateways/gateway-02/devices/0/features/heating.circuits.0.operating.modes.heating", + "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", @@ -529,13 +529,13 @@ }, { "feature": "heating.circuits.0.operating.modes.standby", - "gatewayId": "gateway-02", + "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/1999737/gateways/gateway-02/devices/0/features/heating.circuits.0.operating.modes.standby", + "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", @@ -546,13 +546,13 @@ }, { "feature": "heating.circuits.0.operating.programs.active", - "gatewayId": "gateway-02", + "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/1999737/gateways/gateway-02/devices/0/features/heating.circuits.0.operating.programs.active", + "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", @@ -563,13 +563,13 @@ }, { "feature": "heating.circuits.0.operating.programs.comfort", - "gatewayId": "gateway-02", + "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/1999737/gateways/gateway-02/devices/0/features/heating.circuits.0.operating.programs.comfort", + "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", @@ -587,7 +587,7 @@ }, "commands": { "activate": { - "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-02/devices/0/features/heating.circuits.0.operating.programs.comfort/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": { @@ -603,7 +603,7 @@ } }, "setTemperature": { - "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-02/devices/0/features/heating.circuits.0.operating.programs.comfort/commands/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": { @@ -619,7 +619,7 @@ } }, "deactivate": { - "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-02/devices/0/features/heating.circuits.0.operating.programs.comfort/commands/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": {} @@ -628,13 +628,13 @@ }, { "feature": "heating.circuits.0.operating.programs.eco", - "gatewayId": "gateway-02", + "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/1999737/gateways/gateway-02/devices/0/features/heating.circuits.0.operating.programs.eco", + "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", @@ -648,13 +648,13 @@ }, "commands": { "activate": { - "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-02/devices/0/features/heating.circuits.0.operating.programs.eco/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/1999737/gateways/gateway-02/devices/0/features/heating.circuits.0.operating.programs.eco/commands/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": {} @@ -663,13 +663,13 @@ }, { "feature": "heating.circuits.0.operating.programs.external", - "gatewayId": "gateway-02", + "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/1999737/gateways/gateway-02/devices/0/features/heating.circuits.0.operating.programs.external", + "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", @@ -685,13 +685,13 @@ }, { "feature": "heating.circuits.0.operating.programs.normal", - "gatewayId": "gateway-02", + "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/1999737/gateways/gateway-02/devices/0/features/heating.circuits.0.operating.programs.normal", + "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", @@ -709,7 +709,7 @@ }, "commands": { "setTemperature": { - "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-02/devices/0/features/heating.circuits.0.operating.programs.normal/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": { @@ -728,13 +728,13 @@ }, { "feature": "heating.circuits.0.operating.programs.reduced", - "gatewayId": "gateway-02", + "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/1999737/gateways/gateway-02/devices/0/features/heating.circuits.0.operating.programs.reduced", + "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", @@ -752,7 +752,7 @@ }, "commands": { "setTemperature": { - "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-02/devices/0/features/heating.circuits.0.operating.programs.reduced/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": { @@ -771,13 +771,13 @@ }, { "feature": "heating.circuits.0.operating.programs.standby", - "gatewayId": "gateway-02", + "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/1999737/gateways/gateway-02/devices/0/features/heating.circuits.0.operating.programs.standby", + "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", @@ -788,13 +788,13 @@ }, { "feature": "heating.circuits.0.sensors.temperature.supply", - "gatewayId": "gateway-02", + "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/1999737/gateways/gateway-02/devices/0/features/heating.circuits.0.sensors.temperature.supply", + "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", @@ -810,13 +810,13 @@ }, { "feature": "heating.circuits.0", - "gatewayId": "gateway-02", + "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/1999737/gateways/gateway-02/devices/0/features/heating.circuits.0", + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.circuits.0", "properties": { "active": { "type": "boolean", @@ -833,7 +833,7 @@ }, "commands": { "setName": { - "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-02/devices/0/features/heating.circuits.0/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": { @@ -851,13 +851,13 @@ }, { "feature": "heating.controller.serial", - "gatewayId": "gateway-02", + "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/1999737/gateways/gateway-02/devices/0/features/heating.controller.serial", + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.controller.serial", "properties": { "value": { "type": "string", @@ -868,13 +868,13 @@ }, { "feature": "heating.operating.programs.holiday", - "gatewayId": "gateway-02", + "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/1999737/gateways/gateway-02/devices/0/features/heating.operating.programs.holiday", + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.operating.programs.holiday", "properties": { "active": { "type": "boolean", @@ -891,7 +891,7 @@ }, "commands": { "changeEndDate": { - "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-02/devices/0/features/heating.operating.programs.holiday/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": { @@ -906,7 +906,7 @@ } }, "schedule": { - "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-02/devices/0/features/heating.operating.programs.holiday/commands/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": { @@ -928,7 +928,7 @@ } }, "unschedule": { - "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-02/devices/0/features/heating.operating.programs.holiday/commands/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": {} @@ -937,13 +937,13 @@ }, { "feature": "heating.sensors.temperature.outside", - "gatewayId": "gateway-02", + "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/1999737/gateways/gateway-02/devices/0/features/heating.sensors.temperature.outside", + "uri": "https://api.viessmann.com/iot/v2/features/installations/2323232/gateways/1234567812345678/devices/0/features/heating.sensors.temperature.outside", "properties": { "value": { "type": "number", @@ -962,14 +962,14 @@ "isEnabled": true, "isReady": true, "timestamp": "2024-12-30T09:35:46.843Z", - "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-02/devices/0/features/heating.circuits.0.name", + "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": "gateway-02", + "gatewayId": "1234567812345678", "components": [], "commands": { "setName": { - "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-02/devices/0/features/heating.circuits.0.name/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": { 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/TCU-with-VitoPure350.json b/tests/response/gatewayWithDevices/tcu1/TCU-with-VitoPure350.json deleted file mode 100644 index 918cc435..00000000 --- a/tests/response/gatewayWithDevices/tcu1/TCU-with-VitoPure350.json +++ /dev/null @@ -1,691 +0,0 @@ -{ - "data": [ - { - "feature": "gateway.devices", - "gatewayId": "gateway-01", - "timestamp": "2024-12-30T11:21:57.697Z", - "isEnabled": true, - "isReady": true, - "apiVersion": 1, - "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-01/features/gateway.devices", - "properties": { - "devices": { - "type": "DeviceList", - "value": [ - { - "id": "0", - "fingerprint": "ecu;purifier-01;0099.0500.2413.0002;0099.0500.2408.0001", - "modelId": "E3_VitoPure", - "modelVersion": "Us8A1u4xvSGqCzY1JrC1Dhp0ChE", - "name": "VitoPure", - "type": "ventilation", - "roles": [ - "type:B2C", - "type:E3", - "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": "5ytIrUQEXTTDm_z5kKYVU-39xVQ", - "name": "TCU", - "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": "5YQQWkBdOSx-KBX_QNqNtS_-1x4", - "name": "E3_RoomControl_One_03", - "type": "roomControl", - "roles": [ - "capability:monetization;FTDC", - "capability:monetization;OWD", - "capability:zigbeeCoordinator", - "type:E3", - "type:virtual;smartRoomControl" - ], - "status": "online" - } - ] - } - }, - "commands": {} - }, - { - "feature": "gateway.wifi", - "gatewayId": "gateway-01", - "timestamp": "2024-12-31T00:17:26.491Z", - "isEnabled": true, - "isReady": true, - "apiVersion": 1, - "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-01/features/gateway.wifi", - "properties": { - "strength": { - "type": "number", - "value": -55, - "unit": "" - } - }, - "commands": {} - }, - { - "feature": "ventilation", - "gatewayId": "gateway-01", - "deviceId": "0", - "timestamp": "2024-12-30T11:21:58.241Z", - "isEnabled": true, - "isReady": true, - "apiVersion": 1, - "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-01/devices/0/features/ventilation", - "properties": { - "active": { - "type": "boolean", - "value": true - } - }, - "commands": {} - }, - { - "feature": "ventilation.operating.modes.filterChange", - "gatewayId": "gateway-01", - "deviceId": "0", - "timestamp": "2024-12-30T11:21:58.241Z", - "isEnabled": true, - "isReady": true, - "apiVersion": 1, - "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-01/devices/0/features/ventilation.operating.modes.filterChange", - "properties": { - "active": { - "type": "boolean", - "value": false - } - }, - "commands": {} - }, - { - "feature": "ventilation.operating.modes.permanent", - "gatewayId": "gateway-01", - "deviceId": "0", - "timestamp": "2024-12-30T20:59:55.849Z", - "isEnabled": true, - "isReady": true, - "apiVersion": 1, - "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-01/devices/0/features/ventilation.operating.modes.permanent", - "properties": { - "active": { - "type": "boolean", - "value": false - } - }, - "commands": { - "setLevel": { - "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-01/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": "gateway-01", - "deviceId": "0", - "timestamp": "2024-12-30T11:34:07.603Z", - "isEnabled": true, - "isReady": true, - "apiVersion": 1, - "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-01/devices/0/features/ventilation.operating.modes.sensorDriven", - "properties": { - "active": { - "type": "boolean", - "value": true - } - }, - "commands": {} - }, - { - "feature": "ventilation.operating.modes.ventilation", - "gatewayId": "gateway-01", - "deviceId": "0", - "timestamp": "2024-12-30T11:34:07.603Z", - "isEnabled": true, - "isReady": true, - "apiVersion": 1, - "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-01/devices/0/features/ventilation.operating.modes.ventilation", - "properties": { - "active": { - "type": "boolean", - "value": false - } - }, - "commands": {} - }, - { - "feature": "ventilation.operating.programs.active", - "gatewayId": "gateway-01", - "deviceId": "0", - "timestamp": "2024-12-30T20:59:55.849Z", - "isEnabled": true, - "isReady": true, - "apiVersion": 1, - "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-01/devices/0/features/ventilation.operating.programs.active", - "properties": { - "value": { - "type": "string", - "value": "automatic" - } - }, - "commands": {} - }, - { - "feature": "ventilation.quickmodes.forcedLevelFour", - "gatewayId": "gateway-01", - "deviceId": "0", - "timestamp": "2024-12-30T11:34:06.535Z", - "isEnabled": true, - "isReady": true, - "apiVersion": 1, - "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-01/devices/0/features/ventilation.quickmodes.forcedLevelFour", - "properties": { - "active": { - "type": "boolean", - "value": false - }, - "defaultRuntime": { - "type": "number", - "value": 30, - "unit": "minutes" - }, - "isActiveWritable": { - "type": "boolean", - "value": true - } - }, - "commands": { - "activate": { - "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-01/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.com/iot/v2/features/installations/1999737/gateways/gateway-01/devices/0/features/ventilation.quickmodes.forcedLevelFour/commands/deactivate", - "name": "deactivate", - "isExecutable": true, - "params": {} - }, - "setTimeout": { - "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-01/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.com/iot/v2/features/installations/1999737/gateways/gateway-01/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": "gateway-01", - "deviceId": "0", - "timestamp": "2024-12-30T11:34:06.535Z", - "isEnabled": true, - "isReady": true, - "apiVersion": 1, - "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-01/devices/0/features/ventilation.quickmodes.silent", - "properties": { - "active": { - "type": "boolean", - "value": false - }, - "defaultRuntime": { - "type": "number", - "value": 30, - "unit": "minutes" - }, - "isActiveWritable": { - "type": "boolean", - "value": true - } - }, - "commands": { - "activate": { - "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-01/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.com/iot/v2/features/installations/1999737/gateways/gateway-01/devices/0/features/ventilation.quickmodes.silent/commands/deactivate", - "name": "deactivate", - "isExecutable": true, - "params": {} - }, - "setTimeout": { - "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-01/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.com/iot/v2/features/installations/1999737/gateways/gateway-01/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": "gateway-01", - "deviceId": "0", - "timestamp": "2024-12-30T11:34:06.535Z", - "isEnabled": true, - "isReady": true, - "apiVersion": 1, - "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-01/devices/0/features/ventilation.quickmodes.standby", - "properties": { - "active": { - "type": "boolean", - "value": false - } - }, - "commands": { - "activate": { - "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-01/devices/0/features/ventilation.quickmodes.standby/commands/activate", - "name": "activate", - "isExecutable": true, - "params": {} - }, - "deactivate": { - "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-01/devices/0/features/ventilation.quickmodes.standby/commands/deactivate", - "name": "deactivate", - "isExecutable": true, - "params": {} - } - } - }, - { - "feature": "device.productIdentification", - "gatewayId": "gateway-01", - "deviceId": "0", - "timestamp": "2024-12-30T11:21:58.241Z", - "isEnabled": true, - "isReady": true, - "apiVersion": 1, - "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-01/devices/0/features/device.productIdentification", - "properties": { - "product": { - "type": "object", - "value": { - "busType": "OwnBus", - "busAddress": 0, - "viessmannIdentificationNumber": "purifier-01", - "productFamily": "B_00059_VP300" - } - } - }, - "commands": {} - }, - { - "feature": "device.messages.errors.raw", - "gatewayId": "gateway-01", - "deviceId": "0", - "timestamp": "2024-12-30T11:21:58.241Z", - "isEnabled": true, - "isReady": true, - "apiVersion": 1, - "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-01/devices/0/features/device.messages.errors.raw", - "properties": { - "entries": { - "type": "array", - "value": [] - } - }, - "commands": {} - }, - { - "feature": "device.time.daylightSaving", - "gatewayId": "gateway-01", - "deviceId": "0", - "timestamp": "2024-12-30T11:21:58.241Z", - "isEnabled": true, - "isReady": true, - "apiVersion": 1, - "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-01/devices/0/features/device.time.daylightSaving", - "properties": { - "active": { - "type": "boolean", - "value": false - } - }, - "commands": { - "activate": { - "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-01/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.com/iot/v2/features/installations/1999737/gateways/gateway-01/devices/0/features/device.time.daylightSaving/commands/deactivate", - "name": "deactivate", - "isExecutable": true, - "params": {} - } - } - }, - { - "feature": "heating.boiler.serial", - "gatewayId": "gateway-01", - "deviceId": "0", - "timestamp": "2024-12-30T11:21:58.241Z", - "isEnabled": true, - "isReady": true, - "apiVersion": 1, - "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-01/devices/0/features/heating.boiler.serial", - "properties": { - "value": { - "type": "string", - "value": "purifier-01" - } - }, - "commands": {} - }, - { - "feature": "heating.device.variant", - "gatewayId": "gateway-01", - "deviceId": "0", - "timestamp": "2024-12-30T11:21:58.241Z", - "isEnabled": true, - "isReady": true, - "apiVersion": 1, - "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-01/devices/0/features/heating.device.variant", - "properties": { - "value": { - "type": "string", - "value": "Vitopure350" - } - }, - "commands": {} - }, - { - "feature": "ventilation.operating.modes.active", - "gatewayId": "gateway-01", - "deviceId": "0", - "timestamp": "2024-12-30T11:34:07.603Z", - "isEnabled": true, - "isReady": true, - "apiVersion": 1, - "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-01/devices/0/features/ventilation.operating.modes.active", - "properties": { - "value": { - "type": "string", - "value": "sensorDriven" - } - }, - "commands": { - "setMode": { - "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-01/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.com/iot/v2/features/installations/1999737/gateways/gateway-01/devices/0/features/ventilation.operating.modes.active/commands/setModeContinuousSensorOverride", - "name": "setModeContinuousSensorOverride", - "isExecutable": false, - "params": {} - } - } - }, - { - "feature": "ventilation.operating.state", - "gatewayId": "gateway-01", - "deviceId": "0", - "timestamp": "2024-12-30T20:59:55.849Z", - "isEnabled": true, - "isReady": true, - "apiVersion": 1, - "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-01/devices/0/features/ventilation.operating.state", - "properties": { - "level": { - "type": "string", - "value": "unknown" - }, - "demand": { - "type": "string", - "value": "unknown" - }, - "reason": { - "type": "string", - "value": "sensorDriven" - } - }, - "commands": {} - }, - { - "feature": "ventilation.schedule", - "gatewayId": "gateway-01", - "deviceId": "0", - "timestamp": "2024-12-30T11:21:58.241Z", - "isEnabled": true, - "isReady": true, - "apiVersion": 1, - "uri": "https://api.viessmann.com/iot/v2/features/installations/1999737/gateways/gateway-01/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.com/iot/v2/features/installations/1999737/gateways/gateway-01/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.com/iot/v2/features/installations/1999737/gateways/gateway-01/devices/0/features/ventilation.schedule/commands/resetSchedule", - "name": "resetSchedule", - "isExecutable": false, - "params": {} - } - } - } - ] -} 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": {} + } + } + } + } + } + ] +} From 4eb4e2d2283fd0c4c6166862b57d5414bd3ea694 Mon Sep 17 00:00:00 2001 From: Christopher Fenner Date: Sun, 19 Oct 2025 10:55:40 +0200 Subject: [PATCH 4/5] add test case --- tests/ViCareGatewayServiceMock.py | 38 +++++++++++++++++++++++++++++++ tests/test_Vitopure350.py | 12 ++++++++++ 2 files changed, 50 insertions(+) create mode 100644 tests/ViCareGatewayServiceMock.py 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/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') From 37ed56fefa0710ee48c987960388eb9dfc6055b9 Mon Sep 17 00:00:00 2001 From: Christopher Fenner Date: Sun, 19 Oct 2025 10:55:59 +0200 Subject: [PATCH 5/5] move gateway service --- PyViCare/PyViCareService.py | 12 +++++ PyViCare/PyViCareServiceViaGateway.py | 63 --------------------------- 2 files changed, 12 insertions(+), 63 deletions(-) delete mode 100644 PyViCare/PyViCareServiceViaGateway.py 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/PyViCare/PyViCareServiceViaGateway.py b/PyViCare/PyViCareServiceViaGateway.py deleted file mode 100644 index 0124b83c..00000000 --- a/PyViCare/PyViCareServiceViaGateway.py +++ /dev/null @@ -1,63 +0,0 @@ -import json -import logging -from typing import Any, List - -from PyViCare.PyViCareAbstractOAuthManager import AbstractViCareOAuthManager -from PyViCare.PyViCareService import (ViCareService) -from PyViCare.PyViCareUtils import PyViCareNotSupportedFeatureError - -logger = logging.getLogger('ViCare') -logger.addHandler(logging.NullHandler()) - -# 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 - -# def hasRoles(requested_roles: List[str], existing_roles: List[str]) -> bool: -# return len(requested_roles) > 0 and set(requested_roles).issubset(set(existing_roles)) - -# def buildSetPropertyUrl(accessor, property_name, action): -# return f'/features/installations/{accessor.id}/gateways/{accessor.serial}/devices/{accessor.device_id}/features/{property_name}/commands/{action}' - -# class ViCareDeviceAccessor: -# def __init__(self, _id: int, serial: str, device_id: str) -> None: -# self.id = _id -# self.serial = serial -# self.device_id = device_id - -class ViCareServiceViaGateway(ViCareService): - # def __init__(self, oauth_manager: AbstractViCareOAuthManager, accessor: ViCareDeviceAccessor, roles: List[str]) -> None: - # self.oauth_manager = oauth_manager - # self.accessor = accessor - # self.roles = roles - - # def getProperty(self, property_name: str) -> Any: - # url = self.buildGetPropertyUrl(property_name) - # return self.oauth_manager.get(url) - - # def buildGetPropertyUrl(self, property_name): - # if self._isGateway(): - # 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 hasRoles(self, requested_roles) -> bool: - # return hasRoles(requested_roles, self.roles) - - # def _isGateway(self) -> bool: - # return self.hasRoles(["type:gateway;VitoconnectOpto1"]) or self.hasRoles(["type:gateway;VitoconnectOpto2/OT2"]) or self.hasRoles(["type:gateway;TCU100"]) or self.hasRoles(["type:gateway;TCU200"]) or self.hasRoles(["type:gateway;TCU300"]) - - # def setProperty(self, property_name: str, action: str, data: Any) -> Any: - # url = buildSetPropertyUrl( - # self.accessor, property_name, action) - - # post_data = data if isinstance(data, str) else json.dumps(data) - # return self.oauth_manager.post(url, post_data) - - 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)