Galaxy RS485 protocol reverse engineering

This is very much a work in progress.

What is known so far?

Well, it's RS485 for a start. It runs as 9600 baud, 8 bits, no parity, 1 stop bit, so pretty default. The last bit in each packet appears to be a checksum, and the first bit is always the device address being addressed.

Resources

FilenameDescription
galaxy 9600 3.srSigrok capture, apply a uart filter at 10000 baud(lolsamplerate),8bits no parity.
GalaxyAddresses.pngScreenshot from Galaxy manual showing their RS485 "addresses"
dump.pyPython script to dump data from the RS485 bus, used in figuring out what happens. We used a MAX485 and FT232R together to get data.

Devices observed in the dump

The Galaxy Addr is a weird one - it looks like the actual RS485 address, but truncated.

RS485 AddrGalaxy AddrFunction
10"0"Keypad (beeps if you address a door open command to "Max 0" addr?)
11???Appears to be the alarm panel itself/it's cpu/whatever.
25??????
4b"B"Ethernet Module
90MAX 0MAX4 Reader (not actually present but the panel thinks it is? maybe because keyprox keypad at addr10 also uses this?)
91MAX 1MAX4 Reader

The galaxy manual is not hugely useful regarding how the addresses lay out - they don't show the full address...

Example display output

??!?Workshop?21:34 FRI 12 MAY?v

ByteValueFunction
0010RS485 Address of device being addressed, keypad at addr10
0107BEL
0221ASCII !
0317ETB End Transmission Block
0457W
056fo
0672r
076bk
0873s
0968h
0a6fo
0b70p
0c02STX Start of Text (Used here to go to new line?)
0d322
0e311
0f3A:
10333
11344
1220SPACE
1346F
1452R
1549I
1620SPACE
17311
18322
1920SPACE
1a43M
1b41A
1c59Y
1d07BEL
1e76v (this appears to be a parity byte)

Drawing three asterisks (2Ah) to the display:

1007b3172ab6
100721172a2a4e
1007b3172a2a2a0b

Pressing buttons on the keypad

This is from addr10 (doesn't seem to send source addr tho), to addr10 (the panel).

ByteValueFunction
0011Message to RS485 Addr 11, the panel
01f4???
0201Button "1" on keypad
03b1Checksum
11f401b1

If you press button 2 (02h), the checksum seems to increment by 1, so B2h. Perhaps a simple sum or something.

Also observed on the bus during a display update:

000000a0 -- -- -- -- -- -- -- 10 07 a1 17 20 45 4e 47 49 |-------....-ENGI|
000000b0 4e 45 45 52 20 4d 4f 44 45 20 20 02 31 37 3a 30 |NEER MODE--.17:0|
000000c0 33 20 4d 4f 4e 20 32 39 20 4d 41 59 07 1e -- -- |3 MON 29 MAY..--|

Example MAX data

Addressed from the MAX to the panel

This one seems to be some kind of poll periodically sent to the panel from the reader. Not sure of it's function but it's quite frequently present on the bus.

ByteValueFunction
0011RS485 adress of the panel
01ED
02FA
0303ETX End of Text
04E8
05XXA nonce, incremented on each poll
0600
07XXChecksum
11edfa03e8XX00XX

Addressed from the MAX reader: using a fob

ByteValueFunction
0011RS485 address of the panel, so data TO the panel
01F4?? door open command?
02010 is padding, 1 is first number of fob number
03232 and 3 from fob number
04454 and 5 from fob number
05676 and 7 from fob number
06898 and 9 from fob number
073bLikely a checksum
11f401234567893b

Requesting to open door from MAX 1 (91h) to panel, and replies:

11 F4 20 D0    - Request to open door
91 0c 03 81 cc - ACK?
91 0c 0c 02 - ACK go ahead and open.
(system set)
11 F4 30 E0 - Request to open door
91 0c 03 81 cc - ACK
Note the lack of ACK with go ahead returned now we're armed.
Further packets to request to open the door had the 3rd byte as 30 instead of 20 even after the system was disarmed. Not sure what's up with that either.