Обновлено 2026-09-22

HomeMaster MiniPLC

HomeMaster, модель MiniPLC. 1/5 · USB, без пайки. Модуль Wi-Fi говорит со вторым микроконтроллером.

1. Название и модель

MiniPLC — открытый контроллер на DIN-рейку от home-master.eu. Мозг один: ESP32-WROOM-32U. Рядом не «закрытый Tuya MCU», а обычные микросхемы с опубликованными схемами. Каталог ставит сложность 1/5 и флаг made-for-esphome: прошивка заливается по USB-C, паять не нужно.

На плате шесть реле через расширители PCF8574, четыре изолированных входа 24 В, четыре входа 0–10 В на ADS1115, выход 0–10 В на MCP4725, два RTD на MAX31865, 1-Wire, часы PCF8563, экран SH1106 и изолированный RS-485 для модулей расширения. Ethernet LAN8720 по желанию, одновременно с Wi-Fi ESPHome его не поднимает.

Пины RS-485 в короткой карточке не продублированы. Их берут из README и даташита репозитория, не из гайда очистителя.

Контроллер HomeMaster MiniPLC
MiniPLC на DIN-рейке. Прошивка по USB-C, пайка не нужна. Фото: esphome/devices.esphome.io, GPL-3.0
Блок-схема MiniPLC
Блок-схема: ESP32, расширители и шина RS-485. Это схема, не фотография платы. Схема: esphome/devices.esphome.io, GPL-3.0

2. Что даёт перепрошивка

  • Реле, входы и аналоговые каналы в Home Assistant без облака
  • Modbus RTU к своим модулям на RS-485
  • USB-C для первой прошивки и логов
  • Схемы и даташит в открытом репозитории

3. Что теряется

  • Это не замена облачного кондиционера. Контроллер пустой, пока вы не опишете свою щитовую логику
  • Wi-Fi и Ethernet вместе не работают
  • Официальная прошивка производителя и ваш YAML — один чип. Откат означает залить их файл снова

4. Что понадобится

  • Кабель USB-C
  • ESPHome Dashboard или esphome run
  • Репозиторий isystemsautomation/homemaster-dev, каталог MiniPLC
  • Даташит PDF из того же репозитория, если нужны номера клемм

5. Разборка и пины

Программатор USB–UART подключают к модулю, который прошивают, крест-накрест:

  • Земля переходника (GND) — на землю платы. Этот провод обязателен.
  • TX переходника — на RX модуля. На плате площадка часто подписана RX, RXD или RXD0.
  • RX переходника — на TX модуля. На плате это TX, TXD или TXD0.
  • Питание логики — 3,3 В. Пять вольт на эти площадки не подают. Если плату уже кормит её блок, линию 3,3 В с переходника не подключают вторым источником.
  • Для входа в загрузчик ESP8266 и ESP32 площадку GPIO0 (IO0, BOOT) замыкают на землю и в этот момент подают питание. После старта записи землю с GPIO0 снимают.

Если у этой модели в тексте ниже другие имена площадок, прямой порядок TX–TX или прошивка по USB, делайте как написано там. Общая схема выше — для обычного модульного UART.

Корпус для прошивки не вскрывают. USB-C на лицевой стороне. Клеммы реле и входов подписаны в руководстве пользователя.

I2C в карточке: SDA GPIO32, SCL GPIO33. SPI для RTD: MISO GPIO12, MOSI GPIO13, CLK GPIO14, выбор чипа GPIO1 и GPIO3. Остальное — в README, чтобы не пересказывать таблицу с ошибкой.

Распиновка клемм MiniPLC
Подписи клемм. Номера GPIO, которых нет на этом рисунке, берут из README, не из гайда очистителя. Схема: esphome/devices.esphome.io, GPL-3.0

6. Прошивка

Готового файла «прошивка именно этой модели» на этом сайте нет. Её собирает ESPHome из текстового конфига YAML: туда входят Wi-Fi, пины и команды второго чипа. Чужой .bin из интернета почти наверняка собран с чужим паролем сети.

