
Пожалуйста, будьте ответственными и изучите законодательство вашей страны, прежде чем пытаться делать нечто похожее. Передача радиосигналов может очень быстро вызвать юридические проблемы, а полосу, которую я использовал в посте (868 МГц
) занимать в США без лицензии незаконно. Не хочу, чтобы в ваш дом из-за меня постучались люди в штатском. Я вас предупредил!
Недавно я переехал в новую квартиру, чтобы наконец-то начать жить в одиночку. Это дало мне достаточную степень свободы, чтобы обустраивать жильё под свой вкус, но не крушить стены, ведь у меня был арендодатель (и залог!).
Обогрев квартиры показался довольно неудобным. Термостат бойлера, установленный владельцем квартиры, оказался простым радиоуправляемым устройством, использующим встроенный датчик температуры для включения и отключения отопления. Из-за этого возникло несколько проблем:
- Датчик температуры мог замерять показания только в одной комнате квартиры, которая нагревалась неравномерно.
- Эта комната зависела от физической близости пульта управления термостатом, что неудобно, если я нахожусь в спальне, а пульт — в гостиной или наоборот.
- Если я забуду выключить отопление перед уходом из квартиры, то впустую потрачу кучу дорогостоящей энергии.
Я автоматизирую устройства в своей квартире с помощью Home Assistant, и хотел поступить так же с бойлером. Очевидно, для этого есть множество готовых решений, но они бы потребовали участия арендодателя и, вероятно, прихода электрика. А мне этого не хотелось!
Вместо этого я решил управлять отоплением квартиры так, чтобы не оставлять следов, при помощи термостата владельца квартиры, и, может, в процессе узнать немного нового о радиопередаче.
▍ С чего начать?
Я знал, что термостат общается с бойлером по какому-то радиопротоколу. Мы можем попробовать выполнить реверс-инжиниринг протокола с нуля, но, как я скажу ниже, моих минимальных навыков работы с радиосигналами оказалось крайне недостаточно.
Я решил, что гораздо проще будет попробовать так называемую атаку повторного воспроизведения. Для этого мне нужно клонировать сигналы, передаваемые между бойлером и термостатом, а затем выдать себя за термостат и передавать сигналы самому. Благодаря этому нам не нужно понимать протокол, мы просто воспроизведём его.
Такая методика требует большой доли удачи. От атак повторного воспроизведения достаточно легко защититься счётчиком с инкрементом, из-за которого сигналы с уже встречавшимся значением счётчика буду игнорироваться. К счастью, мой термостат этого не делал.
▍ Первоначальная разведка
Первым делом я решил проверить, можно ли найти онлайн какую-то информацию о моей модели термостата. Я нашёл в продаже точно такую же модель с даташитом в разделе Attachments. Раздел RF Communication был именно тем, что мне нужно:

Из этого можно понять, что термостат выполняет обмен данными в диапазоне
868 МГц
. Поначалу меня смутила надпись Protocol: Encrypted
, но оказалось, что это не проблема.Первой трудностью стало то, что в Интернете на удивление мало ресурсов о клонировании сигнала
868 МГц
. Самые информативные ресурсы были посвящены LoRa/Meshtastic. Я нашёл кучу постов на Reddit, в которых пользователи пытались сделать то же самое с потолочными вентиляторами и дверьми гаражей, но, похоже, никаких ответов им получить не удалось…Я подозреваю, это связано с тем, что в США нелицензированная передача на частоте
868 МГц
незаконна, а пользователей из Европы было мало, но кто знает. Моя жизнь стала бы намного проще, если бы сигнал передавался на частоте 433 МГц
— существует куча потребительских инструментов для передачи данных в этом диапазоне.▍ Изучаем сигналы
Не получив практически никакой информации, я решил, что первым делом стоит посмотреть на радиопакеты и изучить их. Раньше я читал о Software-Defined Radio, поэтому решил, что они подойдут мне лучше всего. Большинство SDR очень дорогие, поэтому я купил бюджетное RTL-SDR V4 на AliExpress. В конечном итоге, это оказалось необязательным по причинам, которые я объясню ниже.
Возможно, вы слышали о знаменитом Flipper Zero и его способности клонировать и воспроизводить сигналы. Я думал использовать его в этой ситуации, но стоит учесть, что Flipper — это НЕ SDR. Flipper очень избирателен в отношении частот, на которых он может работать. Я узнал это на своей шкуре: позаимствовал его и немного отчаялся, когда понял, что он не сработал.
После получения радио я подключил его к ноутбуку с установленным ПО SDR++ для проверки работоспособности и чтобы начать разбираться, что же передаёт мой термостат. После нескольких нажатий на кнопки термостата график ожил!

Не обращайте внимания на толстую вертикальную линию на графике — это стандартное последствие работы с очень дешёвым SDR, в моём случае она возникает на всех исследуемых частотах.
Этот шаг не особо важен, но можете попробовать воспользоваться инструментом rtl_433 tool (несмотря на название, он работает и на других частотах), чтобы проверить, не общается ли термостат по известному протоколу. Для не очень популярных устройств это может и не сработать!

Похоже, этот термостат обменивается данными по тому же протоколу, как и модель Honeywell. Атрибут demand задаёт, включён (1) или выключен (0) термостат, после чего бойлер передаёт подтверждение (предположительно для того, чтобы термостат мог проверить, находится ли бойлер в пределах его действия).
▍ Попытаемся кричать в ответ
Теперь, когда мы понаблюдали за реальной передачей данных туда и обратно, можно попробовать отправить пакеты самостоятельно и управлять бойлером, как будто мы термостат.

