Protokol RS-485
Referenční popis komunikace mezi jednotkami Majordomus a řídícím počítačem po sběrnici RS-485. Jednotky podporují dva protokoly:
- ASCII protokol — nativní protokol systému Majordomus, používá ho Majordomus Control
- Modbus RTU — standardní průmyslový protokol pro integraci s PLC a SCADA systémy
Anglické originály: ASCII protokol · Modbus
Parametry sériové linky
| Parametr | Hodnota |
|---|---|
| Rychlost | 115 200 bps |
| Datové bity | 8 |
| Stop bity | 1 |
| Parita | žádná |
Na sběrnici je jeden master (řídící počítač) — jednotky nikdy nevysílají samy od sebe, pouze odpovídají na dotaz. Každé zařízení má textové id o maximální délce 32 znaků.
sequenceDiagram
Master->>Zařízení A: id:A,msg:data,crc:XX
Zařízení A-->>Master: id:A,msg:data,crc:XX
Master->>Zařízení B: id:B,msg:data,crc:XX
Zařízení B-->>Master: id:B,msg:data,crc:XX
ASCII protokol
Formát zprávy
- Zpráva začíná
id:<název_zařízení>. - Končí znaky
CR LF. - Vlastnosti jsou odděleny čárkou, každá má formát
klíč:hodnota. - Poslední vlastností je vždy
crc— výpočet níže.
Příklady
Čtení stavu zařízení (verze FW, napájecí napětí):
→ id:test,msg:status,crc:8b\r\n
← id:test,type:RoomSens,version:0.3(Nov 2 2024),pwr:12.05,pwrOut:12.11,crc:f0
Čtení dat:
→ id:test,msg:data,crc:ea
← id:test,di:0,btn:0,t:210,t2:211,rh:540,mo:0,voc:95,lux:569,nl:278,adc0:0.00,adc1:0.00,crc:22
Čtení a zápis v jedné zprávě (digitální výstupy, DAC, přísvit, žádaná teplota):
→ id:test,msg:data,do:3,dac0:5.4,dac1:1.2,light:1,reqT:225,crc:93
← id:test,di:0,btn:0,t:210,t2:211,rh:540,mo:0,voc:95,lux:569,nl:278,adc0:0.00,adc1:0.00,crc:22
Změna id zařízení:
→ id:test,msg:config,newId:test2,crc:ea
Restart zařízení:
→ id:test,msg:config,cmd:reset,crc:07
Neznám id zařízení
Místo názvu zařízení lze použít all — zprávu pak zpracují všechna zařízení na sběrnici. Aby nedošlo ke kolizi, každé zařízení před odpovědí čeká náhodnou dobu. Pro běžný provoz se to nedoporučuje, hodí se pro prvotní zjištění zařízení na lince.
Zpráva status
id:<zařízení>,msg:status,...
| Odpověď | Význam |
|---|---|
type |
Typ zařízení (např. RoomSens) |
version |
Verze FW: X.Y (datum sestavení) |
pwr |
Napájecí napětí ve voltech |
pwrOut |
Napájecí napětí za pojistkou vstupů/výstupů |
Zpráva config
id:<zařízení>,msg:config,...
| Klíč | Význam |
|---|---|
newId |
Změna id na nový řetězec (max. 32 znaků) |
newId5050 |
Jako newId, ale zařízení příkaz provede s pravděpodobností 50 % — řeší situaci, kdy mají dvě zařízení na sběrnici stejné id |
cmd:reset |
Restart zařízení |
Zpráva data — RoomIO
| Ze zařízení | Význam |
|---|---|
adc0, adc1 |
Napětí analogových vstupů |
di |
Bitové pole digitálních vstupů |
btn |
Bitové pole tlačítek — posílá se jednou při náběžné hraně |
t0, t1 |
Teploty z 1-Wire senzorů (°C) |
| Do zařízení | Význam |
|---|---|
dac0, dac1 |
Nastavení analogových výstupů |
do |
Bitové pole digitálních výstupů (bit 0 = výstup 0, ...) |
Zpráva data — RoomSensor
| Ze zařízení | Význam |
|---|---|
adc0, adc1 |
Napětí analogových vstupů |
di |
Bitové pole digitálních vstupů |
btn |
Bitové pole tlačítek — posílá se jednou při náběžné hraně |
t0 |
Teplota z předního krytu (°C) |
t1 |
Teplota ze senzoru vlhkosti (°C) |
t2, t3 |
Teploty z 1-Wire senzorů (°C) |
rh |
Relativní vlhkost (%) |
mo |
PIR detektor pohybu (0/1) |
voc |
Kvalita vzduchu VOC (0–500) |
lux |
Intenzita osvětlení (lux) |
nl |
Hladina hluku (dB) |
newReqT |
Nová žádaná teplota zadaná uživatelem na displeji — posílá se jednou při potvrzení |
| Do zařízení | Význam |
|---|---|
dac0, dac1 |
Nastavení analogových výstupů |
do |
Bitové pole digitálních výstupů |
reqT |
Žádaná teplota zobrazená na LCD |
beep |
Spuštění pípání (0–4) |
light |
Ovládání LED přísvitu (0/1) |
Zpráva data — TinySensor
| Ze zařízení | Význam |
|---|---|
di |
Bitové pole digitálních vstupů |
btn |
Bitové pole tlačítek |
t0 |
Teplota (°C) |
rh |
Relativní vlhkost (%) |
t1, t2 |
Teploty z 1-Wire senzorů (°C) |
| Do zařízení | Význam |
|---|---|
do |
Bitové pole digitálních výstupů |
Formát číselných hodnot
Teploty a vlhkost se po sběrnici posílají jako celá čísla ×10 — např. t:210 znamená 21,0 °C, rh:540 znamená 54,0 %.
Výpočet CRC
Kontrolní součet je CRC-8 počítaný tabulkou z celé zprávy před vlastností crc:
static unsigned char const crc8_table[] = {
0xea, 0xd4, 0x96, 0xa8, 0x12, 0x2c, 0x6e, 0x50, 0x7f, 0x41, 0x03, 0x3d,
0x87, 0xb9, 0xfb, 0xc5, 0xa5, 0x9b, 0xd9, 0xe7, 0x5d, 0x63, 0x21, 0x1f,
0x30, 0x0e, 0x4c, 0x72, 0xc8, 0xf6, 0xb4, 0x8a, 0x74, 0x4a, 0x08, 0x36,
0x8c, 0xb2, 0xf0, 0xce, 0xe1, 0xdf, 0x9d, 0xa3, 0x19, 0x27, 0x65, 0x5b,
0x3b, 0x05, 0x47, 0x79, 0xc3, 0xfd, 0xbf, 0x81, 0xae, 0x90, 0xd2, 0xec,
0x56, 0x68, 0x2a, 0x14, 0xb3, 0x8d, 0xcf, 0xf1, 0x4b, 0x75, 0x37, 0x09,
0x26, 0x18, 0x5a, 0x64, 0xde, 0xe0, 0xa2, 0x9c, 0xfc, 0xc2, 0x80, 0xbe,
0x04, 0x3a, 0x78, 0x46, 0x69, 0x57, 0x15, 0x2b, 0x91, 0xaf, 0xed, 0xd3,
0x2d, 0x13, 0x51, 0x6f, 0xd5, 0xeb, 0xa9, 0x97, 0xb8, 0x86, 0xc4, 0xfa,
0x40, 0x7e, 0x3c, 0x02, 0x62, 0x5c, 0x1e, 0x20, 0x9a, 0xa4, 0xe6, 0xd8,
0xf7, 0xc9, 0x8b, 0xb5, 0x0f, 0x31, 0x73, 0x4d, 0x58, 0x66, 0x24, 0x1a,
0xa0, 0x9e, 0xdc, 0xe2, 0xcd, 0xf3, 0xb1, 0x8f, 0x35, 0x0b, 0x49, 0x77,
0x17, 0x29, 0x6b, 0x55, 0xef, 0xd1, 0x93, 0xad, 0x82, 0xbc, 0xfe, 0xc0,
0x7a, 0x44, 0x06, 0x38, 0xc6, 0xf8, 0xba, 0x84, 0x3e, 0x00, 0x42, 0x7c,
0x53, 0x6d, 0x2f, 0x11, 0xab, 0x95, 0xd7, 0xe9, 0x89, 0xb7, 0xf5, 0xcb,
0x71, 0x4f, 0x0d, 0x33, 0x1c, 0x22, 0x60, 0x5e, 0xe4, 0xda, 0x98, 0xa6,
0x01, 0x3f, 0x7d, 0x43, 0xf9, 0xc7, 0x85, 0xbb, 0x94, 0xaa, 0xe8, 0xd6,
0x6c, 0x52, 0x10, 0x2e, 0x4e, 0x70, 0x32, 0x0c, 0xb6, 0x88, 0xca, 0xf4,
0xdb, 0xe5, 0xa7, 0x99, 0x23, 0x1d, 0x5f, 0x61, 0x9f, 0xa1, 0xe3, 0xdd,
0x67, 0x59, 0x1b, 0x25, 0x0a, 0x34, 0x76, 0x48, 0xf2, 0xcc, 0x8e, 0xb0,
0xd0, 0xee, 0xac, 0x92, 0x28, 0x16, 0x54, 0x6a, 0x45, 0x7b, 0x39, 0x07,
0xbd, 0x83, 0xc1, 0xff};
uint8_t crc8(uint8_t seed, unsigned char const *data, size_t len)
{
uint8_t crc = seed;
if (data == NULL)
return 0;
crc &= 0xff;
unsigned char const *end = data + len;
while (data < end)
crc = crc8_table[crc ^ *data++];
return crc;
}
Modbus
Jednotky podporují i standardní protokol Modbus RTU se stejnými parametry sériové linky. Každé zařízení má Modbus adresu 1–247.
Registry — RoomSensor
| Logická adresa | Registr | Přístup | Velikost | Typ | Význam |
|---|---|---|---|---|---|
| 0x41001 | 0x1000 | čtení | 2 B | INT16 | Teplota z předního krytu [×10 °C] |
| 0x41002 | 0x1001 | čtení | 2 B | INT16 | Teplota ze senzoru vlhkosti [×10 °C] |
| 0x41003 | 0x1002 | čtení | 2 B | UINT16 | Relativní vlhkost [×10 %] |
| 0x41004 | 0x1003 | čtení | 2 B | INT16 | Teplota z 1-Wire senzoru 0 [×10 °C] |
| 0x41005 | 0x1004 | čtení | 2 B | INT16 | Teplota z 1-Wire senzoru 1 [×10 °C] |
| 0x41006 | 0x1005 | čtení | 2 B | UINT16 | Kvalita vzduchu VOC index [0–500] |
| 0x41007 | 0x1006 | čtení | 2 B | UINT16 | CO₂ [ppm] |
| 0x41008 | 0x1007 | čtení | 4 B | UINT32 | Intenzita osvětlení [lux] |
| 0x4100A | 0x1009 | čtení | 2 B | UINT16 | Hladina hluku [dB] |
| 0x4100B | 0x100A | čtení | 2 B | UINT16 | PIR detektor pohybu [0/1] |
| 0x4100C | 0x100B | čtení | 2 B | UINT16 | Bitové pole digitálních vstupů |
| 0x4100D | 0x100C | čtení | 2 B | UINT16 | Bitové pole tlačítek (náběžná hrana) |
| 0x4100E | 0x100D | čtení | 2 B | UINT16 | ADC0 — napětí analogového vstupu [mV] |
| 0x4100F | 0x100E | čtení | 2 B | UINT16 | ADC1 — napětí analogového vstupu [mV] |
| 0x41010 | 0x100F | čtení | 2 B | UINT16 | Napájecí napětí [mV] |
| 0x41011 | 0x1010 | čtení | 2 B | UINT16 | Napájecí napětí výstupů [mV] |
| 0x62001 | 0x2000 | zápis | 2 B | UINT16 | Bitové pole digitálních výstupů |
| 0x62002 | 0x2001 | zápis | 2 B | UINT16 | DAC0 — analogový výstup [mV] |
| 0x62003 | 0x2002 | zápis | 2 B | UINT16 | DAC1 — analogový výstup [mV] |
| 0x62004 | 0x2003 | zápis | 2 B | UINT16 | Pípák [0–4] |
| 0x62005 | 0x2004 | zápis | 2 B | UINT16 | LED přísvit [0/1] |
| 0x62006 | 0x2005 | zápis | 2 B | INT16 | Žádaná teplota na LCD [×10 °C] |