RS485 Bus Paul Novus 300 (Focus 200) - Schack17/PaulFocusNovus GitHub Wiki
The Paul Bus is a serial RS485 with 9 Bits (yes 9 - not 8! see knx-user-forum.de: Neues Plugin ComfoAir (KWL Wohnraumlüftung Zehnder, Paul, Wernig))
Package Format
Byte No. | 1+2 | 3 | 4 | 5+6 | 7-31 |
---|---|---|---|---|---|
Description | 2 Target Address | Command | n or n-0x80=Data Length | 2 Checksum | 0-n Data |
Example | 01 02 | 80 | 05 | 7d 8c | 00 00 00 00 00 |
Commands
Command | Length | Data Length | Timing (every ms) | Example | Name | Comment |
---|---|---|---|---|---|---|
00 | 20 | 14 | 5000 | 00 00 00 0e 7b 01 01 00 05 17 06 12 02 00 37 25 13 04 00 00 | 7=?(01), 8=?(00), 9=Weekday (Mo=0), 10=Monthday, 11=Month, 12=Year, 13=?(02), 14=?(00), 15=Second, 16=Minute, 17=Hour, 18=?(04), 19=?(00), 20=?(00) | Timer: current time No address and no command id! |
80 | 11 | 5 | ? | 01 05 80 05 65 4b 00 00 00 00 00 | Address broadcast request | The address in byte 1+2 is not the source address, its the target address |
81 | 6/24 | 0/18 | ? | 01 01 81 12 3e 37 00 00 01 07 01 8f 00 45 54 41 30 30 33 36 45 32 39 41 | Address broadcast answer | The data contains the Bus Version (01 07 01), S/N, firmware version etc. (e.g.: .......ETA0036E29A) |
82 | ? | ? | ||||
83 | 6 | 0 | ? | 01 00 83 00 7f 38 | Broadcast request to get 85er answer from every slave? | |
84 | 6 | 0 | ~100 | 01 04 84 00 28 7d | I'm alive | |
85 | 9 | 3 | 5000 | 01 00 85 03 ba 9b 08 00 01 | Ping? | |
100 | 01 00 85 03 b9 b6 1a 00 ?? | Bypass State? | 6.Byte: 01=off, , 0d=closed, 1d=opened | |||
01 00 85 03 03 5a 90 00 00 | Ping? | |||||
01 00 85 03 29 33 1d 00 01 | Ping? | |||||
85 | 10 | 4 | ??? | 01 00 85 04 nn nn 55 00 00-0a 00 | Ping? | |
85 | 25/32 | nn | ? | 01 00 85 3f 56 51 00 00 00 00 00 03 00 00 00 00 00 00 00 00 00 00 00 00 05 00 00 00 06 00 00 07 00 00 08 00 00 0a 00 83 54 65 6d 70 46 72 6f 6d 42 75 53 44 45 46 52 0b 00 04 16 06 12 0c 00 39 02 16 0f 00 00 | Status? / Set ventilation level | 6. Byte Subcommand? (26 / 44) |
85 | 39 | nn | ? | 01 00 85 21 f3 b5 26 00 38 09 c3 00 01 44 00 5e 81 00 c3 00 82 00 50 00 83 00 c8 00 84 00 73 00 85 00 36 0d ae 00 01 | Status | Last Byte Bypass? 0=open, 1=closed |
86 | ? | ? | ||||
87 | ? | ? | ? | 01 01 87 83 47 6a 00 ee b0 | ? | Length=4.Byte-0x80 |
Command 85
Data Length 13 and 21 has 4 or 5 Blocks:
Header? | Subcommand | Block 1 | Block 2 | Block 3 | Block 4 | Block 5 | Other |
---|---|---|---|---|---|---|---|
01 00 85 13 94 ef | 44 00 a9 | 81 00 af 00 | 82 00 bd 00 | 83 00 ff 00 | 84 00 ff 00 | ||
01 00 85 21 1a 5f 26 00 18 0f 1a 00 00 | 44 00 a8 | 81 00 af 00 | 82 00 b9 00 | 83 00 ff 00 | 84 00 ff 00 | 85 00 14 0f 1a 00 00 (Timer?) |
The Blocks nummerates the temperatures T1-4 (5?) 81-0x80=1
Temperature | Id for Device Version left | Id for Device Version right |
---|---|---|
Outdoor - House in after defroster | T1 | T2 |
Incoming air - rooms in | T2 | T1 |
Indoor / Outgoing air - rooms out | T3 | T4 |
Outgoing air - house out | T4 | T3 |
And the 3. and 4. Byte after the number is the temperature: 0x04 0x01=26.0
Calc: (b[3] << 8 | b[2]) / 10.0
Checksum
- Byte changed and Checksum changed: 01 02 80 05 7d 8c 00 00 00 00 00 01 03 80 05 ae cb 00 00 00 00 00
Calculation in python:
`def crc16_ccitt(crc, data): msb = crc >> 8 lsb = crc & 255 for c in data: # x = ord(c) ^ msb x = c ^ msb x ^= (x >> 4) msb = (lsb ^ (x >> 3) ^ (x << 4)) & 255 lsb = (x ^ (x << 5)) & 255 return (msb << 8) + lsb
def novus_crc(data): # '3254' --> '0xcb6' --> 'b6 0c' crc = crc16_ccitt(0, data) return [int(formatLeadingZero(hex(crc)[-2:]), 16), int(formatLeadingZero(hex(crc)[2:][:-2]), 16)] `
Known Addresses
Address | Name |
---|---|
0100 | TFT (Display) |
0101 | Master |
0102 | TFT (Bedienteil) |
0103 | ? |
0104 | Slave |
0105 | Defrosterheizung |
0106 | Elektroheizregister |
0107 | EWT-Klappe |
0108 | Defrosterheizung |
0109 | ? |