Opentherm to RS232 converter ============================ // Web page meta data. :keywords: Opentherm RS232 AVR ATTINY :description: Opentherm to RS232 converter, allow send/receive + data frame to opentherm boilers. Copyright (C) 2014,2016 Peter Popovec Transparent mode ---------------- Allow send frame as defined in chapter 4.2 Opentherm(TM) Protocol Specification v.2.2 (http://www.domoticaforum.eu/uploaded/Ard%20M/Opentherm%20Protocol%20v2-2.pdf) In this mode only parity bit is calculated automatically, all other bits are transparently mapped to Opentherm frame. Line format: ~~~~~~~~~~~~ Line must end with CR (0x0d) or LF (0x0a) or CRLF (0x0d 0x0a). There is waiting time for about 3 chars after CR to test if LF is received. Response from device uses same line ends as found in received lines. .... < MSG-TYPE-TX DATA-ID DATA-VALUE-1 DATA-VALUE-2 .... * '<' - character "<" (value 0x3c) * MSG-TYPE-TX - decadic number 0-255 interpreted per bit: ** Bit 7 - is ignored, parity bit is calculated internally ** Bits 6,5,4 - message type - transparently forwarded to boiler ** Bits 3..0 - reserved - transparently forwarded to boiler * DATA-ID - decadic number 0-255 * DATA-VALUE-1 - decadic number 0-255 * DATA-VALUE-2 - decadic number 0-255 These numbers are transparent forwarded to boiler, the number is greater than 255, real value is number modulo 256. Response format ~~~~~~~~~~~~~~~ .... > MSG-TYPE-RX DATA-ID DATA-VALUE-1 DATA-VALUE-2 .... * '>' - character ">" (value 0x3e) * MSG-TYPE-RX - decadic number 0-255 interpreted per bit: ** Bit 7 - 0 no error, 1 error, DATA-VALUE-2 represent error code ** Bits 6..0 - response from boiler (msg type, reserved) * DATA-ID - decadic number 0-255 * DATA-VALUE-1 - decadic number 0-255 * DATA-VALUE-2 - decadic number 0-255 User mode --------- In this mode 1st byte of Opentherm frame is filled for TX automatically and response from boiler is checked automatically: Line format ~~~~~~~~~~~ Line must end with CR (0x0d) or LF (0x0a) or CRLF (0x0d 0x0a). There is waiting time for about 3 chars after CR to test if LF is received. Response from device uses same line ends as found in received lines. Read register ^^^^^^^^^^^^^ .... < r DATA-ID DATA-VALUE-1 DATA-VALUE-2 .... * 'r' - character "r" or "R" * DATA-ID - decadic number 0-255 * DATA-VALUE-1 - decadic number 0-255 * DATA-VALUE-2 - decadic number 0-255 Device generate 1st byte for Opentherm frame as message type 0,0,0 reserved bites 0,0,0,0, then calculate parity bit and this frame is send to boiler. Rest of frame (DATA-ID, DATA-VALUE-1, DATA-VALUE-2) are transparently forwarded to boiler. Write register ^^^^^^^^^^^^^^ .... < w DATA-ID DATA-VALUE-1 DATA-VALUE-2 .... * 'w' - character "w" or "W" * DATA-ID - decadic number 0-255 * DATA-VALUE-1 - decadic number 0-255 * DATA-VALUE-2 - decadic number 0-255 Device generate 1st byte for Opentherm frame as message type 0,0,1 reserved bites 0,0,0,0, then calculate parity bit and this frame is send to boiler. Rest of frame (DATA-ID, DATA-VALUE-1, DATA-VALUE-2) are transparently forwarded to boiler. Response format ~~~~~~~~~~~~~~~ .... > R-CODE DATA-ID DATA-VALUE-1 DATA-VALUE-2 .... * R-CODE - return code ** 128 - error in response, DATA-VALUE-2 represent error code ** 0-15 - transparent copy of 'reserved' bites from boiler * DATA-ID - decadic number 0-255 * DATA-VALUE-1 - decadic number 0-255 * DATA-VALUE-2 - decadic number 0-255 Error codes ----------- - ERR: 1 missing '<' on line start - ERR: 2 wrong character in number - ERR: 4 wrong separator - ERR: 5 too many parameter - ERR: 8 not enough parameters on line - ERR: 10 response before expected period ( < 20ms) - ERR: 11 response timeout ( > 800ms) - ERR: 20 timeout for bit middle transition - ERR: 21 transition before window - ERR: 22 transition outside 0,1 window - ERR: 23 transition before bit middle - ERR: 24 parity error Return codes for user mode: - ERR: 30 returned register ID does not match transmitted register ID - ERR: 31 returned data not for slave -> master direction - ERR: 32 failed unknown data ID - ERR: 33 failed invalid data - ERR: 34 no read ack for read / no write ack for write