Уже давно у меня есть метеостанция, штука прикольная, удобно смотреть погоду на улице и дома, но она просто показывает данные на экране и всё. Уличный датчик работает по радио каналу на частоте 433МГц, а значит, его можно слушать не только базой, но и чем то ещё.
Я решил собрать свою метеостанцию с esp32 в качестве базы и esp8266(потому что дешевле arduino) в качестве мозга датчика, но при этом хотелось бы ещё слушать датчик китайской метеостанции(DG-R8S).
Сам я программист не очень, поэтому принялся искать готовые библиотеки и они есть, для DG-R8S точно подходят: https://github.com/dgomes/homeGW и https://github.com/puuu/ESPiLight (версия 0.16.2, не новее, протокол tfa). Кроме того, существует библиотека https://github.com/zoomx/PrologueDecoder которая написана специально для этого датчика, но она у меня не скомпилировалась.
ESPiLight работает, но громоздкая, поэтому остановился на homeGW. Изначально, библиотека homeGW не рассчитана на работу с DG-R8S, то что там зовётся плагином digoo, относится к другому датчику, мой читается плагином weather.
Для корректного получения температуры и влажности, значение необходимо делить на 2. Это работает, причём хорошо, но ровно до момента, когда на улице холодает и появляется минус. Проблема в том, что в библиотеки неправильно реализован парсинг числа температуры(https://github.com/dgomes/homeGW/issues/19). Но увы, это не вся проблема. С самого начала, я как то не задумываясь, опирался на описание структуры ответа DG-R8S описанной в библиотеки PrologueDecoder, ведь она написана для него. Описание структуры гласит следующее:
IIII RRRR RRRR bBCC TTTT TTTT TTTT HHHH HHHH
I - ID
R - Rolling ID
b - battery
B - Button
C - channel
T - Temp
H - Humidity
Но, когда появились отрицательные температуры, канал и id датчика удвоились, что, естественно, не могло произойти, если все так, как описано в структуре.
Теперь, уже мне пришлось смотреть на ответ датчика и разбираться, а получил я следующее
1100 0100 0100 0001 1111 1010 0100 1110 3
1100 0100 1100 0010 0000 1010 0110 0010 3 т
0110 1001 1100 0010 0001 0000 0110 1010 3 т б
0110 1001 1100 0010 0000 1010 1000 0000 3 т б
1011 0000 1100 0001 1111 0010 0100 0100 3 т
1011 0000 1100 0001 1110 0010 0110 0010 3 т
1011 0000 1010 0001 1110 1010 0110 1100 2 т
1100 0100 1010 0001 1111 1010 0110 1000 2 т
1011 0000 0000 0001 1111 0000 0110 1010 1
1011 0000 1000 0001 1111 0000 0110 1010 1 т
1100 0100 1000 0010 0000 1000 0101 1110 1 т
1010 1000 1000 0010 0000 1100 0100 1100 1 т
1100 0001 1000 0010 0000 1110 0110 1010 1 т б
1100 0001 0000 0010 0001 0100 0100 1010 1 б
1111 1111 1000 0010 0001 0100 0100 1110 1 т б
цифра - канал
т - тест кнопка
б - индикатор батареи
Если привести к виду выше, получится типа так
IIII RRRb BCCx TTTT TTTT TTTT HHHH HHHH
Что несколько непохоже на структуру из библиотеки PrologueDecoder, более того, ответ вышел короче. Возможно, моя библиотека как то обрезает ответ, не суть, главное, что для homeGW структура ответа датчика DG-R8S выходит именно такая. IIII RRR в моём случае, просто предположение по аналогии PrologueDecoder, хотя, как видно, в моих тестах все биты меняются, значит, это всё скользящий id. Что такое x, я не понял, возможно, бит отвечающий за минус? Тестировал дома, естественно, температура всегда была положительной.
Библиотеку я подправил, сейчас минус обрабатывается нормально, канал определяется верно, статус батареи(есть сигнал, значит села) определяется верно.
Ссылка на исправленную библиотеку https://disk.yandex.ru/d/3e9_e2JmT1C5Ng которая точно компилируется и работает с актуальной версией arduino ide 2.2.1 и sdk esp32 2.0.14.
R8s отсылает 3 одинаковых пакета подряд, хотя тут https://github.com/dgomes/homeGW/issues/8 пишут про 5 пакетов, а тут https://habr.com/ru/articles/426235/ (Тип 3) вообще 7 пакетов, может у меня настолько плохая антенна или приёмник, что я иногда лишь 1 пакет ловлю? В общем, одинаковых пакетов много, поэтому нужно это дело обрабатывать, защищаясь от дубликатов.
Ещё у меня временами ловятся наводки неизвестно откуда, какой то прибор, с похожей длиной ответа, но точно не метеостанция, ибо данные тогда неадекватны. Забавно, что было время, когда даже родная база метеостанции ошибалась и ночью пикала(будто кто то нажимает кнопку тест на датчике).