Реклама
Интеллектуальные розетки - это самый простой способ автоматизации вашего дома, но по цене около 40 долларов за розетку на основе Wi-Fi или ZWave вы вряд ли купите больше, чем несколько.
Возможно, у вас уже есть несколько дешевых РЧ-разъемов, которые поставляются с собственным пультом дистанционного управления и имеют некоторые переключатели каналов и идентификаторов на задней панели. К сожалению нет умные дома хабы на рынке Битва за Умный Дом Хабы: что там и что будет? Прочитайте больше которые работают с теми. Разве не было бы замечательно, если бы вы могли как-то связать их со своей домашней системой умного дома? Ну, вы можете - довольно легко на самом деле - с около $ 10 по частям.
Приложив немного больше работы, вы также можете интегрировать некоторые другие специализированные удаленные аппаратные средства на основе RF, такие как этот бюджетный киноэкран.
Что вам нужно:
- ESP8266 NodeMCU v12E dev board (точная модель не имеет значения, v1 или v3 тоже должны быть в порядке). Причина, по которой мы используем плату NodeMCU, заключается в том, что позже мы хотим получить простое соединение Wi-Fi. Ссылка для пакета из 2, который стоит по 7 долларов каждый.
- Пакет 433 МГц передатчик и приемник (около 3 долларов).
- Библиотеки RCSwitch и MQTT и наш код - все доступно для скачивания с Github.
- MQTT-сервер, локальный или удаленный.
- Некоторые РЧ-разъемы работают в диапазоне 433 МГц (это следует сказать на пульте дистанционного управления). Я купил свой у Maplin как пакет из 3 около 20 фунтов стерлингов ($ 25,89).
Если вы впервые программируете плату NodeMCU, вам нужно скачать для нее плагины Arduino: следуйте первой части нашего Arduino Killer вводное руководство Встречайте убийцу Ардуино: ESP8266Что если я скажу вам, что есть Arduino-совместимая dev-плата со встроенным Wi-Fi менее чем за 10 долларов? Ну, есть. Прочитайте больше для чипа NodeMCU / ESP8266. Вам также понадобится Драйверы CH430. Ты можешь найти подписанные драйверы macOS CH430 здесь, или же Windows здесь.
Я использовал v1.6.5 Arduino, потому что все, что выше, создает больше проблем, чем решает. Понизьте рейтинг, если вы еще этого не сделали.
Прежде чем продолжить, я собираюсь принять базовый уровень знаний о Arduino программирование Программирование Arduino для начинающих: учебник по проекту светофораСоздание контроллера светофора Arduino поможет вам развить базовые навыки кодирования! Мы начали. Прочитайте больше и что у вас есть настройки NodeMCU в менеджере форума, и вы можете правильно загрузить некоторый демонстрационный код. Вы также должны были добавить библиотеки, включенные в нашу загрузку, к вашему Arduino / библиотеки папки.
Если у вас есть существующий Библиотека PubSubClient или MQTT, сделайте резервную копию и удалите его - тот, который я включил в загрузку, является единственным, где я мог надежно получать сообщения на NodeMCU, и я попытался много!
RF нюхает (опционально)
Этот шаг не требуется, если вы хотите управлять только разъемами DIP-переключателя или селектора набора - они поддерживаются "из коробки", и потребуется минимальное изменение кода (это все еще интересно сделать в первую очередь, поэтому вы поймете, что происходит за сцены).
Если у вас есть другие РЧ-пульты, которые вы хотели бы попробовать добавить, вам нужно сначала «прослушать» передаваемые РЧ-коды. Для этого загрузите ReceiveDemo_Advanced эскиз от Меню -> Примеры -> RCSwitch папку и измените следующую строку с 0
mySwitch.enableReceive (0); // Приемник по прерыванию 0 => это вывод № 2
до 2.
mySwitch.enableReceive (2); // Приемник на GPIO 2 / D4.
Подключите модуль приемника следующим образом. Если смотреть на переднюю панель приемника (она длиннее двух, передатчик квадратный) - сторона с компонентами:
- Далеко справа - земля. Подключитесь к GND на плате NodeMCU.
- Крайний левый VCC. Подключитесь к VIN на плате NodeMCU.
- Средние два пина являются сигналом. Подключите любой из них к D4 на NodeMCU (они соединены вместе, поэтому не важно, какой именно).

