{"id":798,"date":"2020-08-12T15:49:27","date_gmt":"2020-08-12T13:49:27","guid":{"rendered":"http:\/\/valentijn.sessink.nl\/?p=798"},"modified":"2021-12-12T23:15:47","modified_gmt":"2021-12-12T21:15:47","slug":"remeha-i2c-mcba-en-het-protocol-deel-1","status":"publish","type":"post","link":"https:\/\/valentijn.sessink.nl\/?p=798","title":{"rendered":"Remeha, I2C, MCBA en het protocol (deel 1)"},"content":{"rendered":"\n<p>Hoewel de MCBA-ketelbesturing al weer wat ouder is, wilde ik toch weten wat er op de bus gebeurt. Met behulp van het programma Recom, een &#8220;GMI1414&#8221; interface en wat geduld vond ik het uit.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p>De eerste stappen in de juiste richting vond u al op de postings <a href=\"https:\/\/valentijn.sessink.nl\/?p=776\">doe-het-zelf: Remeha-ketel en Arduino <\/a>en <a href=\"https:\/\/valentijn.sessink.nl\/?p=791\">I\u00b2C en een Remeha-ketel<\/a>. Nu bestelde ik de &#8220;Remeha INTERFACE (RECOM-MCBA GMI1414)&#8221; en ondertussen kwam ik wat te weten over deze ketelsturing.<\/p>\n\n\n\n<p>Het is namelijk <a href=\"https:\/\/www.circuitsonline.net\/forum\/view\/113864\/10\">Philips<\/a>. In elk geval doorverkocht door Gasmodul, Honeywell en Bosch. De interface bevat &#8211; zoals <a href=\"https:\/\/www.domoticaforum.eu\/viewtopic.php?f=17&amp;t=5595&amp;sid=1b9b7d3d4b280d8f31bee0f214b216b5&amp;start=30\">hier<\/a> ook al werd opgemerkt &#8211; een MAX202 TTL-naar-RS232-transceiver en een LPC764 microcontroller.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"576\" src=\"https:\/\/valentijn.sessink.nl\/wp-content\/uploads\/2020\/08\/gmi1414.jpg\" alt=\"\" class=\"wp-image-802\" srcset=\"https:\/\/valentijn.sessink.nl\/wp-content\/uploads\/2020\/08\/gmi1414.jpg 800w, https:\/\/valentijn.sessink.nl\/wp-content\/uploads\/2020\/08\/gmi1414-300x216.jpg 300w, https:\/\/valentijn.sessink.nl\/wp-content\/uploads\/2020\/08\/gmi1414-768x553.jpg 768w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><figcaption>GMI1414 met linksonder de MAX202 en rechts de LPC764<\/figcaption><\/figure>\n\n\n\n<p>Op basis van de datasheet van beide chips is eenvoudig terug te vinden welke pinnen je moet uitlezen om zowel het seri\u00eble signaal als het I\u00b2C-signaal van de ketel te bekijken:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"511\" height=\"458\" src=\"https:\/\/valentijn.sessink.nl\/wp-content\/uploads\/2020\/08\/uitlezen.jpg\" alt=\"\" class=\"wp-image-803\" srcset=\"https:\/\/valentijn.sessink.nl\/wp-content\/uploads\/2020\/08\/uitlezen.jpg 511w, https:\/\/valentijn.sessink.nl\/wp-content\/uploads\/2020\/08\/uitlezen-300x269.jpg 300w\" sizes=\"auto, (max-width: 511px) 100vw, 511px\" \/><figcaption>De ketelinterface met aan de onderkant extra pinnetjes<\/figcaption><\/figure>\n\n\n\n<p>Aansluiten op een logic analyzer &#8211; en daar gaan we. De communicatie met dit type &#8211; oudere &#8211; ketels verloopt via 4800 baud en verder geheel standaard. Ik heb me niet bekommerd om DSR\/DTR en RTS\/CTS &#8211; volgens mij doet niemand dat.<\/p>\n\n\n\n<p>Initieel zendt Recom seri\u00ebel de volgende serie (alle getallen in hex):<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><span class=\"has-inline-color has-vivid-red-color\">07 42<\/span> <span class=\"has-inline-color has-vivid-cyan-blue-color\">A0 <\/span><span class=\"has-inline-color has-vivid-purple-color\">00<\/span> <span class=\"has-inline-color has-luminous-vivid-orange-color\">05<\/span> 40 <span class=\"has-inline-color has-vivid-red-color\">D2<\/span><\/pre>\n\n\n\n<p>De <span class=\"has-inline-color has-vivid-red-color\">eerste twee bytes<\/span> en de <span class=\"has-inline-color has-vivid-red-color\">laatste byte<\/span> zijn opdrachten voor de GMI1414: de eerste byte is de lengte van het bericht; dan volgt de opdracht (42 is &#8220;lees als master&#8221;, in latere communicatie vind ik nog de opdrachten 43, dat lijkt &#8220;schrijf als master&#8221; en 40, lijkt te zijn &#8220;lees als slave&#8221;). De laatste byte is de 2-complement-checksum van het gehele bericht &#8211; je telt alle bytes op, modulo 256 en met de checksum erbij kom je dan weer op nul uit.<\/p>\n\n\n\n<p>De A0, 00 en 05 zijn I\u00b2C-bus-opdrachten. A0 is het te lezen <em>address<\/em> &#8211; de verwarring 7-bit versus 8-bit I\u00b2C-adressering laat ik even voor wat het is, gewoon verwarring dus, zoek zelf maar even na dat A0 \/ 2 = 0x50 en omdat de LSB in I\u00b2C-land de lees\/schrijfbit is, kun je het te gebruiken adres zowel schrijven als A0 (dan is in principe A0 lezen en A1 is schrijven, maar dat noteert niemand zo), of als 0x50R \/ 0x50W. De 00 is het <em>register<\/em> op dit adres, want zo werkt dat: je schrijft 00 naar de slave met adres 0x50 en daarna lees je de waarde(n) van dit register terug.<\/p>\n\n\n\n<p>Op de I\u00b2C-bus stuurt de GMI1414 vervolgens als busmaster inderdaad de volgende serie:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><span class=\"has-inline-color has-vivid-cyan-blue-color\">50<\/span>W<span class=\"has-inline-color has-vivid-purple-color\">00<\/span> <span class=\"has-inline-color has-vivid-cyan-blue-color\">50<\/span>R<\/pre>\n\n\n\n<p>De ketel antwoordt met precies 5 bytes (kijk, dat is de <span class=\"has-inline-color has-luminous-vivid-orange-color\">05<\/span> uit onze opdracht):<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">AA 02 24 01 00<\/pre>\n\n\n\n<p>&#8230; waarna de interface via 4800 baud terugmeldt:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><span class=\"has-inline-color has-vivid-red-color\">08 00<\/span> AA 02 24 01 00 <span class=\"has-inline-color has-vivid-red-color\">27<\/span><\/pre>\n\n\n\n<p>Ook hier weer: 08 bytes lengte; 00 is zoiets als &#8220;geen opdracht&#8221; of &#8220;niks&#8221;; AA 02 24 01 00 is de door de ketel verstrekte data en 27 de 2-complement-checksum.<\/p>\n\n\n\n<p>Het uitlezen van de ketelconfiguratie doet Recom door op dezelfde manier steeds 8 bytes te lezen van de slave op 0x50 (of 0xA0) uit registers (hex) 40, 48, 50, 58, 60, 68, 70, en 78. Dus:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">Recom: 07 42 <span class=\"has-inline-color has-vivid-cyan-blue-color\">A0<\/span> <span class=\"has-inline-color has-vivid-green-cyan-color\">40<\/span> 08 40 8F (seri\u00ebel)\nI2C: <span class=\"has-inline-color has-vivid-cyan-blue-color\">50<\/span>W<span class=\"has-inline-color has-vivid-green-cyan-color\">40<\/span>, <span class=\"has-inline-color has-vivid-cyan-blue-color\">50<\/span>R - de ketel zegt \"<span class=\"has-inline-color has-vivid-purple-color\">37 0D 3C 59 6E 2F 00 0F<\/span>\"\n... wat seri\u00ebel <span class=\"has-inline-color has-vivid-red-color\">0B 00<\/span> <span class=\"has-inline-color has-vivid-purple-color\">37 0D 3C 59 6E 2F 00 0F<\/span> <span class=\"has-inline-color has-vivid-red-color\">70<\/span> wordt\nRecom: 07 42 <span class=\"has-inline-color has-vivid-cyan-blue-color\">A0<\/span> <span class=\"has-inline-color has-vivid-green-cyan-color\">48<\/span> 08 40 87 (seri\u00ebel)\nI2C: <span class=\"has-inline-color has-vivid-cyan-blue-color\">50<\/span>W<span class=\"has-inline-color has-vivid-green-cyan-color\">48<\/span>, <span class=\"has-inline-color has-vivid-cyan-blue-color\">50<\/span>R - enzovoorts.<\/pre>\n\n\n\n<p>Met behulp van de xml-files in de configuratiedirectory van Recom kunnen we achterhalen wat de verschillende bytes betekenen, maar daar is nog wel een hobbel te nemen. De bestanden staan namelijk vol kruisverwijzingen. Quinta_P1.xml bevat bijvoorbeeld teksten als <em>name.nr=&#8221;1050&#8243; description.nr=&#8221;923&#8243; unit.nr=&#8221;312&#8243;<\/em>, die je op basis van de file language-nl.xml moet omzetten: <em>text id=&#8221;1050&#8243; value=&#8221;Start modul. dT&#8221;<\/em>, <em>text id=&#8221;923&#8243; value=&#8221;Als de dT boven deze waarde komt, terugmoduleren&#8221;<\/em> en 312 staat gewoon voor gewoon &#8220;\u00b0C&#8221;.<\/p>\n\n\n\n<p>Om dat allemaal te fixen, schreef ik een Python-programma, dat alle result.nr, name.nr en unit.nr omzet in de gegevens uit language-nl.xml. (N.B. zelf word ik altijd vrolijk van recursieve functies, dat is m.i. ook de beste methode om een XML-bestand te bewerken &#8211; waarbij aangetekend dat &#8220;language-nl.xml&#8221; zodanig plat is opgezet dat ik het daar maar even oversloeg). (Terzijde: ik vind Python prachtig om even gauw iets in te programmeren, maar het gegeven dat je halverwege je code gewoon een functie kunt defini\u00ebren vind ik vunzig. Maar ja, code opschonen voor een losse blogpost is me dan ook weer wat veel van het goede).<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">#!\/usr\/bin\/python3\nfrom xml.dom import minidom\nfrom xml.dom import Node\nxml=minidom.parse(\"\/home\/<em>username<\/em>\/config\/language-nl.xml\")\ntextlijst={}\nfor n in xml.childNodes[0].childNodes:\n  if(n.localName == 'text'):\n    textlijst[n.attributes.item(0).value]=n.attributes.item(1).value\nxml.unlink()\nxml=minidom.parse(\"\/home\/<em>username<\/em>\/config\/Quinta_P1.xml\")\ndef replaceresultnr(node):\n  if ( (node.nodeType == Node.ELEMENT_NODE) and (node.hasAttributes())):\n    for attrnum in range(node.attributes.length):\n      if (node.attributes.item(attrnum).name in [\"result.nr\", \"name.nr\", \"unit.nr\", \"description.nr\"] ):\n        node.attributes.item(attrnum).value = textlijst[node.attributes.item(attrnum).value]\n  for subnode in node.childNodes:\n    replaceresultnr(subnode)\n\nreplaceresultnr(xml.documentElement)\nprint(xml.toxml())<\/pre>\n\n\n\n<p>(to be continued)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hoewel de MCBA-ketelbesturing al weer wat ouder is, wilde ik toch weten wat er op de bus gebeurt. Met behulp van het programma Recom, een &#8220;GMI1414&#8221; interface en wat geduld vond ik het uit.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[148,3],"tags":[],"class_list":["post-798","post","type-post","status-publish","format-standard","hentry","category-energie","category-happy-hacking"],"_links":{"self":[{"href":"https:\/\/valentijn.sessink.nl\/index.php?rest_route=\/wp\/v2\/posts\/798","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/valentijn.sessink.nl\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/valentijn.sessink.nl\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/valentijn.sessink.nl\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/valentijn.sessink.nl\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=798"}],"version-history":[{"count":8,"href":"https:\/\/valentijn.sessink.nl\/index.php?rest_route=\/wp\/v2\/posts\/798\/revisions"}],"predecessor-version":[{"id":810,"href":"https:\/\/valentijn.sessink.nl\/index.php?rest_route=\/wp\/v2\/posts\/798\/revisions\/810"}],"wp:attachment":[{"href":"https:\/\/valentijn.sessink.nl\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=798"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/valentijn.sessink.nl\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=798"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/valentijn.sessink.nl\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=798"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}