viessmann_API_HeatingControl
Displays and controls Viessmann API accessible temperatures of heating, water, solar- and outside sensors.
Changes desired water temperatures optimized on a solar modules mounted on west side roof.
- Lower water temperature in the morning
- Higher water temperature in the afternoon, reduce higher water heating only in case of missing sun during the day
Preconditions: Viessmann account, id and refresh tokens
Usage of Viessmann API: See viessman side: https://developer.viessmann.com/start.html
Requires Viessmann Developer Account with creating myRefreshToken myClientId
Installation:
- Import flow
- Replace myRefreshToken and myClientId with your values inside the "set Post params" function node
- Hint: refresh and access tokens are renewed every 60 Minutes according to the Viessman API
[{"id":"cecfbffa.742fb","type":"tab","label":"HeizungViCare","disabled":false,"info":""},{"id":"b1942d41.e8d5b","type":"inject","z":"cecfbffa.742fb","name":"Trigger","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"3600","crontab":"","once":true,"onceDelay":"10","topic":"","payload":"","payloadType":"date","x":140,"y":60,"wires":[["a8fee38d.d2aa5"]]},{"id":"dfd72d41.3929c","type":"http request","z":"cecfbffa.742fb","name":"post to get Refresh Token","method":"POST","ret":"obj","paytoqs":"ignore","url":"https://iam.viessmann.com/idp/v2/token","tls":"","persist":false,"proxy":"","authType":"","x":650,"y":60,"wires":[["d22ae14a.33fd9"]]},{"id":"a8fee38d.d2aa5","type":"function","z":"cecfbffa.742fb","name":"set Post params","func":"var currentRefreshToken = global.get(\"ViessRefreshToken\");\n\nif(isNaN(currentRefreshToken))\n{\n currentRefreshToken = 'myRefreshToken'\n}\n\nmsg.headers={ \n 'Content-Type': 'application/x-www-form-urlencoded'\n};\nmsg.payload = {};\nmsg.payload={ \n 'client_id': 'myClientId',\n 'grant_type': 'refresh_token',\n 'refresh_token': currentRefreshToken\n};\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":380,"y":60,"wires":[["dfd72d41.3929c"]]},{"id":"d22ae14a.33fd9","type":"function","z":"cecfbffa.742fb","name":"set refresh token ","func":"global.set('ViessRefreshToken',msg.payload.refresh_token);\nglobal.set('ViessAccessToken',msg.payload.access_token);\n\n\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":890,"y":60,"wires":[[]]},{"id":"ce050569.d470d8","type":"inject","z":"cecfbffa.742fb","name":"Trigger","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":true,"onceDelay":"20","topic":"","payload":"","payloadType":"date","x":140,"y":180,"wires":[["78d9bac4.755374"]]},{"id":"d72ba596.317378","type":"http request","z":"cecfbffa.742fb","name":"Get installationId","method":"GET","ret":"obj","paytoqs":"body","url":"https://api.viessmann.com/iot/v1/equipment/installations?includeGateways=true","tls":"","persist":false,"proxy":"","authType":"","x":630,"y":180,"wires":[["d4283362.b3db6"]]},{"id":"78d9bac4.755374","type":"function","z":"cecfbffa.742fb","name":"set Bearer Token","func":"var currentAccessToken = global.get(\"ViessAccessToken\");\n\nmsg.headers = {};\nmsg.headers['Authorization'] = \"Bearer \"+currentAccessToken;\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":390,"y":180,"wires":[["d72ba596.317378"]]},{"id":"83a60a59.24dfc8","type":"http request","z":"cecfbffa.742fb","name":"Get Device Features","method":"GET","ret":"obj","paytoqs":"body","url":"{{{path}}}","tls":"","persist":false,"proxy":"","authType":"","x":640,"y":340,"wires":[["9d433a15.f86298","e4ef455b.23e208"]]},{"id":"6fa6992a.4301b8","type":"inject","z":"cecfbffa.742fb","name":"Trigger","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"300","crontab":"","once":true,"onceDelay":"30","topic":"","payload":"","payloadType":"date","x":140,"y":340,"wires":[["f82f3a28.678f48"]]},{"id":"f82f3a28.678f48","type":"function","z":"cecfbffa.742fb","name":"set Device ID get features","func":"var currentAccessToken = global.get(\"ViessAccessToken\");\nvar installationId = global.get('ViessinstallationId');\nvar gatewaySerial = global.get('ViessgatewaySerial');\nvar deviceId = global.get('ViessdeviceId');\n\nmsg.headers = {};\nmsg.headers['Authorization'] = \"Bearer \"+currentAccessToken;\n\n//msg.installationId = installationId;\n//msg.gatewaySerial = gatewaySerial;\n\n//msg.path = \"https://api.viessmann.com/iot/v1/equipment/installations/{{\"+installationId+\"}}/gateways/{{\"+gatewaySerial+\"}}/devices\"\nmsg.path = \"https://api.viessmann.com/iot/v1/equipment/installations/\"+installationId+\"/gateways/\"+gatewaySerial+\"/devices/\"+deviceId+\"/features\"\n\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":390,"y":340,"wires":[["83a60a59.24dfc8"]]},{"id":"9d433a15.f86298","type":"debug","z":"cecfbffa.742fb","name":"DeviceId","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":840,"y":340,"wires":[]},{"id":"d4283362.b3db6","type":"function","z":"cecfbffa.742fb","name":"set installationId","func":"var installationId = msg.payload.data[0].id;\nglobal.set('ViessinstallationId',installationId.toString());\nglobal.set('ViessgatewaySerial',msg.payload.data[0].gateways[0].serial);\nglobal.set('ViessdeviceId',msg.payload.data[0].gateways[0].devices[0].id);\n\n\n\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":880,"y":180,"wires":[[]]},{"id":"e4ef455b.23e208","type":"function","z":"cecfbffa.742fb","name":"Get values","func":"var msg_temperature_outside = { payload: 0};\nvar msg_temperature_main = { payload: 0};\nvar msg_hotwaterStorage = { payload: 0};\nvar msg_solarTemp = { payload: 0};\nvar msg_solarTempCollector = { payload: 0};\nvar msg_hotwaterDesired = { payload: 0};\nvar msg_operatingModes = { payload: \"NotSet\"};\n \n//var msg_length = { payload: msg.payload.data.length};\n\nvar length = msg.payload.data.length\n\nfor (var i = 0; i < length; i++)\n{\n if(msg.payload.data[i].feature == 'heating.sensors.temperature.outside')\n {\n msg_temperature_outside.payload = msg.payload.data[i].properties.value.value;\n }\n if(msg.payload.data[i].feature == 'heating.boiler.sensors.temperature.main')\n {\n msg_temperature_main.payload = msg.payload.data[i].properties.value.value;\n }\n if(msg.payload.data[i].feature == 'heating.dhw.sensors.temperature.hotWaterStorage')\n {\n msg_hotwaterStorage.payload = msg.payload.data[i].properties.value.value;\n }\n if(msg.payload.data[i].feature == 'heating.solar.sensors.temperature.dhw')\n {\n msg_solarTemp.payload = msg.payload.data[i].properties.value.value;\n }\n if(msg.payload.data[i].feature == 'heating.solar.sensors.temperature.collector')\n {\n msg_solarTempCollector.payload = msg.payload.data[i].properties.value.value;\n }\n if(msg.payload.data[i].feature == 'heating.dhw.temperature.main')\n {\n msg_hotwaterDesired.payload = msg.payload.data[i].properties.value.value;\n }\n if(msg.payload.data[i].feature == 'heating.circuits.0.operating.modes.active')\n {\n msg_operatingModes.payload = msg.payload.data[i].properties.value.value;\n }\n}\n\nreturn [ msg_temperature_outside, msg_temperature_main, msg_hotwaterStorage, msg_solarTemp, msg_solarTempCollector, msg_hotwaterDesired, msg_operatingModes ];\n\n\n\n","outputs":7,"noerr":0,"initialize":"","finalize":"","x":850,"y":420,"wires":[["17f86514.7756bb"],["1a093af6.87e7d5"],["8436b76a.5f7b58"],["30f6cc7a.de33f4"],["b6246922.9f8318"],["f9b96377.8c387"],["58915507.b65a8c"]]},{"id":"8436b76a.5f7b58","type":"ui_chart","z":"cecfbffa.742fb","name":"Warmwasser","group":"93f7f96e.67def8","order":1,"width":0,"height":0,"label":"Warmwasser","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":false,"ymin":"","ymax":"","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"3600","cutout":0,"useOneColor":false,"useUTC":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"outputs":1,"useDifferentColor":false,"x":1270,"y":220,"wires":[[]]},{"id":"1a093af6.87e7d5","type":"ui_chart","z":"cecfbffa.742fb","name":"Heizkreis 1","group":"93f7f96e.67def8","order":3,"width":0,"height":0,"label":"Heizkreis 1","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":false,"ymin":"","ymax":"","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"3600","cutout":0,"useOneColor":false,"useUTC":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"outputs":1,"useDifferentColor":false,"x":1270,"y":160,"wires":[[]]},{"id":"17f86514.7756bb","type":"ui_chart","z":"cecfbffa.742fb","name":"Aussentemperatur","group":"4c1f481e.d89f88","order":6,"width":0,"height":0,"label":"Aussentemperatur","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":false,"ymin":"","ymax":"","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"3600","cutout":0,"useOneColor":false,"useUTC":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"outputs":1,"useDifferentColor":false,"x":1290,"y":100,"wires":[[]]},{"id":"30f6cc7a.de33f4","type":"ui_chart","z":"cecfbffa.742fb","name":"SolarTemperatur","group":"4c1f481e.d89f88","order":4,"width":0,"height":0,"label":"SolarTemperatur","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":false,"ymin":"","ymax":"","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"3600","cutout":0,"useOneColor":false,"useUTC":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"outputs":1,"useDifferentColor":false,"x":1290,"y":280,"wires":[[]]},{"id":"b6246922.9f8318","type":"ui_chart","z":"cecfbffa.742fb","name":"SolarTemperaturCollector","group":"4c1f481e.d89f88","order":5,"width":0,"height":0,"label":"SolarTemperaturCollector","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":false,"ymin":"","ymax":"","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"3600","cutout":0,"useOneColor":false,"useUTC":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"outputs":1,"useDifferentColor":false,"x":1310,"y":340,"wires":[[]]},{"id":"de57eab1.2bc168","type":"http request","z":"cecfbffa.742fb","name":"Post Kommandos","method":"use","ret":"obj","paytoqs":"body","url":"{{{url}}}","tls":"","persist":false,"proxy":"","authType":"","x":1510,"y":640,"wires":[["a5d93ea5.bdf61"]]},{"id":"195572e3.34357d","type":"function","z":"cecfbffa.742fb","name":"set Hot Water 35 C","func":"var currentAccessToken = global.get(\"ViessAccessToken\");\nvar installationId = global.get('ViessinstallationId');\nvar gatewaySerial = global.get('ViessgatewaySerial');\nvar deviceId = global.get('ViessdeviceId');\n\nmsg.headers = {};\nmsg.method = \"POST\"\nmsg.headers['Authorization'] = \"Bearer \"+currentAccessToken;\nmsg.headers[\"content-type\"] = \"application/json\"\n\nmsg.payload = {};\nmsg.payload={ \n 'temperature': 35,\n};\n\nmsg.url = \"https://api.viessmann.com/iot/v1/equipment/installations/\"+installationId+\"/gateways/\"+gatewaySerial+\"/devices/\"+deviceId+\"/features/heating.dhw.temperature.main/commands/setTargetTemperature\"\n\nreturn msg;\n\n//heating.circuits.0.operating.modes.dhwAndHeating\n//heating.circuits.0.operating.programs.eco/commands/activate\n//heating.circuits.0.operating.programs.eco/commands/deactivate\n//heating.dhw\n//heating.dhw.temperature.main/commands/setTargetTemperature\n//heating.circuits.0.operating.programs.normal/commands/setTemperature\n//heating.circuits.0.operating.programs.comfort/commands/setTemperatur\n//heating.circuits.0.operating.programs.comfort/commands/activate\n//heating.circuits.0.operating.programs.comfort/commands/deactivate\n//heating.circuits.0.operating.modes.active\n// heating.circuits.1.operating.modes.active/\n\n\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":370,"y":620,"wires":[["de57eab1.2bc168","90e6cbdc.eaf748"]]},{"id":"678e6941.b196b8","type":"inject","z":"cecfbffa.742fb","name":"Trigger","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"00 18 * * *","once":false,"onceDelay":"40","topic":"","payload":"","payloadType":"date","x":140,"y":620,"wires":[["195572e3.34357d"]]},{"id":"90e6cbdc.eaf748","type":"debug","z":"cecfbffa.742fb","name":"HotWaterMsg","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":580,"y":580,"wires":[]},{"id":"a5d93ea5.bdf61","type":"debug","z":"cecfbffa.742fb","name":"HeatCmdRsp","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1620,"y":580,"wires":[]},{"id":"9a17735e.b721b","type":"function","z":"cecfbffa.742fb","name":"set Hot Water 50 C","func":"var currentAccessToken = global.get(\"ViessAccessToken\");\nvar installationId = global.get('ViessinstallationId');\nvar gatewaySerial = global.get('ViessgatewaySerial');\nvar deviceId = global.get('ViessdeviceId');\n\nmsg.headers = {};\nmsg.method = \"POST\"\nmsg.headers['Authorization'] = \"Bearer \"+currentAccessToken;\nmsg.headers[\"content-type\"] = \"application/json\"\n\nmsg.payload = {};\nmsg.payload={ \n 'temperature': 50,\n};\n\nmsg.url = \"https://api.viessmann.com/iot/v1/equipment/installations/\"+installationId+\"/gateways/\"+gatewaySerial+\"/devices/\"+deviceId+\"/features/heating.dhw.temperature.main/commands/setTargetTemperature\"\n\nreturn msg;\n\n//heating.circuits.0.operating.modes.dhwAndHeating\n//heating.circuits.0.operating.programs.eco/commands/activate\n//heating.circuits.0.operating.programs.eco/commands/deactivate\n//heating.dhw\n//heating.dhw.temperature.main/commands/setTargetTemperature\n//heating.circuits.0.operating.programs.normal/commands/setTemperature\n//heating.circuits.0.operating.programs.comfort/commands/setTemperatur\n//heating.circuits.0.operating.programs.comfort/commands/activate\n//heating.circuits.0.operating.programs.comfort/commands/deactivate\n//heating.circuits.0.operating.modes.active\n// heating.circuits.1.operating.modes.active/\n\n\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":370,"y":700,"wires":[["de57eab1.2bc168"]]},{"id":"d86cc9cf.6ccb18","type":"inject","z":"cecfbffa.742fb","name":"Trigger","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"00 17 * * *","once":false,"onceDelay":"40","topic":"","payload":"","payloadType":"date","x":140,"y":700,"wires":[["9a17735e.b721b"]]},{"id":"f9b96377.8c387","type":"ui_chart","z":"cecfbffa.742fb","name":"WarmwasserWunsch","group":"93f7f96e.67def8","order":2,"width":0,"height":0,"label":"WarmwasserWunsch","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":false,"ymin":"","ymax":"","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"3600","cutout":0,"useOneColor":false,"useUTC":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"outputs":1,"useDifferentColor":false,"x":1300,"y":400,"wires":[[]]},{"id":"58915507.b65a8c","type":"ui_text","z":"cecfbffa.742fb","group":"93f7f96e.67def8","order":5,"width":0,"height":0,"name":"OperatingMode","label":"OperatingMode","format":"{{msg.payload}}","layout":"row-spread","x":1280,"y":460,"wires":[]},{"id":"93f7f96e.67def8","type":"ui_group","name":"Gastherme","tab":"2d9674b7.9c8bac","order":1,"disp":true,"width":"6","collapse":false},{"id":"4c1f481e.d89f88","type":"ui_group","name":"Temperatur","tab":"2d9674b7.9c8bac","order":2,"disp":true,"width":"6","collapse":false},{"id":"2d9674b7.9c8bac","type":"ui_tab","name":"Heizung","icon":"dashboard","order":17,"disabled":false,"hidden":false}]