Управляем умным домом при помощи рации

Управляем умным домом при помощи рации

Зачем? Потому что прикольно 🙂 Лично для меня это скорее концепт — у меня нет реальной необходимости управлять умным домом по радио, но возможно эта статья кого-то вдохновит. По радио можно, например, перезагрузить зависший Wi-Fi роутер, открыть шлагбаум или гаражные ворота.

В этой статье для примера я покажу как можно перезагрузить роутер, отправив команду умному дому с портативной радиостанции. Вот так:

Но перезагрузкой роутера все не ограничивается — тут уже на что фантазии хватит.

Так же в конце я кратко расскажу про альтернативные способы сделать то же самое, но немного по-другому.

Принцип работы и требуемые компоненты

В общих чертах схема примерно такая:

Схема управления умным домом с помощью носимой рации

Для кодирования команд я буду использовать DTMF. С DTMF сталкивался каждый, кто хоть раз звонил в техподдержку сотового оператора или банка. «Для связи со специалистом нажмите цифру 0» — это и есть пример использования DTMF 🙂 При нажатии одной из цифр телефон отправляет звуковой сигнал определенной тональности, а на принимающей стороне этот звук декодируется.

Те же самые тональные сигналы можно передать и при помощи рации:

0:00
/0:05

Для приема радиосигнала я буду использовать SDR приемник, подключенный к домашнему серверу с Home Assistant.

SDR-приемник с антенной

В качестве приемника можно было бы использовать еще одну рацию, подключенную к микрофонному разъему на звуковой карте сервера, но SDR приемник у меня уже есть, а второй рации нет 🙂

Так же на сервере понадобится установить rtl-sdr для работы с SDR приемником и multimon-ng для декодирования DTMF кодов. Оба пакета есть в репозиториях Debian и Ubuntu:

apt install rtl-sdr multimon-ng

Для перезагрузки Wi-Fi роутера его нужно запитать через умную розетку, подключенную к Home Assistant. Ну либо в моем случае через реле от Sonoff:

Самодельная умная розетка из реле Sonoff и удлинителя

Настройка рации

По большому счету какой-то сложной настройки не требуется — достаточно выставить частоту, зажать тангету и набрать DTMF код. Но для удобства запрограммируем рацию так, чтобы необходимый код отправлялся просто одним нажатием на тангету.

Для программирования понадобится специальный кабель и установленный на компьютере CHIRP.

Baofeng UV-5R с кабелем для программирования рации

С помощью CHIRP нужно прописать любой код в разделе DTMF Settings. Например, пусть будет 08# в качестве PTT ID Code 8. # в конце обязательна — чуть позже объясню зачем. Еще на этой же вкладке нужно выключить ANI ID и в DTMF Sidetone указать DT+ANI.

После необходимо прописать частоту в память. Я использую 434.475 (57 канал LPD) на малой мощности. В свойствах ячейки памяти (клик правой кнопкой -> Properties) нужно выставить:

  • PTT ID: EOT — передавать DTMF код при отпускании тангеты;
  • PTT ID Code: 8 — номер слота с сохраненным DTMF кодом.
⚠️
Использование УКВ радиостанции на частотах за пределами диапазонов LPD и PMR запрещено, если у вас нет радиолюбительской лицензии. Так же в зависимости от юрисдикции могут быть законодательные ограничения по мощности и может потребоваться регистрация радиостанции. На практике контролирующие органы часто закрывают глаза на превышение мощности и регистрацию, но я вас предупредил.

В конце остается только загрузить настройки в рацию, выбрать сохраненный в памяти канал, нажать на тангету и DTMF код улетит в эфир 🙂

Конфигурация сервера

На сервере нужно настроить несколько вещей:

  1. Прием радиосигнала;
  2. Декодирование DTMF кодов и их отправку в Home Assistant;
  3. Перезагрузку роутера.

Для приема радиосигнала используется следующая команда:

rtl_fm -f 434.475M -s 22050 -

А для распознавания DTMF кодов и их пересылку в Home Assistant я накидал небольшой скрипт:

#!/bin/bash

HASS='http://localhost:8123' # адрес Home Assistant

