{"id":3024,"date":"2024-10-25T13:32:55","date_gmt":"2024-10-25T11:32:55","guid":{"rendered":"https:\/\/www.rustimation.eu\/?p=3024"},"modified":"2026-02-22T11:08:41","modified_gmt":"2026-02-22T10:08:41","slug":"viessmann-ohne-api-optolink-splitter-3","status":"publish","type":"post","link":"https:\/\/www.rustimation.eu\/index.php\/viessmann-ohne-api-optolink-splitter-3\/","title":{"rendered":"Viessmann ohne API &#8211; Optolink-Splitter (3)"},"content":{"rendered":"<p>Jetzt beginnt der sch\u00f6nere Teil. Hat man einmal die wesentlichen Datenpunkte gefunden kann man diese ganz einfach \u00fcber einen <em>MQTT In<\/em> Node in Node-Red verarbeiten.<\/p>\n<h2>Node-Red<\/h2>\n<p>Bevor ihr allerdings eure komplette API Kopplung l\u00f6scht, empfehle ich, erst einmal ein Backup zu machen.<!--more--> Des Weiteren w\u00fcrde ich in einem ersten Schritt, die Optolink Geschichte in einem eigenen Tab ausprobieren und schauen, ob die angezeigten Optolink Werte tats\u00e4chlich mit den API Werten \u00fcbereinstimmen. Bei Au\u00dfentemperatur, Speichertemperatur und ein paar anderen liefert Viessmann die Werte zeitverz\u00f6gert aus. Es muss also nicht immer zu 100% \u00fcbereinstimmen.<\/p>\n<p><a href=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2024\/10\/optolink_disclaimer-e1730199916608.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-3116 size-full\" src=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2024\/10\/optolink_disclaimer-e1730199916608.png\" alt=\"\" width=\"770\" height=\"221\" srcset=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2024\/10\/optolink_disclaimer-e1730199916608.png 770w, https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2024\/10\/optolink_disclaimer-e1730199916608-300x86.png 300w, https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2024\/10\/optolink_disclaimer-e1730199916608-768x220.png 768w\" sizes=\"auto, (max-width: 770px) 100vw, 770px\" \/><\/a><\/p>\n<h3>Einfache Werte auslesen<\/h3>\n<p>Zum Gl\u00fcck kommen die meisten Werte verz\u00f6gerungsfrei aus dem System &#8211; egal ob mit Optolink oder der API ausgelesen. Hier ein Beispiel f\u00fcr dieWarmwassertemperatur:<\/p>\n<p><a href=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2024\/10\/2024-10-25-11_28_04-Node-RED-_-Viessmann-\u2013-Mozilla-Firefox.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-3037\" src=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2024\/10\/2024-10-25-11_28_04-Node-RED-_-Viessmann-\u2013-Mozilla-Firefox.png\" alt=\"\" width=\"482\" height=\"68\" srcset=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2024\/10\/2024-10-25-11_28_04-Node-RED-_-Viessmann-\u2013-Mozilla-Firefox.png 482w, https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2024\/10\/2024-10-25-11_28_04-Node-RED-_-Viessmann-\u2013-Mozilla-Firefox-300x42.png 300w\" sizes=\"auto, (max-width: 482px) 100vw, 482px\" \/><\/a><\/p>\n<p>Der MQTT In Node erh\u00e4lt das Topic, das wir in der Polling Liste poll_list.py f\u00fcr Warmwassertemperatur definiert haben. Die Quality of Service definiere ich pers\u00f6nlich mit \"1\" was bei wackeligen Verbindungen etwas mehr Betriebssicherheit bietet &#8211; wie ich meine.<\/p>\n<p><a href=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2024\/10\/2024-10-25-11_28_32-Node-RED-_-Viessmann-\u2013-Mozilla-Firefox.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-3040\" src=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2024\/10\/2024-10-25-11_28_32-Node-RED-_-Viessmann-\u2013-Mozilla-Firefox.png\" alt=\"\" width=\"543\" height=\"431\" srcset=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2024\/10\/2024-10-25-11_28_32-Node-RED-_-Viessmann-\u2013-Mozilla-Firefox.png 543w, https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2024\/10\/2024-10-25-11_28_32-Node-RED-_-Viessmann-\u2013-Mozilla-Firefox-300x238.png 300w\" sizes=\"auto, (max-width: 543px) 100vw, 543px\" \/><\/a><\/p>\n<p>Bei \"Ausgang\" empfehle ich \"String\" zu verwenden. Nat\u00fcrlich geht auch \"Auto-Erkennung\", meistens jedenfalls. Bei Hexadezimal Werten allerdings nicht.<\/p>\n<h3>Weiterverarbeitung<\/h3>\n<p>Normalerweise k\u00f6nnen wir wie oben direkt ein Dashboard Element an den MQTT In Node dranh\u00e4ngen.<\/p>\n<p>Manchmal jedoch k\u00f6nnen wir Dashboard Switches nicht 1 zu 1 \u00fcbernehmen, da die API mit \"on\" oder \"off\" Werten arbeitet und Optolink mit 1 oder 0. Hier entsprechend den Dashboard Node anpassen.<\/p>\n<h4>Zu viele Werte<\/h4>\n<p>Die Au\u00dfentemperatur wird von Viessmann in der API nur ca. jede Stunde oder bei gr\u00f6\u00dferen \u00c4nderungen aktualisiert. Wir haben jetzt die M\u00f6glichkeit, die Temperatur alle 30 Sekunden abzugreifen. Will man diesen Wert aber in Influx speichern, ist\u00a0 das ein Overkill. Anstatt einer sch\u00f6nen Temperaturlinie gibt es ein zittriges Band von Werten.<\/p>\n<figure id=\"attachment_3042\" aria-describedby=\"caption-attachment-3042\" style=\"width: 218px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2024\/10\/IMG_9826-e1729849862241.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-3042 size-medium\" src=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2024\/10\/IMG_9826-e1729849862241-218x300.png\" alt=\"\" width=\"218\" height=\"300\" srcset=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2024\/10\/IMG_9826-e1729849862241-218x300.png 218w, https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2024\/10\/IMG_9826-e1729849862241-742x1024.png 742w, https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2024\/10\/IMG_9826-e1729849862241.png 749w\" sizes=\"auto, (max-width: 218px) 100vw, 218px\" \/><\/a><figcaption id=\"caption-attachment-3042\" class=\"wp-caption-text\">Links &#8211; Abfrageintervall 30 Sek. Rechts &#8211; gefiltert alle 10 Minuten<\/figcaption><\/figure>\n<p>Ich habe mir so beholfen:<\/p>\n<p><a href=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2024\/10\/2024-10-25-11_53_21-Node-RED-_-Flow-1-\u2013-Mozilla-Firefox.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-3044\" src=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2024\/10\/2024-10-25-11_53_21-Node-RED-_-Flow-1-\u2013-Mozilla-Firefox.png\" alt=\"\" width=\"452\" height=\"73\" srcset=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2024\/10\/2024-10-25-11_53_21-Node-RED-_-Flow-1-\u2013-Mozilla-Firefox.png 452w, https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2024\/10\/2024-10-25-11_53_21-Node-RED-_-Flow-1-\u2013-Mozilla-Firefox-300x48.png 300w\" sizes=\"auto, (max-width: 452px) 100vw, 452px\" \/><\/a>Nach dem MQTT In Node kommt ein Delay Node, der nur alle 10 Minuten einen Wert durchl\u00e4sst sowie ein Filter Node, der nur bei Wert\u00e4nderungen die payload.msg weiterleitet. Das spart etwas Platz in der Datenbank. Ferner benutze ich das Topic <span class=\"lang:default decode:true crayon-inline\">Vitodens\/AussenTemp_fltrd<\/span>\u00a0 0x5525 und nicht den in Phil's Original Polling Liste ebenfalls verf\u00fcgbaren Wert bei 0x800. In aktuellen Versionen des Splitters hei\u00dft das Topic-Prefix \"Vito\".<\/p>\n<p>Alternativ k\u00f6nnten wir die Temperatur nicht \u00fcber die Pollingliste sondern alle x Minuten direkt auslesen. Weiter unten steht mehr dazu.<\/p>\n<h4>Hexadezimale Werte &#8211; lauter kleine Endians<\/h4>\n<p style=\"padding-left: 40px;\"><span style=\"color: #808080;\">Endian hat nichts mit den amerikanischen Ureinwohnern zu tun, sondern mit Gullivers Reisen und der Art, wie man gekochte Eier aufschl\u00e4gt \ud83d\ude42<\/span><\/p>\n<p>Informatiker k\u00f6nnen dieses Kapitel gerne \u00fcberspringen&#8230;<\/p>\n<p>Einige Werte sind weder Integer noch Float sondern hexadezimal. Zum Beispiel die Verbrauchswerte [kWh]. Bei Gasger\u00e4ten stehten diese in der Gegend von 0x9000 bei W\u00e4rmepumpen und anderer moderner Technologie wahrscheinlich an einer anderen Stelle.<\/p>\n<p>In der Polling Liste werden diese als \"raw\" ausgelesen:<\/p>\n<p><span class=\"lang:default decode:true crayon-inline \">(\"HeizgVerbrTag\", 0x9000, 32, 'raw'),<\/span><\/p>\n<p>MQTT spuckt dann f\u00fcr<strong> 8 Tage Verbrauchsdaten<\/strong> z.B. folgendes aus: <span class=\"lang:default decode:true crayon-inline\">2A00000004000000000000000d000000180000000e0000000000000000000000<\/span><\/p>\n<p>So etwas erschlie\u00dft sich nicht von selbst. Der Hex String ist 64 Zeichen lang, je Byte sind das zwei Zeichen, also insgesamt 32 Byte, somit 4 Byte pro Tag.<br \/>\nDie 4 Byte (8 Zeichen) ganz links stehen f\u00fcr \"heute\".<\/p>\n<p>Was man jetzt beachten muss, ist, dass die 4 Byte nach der <a href=\"https:\/\/de.wikipedia.org\/wiki\/Byte-Reihenfolge\" target=\"_blank\" rel=\"noopener\">\"Little Endian\" Notation<\/a> da stehen. Das hei\u00dft, das niederwertigste Byte kommt zuerst, dann das n\u00e4chst h\u00f6herwertige und so fort. Auf das Dezimalsystem \u00fcbertragen hie\u00dfe das, die Zahl '3456' wird als '6543 dargestellt. Also Einer zuerst, dann Zehner, dann Hunderter, dann Tausender.<\/p>\n<p><a href=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2024\/10\/endian.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-3076\" src=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2024\/10\/endian.png\" alt=\"\" width=\"926\" height=\"242\" srcset=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2024\/10\/endian.png 926w, https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2024\/10\/endian-300x78.png 300w, https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2024\/10\/endian-768x201.png 768w\" sizes=\"auto, (max-width: 926px) 100vw, 926px\" \/><\/a><\/p>\n<p>Nach dieser Einleitung wissen wir hoffentlich, wie die ersten 4 Byte zu interpretieren sind:, n\u00e4mlich als<\/p>\n<p><span class=\"lang:default decode:true crayon-inline\">0000002A<\/span><\/p>\n<p>oder dezimal 42 &#8211; die Antwort auf\u00a0 '<a href=\"https:\/\/www.amazon.de\/Hitchhikers-Collection-Harmless-Everything-Restaurant\/dp\/9123537949\/\" target=\"_blank\" rel=\"noopener\">Life, the Universe And Everything<\/a>'. Das hei\u00dft, wir haben heute einen Bespielverbrauch von 42 kWh gehabt.<\/p>\n<p>Da diese Hex Werte f\u00fcr Nicht-Informatiker wie mich schwer zu verdauen sind, habe ich spa\u00dfeshalber einmal Chat\u00a0 GPT gefragt, ob es mir nicht eine Aufdr\u00f6sel-Routine zur Verf\u00fcgung stellen k\u00f6nnte. Frage war: \"<em>Ich brauche ein Javascript Skript, das eine lange Kette von 4 Byte hexadezimal Werten zerlegt und unter Ber\u00fccksichtigung von Little Endian in Dezimalwerte umwandelt<\/em>.\" Und siehe da, es hat geklappt: Auf einen Node Red Funktionsknoten angepasst sieht das so aus:<\/p>\n<pre class=\"lang:js decode:true \">\/\/ original JS code generated by ChatGPT - adapted to NR Function Node\r\nlet hexString = msg.payload;\r\n\r\n\/\/ Entfernt Leerzeichen und konvertiert in Kleinbuchstaben\r\nhexString = hexString.replace(\/\\s+\/g, '').toLowerCase();\r\n\/\/ \u00dcberpr\u00fcft, ob die L\u00e4nge der Hexadezimalzeichenkette ein Vielfaches von 8 ist (4 Bytes = 8 Hex-Zeichen)\r\nif (hexString.length % 8 !== 0) {\r\n    throw new Error(\"Hexadezimalzeichenkette muss ein Vielfaches von 8 Zeichen sein.\");\r\n}\r\n\r\nconst decimalValues = [];\r\n\r\n\/\/ Zerlegt die Hexadezimalzeichenkette in 8-stellige St\u00fccke (4 Byte)\r\nfor (let i = 0; i &lt; hexString.length; i += 8) {\r\n    let hexChunk = hexString.slice(i, i + 8);\r\n    \r\n    \/\/ Zerlegt das 4-Byte-Hexadezimalst\u00fcck in Paare von 2 Hex-Zeichen (1 Byte) und dreht es um\r\n    let littleEndianChunk = hexChunk.match(\/..\/g).reverse().join('');\r\n    \r\n    \/\/ Konvertiert in einen Dezimalwert\r\n    let decimalValue = parseInt(littleEndianChunk, 16);\r\n    decimalValues.push(decimalValue);\r\n}\r\nmsg.payload = decimalValues;\r\nreturn msg;<\/pre>\n<p>Sch\u00f6n kommentieren kann die KI auch noch.<\/p>\n<p style=\"padding-left: 40px;\"><span style=\"color: #808080;\">Ich m\u00f6chte allerdings nicht wissen, wieviel Watt Strom durch diese Anfrage verbraucht wurden. Kein Wunder, dass Google und Amazon inzwischen wieder Atomkraftwerke reaktivieren, um die unnat\u00fcrliche Intelligenz zu betreiben.<\/span><\/p>\n<p>F\u00fcttert man den \"Hex String 2 Decimal\" Function Node mit dem ganzen Output von MQTT, kommt folgendes Array heraus:<\/p>\n<p><a href=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2024\/10\/2024-10-25-12_39_20-Node-RED-_-Optolink-\u2013-Mozilla-Firefox.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-3047\" src=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2024\/10\/2024-10-25-12_39_20-Node-RED-_-Optolink-\u2013-Mozilla-Firefox.png\" alt=\"\" width=\"270\" height=\"67\" \/><\/a>Analog k\u00f6nnen wir bei den anderen Verbrauchwerten vorgehen. Aber Achtung: Optolink liefert aus irgend welchen Gr\u00fcnden gw\u00f6hnlich nur 55 valide Byte. Der Rest ist dann einfach \"00\". Der Wochenverbrauch (53 Wochen) ist 212 Byte lang und m\u00fcsste in 4 Teile gest\u00fcckelt werden. Siehe Byte-Bitweiser Zugriff direkt unterhalb.<\/p>\n<h5>Byte-Bitweiser Zugriff<\/h5>\n<p><span style=\"color: #808080;\"><span style=\"color: #000000;\">Wem das in diesem Kapitel Beschriebene zu kompliziert (oder zu langatmig) ist, kann auch einfach Byte-Bitweise auf die Werte zugreifen. Der heutige Verbrauch w\u00e4re dann so zu konfigurieren: <span class=\"lang:default decode:true crayon-inline\">(\"HeizgVerbr_heute\", 0x9000, 32, 'b:0:3', 1),<\/span> (lese ab 0x9000 die Bytes 0 bis 3 und konvertiere in Dezimal ohne zu skalieren)<\/span><br \/>\n<span style=\"color: #000000;\">Der gestrige Verbrauch w\u00e4re demnach so einzustellen <\/span><br \/>\n<span style=\"color: #000000;\"><span class=\"lang:default decode:true crayon-inline\">(\"HeizgVerbr_gestern\", 0x9000, 32, 'b:4:7', 1),<\/span> und so weiter.<\/span><br \/>\n<\/span><\/p>\n<p>Die Frage dabei ist, ob es Sinn macht, MQTT alle 30 Sekunden mit einer Abfrage zu beaufschlagen, deren Ergebnis sich nur sehr selten \u00e4ndert? Eher nein, weshalb ich f\u00fcr derlei Abfragen anders vorgehe. <a href=\"https:\/\/www.rustimation.eu\/index.php\/viessmann-ohne-api-optolink-splitter-3\/#Direkte_Abfragen\">Siehe unten<\/a>.<\/p>\n<h3>Schreiben von Werten<\/h3>\n<p>W\u00e4hrend das Auslesen von gepollten Werten sehr komfortabel ist, muss man zum Schreiben mit MQTT die betreffenden Speicheradressen des Viessmann Ger\u00e4ts ansprechen. Hier ein Beispiel zum Setzen der Solltemperatur in Heizkreis 2:<\/p>\n<p>Die Solltemperatur von Heizkreis 2 liegt bei meiner Therme auf 0x3306 und nennt sich <em>BedienRTSolltemperaturM2~0x3306.<\/em> RT steht f\u00fcr \"Raumthermostat\".<em><br \/>\n<\/em><\/p>\n<p>Nun basteln wir uns die Payload zusammen, die wir mittels MQTT Out Node an das Topic Vitodens\/cmnd schicken:<\/p>\n<pre class=\"lang:js decode:true\">let addr = \"0x3306\";  \/\/ Adresse\r\nlet bytes=1;          \/\/ L\u00e4nge byte\r\nvar setTo = \"23\";     \/\/ Soll Wert\r\nlet message= \"write;\" + addr + \";\" + bytes + \";\" + setTo;\r\nmsg.payload = message;\r\nreturn msg;\r\n<\/pre>\n<p>Wie schon in einem Vissmann API Beitrag geschrieben, habe ich das ganze etwas <a href=\"https:\/\/www.rustimation.eu\/index.php\/viessmann-api-und-node-red-teil-4\/#Flow_Betriebssicher_machen\" target=\"_blank\" rel=\"noopener\">betriebsicherer<\/a> gemacht. Der Vollst\u00e4ndigkeit halber hier noch der komplette Flow dazu<\/p>\n<pre class=\"height-set:true height:250 lang:js decode:true\">[\r\n    {\r\n        \"id\": \"4c1996e23928f78f\",\r\n        \"type\": \"tab\",\r\n        \"label\": \"Flow 2\",\r\n        \"disabled\": false,\r\n        \"info\": \"\",\r\n        \"env\": []\r\n    },\r\n    {\r\n        \"id\": \"d7fd93f2be840b73\",\r\n        \"type\": \"mqtt in\",\r\n        \"z\": \"4c1996e23928f78f\",\r\n        \"name\": \"\",\r\n        \"topic\": \"Vitodens\/SollTempTagFBH\",\r\n        \"qos\": \"1\",\r\n        \"datatype\": \"auto-detect\",\r\n        \"broker\": \"c3ec39dc.4614f\",\r\n        \"nl\": false,\r\n        \"rap\": true,\r\n        \"rh\": 0,\r\n        \"inputs\": 0,\r\n        \"x\": 310,\r\n        \"y\": 220,\r\n        \"wires\": [\r\n            [\r\n                \"4ca4c30250a613a0\"\r\n            ]\r\n        ]\r\n    },\r\n    {\r\n        \"id\": \"4ca4c30250a613a0\",\r\n        \"type\": \"ui_slider\",\r\n        \"z\": \"4c1996e23928f78f\",\r\n        \"name\": \"Slider sets temperature\",\r\n        \"label\": \"FBH Tag \u00b0C\",\r\n        \"tooltip\": \"\",\r\n        \"group\": \"f0f24855fdba9035\",\r\n        \"order\": 2,\r\n        \"width\": 5,\r\n        \"height\": 1,\r\n        \"passthru\": false,\r\n        \"outs\": \"end\",\r\n        \"topic\": \"topic\",\r\n        \"topicType\": \"msg\",\r\n        \"min\": \"5\",\r\n        \"max\": \"30\",\r\n        \"step\": 1,\r\n        \"className\": \"\",\r\n        \"x\": 570,\r\n        \"y\": 220,\r\n        \"wires\": [\r\n            [\r\n                \"575d48fd94562405\"\r\n            ]\r\n        ],\r\n        \"icon\": \"node-red-contrib-sensor-ds18b20\/thermometer.png\"\r\n    },\r\n    {\r\n        \"id\": \"575d48fd94562405\",\r\n        \"type\": \"change\",\r\n        \"z\": \"4c1996e23928f78f\",\r\n        \"name\": \"sliFN\",\r\n        \"rules\": [\r\n            {\r\n                \"t\": \"set\",\r\n                \"p\": \"sliFN\",\r\n                \"pt\": \"flow\",\r\n                \"to\": \"payload\",\r\n                \"tot\": \"msg\"\r\n            }\r\n        ],\r\n        \"action\": \"\",\r\n        \"property\": \"\",\r\n        \"from\": \"\",\r\n        \"to\": \"\",\r\n        \"reg\": false,\r\n        \"x\": 770,\r\n        \"y\": 220,\r\n        \"wires\": [\r\n            []\r\n        ]\r\n    },\r\n    {\r\n        \"id\": \"502a6f02d5e9f75d\",\r\n        \"type\": \"ui_button\",\r\n        \"z\": \"4c1996e23928f78f\",\r\n        \"name\": \"OK\",\r\n        \"group\": \"f0f24855fdba9035\",\r\n        \"order\": 3,\r\n        \"width\": 1,\r\n        \"height\": 1,\r\n        \"passthru\": false,\r\n        \"label\": \"\",\r\n        \"tooltip\": \"\",\r\n        \"color\": \"yellow\",\r\n        \"bgcolor\": \"#333333\",\r\n        \"className\": \"\",\r\n        \"icon\": \"fa-2x fa-check-square-o \",\r\n        \"payload\": \"sliFN\",\r\n        \"payloadType\": \"flow\",\r\n        \"topic\": \"topic\",\r\n        \"topicType\": \"msg\",\r\n        \"x\": 250,\r\n        \"y\": 280,\r\n        \"wires\": [\r\n            [\r\n                \"3b440720c331f722\"\r\n            ]\r\n        ]\r\n    },\r\n    {\r\n        \"id\": \"3b440720c331f722\",\r\n        \"type\": \"function\",\r\n        \"z\": \"4c1996e23928f78f\",\r\n        \"name\": \"Solltemp FBH Tag\",\r\n        \"func\": \"let addr = \\\"0x3306\\\";\\nlet bytes=1;\\nvar setTo = flow.get('sliFN');\\nlet message= \\\"write;\\\" + addr + \\\";\\\" + bytes + \\\";\\\" + setTo;\\nmsg.payload = message;\\nreturn msg;\\n\",\r\n        \"outputs\": 1,\r\n        \"timeout\": \"\",\r\n        \"noerr\": 0,\r\n        \"initialize\": \"\",\r\n        \"finalize\": \"\",\r\n        \"libs\": [],\r\n        \"x\": 430,\r\n        \"y\": 280,\r\n        \"wires\": [\r\n            [\r\n                \"48ee9832dc0a347b\"\r\n            ]\r\n        ]\r\n    },\r\n    {\r\n        \"id\": \"48ee9832dc0a347b\",\r\n        \"type\": \"mqtt out\",\r\n        \"z\": \"4c1996e23928f78f\",\r\n        \"name\": \"\",\r\n        \"topic\": \"Vitodens\/cmnd\",\r\n        \"qos\": \"1\",\r\n        \"retain\": \"\",\r\n        \"respTopic\": \"\",\r\n        \"contentType\": \"\",\r\n        \"userProps\": \"\",\r\n        \"correl\": \"\",\r\n        \"expiry\": \"\",\r\n        \"broker\": \"c3ec39dc.4614f\",\r\n        \"x\": 640,\r\n        \"y\": 280,\r\n        \"wires\": []\r\n    },\r\n    {\r\n        \"id\": \"c3ec39dc.4614f\",\r\n        \"type\": \"mqtt-broker\",\r\n        \"name\": \"CentralinaPi\",\r\n        \"broker\": \"192.168.1.25\",\r\n        \"port\": \"1883\",\r\n        \"clientid\": \"\",\r\n        \"autoConnect\": true,\r\n        \"usetls\": false,\r\n        \"compatmode\": false,\r\n        \"protocolVersion\": \"4\",\r\n        \"keepalive\": \"60\",\r\n        \"cleansession\": true,\r\n        \"autoUnsubscribe\": true,\r\n        \"birthTopic\": \"\",\r\n        \"birthQos\": \"0\",\r\n        \"birthPayload\": \"\",\r\n        \"birthMsg\": {},\r\n        \"closeTopic\": \"\",\r\n        \"closeQos\": \"0\",\r\n        \"closePayload\": \"\",\r\n        \"closeMsg\": {},\r\n        \"willTopic\": \"\",\r\n        \"willQos\": \"0\",\r\n        \"willPayload\": \"\",\r\n        \"willMsg\": {},\r\n        \"userProps\": \"\",\r\n        \"sessionExpiry\": \"\"\r\n    },\r\n    {\r\n        \"id\": \"f0f24855fdba9035\",\r\n        \"type\": \"ui_group\",\r\n        \"name\": \"Einstellung FBH Anbau\",\r\n        \"tab\": \"7e5ee24d.2d5ae4\",\r\n        \"order\": 5,\r\n        \"disp\": true,\r\n        \"width\": \"6\",\r\n        \"collapse\": false,\r\n        \"className\": \"\"\r\n    },\r\n    {\r\n        \"id\": \"7e5ee24d.2d5ae4\",\r\n        \"type\": \"ui_tab\",\r\n        \"name\": \"Heizung\/WW\",\r\n        \"icon\": \"dashboard\",\r\n        \"order\": 3,\r\n        \"disabled\": false,\r\n        \"hidden\": false\r\n    }\r\n]<\/pre>\n<h3>Direkte Abfragen<\/h3>\n<p>Wir oben schon erw\u00e4hnt, belastet das unn\u00f6tige Abfragen von Werten, die sich nur einmal am Tag oder gar seltener \u00e4ndern, unseren MQTT Server &#8211; zumindest dann, wenn er noch diverse andere MQTT Publisher Clients bedienen muss.<\/p>\n<p style=\"padding-left: 40px;\"><span style=\"color: #808080;\">Ich habe ca. 10 Shelly Aktoren, 2 Wechselrichter, ein Smartmeter, Ladeger\u00e4t, Batterie\u00fcberwachung, div. WiFi Thermometer die alle flei\u00dfig mit dem MQTT Broker kommunizieren. Da kommt der ganz sch\u00f6n ins Zappeln. Deshalb auch die Beschr\u00e4nkung auf 30 Sekunden Abfrageintervalle beim Optolink-Splitter.<\/span><\/p>\n<p>Es bietet sich daher an, zeitgesteuert direkte Abfragen zu starten ohne, dass diese in der Pollingliste drin stehen. Das geschieht analog der manuellen Testeingabe im MQTT Explorer.<\/p>\n<p>Wollen wir z.B. die Verbrauchwerte der letzten 12+1 Monate wissen, k\u00f6nnen wir das bei 0x90F4 abfragen.<\/p>\n<p>Der Funktionsnode wird wie folgt bef\u00fcllt:<\/p>\n<pre class=\"lang:js decode:true \">let addr = \"0x90F4\";\r\nlet bytes=52;\r\nlet type = \"raw\";\r\n\r\nlet message= \"read;\" + addr + \";\" + bytes + \";\" + type;\r\nmsg.payload = message;\r\nreturn msg;<\/pre>\n<p>Die erzeugte Payload wird an einen MQTT Out Node geschickt, welcher die Abfrage durchf\u00fchrt und den Wert am MQTT Server ablegt. Hier werden wie beim Zugriff \u00fcber den MQTT Client Semikola als Trenner verwendet.<\/p>\n<p><strong>Gelesen<\/strong> wird die Abfrage wieder \u00fcber einen MQTT In Node, diesmal beim Topic <span class=\"lang:default decode:true crayon-inline\">Vitodens\/resp<\/span> Dieses Topic habe ich beim initalen Anpassen der settings_ini.py Datei so definiert. In der Original settings_ini.py Datei hei\u00dft das Topic \"Vito\" <span class=\"lang:default decode:true crayon-inline \">mqtt_topic = \"Vito\"<\/span><\/p>\n<p><span class=\"lang:default decode:true crayon-inline \">1;37108;38000000000000000000000000000000000000003d0000007501000077020000fd000000ae040000900400009400000012000000<\/span><\/p>\n<p>Die Antwort m\u00fcssen wir noch zerlegen, da der Optolink Splitter immer noch das Ergebnis der Abfrage und den Dezimalwert der Adresse mitliefert. Uns interessiert der Wert nach dem zweiten Semikolon:<\/p>\n<pre class=\"lang:js decode:true \">const myArray = msg.payload.split(\";\")\r\nmsg.payload = myArray[2];\r\nreturn msg;<\/pre>\n<p>Das gesamte Konstrukt f\u00fcr direkte Abfragen sieht dann so aus:<\/p>\n<pre class=\"height-set:true height:100 lang:js decode:true\">[\r\n    {\r\n        \"id\": \"4c1996e23928f78f\",\r\n        \"type\": \"tab\",\r\n        \"label\": \"Flow 2\",\r\n        \"disabled\": false,\r\n        \"info\": \"\",\r\n        \"env\": []\r\n    },\r\n    {\r\n        \"id\": \"d7fd93f2be840b73\",\r\n        \"type\": \"mqtt in\",\r\n        \"z\": \"4c1996e23928f78f\",\r\n        \"name\": \"\",\r\n        \"topic\": \"Vitodens\/resp\",\r\n        \"qos\": \"1\",\r\n        \"datatype\": \"utf8\",\r\n        \"broker\": \"c3ec39dc.4614f\",\r\n        \"nl\": false,\r\n        \"rap\": true,\r\n        \"rh\": 0,\r\n        \"inputs\": 0,\r\n        \"x\": 190,\r\n        \"y\": 340,\r\n        \"wires\": [\r\n            [\r\n                \"a7dfadeeb2f3754c\"\r\n            ]\r\n        ]\r\n    },\r\n    {\r\n        \"id\": \"3b440720c331f722\",\r\n        \"type\": \"function\",\r\n        \"z\": \"4c1996e23928f78f\",\r\n        \"name\": \"Einzelwert erzeugen\",\r\n        \"func\": \"let addr = \\\"0x90F4\\\";\\nlet bytes=52;\\nlet type = \\\"raw\\\";\\n\\nlet message= \\\"read;\\\" + addr + \\\";\\\" + bytes + \\\";\\\" + type;\\nmsg.payload = message;\\nreturn msg;\\n\",\r\n        \"outputs\": 1,\r\n        \"timeout\": \"\",\r\n        \"noerr\": 0,\r\n        \"initialize\": \"\",\r\n        \"finalize\": \"\",\r\n        \"libs\": [],\r\n        \"x\": 440,\r\n        \"y\": 280,\r\n        \"wires\": [\r\n            [\r\n                \"48ee9832dc0a347b\"\r\n            ]\r\n        ]\r\n    },\r\n    {\r\n        \"id\": \"48ee9832dc0a347b\",\r\n        \"type\": \"mqtt out\",\r\n        \"z\": \"4c1996e23928f78f\",\r\n        \"name\": \"\",\r\n        \"topic\": \"Vitodens\/cmnd\",\r\n        \"qos\": \"1\",\r\n        \"retain\": \"\",\r\n        \"respTopic\": \"\",\r\n        \"contentType\": \"\",\r\n        \"userProps\": \"\",\r\n        \"correl\": \"\",\r\n        \"expiry\": \"\",\r\n        \"broker\": \"c3ec39dc.4614f\",\r\n        \"x\": 640,\r\n        \"y\": 280,\r\n        \"wires\": []\r\n    },\r\n    {\r\n        \"id\": \"0059ec9495bf299f\",\r\n        \"type\": \"inject\",\r\n        \"z\": \"4c1996e23928f78f\",\r\n        \"name\": \"\",\r\n        \"props\": [\r\n            {\r\n                \"p\": \"payload\"\r\n            },\r\n            {\r\n                \"p\": \"topic\",\r\n                \"vt\": \"str\"\r\n            }\r\n        ],\r\n        \"repeat\": \"\",\r\n        \"crontab\": \"\",\r\n        \"once\": false,\r\n        \"onceDelay\": 0.1,\r\n        \"topic\": \"\",\r\n        \"payload\": \"\",\r\n        \"payloadType\": \"date\",\r\n        \"x\": 200,\r\n        \"y\": 280,\r\n        \"wires\": [\r\n            [\r\n                \"3b440720c331f722\"\r\n            ]\r\n        ]\r\n    },\r\n    {\r\n        \"id\": \"a7dfadeeb2f3754c\",\r\n        \"type\": \"function\",\r\n        \"z\": \"4c1996e23928f78f\",\r\n        \"name\": \"Output filtern\",\r\n        \"func\": \"const myArray = msg.payload.split(\\\";\\\")\\nmsg.payload = myArray[2];\\nreturn msg;\",\r\n        \"outputs\": 1,\r\n        \"timeout\": 0,\r\n        \"noerr\": 0,\r\n        \"initialize\": \"\",\r\n        \"finalize\": \"\",\r\n        \"libs\": [],\r\n        \"x\": 410,\r\n        \"y\": 340,\r\n        \"wires\": [\r\n            [\r\n                \"0892534f190c5d89\"\r\n            ]\r\n        ]\r\n    },\r\n    {\r\n        \"id\": \"0892534f190c5d89\",\r\n        \"type\": \"debug\",\r\n        \"z\": \"4c1996e23928f78f\",\r\n        \"name\": \"debug 206\",\r\n        \"active\": true,\r\n        \"tosidebar\": true,\r\n        \"console\": false,\r\n        \"tostatus\": false,\r\n        \"complete\": \"false\",\r\n        \"statusVal\": \"\",\r\n        \"statusType\": \"auto\",\r\n        \"x\": 630,\r\n        \"y\": 340,\r\n        \"wires\": []\r\n    },\r\n    {\r\n        \"id\": \"c3ec39dc.4614f\",\r\n        \"type\": \"mqtt-broker\",\r\n        \"name\": \"CentralinaPi\",\r\n        \"broker\": \"192.168.1.25\",\r\n        \"port\": \"1883\",\r\n        \"clientid\": \"\",\r\n        \"autoConnect\": true,\r\n        \"usetls\": false,\r\n        \"compatmode\": false,\r\n        \"protocolVersion\": \"4\",\r\n        \"keepalive\": \"60\",\r\n        \"cleansession\": true,\r\n        \"autoUnsubscribe\": true,\r\n        \"birthTopic\": \"\",\r\n        \"birthQos\": \"0\",\r\n        \"birthPayload\": \"\",\r\n        \"birthMsg\": {},\r\n        \"closeTopic\": \"\",\r\n        \"closeQos\": \"0\",\r\n        \"closePayload\": \"\",\r\n        \"closeMsg\": {},\r\n        \"willTopic\": \"\",\r\n        \"willQos\": \"0\",\r\n        \"willPayload\": \"\",\r\n        \"willMsg\": {},\r\n        \"userProps\": \"\",\r\n        \"sessionExpiry\": \"\"\r\n    }\r\n]<\/pre>\n<h3>Mehrere direkte Abfragen<\/h3>\n<p>Hat man mehrere direkte Abfragen gebaut, braucht man nur einen einzigen MQTT-In Node, der alle direkten Abfragen empf\u00e4ngt. Um die Antwort dann richtig zuordnen zu k\u00f6nnen, muss anschlie\u00dfend noch \u00fcber den zweiten Teil der Antwort, die zur\u00fcckgegebene Dezimaladresse (hier 37108) gefiltert werden.<\/p>\n<p>Wer mag, kann in der Response auch eine Hex Adresse anzeigen lassen &#8211; wie in nachfolgendem Beispiel: Dazu den Kommentar in der Zeile <span class=\"lang:default decode:true crayon-inline\">resp_addr_format =<\/span>\u00a0 in settings_ini.py beachten.<\/p>\n<p>Dieses Beispiel erzeugt zwei direkte Abfragen &#8211; Au\u00dfentemperatur und tageweiser Verbrauch &#8211; welche anschlie\u00dfend \u00fcber einen Response Filter zugeordnet werden. Auch hier wieder das MQTT-Topic-Prefix\u00a0 entsprechend der Einstellung in <em>settings_ini.py<\/em> anpassen. Ich verwende \"<em>Vitodens<\/em>\", im Original hei\u00dft es jetzt \"<em>Vito<\/em>\".<\/p>\n<pre class=\"height-set:true height:30 lang:js decode:true\">[ { \"id\": \"bc6d8a5de8a30b47\", \"type\": \"function\", \"z\": \"e97d31eeea2066ef\", \"name\": \"AussenTemp direkt\", \"func\": \"let addr = \\\"0x5525\\\";\\nlet bytes=2;\\nlet type = \\\"0.1\\\";\\nlet sInt = \\\"true\\\" \/\/ must be string!\\n\\nlet message= \\\"read;\\\" + addr + \\\";\\\" + bytes + \\\";\\\" + type +\\\";\\\" + sInt;\\nmsg.payload = message;\\nreturn msg;\", \"outputs\": 1, \"timeout\": 0, \"noerr\": 0, \"initialize\": \"\", \"finalize\": \"\", \"libs\": [], \"x\": 490, \"y\": 1040, \"wires\": [ [ \"8a952b7955f4b3a1\" ] ] }, { \"id\": \"8a952b7955f4b3a1\", \"type\": \"mqtt out\", \"z\": \"e97d31eeea2066ef\", \"name\": \"\", \"topic\": \"Vitodens\/cmnd\", \"qos\": \"1\", \"retain\": \"\", \"respTopic\": \"\", \"contentType\": \"\", \"userProps\": \"\", \"correl\": \"\", \"expiry\": \"\", \"broker\": \"c3ec39dc.4614f\", \"x\": 740, \"y\": 1040, \"wires\": [] }, { \"id\": \"6f518672b8bed8af\", \"type\": \"inject\", \"z\": \"e97d31eeea2066ef\", \"name\": \"\", \"props\": [ { \"p\": \"payload\" }, { \"p\": \"topic\", \"vt\": \"str\" } ], \"repeat\": \"\", \"crontab\": \"\", \"once\": false, \"onceDelay\": 0.1, \"topic\": \"\", \"payload\": \"\", \"payloadType\": \"date\", \"x\": 260, \"y\": 1040, \"wires\": [ [ \"bc6d8a5de8a30b47\" ] ] }, { \"id\": \"8ed7e26a45d70242\", \"type\": \"mqtt in\", \"z\": \"e97d31eeea2066ef\", \"name\": \"\", \"topic\": \"Vitodens\/resp\", \"qos\": \"1\", \"datatype\": \"auto-detect\", \"broker\": \"c3ec39dc.4614f\", \"nl\": false, \"rap\": true, \"rh\": 0, \"inputs\": 0, \"x\": 250, \"y\": 1180, \"wires\": [ [ \"c14e88e582990e27\", \"630376fa15821840\" ] ] }, { \"id\": \"c14e88e582990e27\", \"type\": \"debug\", \"z\": \"e97d31eeea2066ef\", \"name\": \"debug 211\", \"active\": true, \"tosidebar\": true, \"console\": false, \"tostatus\": false, \"complete\": \"false\", \"statusVal\": \"\", \"statusType\": \"auto\", \"x\": 430, \"y\": 1240, \"wires\": [] }, { \"id\": \"1a4deac5bc09126b\", \"type\": \"function\", \"z\": \"e97d31eeea2066ef\", \"name\": \"Verbrauch direkt raw\", \"func\": \"let addr = \\\"0x9000\\\";\\nlet bytes=32;\\nlet type = \\\"raw\\\";\\nlet sInt = 1 \\n\\nlet message= \\\"read;\\\" + addr + \\\";\\\" + bytes + \\\";\\\" + type +\\\";\\\" + sInt;\\nmsg.payload = message;\\nreturn msg;\", \"outputs\": 1, \"timeout\": 0, \"noerr\": 0, \"initialize\": \"\", \"finalize\": \"\", \"libs\": [], \"x\": 500, \"y\": 1100, \"wires\": [ [ \"a9ee097b0378dff8\" ] ] }, { \"id\": \"a9ee097b0378dff8\", \"type\": \"mqtt out\", \"z\": \"e97d31eeea2066ef\", \"name\": \"\", \"topic\": \"Vitodens\/cmnd\", \"qos\": \"1\", \"retain\": \"\", \"respTopic\": \"\", \"contentType\": \"\", \"userProps\": \"\", \"correl\": \"\", \"expiry\": \"\", \"broker\": \"c3ec39dc.4614f\", \"x\": 740, \"y\": 1100, \"wires\": [] }, { \"id\": \"265e0718be4cf0b0\", \"type\": \"inject\", \"z\": \"e97d31eeea2066ef\", \"name\": \"\", \"props\": [ { \"p\": \"payload\" }, { \"p\": \"topic\", \"vt\": \"str\" } ], \"repeat\": \"\", \"crontab\": \"\", \"once\": false, \"onceDelay\": 0.1, \"topic\": \"\", \"payload\": \"\", \"payloadType\": \"date\", \"x\": 260, \"y\": 1100, \"wires\": [ [ \"1a4deac5bc09126b\" ] ] }, { \"id\": \"3abe9cdefd8d2b8c\", \"type\": \"function\", \"z\": \"e97d31eeea2066ef\", \"name\": \"hexStringToDecimal\", \"func\": \"\/\/let hexString = \\\"00000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\\"\\nlet hexString = msg.payload[2];\\n\/\/let len = 0\\n\\n \/\/ Entfernt Leerzeichen und konvertiert in Kleinbuchstaben\\n hexString = hexString.replace(\/\\\\s+\/g, '').toLowerCase();\\n \/\/ \u00dcberpr\u00fcft, ob die L\u00e4nge der Hexadezimalzeichenkette ein Vielfaches von 8 ist (4 Bytes = 8 Hex-Zeichen)\\n \/\/len = hexString.length % 8;\\n if (hexString.length % 8 !== 0) {\\n throw new Error(\\\"Hexadezimalzeichenkette muss ein Vielfaches von 8 Zeichen sein.\\\");\\n }\\n\\n const decimalValues = [];\\n\\n \/\/ Zerlegt die Hexadezimalzeichenkette in 8-stellige St\u00fccke (4 Byte)\\n for (let i = 0; i &lt; hexString.length; i += 8) {\\n let hexChunk = hexString.slice(i, i + 8);\\n \\n \/\/ Zerlegt das 4-Byte-Hexadezimalst\u00fcck in Paare von 2 Hex-Zeichen (1 Byte) und dreht es um\\n let littleEndianChunk = hexChunk.match(\/..\/g).reverse().join('');\\n \\n \/\/ Konvertiert in einen Dezimalwert\\n let decimalValue = parseInt(littleEndianChunk, 16);\\n decimalValues.push(decimalValue);\\n }\\nmsg.payload = decimalValues;\\n\/\/msg.payload = len\\n return msg;\\n\", \"outputs\": 1, \"timeout\": 0, \"noerr\": 0, \"initialize\": \"\", \"finalize\": \"\", \"libs\": [], \"x\": 800, \"y\": 1200, \"wires\": [ [ \"0ab30195e3db7c98\" ] ] }, { \"id\": \"0ab30195e3db7c98\", \"type\": \"debug\", \"z\": \"e97d31eeea2066ef\", \"name\": \"debug 212\", \"active\": true, \"tosidebar\": true, \"console\": false, \"tostatus\": false, \"complete\": \"false\", \"statusVal\": \"\", \"statusType\": \"auto\", \"x\": 1010, \"y\": 1200, \"wires\": [] }, { \"id\": \"f3ca7cea508856fc\", \"type\": \"switch\", \"z\": \"e97d31eeea2066ef\", \"name\": \"Filter\", \"property\": \"payload[1]\", \"propertyType\": \"msg\", \"rules\": [ { \"t\": \"eq\", \"v\": \"0x5525\", \"vt\": \"str\" }, { \"t\": \"eq\", \"v\": \"0x9000\", \"vt\": \"str\" } ], \"checkall\": \"true\", \"repair\": false, \"outputs\": 2, \"x\": 590, \"y\": 1180, \"wires\": [ [ \"1c02585db34ca808\" ], [ \"3abe9cdefd8d2b8c\" ] ] }, { \"id\": \"630376fa15821840\", \"type\": \"function\", \"z\": \"e97d31eeea2066ef\", \"name\": \"make array\", \"func\": \"let myarray = msg.payload.split(\\\";\\\");\\nmsg.payload = myarray;\\nreturn msg;\", \"outputs\": 1, \"timeout\": 0, \"noerr\": 0, \"initialize\": \"\", \"finalize\": \"\", \"libs\": [], \"x\": 430, \"y\": 1180, \"wires\": [ [ \"f3ca7cea508856fc\" ] ] }, { \"id\": \"1c02585db34ca808\", \"type\": \"debug\", \"z\": \"e97d31eeea2066ef\", \"name\": \"Aussentemp\", \"active\": true, \"tosidebar\": true, \"console\": false, \"tostatus\": false, \"complete\": \"payload[2]\", \"targetType\": \"msg\", \"statusVal\": \"\", \"statusType\": \"auto\", \"x\": 770, \"y\": 1160, \"wires\": [] }, { \"id\": \"c3ec39dc.4614f\", \"type\": \"mqtt-broker\", \"name\": \"CentralinaPi\", \"broker\": \"192.168.1.25\", \"port\": \"1883\", \"clientid\": \"\", \"autoConnect\": true, \"usetls\": false, \"compatmode\": false, \"protocolVersion\": \"4\", \"keepalive\": \"60\", \"cleansession\": true, \"autoUnsubscribe\": true, \"birthTopic\": \"\", \"birthQos\": \"0\", \"birthPayload\": \"\", \"birthMsg\": {}, \"closeTopic\": \"\", \"closeQos\": \"0\", \"closePayload\": \"\", \"closeMsg\": {}, \"willTopic\": \"\", \"willQos\": \"0\", \"willPayload\": \"\", \"willMsg\": {}, \"userProps\": \"\", \"sessionExpiry\": \"\" } ]<\/pre>\n<h2>Zu guter Letzt<\/h2>\n<p>Fragen zum Umsetzung in Node Red k\u00f6nnt ihr gerne an mich richten. In Bezug auf Gasger\u00e4te kann ich etwas weiterhelfen,\u00a0 bei W\u00e4rmepumpen und anderen neueren Technologien bitte ich euch, die <a href=\"https:\/\/github.com\/philippoo66\/optolink-splitter\/discussions\" target=\"_blank\" rel=\"noopener\">Diskussionsfunktion bei Github<\/a> zu nutzen.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Jetzt beginnt der sch\u00f6nere Teil. Hat man einmal die wesentlichen Datenpunkte gefunden kann man diese ganz einfach \u00fcber einen MQTT In Node in Node-Red verarbeiten. Node-Red Bevor ihr allerdings eure komplette API Kopplung l\u00f6scht, empfehle ich, erst einmal ein Backup zu machen.<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[137,151,198],"tags":[99,126,194,174],"class_list":["post-3024","post","type-post","status-publish","format-standard","hentry","category-mqtt","category-node-red","category-viessmann-ohne-api","tag-mqtt","tag-node-red","tag-optolink-splitter","tag-viessmann-api"],"_links":{"self":[{"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/posts\/3024","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=3024"}],"version-history":[{"count":1,"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/posts\/3024\/revisions"}],"predecessor-version":[{"id":3807,"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/posts\/3024\/revisions\/3807"}],"wp:attachment":[{"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/media?parent=3024"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/categories?post=3024"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/tags?post=3024"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}