Теперь загрузите измененный ReceiveDemo_Advancedи когда это будет сделано, откройте последовательный монитор и начните нажимать кнопки на пульте дистанционного управления. Скопируйте десятичную (включая битовую длину), длительность импульса и протокол при нажатии кнопки.

После этого я обнаружил, что экран моего проектора
- ЭКРАН ВВЕРХ: Получено 8694273/24 бита; Длина импульса: 355 или 356; Протокол: 1
- ЭКРАН ВНИЗ: получен 8694276 / 24бит;Длина импульса: 355 или 356; Протокол: 1
Продолжайте столько кнопок, сколько вам нужно.
Тестирование передатчика
Далее мы попробуем отправить коды с помощью передатчика. Подключите модуль передатчика (квадратный) следующим образом. Будьте осторожны: маркировка на этих штифтах ужасна.
Вывод VCC на самом деле посередине, а не на левой стороне. Я уничтожил один модуль в процессе выяснения этого. То, что говорит «АТАД», на самом деле «ДАННЫЕ», пишется в обратном направлении. Опять же, данные поступают на D4, VCC на VIN и GND на GND (удалите модуль приемника, он вам больше не нужен).

Загрузите Примеры -> RCSwitch -> TypeB_WithRotaryOrSlidingSwitchesи снова измените контакт данных:
mySwitch.enableTransmit (10);
в
mySwitch.enableTransmit (2);
Обратите внимание, что в библиотеку включены различные примеры, и то, какой из них вам подходит, будет зависеть от того, какой именно тип коммутатора у вас есть. Тип A (DIP-переключатели) и B (диски или ползунки) являются наиболее распространенными - обратитесь к рисункам на странице RCSwitch. Для типа B включить и выключить сокет так же просто, как:
mySwitch.switchOn (1, 4); mySwitch.switchOff (1, 4);
где 1 - идентификатор канала (верхний диск), а 4 - идентификатор сокета (нижний диск). Они были написаны римскими цифрами на моих розетках. Поэтому можно адресовать максимум 16 отдельных сокетов, хотя несколько сокетов могут использовать один и тот же адрес, если у вас есть несколько устройств для одновременного включения.
Однако экран моего проектора немного отличался - использовалась другая длина импульса. Итак, чтобы оперировать тем, работало следующее. Обратите внимание, что вы также можете определить другой протокол, если он нужен вашему пульту, НО убедитесь, что вы определили протокол ДО длительности импульса. Длина импульса перезаписывается при смене протокола.
// Обратите внимание, что мой экран на самом деле требует ДВА нажатия кнопки (не долгое нажатие, а два физических нажимает), поэтому я немного задерживаю, а затем отправляю тот же сигнал снова void screenUp () { mySwitch.setPulseLength (358); mySwitch.send (8694273,24); // (десятичный код, количество бит) delay (2000); mySwitch.send (8694273,24); } void screenDown () {mySwitch.setPulseLength (358); mySwitch.send (8694276,24); задержка (2000 год); mySwitch.send (8694276,24); }
Прежде чем переходить к следующему шагу, проверьте все ваши коды.
Управление через MQTT
Откройте эскиз, который вы скачали с Github с именем mqtt_rcswitch.inoи начните с изменения сетевого SSID и пароля для вашего дома. Затем измените имя канала, если хотите, и установите сервер MQTT. Если у вас еще нет сервера MQTT, работающего на вашей установке OpenHAB, прочитайте часть 2 нашего руководства для начинающих OpenHAB Руководство для начинающих OpenHAB, часть 2: ZWave, MQTT, правила и графикиOpenHAB, программное обеспечение для домашней автоматизации с открытым исходным кодом, намного превосходит возможности других систем домашней автоматизации, представленных на рынке, но настроить его нелегко. На самом деле, это может быть совершенно расстраивающим. Прочитайте больше . Обратите внимание, что мой код предназначен для розеток типа B (поворотный переключатель), хотя вы можете легко изменить его и для DIP-переключателей.
Наиболее важной частью кода является Сообщение получено() функция, которая реагирует на входящие команды MQTT. В этой функции мы сначала проверяем основное ключевое слово - я выбрал «switch» и «screen». В случае «переключателя» мы затем анализируем канал и идентификатор разъема; затем проверьте тело полезной нагрузки для команды.
void messageReceived (тема String, полезная нагрузка String, байты char *, длина целого без знака) {if (topic.indexOf ("switch")> = 0) {// переключаем управление, разбираем канал и вставляем идентификатор int channel = getValue (Тема, '/', 3) .toInt (); int plug = getValue (topic, '/', 4) .toInt (); if (payload == "on") {mySwitch.switchOn (channel, plug); } else {mySwitch.switchOff (channel, plug); }} else if (topic.indexOf ("screen")> = 0) {// управление экраном if (payload == "up") {screenUp (); } else if (payload == "down") {screenDown (); }} / * добавьте еще один, если здесь, чтобы прослушать дополнительные команды (или просто измените приведенную выше, если вам не нужен экран) * / }
Тогда по умолчанию работают следующие команды MQTT:
гостиная / управление / выключатель / X / Y (где X - канал, а Y - идентификатор разъема; с включенным или выключенным телом сообщения)
гостиная / контроль / экран (с телом сообщения вверх или вниз)
Используйте командную строку или GUI MQTT-клиент, чтобы протестировать свои устройства перед добавлением в OpenHAB.
Добавление в OpenHAB
В качестве последнего шага нам просто нужно создать некоторые элементы для этих переключателей в OpenHAB. На данный момент я определил следующие пункты, но вы сможете понять, как добавить больше:
/ * Устройства RF433mHz * / Переключить CinemaScreen «Экран» (Cinema) {mqtt = "> [посредник: гостиная / управление / экран: команда: ВКЛ: вниз],> [посредник: гостиная / управление / экран: команда: ВЫКЛ: вверх]"} Switch Switch41 "Switch41" (Cinema) {mqtt = "> [брокер: гостиная / управление / переключатель / 4/1: команда: ON: on],> [брокер: гостиная / управление / переключатель / 4/1: команда: OFF: off] "} Switch Switch42 "Switch42" (Cinema) {mqtt = "> [брокер: гостиная / управление / переключатель / 4/2: команда: ON: on],> [брокер: гостиная / управление / переключатель / 4/2: команда: OFF: off] "}
Теперь вы должны иметь возможность управлять своими RF устройствами из OpenHAB! Одной вещью, которую я был приятно удивлен, был диапазон - единственный узел мог покрыть большую часть моего дома. Конечно, вы можете добавить другой узел, прослушивая тот же канал, который просто повторяет те же команды, если вам нужно дополнительное покрытие.
Единственное ограничение, о котором следует помнить, это то, что сами сокеты не могут сообщить о своем статусе, так что если используйте оригинальный пульт дистанционного управления, контроль состояния сокета может не быть точно отражен в OpenHAB. Придерживайтесь только использования интерфейса OpenHAB, и все будет в порядке.
Вопросы или проблемы? Спросите в комментариях, и я сделаю все возможное, чтобы помочь. Если вы хотите улучшить мой код, не стесняйтесь отправлять запрос на удаление.
Джеймс имеет степень бакалавра в области искусственного интеллекта и сертифицирован CompTIA A + и Network +. Он является ведущим разработчиком MakeUseOf и проводит свое свободное время за игрой в VR-пейнтбол и настольные игры. Он строит компьютеры с детства.