cat - | multimon-ng -t raw -a DTMF -q - | sed -u 's/DTMF: //g' | while read -d '#' LINES; do
  CODE=`echo "$LINES" | tr -d '\n'`
  echo "Received new DTMF code: ${CODE}"
  curl -X POST -d "code=${CODE}" "${HASS}/api/webhook/dtmf"
done

Скрипт распознает DTMF коды из аудиопотока и отправляет их в вебхук, который мы чуть позже настроим в Home Assistant.

Выше я писал про обязательную # в конце каждого кода. Скрипт использует # для отделения одного кода от другого, то есть для передачи, например, 08 нужно набрать 0, 8 и в конце #. # это такая своеобразная клавиша «Ввод» 🙂

Скрипт нужно сохранить, например как dtmf.sh, и сделать его исполняемым вызвав chmod +x dtmf.sh.

Все вместе запускается следующим образом:

rtl_fm -f 434.475M -s 22050 - | ./dtmf.sh

434.475 — частота, на которую настроена рация.

Остается только настроить вебхук в Home Assistant, который бы перезагружал роутер. Для этого в configuration.yaml нужно добавить:

automation:
  - id: function_reset_router_by_ham_radio
    alias: 'Reset router by ham radio'
    trigger:
      platform: webhook
      webhook_id: 'dtmf'
    condition:
      condition: template
      value_template: "{{ trigger.data['code'] == '08' }}" # когда получен код "08"
    action:
     - service: switch.turn_off
       data:
         entity_id: switch.router # умная розетка/реле, через которую запитан роутер
     - delay: "00:00:03"
     - service: switch.turn_on
       data:
         entity_id: switch.router

В итоге, когда в вебхук придет код 08, то Home Assistant выключит розетку switch.router, подождет 3 секунды (т.к. роутер выключается не мгновенно после пропадания питания) и включит розетку снова.

Разумеется перезагрузка роутера это просто пример и таким же образом можно автоматизировать любые другие действия.

Альтернативные варианты

APRS

Радиолюбительством я увлекся недавно и меня сразу заинтересовало пакетное радио — APRS. Если без подробностей, то APRS позволяет передавать информацию о местоположении, телеметрию и прочие данные радиостанциям в округе. Home Assistant «из коробки» даже поддерживает отслеживание местоположения через APRS.

APRS маяки на карте
APRS маяки на карте.

А еще с помощью пакетного радио можно обмениваться короткими сообщениями. То есть получается поверх APRS можно сделать что-то типа чат-бота и подключить его к умному дому. Каких-то готовых решений я не нашел, но есть интересный проект aprsd, который как раз реализует подобный функционал, правда без привязки к Home Assistant.

Немного про APRS
Обзор технологии APRS: интеграция APRS с умным домом Home Assistant, шлюз в Telegram и чат-бот поверх APRS. Настройка APRSDroid и PocketPacket.

Вариант с APRS чат-ботом имеет свои ограничения и сложности, поэтому я все же остановился на более простом способе с DTMF. Хотя пока писал эту статью, то уже успел настроить шлюз на базе Home Assistant для пересылки сообщений из APRS в Skype 🙂 Поэтому если будет интересно, то расскажу подробнее.

DTMF реле

Home Assistant можно вообще выкинуть из схемы и воспользоваться модулем реле с поддержкой DTMF. Достаточно подключить принимающую рацию/телефон аудио кабелем к модулю и все.

Скриншот DTMF реле на AliExpress

LoRa

Вариант для любителей DIY и технологий 🙂 Если кратко, то LoRa это технология беспроводной связи, которая позволяет устройствам отправлять и принимать данные на больших расстояниях.

На Али можно найти ESP контроллеры с LoRa на борту, приделать к ним реле, написать прошивку и вот у вас умное реле, которым можно управлять на большом расстоянии.

Этим возможности LoRa не ограничиваются. На базе LoRa существуют разные прикольные проекты, например, Meshtastic, LoRaAPRS, но это все уже выходит за рамки статьи.

На этом все. 73!

Была ли статья полезна?

Хотите сказать спасибо? Кофе автору — ваша благодарность.

На кофе
Подписка на новые статьи

Уведомления, как только в блоге появится что-нибудь интересненькое.

Подписываясь, вы даете согласие на обработку персональных данных.