Категории

Проводная шина для умного дома: что выбрать самоделкину (без Zigbee и облаков)

19.12.2025 | Статья из категории: IOT умный дом

Проводная шина для умного дома: что выбрать самоделкину (без Zigbee и облаков)

Беспроводные технологии — удобны, но не надёжны. Wi-Fi падает, Zigbee глючит, а облака вообще не нужны, если вы строите систему для себя. Что делать, если хочется, чтобы свет включался мгновенно, даже когда интернета нет?

Ответ: проводная шина. Но не любая — а та, что дешёвая, простая и управляемая через вашу самописную MQTT-систему.

Забудьте про KNX и витую пару для реле

KNX — промышленный стандарт, но стоит как половина машины. А тянуть 8-жильную витую пару только чтобы включить лампочку — расточительство. Нам нужно:

Лучший выбор для DIY: RS-485 + питание

Оптимальная схема — двухпроводная дифференциальная шина RS-485 + отдельные провода для питания (12–24 В). Всего 4 жилы — легко взять кабель КВВГ 4×0.75 или даже часть UTP.

Преимущества:

Да, 32 устройства — это уже много. Остальное можно оставить на Zigbee: датчики движения в углах, беспроводные выключатели, уличные сенсоры. Провод — для backbone, радио — для edge.

Как интегрировать в MQTT-систему?

Вам нужен шлюз (gateway) — мост между RS-485 и MQTT. Он может быть на:

Шлюз делает две вещи:

  1. Слушает MQTT-топики вида home/relay/5/cmd → отправляет пакет по RS-485 устройству №5
  2. Слушает шину RS-485 → при получении статуса публикует в MQTT: home/relay/5/state

В итоге вся ваша самописная система «видит» проводные реле как обычные MQTT-устройства. Никакой разницы — только выше надёжность.

Простой протокол поверх RS-485

Modbus — избыточен. Делайте свой лёгкий пакет:

[ADDR][CMD][DATA][CRC8]

Пример: включить реле №3 → [0x03][0x01][0x01][CRC]

Каждое устройство на шине — микроконтроллер (ATmega328, ESP8266, STM32) + MAX485 + реле/датчик. Оно:


#include <WiFi.h>  
#include <PubSubClient.h>  

// === НАСТРОЙКИ ===
const char* ssid = "ВАШ_WIFI_SSID";
const char* password = "ВАШ_WIFI_PASSWORD";

// IP-адрес вашего Raspberry Pi (где Mosquitto)
const char* mqtt_server = "192.168.1.100";  // ← ЗАМЕНИТЕ на IP вашего Pi!
const int mqtt_port = 1883;

const char* mqtt_client_id = "esp32_rs485_gateway";
const char* mqtt_topic_cmd = "home/rs485/gateway/cmd";
const char* mqtt_topic_state = "home/rs485/gateway/state";

// === ПИНЫ ===
// Если у вас будет MAX485, раскомментируйте и настройте:
// const int rs485DE = 17;   // DE/RE пин модуля MAX485
// const int rs485RE = 17;   // часто DE и RE соединены

// === ГЛОБАЛЫ ===
WiFiClient espClient;
PubSubClient mqttClient(espClient);

// === CALLBACK: при получении команды по MQTT ===
void mqttCallback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Получено в топике: ");
  Serial.println(topic);

  // Преобразуем payload в строку
  String message = "";
  for (int i = 0; i < length; i++) {
    message += (char)payload[i];
  }
  message.trim();
  Serial.print("Сообщение: ");
  Serial.println(message);

  // Сюда добавите логику: отправить пакет по RS-485 нужному устройству
  // Например: sendRS485Packet(parseDeviceId(topic), message);

  // Пример: просто эхо-ответ
  mqttClient.publish(mqtt_topic_state, "Получено: " + message);
}

// === ПОДКЛЮЧЕНИЕ К MQTT ===
void mqttReconnect() {
  while (!mqttClient.connected()) {
    Serial.println("Подключаюсь к MQTT...");
    if (mqttClient.connect(mqtt_client_id)) {
      Serial.println("Успешно подключен к MQTT");
      mqttClient.subscribe(mqtt_topic_cmd);
      mqttClient.publish(mqtt_topic_state, "ESP32-GW онлайн");
    } else {
      Serial.print("Ошибка MQTT, rc=");
      Serial.print(mqttClient.state());
      Serial.println(" — повтор через 5 сек");
      delay(5000);
    }
  }
}

// === SETUP ===
void setup() {
  Serial.begin(115200);
  delay(500);
  Serial.println("\n\n=== ESP32 MQTT + RS-485 Gateway ===");

  // Подключаемся к Wi-Fi
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("\nWi-Fi подключён. IP: " + WiFi.localIP());

  // Настраиваем MQTT
  mqttClient.setServer(mqtt_server, mqtt_port);
  mqttClient.setCallback(mqttCallback);
}

// === LOOP ===
void loop() {
  if (!mqttClient.connected()) {
    mqttReconnect();
  }
  mqttClient.loop();

  // Здесь можно добавить:
  // - опрос RS-485 шины на входящие пакеты
  // - обработку таймеров, датчиков и т.п.
  // delay(10); // не слишком нагружайте шину
}

Итог: гибрид — это нормально

Профи «для себя» не ищут единого решения. Они делают так:

Такая система работает даже без интернета, не зависит от обновлений в облаке и полностью под вашим контролем.

А витовую пару оставьте для PoE-камер — не надо возить молоко на Ferrari.

Комментарии

Пока нет комментариев. Будьте первым!

Оставить комментарий

← Назад к списку статей

Важно: Блог-эксперимент

Блог только запустил, все статьи генерирую через нейросеть т.к. лень, возможны ошибки. Просто чтобы вы знали и не запускали ядерный реактор по моим статьям ))
Если у вас есть вопросы, или Нашли неточность? пишите в коментах — вместе поправим и сделаем статью более качественной. Я лично объясню нюансы из практики.

Посетителей сегодня: 0


кто я | книга | контакты

© Digital Specialist | Не являемся сотрудниками Google, Яндекса и NASA