{"id":2349,"date":"2023-03-27T09:00:12","date_gmt":"2023-03-27T07:00:12","guid":{"rendered":"https:\/\/www.rustimation.eu\/?p=2349"},"modified":"2025-03-03T09:34:28","modified_gmt":"2025-03-03T08:34:28","slug":"viessmann-api-und-node-red-teil-8","status":"publish","type":"post","link":"https:\/\/www.rustimation.eu\/index.php\/viessmann-api-und-node-red-teil-8\/","title":{"rendered":"Viessmann API und Node-Red \u2013 Teil 8 &#8211; Sonstiges Tipps"},"content":{"rendered":"<h1>Sonstige Tipps &amp; Ticks<\/h1>\n<p>Im Laufe der Zeit baut man immer wieder kleine Verbesserungen in die Flows ein, um Performance, Transparenz oder Betriebssicherheit zu steigern. In loser Folge sind hier meine Erkenntnisse dazu zu finden.<\/p>\n<p><!--more--><\/p>\n<h2>Kommunikationsfehler abfangen<\/h2>\n<p>Leider sind die Viessmann Server alles andere als zuverl\u00e4ssig. So kommt es immer wieder zu Timeouts, fehlgeschlagenen Authentifizierungen oder Komplettausf\u00e4llen. Okay, als User des kostenfreien Basisangebots will ich mich nicht all zu laut beschweren.<\/p>\n<p>Kommunikationsfehler k\u00f6nnte man durch jeweils einen <em>debug<\/em> Node hinter einem <em>http request<\/em> Node anzeigen lassen. Angezeigt werden sollte dabei das \"komplettte Nachrichtenobjekt\". Das ist zum Testen ganz okay, aber auch fl\u00fcchtig.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2350 size-full\" src=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2023\/03\/2023-03-27-08_19_58-Node-RED-_-192.168.178.24-\u2013-Mozilla-Firefox.png\" alt=\"\" width=\"626\" height=\"453\" srcset=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2023\/03\/2023-03-27-08_19_58-Node-RED-_-192.168.178.24-\u2013-Mozilla-Firefox.png 626w, https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2023\/03\/2023-03-27-08_19_58-Node-RED-_-192.168.178.24-\u2013-Mozilla-Firefox-300x217.png 300w\" sizes=\"auto, (max-width: 626px) 100vw, 626px\" \/><\/p>\n<p>Um solche Fehler in ein <strong>Log<\/strong> zu schreiben, brauchst du einen <em>switch<\/em> node, der z.B. bei leerem Refresh Token zu einem <em>write file<\/em> Node verzweigt und die Payload dort hineinschreibt. Den <em>write file<\/em> Node muss man eventuell \u00fcber die Palettenverwaltung nachinstallieren. Das funktioniert ganz gut, ist aber umst\u00e4ndlich, da ich den Switch hinter jedem <em>http request<\/em> Node einbauen muss und dann unter Umst\u00e4nden viele Spaghettis zu dem <em>write file<\/em> Node ziehen muss. Bei Autentifizierungsfehlern ist das aber die beste M\u00f6glichkeit der Fehlerbehandlung (siehe unten).<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-2351\" src=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2023\/03\/2023-03-27-08_22_26-Node-RED-_-192.168.178.24-\u2013-Mozilla-Firefox.png\" alt=\"\" width=\"683\" height=\"609\" srcset=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2023\/03\/2023-03-27-08_22_26-Node-RED-_-192.168.178.24-\u2013-Mozilla-Firefox.png 683w, https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2023\/03\/2023-03-27-08_22_26-Node-RED-_-192.168.178.24-\u2013-Mozilla-Firefox-300x267.png 300w\" sizes=\"auto, (max-width: 683px) 100vw, 683px\" \/><\/p>\n<p>Eine sch\u00f6ne M\u00f6glichkeit bietet der <em>catch<\/em> Node: Der c<em>atch<\/em> Node ist eine Art M\u00fclleimer f\u00fcr alle Arten von Fehlern. Ich stelle ihn so ein, dass er alle gew\u00fcnschten Nodes, in diesem Fall alle <em>http request<\/em> Nodes \u00fcberwacht, das Ergebnis anschlie\u00dfend angereichert und mit dem <em>write file<\/em> Node in ein Log (Textdatei) geschrieben wird.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-2353\" src=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2023\/03\/2023-03-27-08_33_36-Node-RED-_-192.168.178.24-\u2013-Mozilla-Firefox.png\" alt=\"\" width=\"640\" height=\"1133\" srcset=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2023\/03\/2023-03-27-08_33_36-Node-RED-_-192.168.178.24-\u2013-Mozilla-Firefox.png 640w, https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2023\/03\/2023-03-27-08_33_36-Node-RED-_-192.168.178.24-\u2013-Mozilla-Firefox-169x300.png 169w, https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2023\/03\/2023-03-27-08_33_36-Node-RED-_-192.168.178.24-\u2013-Mozilla-Firefox-578x1024.png 578w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/p>\n<p>Der Flow sieht so aus:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-2352\" src=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2023\/03\/2023-03-27-08_33_01-Node-RED-_-192.168.178.24-\u2013-Mozilla-Firefox.png\" alt=\"\" width=\"878\" height=\"74\" srcset=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2023\/03\/2023-03-27-08_33_01-Node-RED-_-192.168.178.24-\u2013-Mozilla-Firefox.png 878w, https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2023\/03\/2023-03-27-08_33_01-Node-RED-_-192.168.178.24-\u2013-Mozilla-Firefox-300x25.png 300w, https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2023\/03\/2023-03-27-08_33_01-Node-RED-_-192.168.178.24-\u2013-Mozilla-Firefox-768x65.png 768w\" sizes=\"auto, (max-width: 878px) 100vw, 878px\" \/><\/p>\n<p>Die Nodes <em>simpletime<\/em> (\u00fcber Palettenverwaltung nachinstallieren) und <em>create error msg function<\/em> Node erzeugen einen aussagekr\u00e4ftigen Eintrag im Log. Siehe JSON<\/p>\n<pre class=\"height:15 lang:default decode:true \">[{\"id\":\"9bcfca998ffaad65\",\"type\":\"file\",\"z\":\"31c57f8640528976\",\"name\":\"\",\"filename\":\"\/home\/pi\/refresh_error.log\",\"filenameType\":\"str\",\"appendNewline\":true,\"createDir\":false,\"overwriteFile\":\"false\",\"encoding\":\"none\",\"x\":2390,\"y\":820,\"wires\":[[]]},{\"id\":\"b53c3d8b942ddacd\",\"type\":\"catch\",\"z\":\"31c57f8640528976\",\"name\":\"\",\"scope\":[\"eb4771b87fc1270f\",\"d6e3257c9c2d54ad\",\"c765f5d53247981e\",\"3d828c3c867062b0\",\"d189c65f2d221d39\",\"f52e123cdd02a6bc\",\"934155ca818ec102\",\"70ab63bf7d6ee874\",\"71289c1dc9738a4c\"],\"uncaught\":false,\"x\":1870,\"y\":820,\"wires\":[[\"bc0237c216acaaf6\"]]},{\"id\":\"a600cbb060c0019d\",\"type\":\"function\",\"z\":\"31c57f8640528976\",\"name\":\"create error msg\",\"func\":\"msg.payload = msg.myrawdate + \\\" \\\" + msg.error.message + \\\" \\\" + msg.error.source.name \\nreturn msg;\",\"outputs\":1,\"noerr\":0,\"initialize\":\"\",\"finalize\":\"\",\"libs\":[],\"x\":2180,\"y\":820,\"wires\":[[\"9bcfca998ffaad65\"]]},{\"id\":\"bc0237c216acaaf6\",\"type\":\"simpletime\",\"z\":\"31c57f8640528976\",\"name\":\"\",\"mydate\":false,\"myymd\":false,\"myyear\":false,\"mymonth\":false,\"mymonthn\":false,\"mydom\":false,\"mydoy\":false,\"myday\":false,\"myhourpm\":false,\"myhour\":false,\"mytime\":false,\"mytimes\":false,\"myminute\":false,\"myminutes\":false,\"mysecond\":false,\"mymillis\":false,\"myepoch\":false,\"myrawdate\":true,\"mypm\":false,\"x\":2010,\"y\":820,\"wires\":[[\"a600cbb060c0019d\"]]}]<\/pre>\n<p>Wichtig ist ferner, den oder die http Request Nodes so einzustellen, dass sie mit \"Only send non-2xx responses to Catch node\" alle Kommunikationsfehler an den catch Node weiterleiten:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-2354\" src=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2023\/03\/2023-03-27-08_43_30-Node-RED-_-192.168.178.24-\u2013-Mozilla-Firefox.png\" alt=\"\" width=\"638\" height=\"721\" srcset=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2023\/03\/2023-03-27-08_43_30-Node-RED-_-192.168.178.24-\u2013-Mozilla-Firefox.png 638w, https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2023\/03\/2023-03-27-08_43_30-Node-RED-_-192.168.178.24-\u2013-Mozilla-Firefox-265x300.png 265w\" sizes=\"auto, (max-width: 638px) 100vw, 638px\" \/><\/p>\n<p>In der Console eures Rechners (bei mir ein Raspberry Pi) sieht das so aus:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-2355\" src=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2023\/03\/2023-03-27-08_46_38-pi@CentralinaPi_-.png\" alt=\"\" width=\"1404\" height=\"514\" srcset=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2023\/03\/2023-03-27-08_46_38-pi@CentralinaPi_-.png 1404w, https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2023\/03\/2023-03-27-08_46_38-pi@CentralinaPi_--300x110.png 300w, https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2023\/03\/2023-03-27-08_46_38-pi@CentralinaPi_--1024x375.png 1024w, https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2023\/03\/2023-03-27-08_46_38-pi@CentralinaPi_--768x281.png 768w\" sizes=\"auto, (max-width: 1404px) 100vw, 1404px\" \/><\/p>\n<p>Bei mir immer wieder \"Keine Antwort vom Server\" oder etwas kryptischer \"getaddrinfo EAI_AGAIN api.viessmann.com\" was aber auch ein Fehler auf der Viessmann Seite sein d\u00fcrfte. So habt ihr zumindest etwas in der Hand um bei den Friendly Moderators bei Viessmann nachzufragen.<\/p>\n<p>\u00dcbrigens: das von mir im Viessmann Forum bem\u00e4ngelte Problem <a href=\"https:\/\/www.viessmann-community.com\/t5\/The-Viessmann-API\/Access-Token-erneuern-schlaegt-alle-paar-Stunden-fehl\/td-p\/321602\" target=\"_blank\" rel=\"noopener\">The-Viessmann-API\/Access-Token-erneuern-schlaegt-alle-paar-Stunden-fehl<\/a>, tritt nicht mehr auf. Ob das mit der Umstellung auf die\u00a0 Catch Node Fehlerbeandling zur\u00fcckzuf\u00fchren ist, wei\u00df ich allerdings nicht.<\/p>\n<p><span style=\"color: #ff0000;\"><strong>Wichtig<\/strong><\/span>: Leider f\u00e4ngt der Catch Node Fehler der Art \"INVALID TOKEN\" oder \"TOKEN EXPIRED\" nicht ab.<\/p>\n<p>Hier muss explizit \u00fcber die Abfrage der R\u00fcckgabewerte <em>msg.payload.message, msg.payload.errorType<\/em>, <em>msg.payload.error<\/em> oder <em>msg.payload.statusCode<\/em> gearbeitet werden. Diese Werte sind <em>null<\/em>, wenn alles okay ist.<\/p>\n<p>Der direkt hinter einem <em>http request<\/em> einzubauende <em>switch<\/em> Node sieht dann so aus:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-2362\" src=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2023\/03\/2023-03-27-10_33_11-Node-RED-_-192.168.178.24-\u2013-Mozilla-Firefox.png\" alt=\"\" width=\"631\" height=\"434\" srcset=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2023\/03\/2023-03-27-10_33_11-Node-RED-_-192.168.178.24-\u2013-Mozilla-Firefox.png 631w, https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2023\/03\/2023-03-27-10_33_11-Node-RED-_-192.168.178.24-\u2013-Mozilla-Firefox-300x206.png 300w\" sizes=\"auto, (max-width: 631px) 100vw, 631px\" \/><\/p>\n<p>Ausgang 1 wird benutzt wenn die Abfrage ordnungsgem\u00e4\u00df durchgelaufen ist, Ausgang 2 sobald in msg.payload.message (oder msg.payload.error etc.) etwas drin steht also ein Fehler aufgetreten ist.<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Sonstige Tipps &amp; Ticks Im Laufe der Zeit baut man immer wieder kleine Verbesserungen in die Flows ein, um Performance, Transparenz oder Betriebssicherheit zu steigern. In loser Folge sind hier meine Erkenntnisse dazu zu finden.<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[151,69,159],"tags":[184,174],"class_list":["post-2349","post","type-post","status-publish","format-standard","hentry","category-node-red","category-tips-tricks","category-viessmann-api","tag-fehlerbehandlung","tag-viessmann-api"],"_links":{"self":[{"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/posts\/2349","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=2349"}],"version-history":[{"count":1,"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/posts\/2349\/revisions"}],"predecessor-version":[{"id":3362,"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/posts\/2349\/revisions\/3362"}],"wp:attachment":[{"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/media?parent=2349"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/categories?post=2349"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/tags?post=2349"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}