Какую программу ставить

  • ESPHome Dashboard — дополнение в Home Assistant или программа на компьютере. В ней пишут YAML, нажимают Install, и она сама собирает прошивку. Установка: дополнение для Home Assistant или команда pip install esphome.
  • ESPHome Web, сайт web.esphome.io, — загрузчик в браузере Chrome или Edge. Им записывают уже собранный .bin на ESP8266 и ESP32 через USB–UART. На BK72xx он не рассчитан.
  • esptool — программа Espressif, чтобы снять заводскую копию флеша и записать .bin, если браузер порт не видит. Репозиторий: espressif/esptool.
  • ltchiptool — то же самое для чипов Beken BK72xx (модули WB3S, WBR3, CB3S и похожие). ESPHome для них собирается через LibreTiny. Программа: libretiny-eu/ltchiptool, описание платы: компонент bk72xx.

Как собрать конфиг

  1. В Dashboard нажмите New Device и выберите чип, который стоит на плате: ESP8266, ESP32 или BK72xx. Имя — латиницей, без пробелов.
  2. Пароль Wi-Fi уберите в файл secrets.yaml рядом с конфигом. В YAML оставьте ssid: !secret wifi_ssid и password: !secret wifi_password.
  3. Блок UART, модель и скорости из раздела ниже вставьте в этот файл. Полный пример, если он длинный, берите по ссылке в источниках внизу страницы, а не из гайда соседней модели.
  4. Строки api: и ota: оставьте. Без api: Home Assistant устройство не увидит. Ключ шифрования Dashboard предлагает сам, его потом спросит интеграция ESPHome.

Как залить первый раз

  1. Подключите USB–UART, как в разделе «Разборка и пины»: земля переходника на землю платы, TX переходника на RX модуля, RX переходника на TX модуля. Логика 3,3 В. Имена площадок на конкретной плате — там же.
  2. Для ESP8266 и ESP32 замкните GPIO0 (IO0, BOOT) на землю и в этот момент подайте питание. Для BK72xx ltchiptool сам просит перезапустить чип, обычно кратким отключением земли.
  3. В Dashboard: Install → Plug into this computer, выберите порт переходника. Либо Install → Manual download, сохраните .bin и откройте его на web.esphome.io. Из терминала то же самое делает esphome run имя-устройства.yaml.
  4. Когда в логе появится IP-адрес, GPIO0 от земли отпустите, провода можно отпаять. Следующие обновления идут по Wi-Fi, пункт OTA, паяльник больше не нужен.

Дальше — только то, чем эта модель отличается от общей схемы.

В Dashboard создают устройство ESP32 и подставляют YAML из MiniPLC. Запись по USB-C, пункт Plug into this computer. GPIO0 руками замыкать не нужно: на плате есть USB-serial.

Компонент Modbus и скорость шины расширения берут из того же README. Скорость счётчика на другой стороне шины должна совпасть.

Базовый конфиг этой модели с карточки или из репозитория компонента. Wi-Fi, пароль и OTA задайте как в общем разделе выше. Пароли из исходника сюда не перенесены.

# miniplc.yaml
esphome:
  name: homemaster-miniplc
  name_add_mac_suffix: true
  friendly_name: HomeMaster MiniPLC
  comment: HomeMaster MiniPLC
  min_version: 2026.7.0
  project:
    name: homemaster.miniplc
    version: "1.2.0"

esp32:
  board: esp32dev
  framework:
    type: esp-idf
    version: recommended

logger:
  baud_rate: 115200

provisioning:
  # LED / status behaviour while the provisioning window is open is not
  # documented by upstream ESPHome and is not confirmed here — awaiting
  # clarification. Do not document observed quirks until upstream does.
  timeout: 15min
  on_timeout:
    then:
      - logger.log: "Provisioning window closed. Power-cycle the device to reopen it."

# RS-485 / Modbus RTU bus. The UART is exposed below as `uart_modbus`.
# Users can attach their own `modbus_controller:` blocks to integrate
# field devices (energy meters, expansion modules, etc.).
http_request:
  id: http_request_data

update:
  - platform: http_request
    id: firmware_update
    name: "Firmware Update"
    source: https://isystemsautomation.github.io/homemaster-dev/MiniPLC/Firmware/manifest.json
    update_interval: 6h

improv_serial:

esp32_improv:
  authorizer: none

dashboard_import:
  package_import_url: github://isystemsautomation/homemaster-dev/MiniPLC/Firmware/miniplc.yaml@main
  import_full_config: true

# Optional wired Ethernet (LAN8720 PHY)
# ethernet:
#   type: LAN8720
#   id: eth_phy
#   mdc_pin: GPIO23
#   mdio_pin: GPIO18
#   clk_mode: GPIO0_OUT
#   phy_addr: 1