На этом этапе я застрял на несколько месяцев. Я пытался пойти по «умному» пути, попытавшись выполнить реверс-инжиниринг и воссоздание пакетов вручную при помощи URH, а затем транслировать их через очень дешёвые микроконтроллерные платы на
868 МГц
. Можно с уверенностью сказать, что это гораздо выше моих навыков. Ни одна плата не рассчитана на общение ни с кем, кроме как с точно такой же платой, а для дальнейших шагов мне потребовалось бы изучать регистры радио, чего мне не хотелось.▍ HackRF

После этого я решил начать забивать гвозди микроскопом: использовать полнофункциональный SDR для простого воспроизведения того же сигнала, не заботясь о его содержимом. Но купленный мной ранее дешёвый RTL-SDR поддерживал только приём, но не трансляцию. SDR, способные выполнять широковещание, обычно стоят сотни долларов.
Я сказал «обычно», потому что у одного из самых популярных SDR с функцией вещания,
HackRF One
(обычно стоит до 400$), было множество клонов на AliExpress в десять раз дешевле — всего за 40$.Я сказал «было», потому что когда я начал несколько месяцев спустя писать этот пост, AliExpress удалил практически все товары, которые можно было найти по запросу «HackRF». Насколько я понимаю, их арестовывали на таможнях многих стран, которые напрягал импорт грозных хакерских инструментов, поэтому маркетплейс решил удалить все товары, а не разбираться с этим. Более новые клоны можно купить здесь, но они стали гораздо дороже…
С дешёвыми клонами опенсорсного оборудования связаны очевидные этические (а, возможно, и технические) проблемы, но я решил, что для моего маленького случая их использование допустимо. Если это в ваших силах, поддержите оригинальный проект!
Значит, как я и говорил выше, тогда необходимость в RTL-SDR отпадает? На самом деле, я думаю, что всегда неплохо иметь под рукой ещё один SDR, чтобы убедиться, что вы не засоряете другие частоты.
▍ Кричим в ответ по-настоящему
Купив HackRF, можно использовать инструмент hackrf_transfer для записи, и что ещё важнее, для воспроизведения сигналов. Я выполняю эти команды, а затем нажимаю соответствующие кнопки на термостате, чтобы записывать сигналы в отдельные файлы:
# Устанавливаем частоту на 868,3 МГц и частоту сэмплирования на 2000000.
hackrf_transfer -r turn_off.raw -f 868300000 -s 2000000
hackrf_transfer -r turn_on.raw -f 868300000 -s 2000000
Далее мы можем попытаться выключать и включать бойлер из командной строки:
# Используем -a для включения усилителя и -x, чтобы немного увеличить коэффициент усиления.
hackrf_transfer -t turn_off.raw -f 868300000 -s 2000000 -a 1 -x 23
hackrf_transfer -t turn_on.raw -f 868300000 -s 2000000 -a 1 -x 23
После этого мы можем услышать отключение и включение физического реле внутри бойлера!
▍ Автоматизируем всё это
Мой клон HackRF находится в распечатанном на 3D-принтере корпусе, подключённом к серверу.
HackRF подсоединён к USB-концентратору сервера Assistant. Я написал простейший веб-сервер, который всего лишь передаёт показанные выше команды в контейнер Docker.
Затем при помощи Average Sensor Plugin и конфигурации YAML я получил работающий термостат!
command_line:
- switch:
name: Boiler
command_on: "curl http://docker-vm:1111/api/on"
command_off: "curl http://docker-vm:1111/api/off"
sensor:
- platform: average
name: "Average Temperature"
entities:
- sensor.bedroom_thermostat_temperature
- sensor.kitchen_thermostat_temperature
climate:
- platform: generic_thermostat
name: Boiler Thermostat
heater: switch.boiler
target_sensor: sensor.average_temperature
К этому моменту я был доволен уже тем, что он хотя бы работает наконец, спустя столько месяцев попыток. Стоит признать, что эта система с Home Assistant довольно сырая и её определённо можно улучшить. Лучше было бы написать настоящий плагин и управлять радиосигналом напрямую, а не передавать команды в CLI. Наверно, использовать
curl
— это уже перебор?▍ Стоило ли оно того?

Я пользовался этой системой для управления обогревом квартиры с начала декабря,
и у меня ни разу не возникало проблем! Стало очень удобно настраивать температуру с телефона, а созданные мной автоматизации определённо стоили того, чтобы работать над этим проектом.
У меня есть несколько простых автоматизаций, например, снижение температуры, когда я сплю, и нагрев утром перед моим пробуждением. Кроме того, обогрев отключается, когда я выхожу из дома, и включается, когда я нахожусь всего в нескольких станциях метро от дома, поэтому когда я возвращаюсь, там тепло и комфортно!
Единственное, что меня не устраивает — это необходимость использования такого мощного и универсального радио, как HackRF, для простого включения-отключения бойлера. Но я лучше буду пользоваться чем-то излишне мощным, чем тратить кучу времени, чтобы заставить менее совершенные радио выполнять мои требования.
Главное, что мне теперь тепло!
Telegram-канал со скидками, розыгрышами призов и новостями IT 💻
