Разбираем протокол Dyson. Интеграция с Home Assistant

3996f09721a41648ff24eb8bc7a94f0f
Time [s],Value,Parity Error,Framing Error
-0.000017291666667,18,,
0.000069333333333,25,,
0.000156000000000,0,,
0.000242666666667,134,,
0.000329250000000,1,,
0.000415958333333,192,,
0.000502666666667,1,,
0.000589166666667,21,,
0.000675875000000,0,,
0.000762750000000,4,,
0.000849625000000,49,,
0.000936458333333,219,,
0.001023000000000,222,,
0.001109625000000,0,,
0.001196458333333,1,,
0.001283291666667,0,,
0.001370166666667,100,,
0.001456916666667,4,,
0.001543500000000,0,,
0.001630125000000,0,,
0.001717083333333,0,,
0.001803875000000,0,,
0.001890833333333,0,,
0.001977458333333,0,,
0.002064000000000,0,,
0.002150791666667,0,,
0.002237666666667,144,,
0.002324500000000,115,,
0.002411375000000,80,,
0.002498000000000,63,,
0.002584666666667,18,,
0.132283458333333,18,,
0.132370166666667,21,,
0.132456791666667,0,,
0.132543416666667,25,,
0.132630041666667,1,,
0.132716583333333,192,,
0.132803250000000,1,,
0.132889833333333,21,,
0.132976416666667,0,,
0.133063291666667,4,,
0.133150041666667,49,,
0.133236958333333,2,,
0.133323666666667,0,,
0.133410208333333,2,,
0.133496875000000,0,,
0.133583500000000,98,,
0.133670041666667,4,,
0.133756708333333,0,,
0.133843333333333,0,,
0.133929875000000,0,,
0.134016750000000,0,,
0.134103625000000,80,,
0.134190458333333,60,,
0.134277250000000,76,,
0.134363750000000,195,,
0.134450375000000,18,,
0.134537333333333,18,,
0.134624166666667,57,,
0.134710958333333,0,,
0.134797625000000,172,,
0.134884125000000,1,,
0.134970791666667,192,,
0.135057708333333,1,,
0.135144500000000,21,,
0.135231291666667,0,,
0.135317958333333,4,,
0.135404458333333,49,,
0.135491208333333,2,,
0.135578166666667,0,,
0.135664958333333,3,,
0.135751625000000,0,,
0.135838291666667,107,,
0.135924750000000,5,,
0.136011708333333,0,,
0.136098625000000,0,,
0.136185375000000,0,,
0.136272041666667,0,,
0.136358666666667,102,,
0.136445208333333,3,,
0.136532166666667,24,,
0.136619083333333,64,,
0.136705750000000,0,,
0.136792416666667,0,,
0.136879041666667,0,,
0.136965708333333,224,,
0.137052666666667,102,,
0.137139583333333,3,,
0.137226166666667,24,,
0.137312791666667,64,,
0.137399416666667,0,,
0.137486208333333,0,,
0.137573166666667,0,,
0.137659958333333,0,,
0.137746500000000,0,,
0.137833208333333,174,,
0.137919875000000,210,,
0.138006750000000,64,,
0.138093750000000,0,,
0.138180375000000,0,,
0.138267041666667,0,,
0.138353708333333,0,,
0.138440458333333,128,,
0.138527375000000,119,,
0.138614291666667,223,,
0.138700791666667,64,,
0.138787375000000,7,,
0.138874083333333,0,,
0.138960916666667,0,,
0.139047833333333,0,,
0.139134666666667,10,,
0.139221250000000,173,,
0.139307875000000,8,,
0.139394541666667,67,,
0.139481041666667,248,,
0.139567708333333,88,,
0.139654375000000,149,,
0.139740916666667,254,,
0.139827500000000,18,,
0.139914375000000,18,,
0.140001166666667,29,,
0.140088083333333,0,,
0.140174750000000,243,,
0.140261208333333,1,,
0.140347958333333,192,,
0.140434750000000,1,,
0.140521625000000,21,,
0.140608458333333,0,,
0.140695000000000,4,,
0.140781666666667,49,,
0.140868416666667,2,,
0.140955250000000,0,,
0.141042166666667,5,,
0.141128875000000,0,,
0.141215375000000,102,,
0.141301916666667,3,,
0.141388833333333,0,,
0.141475583333333,0,,
0.141562375000000,0,,
0.141649000000000,0,,
0.141735583333333,0,,
0.141822166666667,0,,
0.141909083333333,0,,
0.141995916666667,0,,
0.142082541666667,4,,
0.142169166666667,0,,
0.142255750000000,0,,
0.142342416666667,0,,
0.142429375000000,119,,
0.142516166666667,203,,
0.142602708333333,104,,
0.142689375000000,185,,
0.142775916666667,18,,

Сходу можно определить, что данные поступают пакетами переменной длины. Начало и конец пакета задаются старт/стоп байтом 0×12. При таком подходе необходимо исключить передачу числа 0×12 внутри пакета для недопущения преждевременного завершения пакета. Для этого применяется byte stuffing. Все возможные числа 0×12 заменяются на последовательную пару чисел 0xDB и 0xDE. При получении пакета декодер, встретив такую пару чисел, возвращает все на свои места.

А внутри пакета всё весело. Ни байта текстовой информации, только числовые данные в различных форматах — (uint8_t, uint16_t, uint32_t, double). Тут сразу необходимо учесть остроконечность микроконтроллера STM32 и архитектуры ARM в целом, при отправке многобайтной переменной через UART.

© Habrahabr.ru