uart:
  id: uart_modbus
  tx_pin: GPIO17
  rx_pin: GPIO16
  baud_rate: 19200

i2c:
  - id: bus_a
    sda: GPIO32
    scl: GPIO33
    frequency: 400kHz
    timeout: 1s
    scan: true
spi:
  miso_pin: GPIO12
  mosi_pin: GPIO13
  clk_pin: GPIO14
one_wire:
  - platform: gpio
    id: ow_bus_1
    pin: GPIO5
  - platform: gpio
    id: ow_bus_2
    pin: GPIO4

pcf8574:
  - id: pcf8574_hub_a
    address: 0x20
    pcf8575: false
  - id: pcf8574_hub_b
    address: 0x21
    pcf8575: false

ads1115:
  - id: ads1115_hub
    address: 0x48

time:
  - platform: pcf8563
    id: pcf8563_time
    address: 0x51
  - platform: homeassistant
    id: ha_time
    on_time_sync:
      then:
        - pcf8563.write_time:

font:
  - file: "gfonts://Roboto"
    id: font_small
    size: 8
  - file: "gfonts://Roboto"
    id: font_large
    size: 48
  - file: "gfonts://Roboto"
    id: font_medium
    size: 14

display:
  - platform: ssd1306_i2c
    id: oled_display
    model: "SH1106 128x64"
    address: 0x3C
    rotation: 180
    contrast: 100%
    update_interval: 1s
    lambda: |-
      it.printf(64, 0, id(font_small), TextAlign::TOP_CENTER, "HOMEMASTER");
      it.strftime(0, 60, id(font_large), TextAlign::BASELINE_LEFT, "%H:%M", id(pcf8563_time).now());

binary_sensor:
  - platform: status
    id: esp_status
    name: "ESP Status"
    entity_category: diagnostic

  - platform: gpio
    id: di_1
    name: "DI #1"
    pin:
      number: GPIO36
  - platform: gpio
    id: di_2
    name: "DI #2"
    pin:
      number: GPIO39
  - platform: gpio
    id: di_3
    name: "DI #3"
    pin:
      number: GPIO34
  - platform: gpio
    id: di_4
    name: "DI #4"
    pin:
      number: GPIO35

  - platform: gpio
    id: button_1
    name: "Button #1"
    pin:
      pcf8574: pcf8574_hub_a
      number: 0
      inverted: true
  - platform: gpio
    id: button_2
    name: "Button #2"
    pin:
      pcf8574: pcf8574_hub_a
      number: 1
      inverted: true
  - platform: gpio
    id: button_3
    name: "Button #3"
    pin:
      pcf8574: pcf8574_hub_a
      number: 2
      inverted: true
  - platform: gpio
    id: button_4
    name: "Button #4"
    pin:
      pcf8574: pcf8574_hub_a
      number: 3
      inverted: true

switch:
  - platform: gpio
    id: relay_1
    name: "RELAY #1"
    pin:
      pcf8574: pcf8574_hub_b
      number: 2
      mode:
        output: true
      inverted: true
  - platform: gpio
    id: relay_2
    name: "RELAY #2"
    pin:
      pcf8574: pcf8574_hub_b
      number: 1
      mode:
        output: true
      inverted: true
  - platform: gpio
    id: relay_3
    name: "RELAY #3"
    pin:
      pcf8574: pcf8574_hub_b
      number: 0
      mode:
        output: true
      inverted: true
  - platform: gpio
    id: relay_4
    name: "RELAY #4"
    pin:
      pcf8574: pcf8574_hub_a
      number: 6
      mode:
        output: true
      inverted: true
  - platform: gpio
    id: relay_5
    name: "RELAY #5"
    pin:
      pcf8574: pcf8574_hub_a
      number: 5
      mode:
        output: true
      inverted: true
  - platform: gpio
    id: relay_6
    name: "RELAY #6"
    pin:
      pcf8574: pcf8574_hub_a
      number: 4
      mode:
        output: true
      inverted: true

  - platform: gpio
    id: led_2
    name: "LED #2"
    pin:
      pcf8574: pcf8574_hub_b
      number: 3
      mode:
        output: true
      inverted: true
  - platform: gpio
    id: led_3
    name: "LED #3"
    pin:
      pcf8574: pcf8574_hub_b
      number: 4
      mode:
        output: true
      inverted: true

  - platform: template
    id: buzzer_switch
    name: "Buzzer"
    optimistic: true
    turn_on_action:
      - output.turn_on: buzzer_output
      - output.ledc.set_frequency:
          id: buzzer_output
          frequency: "2441Hz"
      - output.set_level:
          id: buzzer_output
          level: "75%"
    turn_off_action:
      - output.turn_off: buzzer_output

