{"id":1860,"date":"2023-01-19T16:35:03","date_gmt":"2023-01-19T15:35:03","guid":{"rendered":"https:\/\/www.rustimation.eu\/?p=1860"},"modified":"2025-07-13T18:23:52","modified_gmt":"2025-07-13T16:23:52","slug":"viessmann-api-und-node-red-teil-4","status":"publish","type":"post","link":"https:\/\/www.rustimation.eu\/index.php\/viessmann-api-und-node-red-teil-4\/","title":{"rendered":"Viessmann API und Node Red &#8211; Teil 4 &#8211; Einstellungen \u00e4ndern"},"content":{"rendered":"<p>Nachdem wir in den vorherigen Kapiteln gelernt haben, wie der Zugriff auf die API erfolgt und wie man Daten daraus auslesen kann, sehen wir jetzt, wie man die Einstellung der Heizung &#8211; z.B. die Temperatur oder den Betriebsmodus \u00fcber die API ver\u00e4ndern kann.<\/p>\n<p><!--more--><\/p>\n<p style=\"padding-left: 40px;\"><span style=\"color: #808080;\">Dieses Tutorial ist auf die ge\u00e4nderte API von Februar 2023 angepasst. Anstatt dem\u00a0 Endpoint <em>equipment<\/em> wird jetzt der Endpoint<em> features<\/em> verwendet.<\/span><\/p>\n<p>Schauen wir uns zuerst einmal das JSON Objekt aus der Feature Abfrage an. Der hier dargestellte Auszug zeigt bzw. setzt die Normaltemperatur des Heizkreises 2 (Feature: heating.circuits.2.operating.programs.normal): Ein Feature f\u00e4ngt immer mit \"properties\" an und l\u00e4uft bis zur n\u00e4chsten \"properties\" Zeile.<\/p>\n<h3>Beispiel: Normaltemperatur Heizkreis 2 einstellen<\/h3>\n<pre class=\"lang:js mark:12 decode:true\">           {\r\n                \"properties\": {\r\n                    \"active\": {\r\n                        \"value\": false,\r\n                        \"type\": \"boolean\"\r\n                    },\r\n                    \"demand\": {\r\n                        \"value\": \"unknown\",\r\n                        \"type\": \"string\"\r\n                    },\r\n                    \"temperature\": {\r\n                        \"value\": 17,\r\n                        \"unit\": \"celsius\",\r\n                        \"type\": \"number\"\r\n                    }\r\n                },\r\n                \"commands\": {\r\n                    \"setTemperature\": {\r\n                        \"uri\": \"https:\/\/api.viessmann-climatesolutions.com\/iot\/v1\/equipment\/installations\/999999\/gateways\/1234567890123456\/devices\/0\/features\/heating.circuits.2.operating.programs.normal\/commands\/setTemperature\",\r\n                        \"name\": \"setTemperature\",\r\n                        \"isExecutable\": true,\r\n                        \"params\": {\r\n                            \"targetTemperature\": {\r\n                                \"type\": \"number\",\r\n                                \"required\": true,\r\n                                \"constraints\": {\r\n                                    \"min\": 3,\r\n                                    \"max\": 37,\r\n                                    \"stepping\": 1\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n                },\r\n                \"apiVersion\": 1,\r\n                \"uri\": \"https:\/\/api.viessmann-climatesolutions.com\/iot\/v1\/equipment\/installations\/999999\/gateways\/1234567890123456\/devices\/0\/features\/heating.circuits.2.operating.programs.normal\",\r\n                \"gatewayId\": \"1234567890123456\",\r\n                \"feature\": \"heating.circuits.2.operating.programs.normal\",\r\n                \"timestamp\": \"2022-11-24T08:22:15.667Z\",\r\n                \"isEnabled\": true,\r\n                \"isReady\": true,\r\n                \"deviceId\": \"0\"\r\n            },<\/pre>\n<p>Die eingestellte Solltemperatur betr\u00e4gt 17 Grad Celsius &#8211; wie man sie ausliest, ist im <a href=\"https:\/\/www.rustimation.eu\/index.php\/vicare-daten-abfragen\/\" target=\"_blank\" rel=\"noopener\">vorigen Kapitel<\/a> beschrieben.<\/p>\n<p>Jedes Feature, das bei \"commands\" einen nicht leeren Inhalt hat, kann &#8211; theoretisch &#8211; manipuliert werden. In unserem Beispiel ist das der Fall. Dort steht <span class=\"lang:js decode:true crayon-inline\">\"commands\": { \"setTemperature\": {&#8230;<\/span> gefolgt von einer URL und einigen Constraints (Einschr\u00e4nkungen).<\/p>\n<p>Der Parameter\u00a0\"isExecutable\" gibt an, ob sich ein Befehl in einem Feature <strong>unter den aktuellen Gegebenheiten <\/strong>ausf\u00fchren l\u00e4sst oder nicht. Bei\u00a0\"isExecutable\" = true l\u00e4sst sich der Befehl ausf\u00fchren, ansonsten nicht. Beispiel: Du kannst das Betriebsprogramm \"Eco\" nicht einstellen, weil sich die Anlage im Standby Modus befindet.<\/p>\n<p>Wie stellen wir nun die Normaltemperatur von Heizkreis 2 ein?<\/p>\n<h4>Straight forward<\/h4>\n<p><a href=\"https:\/\/www.rustimation.eu\/index.php\/viessmann-api-und-node-red-teil-4\/2023-01-19-14_26_26-node-red-_-192-168-178-24-mozilla-firefox\/\" rel=\"attachment wp-att-1979\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1979\" src=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2023\/01\/2023-01-19-14_26_26-Node-RED-_-192.168.178.24-\u2013-Mozilla-Firefox.png\" alt=\"\" width=\"916\" height=\"68\" srcset=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2023\/01\/2023-01-19-14_26_26-Node-RED-_-192.168.178.24-\u2013-Mozilla-Firefox.png 916w, https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2023\/01\/2023-01-19-14_26_26-Node-RED-_-192.168.178.24-\u2013-Mozilla-Firefox-300x22.png 300w, https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2023\/01\/2023-01-19-14_26_26-Node-RED-_-192.168.178.24-\u2013-Mozilla-Firefox-768x57.png 768w\" sizes=\"auto, (max-width: 916px) 100vw, 916px\" \/><\/a><\/p>\n<p>Zuerst kommt ein Dashboard Slider Node, den wir so einstellen, dass er \"Output only on release\" liefert. Der Zielwert steckt jetzt in msg.payload. Der Function Node, der den http-Reuest Header entsprechend aufbereitet, wird wie folgt programmiert:<\/p>\n<p><a href=\"https:\/\/www.rustimation.eu\/index.php\/viessmann-api-und-node-red-teil-4\/2023-01-19-14_43_56-node-red-_-192-168-178-24-mozilla-firefox\/\" rel=\"attachment wp-att-1980\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1980\" src=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2023\/01\/2023-01-19-14_43_56-Node-RED-_-192.168.178.24-\u2013-Mozilla-Firefox.png\" alt=\"\" width=\"542\" height=\"560\" srcset=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2023\/01\/2023-01-19-14_43_56-Node-RED-_-192.168.178.24-\u2013-Mozilla-Firefox.png 542w, https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2023\/01\/2023-01-19-14_43_56-Node-RED-_-192.168.178.24-\u2013-Mozilla-Firefox-290x300.png 290w\" sizes=\"auto, (max-width: 542px) 100vw, 542px\" \/><\/a><\/p>\n<p>bzw. als Javascript Snippet zum copy&amp;paste:<\/p>\n<pre class=\"lang:js decode:true\">var atoken = flow.get('accessToken');\r\nvar setTo = msg.payload;\r\n\r\nmsg.payload = {\r\n    \"targetTemperature\": setTo\r\n}\r\nmsg.headers = {};\r\nmsg.headers['content-type'] = 'application\/json';\r\nmsg.headers['Authorization'] = \"Bearer \" + atoken;\r\n\r\nmsg.installationID = flow.get('installationID');\r\nmsg.gatewaySerial = flow.get('gatewaySerial');\r\nmsg.deviceId = flow.get('deviceID');\r\n\r\nreturn msg;<\/pre>\n<p style=\"padding-left: 40px;\"><span style=\"color: #808080;\">Noch ein HInweis: Die in msg.header steckende Information ist ziemlich \"klebrig\", was bedeutet, dass da oft\u00a0 Informationen aus vorherigen http-Requests drin stehen bleiben. Um eine saubere Basis zu haben, sollte man vor jedem Setzen des Headers diesen mit einem <span class=\"lang:default decode:true crayon-inline \">msg.headers = {};<\/span>\u00a0 l\u00f6schen.<\/span><\/p>\n<p>Der <em>http Rquest Node<\/em> \"set feature\" enth\u00e4lt die f\u00fcr die Normaltemperatur Heizkreis 2 erforderliche URI:<\/p>\n<pre class=\"lang:js decode:true\">https:\/\/api.viessmann.com\/iot\/v2\/features\/installations\/{{installationID}}\/gateways\/{{gatewaySerial}}\/devices\/{{deviceId}}\/features\/heating.circuits.2.operating.programs.normal\/commands\/setTemperature<\/pre>\n<p>Fertig! Oder nicht?<\/p>\n<h4>Flow Betriebssicher machen<\/h4>\n<p>Bedient man das Dashboard mit einem Mobilger\u00e4t, kann es schnell passieren, dass man den Slider Temperaturw\u00e4hler versehentlich verstellt. Das ist nat\u00fcrlich nicht im Sinne des Erfinders. Ich habe deshalb den Slider und den Befehl enkoppelt. Zum Abschicken der neuen Temperatur muss noch ein Best\u00e4tigungsbutton geklickt werden.<\/p>\n<p>Das sieht insgesamt wie folgt aus:<\/p>\n<p><a href=\"https:\/\/www.rustimation.eu\/2023-01-19-14_52_54-node-red-_-192-168-178-24-mozilla-firefox\/\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1983\" src=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2023\/01\/2023-01-19-14_52_54-Node-RED-_-192.168.178.24-\u2013-Mozilla-Firefox.png\" alt=\"\" width=\"851\" height=\"411\" srcset=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2023\/01\/2023-01-19-14_52_54-Node-RED-_-192.168.178.24-\u2013-Mozilla-Firefox.png 851w, https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2023\/01\/2023-01-19-14_52_54-Node-RED-_-192.168.178.24-\u2013-Mozilla-Firefox-300x145.png 300w, https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2023\/01\/2023-01-19-14_52_54-Node-RED-_-192.168.178.24-\u2013-Mozilla-Firefox-768x371.png 768w\" sizes=\"auto, (max-width: 851px) 100vw, 851px\" \/><\/a><\/p>\n<p>Die oberen drei grau unterlegten Nodes aus dem Feature Request hast du sicher schon; sie dienen lediglich der R\u00fcckkopplung des aktell in der Heizung eingestellten Werts. Da unsere Applikation ja nicht die einzige Eingabem\u00f6glichkeit ist &#8211; es gibt ja noch die ViCare App oder die Tasten am Ger\u00e4t selbst &#8211; ist die R\u00fcckkopplung sehr wichtig um immer die aktuell geltende Einstellung zu sehen.<\/p>\n<p>Der Function Node mit Namen \"HK Soll Temp normal\" wird einfach mit dem bereits existierenden \"Feature auslesen\" <em>http Request<\/em> verdrahtet. Dieser Node macht nichts Anderes als sich den in der Heizanlage geltenden Wert aus dem JSON File herauszusuchen. Die Logik ist aus dem <a href=\"https:\/\/www.rustimation.eu\/index.php\/vicare-daten-abfragen\/\">vorigen Kapitel<\/a> bekannt.<\/p>\n<pre class=\"lang:js decode:true \">var featureArray = msg.payload.data;\r\nvar idx = featureArray.findIndex((element) =&gt; element.feature === 'heating.circuits.2.operating.programs.normal');\r\nmsg.payload = msg.payload.data[idx].properties.temperature.value;\r\nflow.set(\"hkNormal\", msg.payload);\r\nreturn msg;<\/pre>\n<p>Danach kommt der Dashboard Slider Node &#8211; Einstellung wie oben. Letzter Node in diesem Strang ist noch ein Change Node, der die Flow Variable gem\u00e4\u00df des Slider Werts zur Verwendung im n\u00e4chsten Schritt abspeichert. Wenn nun der Slider bewegt wird, passiert wie gewollt erst einmal nichts. Das geschieht erst im n\u00e4chsten Schritt, denn erst die unteren drei Nodes nehmen nach dem Ausl\u00f6sen des Dashboard Buttons die Einstellung vor.<\/p>\n<p>Der Dashboard Button Node wird wie unten gezeigt eingestellt &#8211; wobei ich die Darstellung des Button Icons ge\u00e4ndert habe:<\/p>\n<p><a href=\"https:\/\/www.rustimation.eu\/index.php\/viessmann-api-und-node-red-teil-4\/2023-01-19-15_14_37-node-red-_-192-168-178-24-mozilla-firefox\/\" rel=\"attachment wp-att-1984\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1984\" src=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2023\/01\/2023-01-19-15_14_37-Node-RED-_-192.168.178.24-\u2013-Mozilla-Firefox.png\" alt=\"\" width=\"567\" height=\"802\" srcset=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2023\/01\/2023-01-19-15_14_37-Node-RED-_-192.168.178.24-\u2013-Mozilla-Firefox.png 567w, https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2023\/01\/2023-01-19-15_14_37-Node-RED-_-192.168.178.24-\u2013-Mozilla-Firefox-212x300.png 212w\" sizes=\"auto, (max-width: 567px) 100vw, 567px\" \/><\/a><\/p>\n<p>Die Payload enh\u00e4lt die Flow Variable mit der eingestellten Temperatur.<\/p>\n<p>Der <em>Function Node Headers &amp; Parameter<\/em> sieht fast so aus, wie der beim \"straight forward\" Beispiel. Lediglich Zeile 2 ist unterschiedlich<\/p>\n<pre class=\"lang:js decode:true \">var atoken = flow.get('accessToken');\r\nvar setTo = flow.get('sliHN');\r\n\r\nmsg.payload = {\r\n    \"targetTemperature\": setTo\r\n}\r\nmsg.headers = {};\r\nmsg.headers['content-type'] = 'application\/json';\r\nmsg.headers['Authorization'] = \"Bearer \" + atoken;\r\n\r\nmsg.installationID = flow.get('installationID');\r\nmsg.gatewaySerial = flow.get('gatewaySerial');\r\nmsg.deviceId = flow.get('deviceID');\r\n;\r\nreturn msg;<\/pre>\n<p>Der<em> http Requst Node \"<\/em>Set Feature\" ist identisch zum straight forward Beispiel<\/p>\n<pre class=\"lang:js decode:true\">https:\/\/api.viessmann-climatesolutions.com\/iot\/v2\/features\/installations\/{{installationID}}\/gateways\/{{gatewaySerial}}\/devices\/{{deviceId}}\/features\/heating.circuits.2.operating.programs.normal\/commands\/setTemperature<\/pre>\n<p>Und hier noch die Darstellung des Dashboards mit Auswahl Betriebsart, Slider f\u00fcr normale und reduzierte Temperatur. Die gelben \"OK Haken\" l\u00f6sen aus.<\/p>\n<p><a href=\"https:\/\/www.rustimation.eu\/index.php\/viessmann-api-und-node-red-teil-4\/2023-01-19-15_40_33-centralina-mozilla-firefox\/\" rel=\"attachment wp-att-1987\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1987\" src=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2023\/01\/2023-01-19-15_40_33-Centralina-\u2013-Mozilla-Firefox.png\" alt=\"\" width=\"365\" height=\"266\" srcset=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2023\/01\/2023-01-19-15_40_33-Centralina-\u2013-Mozilla-Firefox.png 365w, https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2023\/01\/2023-01-19-15_40_33-Centralina-\u2013-Mozilla-Firefox-300x219.png 300w\" sizes=\"auto, (max-width: 365px) 100vw, 365px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<h3>Beispiel: Betriebsart einstellen<\/h3>\n<p><a href=\"https:\/\/www.rustimation.eu\/index.php\/viessmann-api-und-node-red-teil-4\/2023-01-19-15_44_44-node-red-_-192-168-178-24-mozilla-firefox-2\/\" rel=\"attachment wp-att-1990\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1990\" src=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2023\/01\/2023-01-19-15_44_44-Node-RED-_-192.168.178.24-\u2013-Mozilla-Firefox-1.png\" alt=\"\" width=\"1007\" height=\"157\" srcset=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2023\/01\/2023-01-19-15_44_44-Node-RED-_-192.168.178.24-\u2013-Mozilla-Firefox-1.png 1007w, https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2023\/01\/2023-01-19-15_44_44-Node-RED-_-192.168.178.24-\u2013-Mozilla-Firefox-1-300x47.png 300w, https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2023\/01\/2023-01-19-15_44_44-Node-RED-_-192.168.178.24-\u2013-Mozilla-Firefox-1-768x120.png 768w\" sizes=\"auto, (max-width: 1007px) 100vw, 1007px\" \/><\/a><\/p>\n<p>Je nach Anlage gibt es mehrere Betriebsarten: Bei mir sind dies <em>Aus<\/em>, <em>Nur Warmwasser,<\/em> <em>Zeitprogramm Heizung und Warmwasser<\/em>, <em>dauernd reduziert<\/em> und <em>dauernd normal<\/em>.<\/p>\n<p>Diese stellt man je nach Heizkreis wie folgt ein; in unserem Beispiel f\u00fcr Heizkreis 2:<\/p>\n<pre class=\"lang:js decode:true\">heating.circuits.2.operating.modes.active\/commands\/setMode<\/pre>\n<p>Im Prinzip funktioniert alles so wie bei der Temperatureinstellung. Der Function Node HK Betriebsart ist wieder die R\u00fcckkopplung aus der Feature Abfrage <em>Betriebsart.<\/em> Die Einstellung erfolgt \u00fcber einen <em>Dashboard Dropdown Node,<\/em> der Headers<em> &amp; Parameter<\/em> Node setzt die Payload auf einen der vorgeschriebenen Werte \"mode: standby\",<br \/>\n\"mode: dhw\", \"mode: dhwAndHeating\", \"mode: forcedReduced\", \"mode: forcedNormal\" .<br \/>\nDer http Request hat die URL<\/p>\n<pre class=\"lang:js decode:true\">https:\/\/api.viessmann-climatesolutions.com\/iot\/v2\/features\/installations\/{{installationID}}\/gateways\/{{gatewaySerial}}\/devices\/{{deviceId}}\/features\/heating.circuits.2.operating.modes.active\/commands\/setMode<\/pre>\n<p>Das zugeh\u00f6rige JSON File f\u00fcr Node-Red findest du hier:<\/p>\n<pre class=\"height:20 lang:js decode:true\">[{\"id\":\"354cb6e083ea9537\",\"type\":\"function\",\"z\":\"31c57f8640528976\",\"name\":\"HK Betriebsart\",\"func\":\"var featureArray = msg.payload.data;\\nvar idx = featureArray.findIndex((element) =&gt; element.feature === 'heating.circuits.2.operating.modes.active');\\nmsg.payload = msg.payload.data[idx].properties.value.value;\\nreturn msg;\\n\",\"outputs\":1,\"noerr\":0,\"initialize\":\"\",\"finalize\":\"\",\"libs\":[],\"x\":420,\"y\":2560,\"wires\":[[\"9ec49bb67331871e\"]]},{\"id\":\"9ec49bb67331871e\",\"type\":\"ui_dropdown\",\"z\":\"31c57f8640528976\",\"name\":\"HK Betriebsart\",\"label\":\"\",\"tooltip\":\"\",\"place\":\"Betriebsart\",\"group\":\"ba68cdf22ac62395\",\"order\":1,\"width\":6,\"height\":1,\"passthru\":false,\"multiple\":false,\"options\":[{\"label\":\"aus\",\"value\":\"standby\",\"type\":\"str\"},{\"label\":\"nur WW\",\"value\":\"dhw\",\"type\":\"str\"},{\"label\":\"Zeitprogr. Heizung &amp; WW\",\"value\":\"dhwAndHeating\",\"type\":\"str\"},{\"label\":\"dauernd reduziert\",\"value\":\"forcedReduced\",\"type\":\"str\"},{\"label\":\"dauernd Tag\",\"value\":\"forcedNormal\",\"type\":\"str\"}],\"payload\":\"\",\"topic\":\"topic\",\"topicType\":\"msg\",\"className\":\"\",\"x\":160,\"y\":2620,\"wires\":[[\"8c38cdcc5d584653\"]]},{\"id\":\"8c38cdcc5d584653\",\"type\":\"function\",\"z\":\"31c57f8640528976\",\"name\":\"Headers &amp; Parameter\",\"func\":\"var atoken = flow.get('accessToken')\\nvar setTo = msg.payload\\n\\nmsg.payload = {\\n \\\"mode\\\": setTo\\n}\\nmsg.headers = {};\\nmsg.headers['content-type'] = 'application\/json',\\nmsg.headers['Authorization'] = \\\"Bearer \\\" + atoken;\\n\\nmsg.installationID = flow.get('installationID');\\nmsg.gatewaySerial = flow.get('gatewaySerial');\\nmsg.deviceId = flow.get('deviceID');\\n;\\nreturn msg;\\n\\n\",\"outputs\":1,\"noerr\":0,\"initialize\":\"\",\"finalize\":\"\",\"libs\":[],\"x\":440,\"y\":2620,\"wires\":[[\"3f5d70a0adfe2d5a\"]]},{\"id\":\"3f5d70a0adfe2d5a\",\"type\":\"http request\",\"z\":\"31c57f8640528976\",\"name\":\"Set Feature\",\"method\":\"POST\",\"ret\":\"obj\",\"paytoqs\":\"ignore\",\"url\":\"https:\/\/api.viessmann-climatesolutions.com\/iot\/v2\/equipment\/installations\/{{installationID}}\/gateways\/{{gatewaySerial}}\/devices\/{{deviceId}}\/features\/heating.circuits.2.operating.modes.active\/commands\/setMode\",\"tls\":\"\",\"persist\":false,\"proxy\":\"\",\"insecureHTTPParser\":false,\"authType\":\"\",\"senderr\":false,\"headers\":[],\"credentials\":{},\"x\":650,\"y\":2620,\"wires\":[[\"ac3e542798c51fa6\",\"47147733bf11ab71\"]]},{\"id\":\"ac3e542798c51fa6\",\"type\":\"debug\",\"z\":\"31c57f8640528976\",\"name\":\"debug 17\",\"active\":true,\"tosidebar\":true,\"console\":false,\"tostatus\":false,\"complete\":\"payload\",\"targetType\":\"msg\",\"statusVal\":\"\",\"statusType\":\"auto\",\"x\":840,\"y\":2620,\"wires\":[]},{\"id\":\"ba68cdf22ac62395\",\"type\":\"ui_group\",\"name\":\"Einstellung HK Rustico\",\"tab\":\"7e5ee24d.2d5ae4\",\"order\":5,\"disp\":true,\"width\":\"6\",\"collapse\":false,\"className\":\"\"},{\"id\":\"7e5ee24d.2d5ae4\",\"type\":\"ui_tab\",\"name\":\"Solar\/Heizung\",\"icon\":\"dashboard\",\"order\":3,\"disabled\":false,\"hidden\":false}]<\/pre>\n<h3>Beispiel: \"Ich m\u00f6chte Warmwasser\"<\/h3>\n<p>Hinter dieser Schnellwahlfunktion der App verbirgt sich die Ausf\u00fchrung des Befehls \"Warmwasser einmal bereitstellen\" bzw. <span class=\"lang:js decode:true crayon-inline \">heating.dhw.oneTimeCharge<\/span> . Damit wird dann der Warmwasserboiler einmalig bis zu gew\u00e4hlten Temperatur aufgeheizt, egal in welchem Betriebsmodus sich die Heizung befindet &#8211; auch wenn sie auf AUS steht.<\/p>\n<p>Der Befehl ist einerseits etwas anders als die oben beschriebenen, andererseits auch nicht schwieriger &#8211; man muss nur drauf kommen!<\/p>\n<p>Ich schildere hier nur das Prinzip. Einbauen in deine Anwendung und mit Schalterchen versehen darfst du das selbst &#8211; inzwischen kannst du das ja, oder?<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-2336\" src=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2023\/01\/2023-03-18-14_54_13-Node-RED-_-192.168.178.24-\u2013-Mozilla-Firefox.png\" alt=\"\" width=\"1070\" height=\"176\" srcset=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2023\/01\/2023-03-18-14_54_13-Node-RED-_-192.168.178.24-\u2013-Mozilla-Firefox.png 1070w, https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2023\/01\/2023-03-18-14_54_13-Node-RED-_-192.168.178.24-\u2013-Mozilla-Firefox-300x49.png 300w, https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2023\/01\/2023-03-18-14_54_13-Node-RED-_-192.168.178.24-\u2013-Mozilla-Firefox-1024x168.png 1024w, https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2023\/01\/2023-03-18-14_54_13-Node-RED-_-192.168.178.24-\u2013-Mozilla-Firefox-768x126.png 768w\" sizes=\"auto, (max-width: 1070px) 100vw, 1070px\" \/><\/p>\n<p>Die beiden Trigger schicken einen String und zwar entweder \"activate\" oder \"deactivate\". Im folgenden Function Node wird daraus die aufzurufende URL aufgebaut und an den http Request Node weitergeben.<\/p>\n<div>\n<div>\n<pre class=\"lang:js decode:true\" title=\"Functioin Node \">var atoken = flow.get('accessToken');\r\nvar setTo = msg.payload;\r\nvar installationID = flow.get('installationID');\r\nvar gatewaySerial = flow.get('gatewaySerial');\r\nvar deviceId = flow.get('deviceID');\r\n\r\nmsg.payload = {};\r\nmsg.headers = {};\r\nmsg.headers['content-type'] = 'application\/json',\r\nmsg.headers['Authorization'] = \"Bearer \" + atoken;\r\n\r\nmsg.url = \"https:\/\/api.viessmann-climatesolutions.com\/iot\/v1\/features\/installations\/\" + installationID + \"\/gateways\/\" + gatewaySerial + \"\/devices\/\" + deviceId + \"\/features\/heating.dhw.oneTimeCharge\/commands\/\" + setTo;\r\n\r\nreturn msg;<\/pre>\n<\/div>\n<p>Was passiert da: Der Function Node setzt die Payload auf eine leere Menge <span class=\"lang:js decode:true crayon-inline \">msg.payload={}<\/span> , das ist wichtig, da der http Request keine Payload \u00fcbermittelt bekommen soll. In der vorletzten Zeile wird die URL zusammengebastelt, d.h. erweitert um den gew\u00fcnschten Aktivierungsstatus.<\/p>\n<p>Die Funktion bzw. der Status ergibt sich hier also aus der URL und nicht wie sonst aus einem Parameter im http-Request Header, der \u00fcbergeben wird.<\/p>\n<p>Der <em>http Request Node<\/em> wird als POST konfiguriert und hat in der URL Zeile nichts drin stehen.<\/p>\n<p>Schickt man zweimal denselben Status ab &#8211; z.B. zweimal <em>activate<\/em>, dann gibt es eine Fehlermeldung der Art:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-2337\" src=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2023\/01\/2023-03-18-15_29_48-Node-RED-_-192.168.178.24-\u2013-Mozilla-Firefox.png\" alt=\"\" width=\"372\" height=\"348\" srcset=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2023\/01\/2023-03-18-15_29_48-Node-RED-_-192.168.178.24-\u2013-Mozilla-Firefox.png 372w, https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2023\/01\/2023-03-18-15_29_48-Node-RED-_-192.168.178.24-\u2013-Mozilla-Firefox-300x281.png 300w\" sizes=\"auto, (max-width: 372px) 100vw, 372px\" \/><\/p>\n<p>Hier noch das JSON Snippet zum importieren<\/p>\n<pre class=\"height-set:true height-mode:2 height:15 lang:js decode:true\">[{\"id\":\"549e96f8b1dcf2b1\",\"type\":\"http request\",\"z\":\"31c57f8640528976\",\"name\":\"Set Feature\",\"method\":\"POST\",\"ret\":\"obj\",\"paytoqs\":\"ignore\",\"url\":\"\",\"tls\":\"\",\"persist\":false,\"proxy\":\"\",\"insecureHTTPParser\":false,\"authType\":\"\",\"senderr\":false,\"headers\":[],\"x\":650,\"y\":2880,\"wires\":[[\"ed98324b1f418d0b\"]]},{\"id\":\"b1ab78c225f82b3b\",\"type\":\"function\",\"z\":\"31c57f8640528976\",\"name\":\"Headers &amp; Parameter\",\"func\":\"var atoken = flow.get('accessToken');\\nvar setTo = msg.payload;\\nvar installationID = flow.get('installationID');\\nvar gatewaySerial = flow.get('gatewaySerial');\\nvar deviceId = flow.get('deviceID');\\n\\nmsg.payload = {};\\nmsg.headers = {};\\nmsg.headers['content-type'] = 'application\/json',\\nmsg.headers['Authorization'] = \\\"Bearer \\\" + atoken;\\nmsg.url = \\\"https:\/\/api.viessmann-climatesolutions.com\/iot\/v2\/features\/installations\/\\\" + installationID + \\\"\/gateways\/\\\" + gatewaySerial + \\\"\/devices\/\\\" + deviceId + \\\"\/features\/heating.dhw.oneTimeCharge\/commands\/\\\" + setTo;\\n\\nreturn msg;\\n\\n\",\"outputs\":1,\"noerr\":0,\"initialize\":\"\",\"finalize\":\"\",\"libs\":[],\"x\":440,\"y\":2880,\"wires\":[[\"549e96f8b1dcf2b1\"]]},{\"id\":\"ed98324b1f418d0b\",\"type\":\"debug\",\"z\":\"31c57f8640528976\",\"name\":\"debug 44\",\"active\":true,\"tosidebar\":true,\"console\":false,\"tostatus\":false,\"complete\":\"false\",\"statusVal\":\"\",\"statusType\":\"auto\",\"x\":820,\"y\":2880,\"wires\":[]},{\"id\":\"0b018d39b29952e0\",\"type\":\"inject\",\"z\":\"31c57f8640528976\",\"name\":\"\",\"props\":[{\"p\":\"payload\"},{\"p\":\"topic\",\"vt\":\"str\"}],\"repeat\":\"\",\"crontab\":\"\",\"once\":false,\"onceDelay\":0.1,\"topic\":\"\",\"payload\":\"activate\",\"payloadType\":\"str\",\"x\":210,\"y\":2900,\"wires\":[[\"b1ab78c225f82b3b\"]]},{\"id\":\"78d7db200a51816d\",\"type\":\"inject\",\"z\":\"31c57f8640528976\",\"name\":\"\",\"props\":[{\"p\":\"payload\"},{\"p\":\"topic\",\"vt\":\"str\"}],\"repeat\":\"\",\"crontab\":\"\",\"once\":false,\"onceDelay\":0.1,\"topic\":\"\",\"payload\":\"deactivate\",\"payloadType\":\"str\",\"x\":200,\"y\":2840,\"wires\":[[\"b1ab78c225f82b3b\"]]},{\"id\":\"22529d0c5cc35dea\",\"type\":\"comment\",\"z\":\"31c57f8640528976\",\"name\":\"dhw One Time charge\",\"info\":\"\",\"x\":220,\"y\":2800,\"wires\":[]}]<\/pre>\n<p>That's it.<\/p>\n<p>Kommentare, Fehlermeldungen und ein kleines Dankesch\u00f6n w\u00fcrden mich gl\u00fccklich machen.<\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u00c4ndern wesentlicher Heizungsparameter mittels Node-Red. Zum Beispiel \u00e4ndern der Temperatur, \u00e4ndern des Betriebsmodus.<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[53,4,151,159],"tags":[161],"class_list":["post-1860","post","type-post","status-publish","format-standard","hentry","category-iot","category-json","category-node-red","category-viessmann-api","tag-einstellungen-aendern"],"_links":{"self":[{"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/posts\/1860","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/comments?post=1860"}],"version-history":[{"count":1,"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/posts\/1860\/revisions"}],"predecessor-version":[{"id":3617,"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/posts\/1860\/revisions\/3617"}],"wp:attachment":[{"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/media?parent=1860"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/categories?post=1860"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/tags?post=1860"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}