fan:
  - platform: speed
    id: dac_fan
    output: dac_output
    name: "DAC 0-10V"

sensor:
  - platform: uptime
    id: esp_uptime
    name: "Uptime"
    update_interval: 60s
    entity_category: diagnostic
  - platform: wifi_signal
    id: wifi_signal_db
    name: "WiFi Signal"
    update_interval: 60s
    entity_category: diagnostic
  - platform: internal_temperature
    id: esp32_temperature
    name: "ESP32 Temperature"
    update_interval: 60s
    entity_category: diagnostic

  - platform: ads1115
    id: ai_1
    ads1115_id: ads1115_hub
    multiplexer: 'A3_GND'
    gain: 6.144
    name: "AI 1"
    update_interval: 60s
    filters:
      - multiply: 3
  - platform: ads1115
    id: ai_2
    ads1115_id: ads1115_hub
    multiplexer: 'A2_GND'
    gain: 6.144
    name: "AI 2"
    update_interval: 60s
    filters:
      - multiply: 3
  - platform: ads1115
    id: ai_3
    ads1115_id: ads1115_hub
    multiplexer: 'A1_GND'
    gain: 6.144
    name: "AI 3"
    update_interval: 60s
    filters:
      - multiply: 3
  - platform: ads1115
    id: ai_4
    ads1115_id: ads1115_hub
    multiplexer: 'A0_GND'
    gain: 6.144
    name: "AI 4"
    update_interval: 60s
    filters:
      - multiply: 3

  # Optional 1-Wire Dallas temperature sensors — enable per bus.
  # Set explicit `address:` if you connect multiple sensors on the same bus.
  # - platform: dallas_temp
  #   id: ow_bus_1_temp
  #   one_wire_id: ow_bus_1
  #   name: "1-Wire Bus 1 Temperature"
  #   update_interval: 60s
  # - platform: dallas_temp
  #   id: ow_bus_2_temp
  #   one_wire_id: ow_bus_2
  #   name: "1-Wire Bus 2 Temperature"
  #   update_interval: 60s

  # Optional MAX31865 RTD inputs (PT100 / PT1000) over SPI.
  # Requires `spi:` block above to be enabled with miso/mosi/clk pins.
  # - platform: max31865
  #   id: rtd_1
  #   name: "RTD Temperature 1"
  #   cs_pin: GPIO1
  #   reference_resistance: 400 Ω
  #   rtd_nominal_resistance: 100 Ω
  #   update_interval: 60s
  # - platform: max31865
  #   id: rtd_2
  #   name: "RTD Temperature 2"
  #   cs_pin: GPIO3
  #   reference_resistance: 4000 Ω
  #   rtd_nominal_resistance: 1000 Ω
  #   update_interval: 60s

text_sensor:
  - platform: template
    id: current_time
    name: "Current Time"
    entity_category: diagnostic
    update_interval: 60s
    lambda: |-
      char str[17];
      time_t currTime = id(pcf8563_time).now().timestamp;
      strftime(str, sizeof(str), "%Y-%m-%d %H:%M", localtime(&currTime));
      return { str };
  - platform: version
    id: esphome_version
    name: "ESPHome Version"
    entity_category: diagnostic
  - platform: wifi_info
    ip_address:
      id: wifi_ip_address
      name: "IP Address"
      entity_category: diagnostic

output:
  - platform: ledc
    id: buzzer_output
    pin: GPIO2
  - platform: mcp4725
    id: dac_output
    address: 0x60

status_led:
  id: st_led
  pin:
    pcf8574: pcf8574_hub_a
    number: 7
    mode:
      output: true
    inverted: false

7. Настройка в Home Assistant

Шесть реле появятся отдельными выключателями, если они есть в YAML производителя. Входы 24 В — бинарные сенсоры. Первое включение реле делайте без нагрузки, пока не сверили номер клеммы.

8. Известные баги и как их обойти

  • Wi-Fi и Ethernet в одном файле ESPHome не собираются
  • GPIO1 и GPIO3 заняты выбором чипа RTD. Журнал UART на них мешает SPI, если вы его туда направите
  • Чужой YAML реле KinCony на эту плату не переносится

9. Источники