Не могу подключить ИБП PowerMan Online 1000 Plus по RS-232

Пытаюсь подключить ИБП по порту RS 232 контролер WB 7 с прошивкой wb-2410
Модель ИБП: PowerMan Online 1000 Plus
Подключение: RS-232 к ttyMOD2
Конфигурация /etc/nut/ups.conf:

[powerman]
    driver = blazer_ser
    port = /dev/ttyMOD2
    desc = "PowerMan Online 1000 Plus on WB"

Библиотеку /lib/nut/megatec не находит (No such file or directory )
с библиотекой `/lib/nut/blazer_ser - выдает ошибку

Результат systemctl status nut-driver.service:

● nut-driver.service - Network UPS Tools - power device driver controller
     Loaded: loaded (/lib/systemd/system/nut-driver.service; static)
     Active: failed (Result: exit-code) since Sat 2025-06-28 16:08:23 UTC; 11s ago
    Process: 21579 ExecStart=/sbin/upsdrvctl start (code=exited, status=1/FAILURE)
        CPU: 51ms

Jun 28 16:08:06 wirenboard-APBCR36S upsdrvctl[21712]: No supported UPS detected
Jun 28 16:08:06 wirenboard-APBCR36S upsdrvctl[21712]: Network UPS Tools - Megatec/Q1 protocol serial driver 1.57 (2.7.4)
Jun 28 16:08:06 wirenboard-APBCR36S upsdrvctl[21579]: Driver failed to start (exit status=1)
Jun 28 16:08:23 wirenboard-APBCR36S upsdrvctl[21841]: No supported UPS detected
Jun 28 16:08:23 wirenboard-APBCR36S upsdrvctl[21841]: Network UPS Tools - Megatec/Q1 protocol serial driver 1.57 (2.7.4)
Jun 28 16:08:23 wirenboard-APBCR36S upsdrvctl[21579]: Driver failed to start (exit status=1)
Jun 28 16:08:23 wirenboard-APBCR36S upsdrvctl[21579]: Network UPS Tools - UPS driver controller 2.7.4
Jun 28 16:08:23 wirenboard-APBCR36S systemd[1]: nut-driver.service: Control process exited, code=exited, status=1/FAILURE
Jun 28 16:08:23 wirenboard-APBCR36S systemd[1]: nut-driver.service: Failed with result 'exit-code'.
Jun 28 16:08:23 wirenboard-APBCR36S systemd[1]: Failed to start Network UPS Tools - power device driver controller.
root@wirenboard-APBCR36S:~# journalctl -xe
Jun 28 16:08:18 wirenboard-APBCR36S Node-RED[342]:     at Async.drainQueues [as _onImmediate] (/mnt/data/root/.node-red/node_modules/bluebird/js/release/async.js:15:14)
Jun 28 16:08:18 wirenboard-APBCR36S Node-RED[342]:     at process.processImmediate (node:internal/timers:478:21)
Jun 28 16:08:23 wirenboard-APBCR36S upsdrvctl[21841]: No supported UPS detected
Jun 28 16:08:23 wirenboard-APBCR36S upsdrvctl[21841]: Network UPS Tools - Megatec/Q1 protocol serial driver 1.57 (2.7.4)
Jun 28 16:08:23 wirenboard-APBCR36S upsdrvctl[21579]: Driver failed to start (exit status=1)
Jun 28 16:08:23 wirenboard-APBCR36S upsdrvctl[21579]: Network UPS Tools - UPS driver controller 2.7.4
Jun 28 16:08:23 wirenboard-APBCR36S systemd[1]: nut-driver.service: Control process exited, code=exited, status=1/FAILURE

попробовал выполнить диагностику порта с помощью minicom, в ответ тишина, на стандартные команды не реагирует


Попробовал петлевой тест (замкнул провода RX и TX), minicom выдает эхо (дублирует символы), значит плата rs 232 и кортроллер отрабатывают корректно.

Распиновку брал дефолтную


Пробовал менять местами RX и TX

Залез внутрь ИБП выглядит как будто пины стандартные (к ним подходит распайка), основная плата к которой идет шлейф от порта rs 232 - это Megatec, тоже как будто стандартная.

Еще наткнулся на такой форум где человек подключал аналогичный ИБП к ардуинке и пишет что у него все заработало в штатных командах
https://radiokot.ru/forum/viewtopic.php?f=11&t=188086&p=4408271
один из пользователей в конце темы пишет что использовал драйвер powercom для моей модели ИБП, попробовал с этим драйвером (он есть в комплекте WB), драйвер поднялся, ИБП видит, но обратную связь от ИБП не получает. Попытался поменять типы в /etc/nut/ups.conf ( KIN → IMP → BNT ->BNT-other и т.д.), но тоже не помогло выдает “data receiving error (0 instead of 16 или 11 bytes)”

[powerman]
    driver = powercom
    port = /dev/ttyMOD2
    desc = "PowerMan Online 1000 Plus on WB"
    type = KIN
systemctl status nut-driver.service --no-pager
● nut-driver.service - Network UPS Tools - power device driver controller
     Loaded: loaded (/lib/systemd/system/nut-driver.service; static)
     Active: active (running) since Sun 2025-06-29 04:50:51 UTC; 7s ago
    Process: 7442 ExecStart=/sbin/upsdrvctl start (code=exited, status=0/SUCCESS)
   Main PID: 7468 (powercom)
      Tasks: 1 (limit: 4790)
     Memory: 180.0K
        CPU: 24ms
     CGroup: /system.slice/nut-driver.service
             └─7468 /lib/nut/powercom -a powerman

Jun 29 04:50:48 wirenboard-APBCR36S systemd[1]: Starting Network UPS Tools - power device driver controller...
Jun 29 04:50:51 wirenboard-APBCR36S upsdrvctl[7443]: data receiving error (0 instead of 16 bytes)
Jun 29 04:50:51 wirenboard-APBCR36S upsdrvctl[7442]: Network UPS Tools - UPS driver controller 2.7.4
Jun 29 04:50:51 wirenboard-APBCR36S powercom[7468]: Startup successful
Jun 29 04:50:51 wirenboard-APBCR36S systemd[1]: Started Network UPS Tools - power device driver controller.
Jun 29 04:50:54 wirenboard-APBCR36S powercom[7468]: data receiving error (0 instead of 16 bytes)
Jun 29 04:50:57 wirenboard-APBCR36S powercom[7468]: **data receiving error (0 instead of 16 bytes)**

Есть какие-то мысли как завести этот ИБП в WB?

WB замечательно работает с SNMP, сам через wb-mqtt-snmp рулю UPS’ом. Для Вашей модели есть карта DL801, на Авито от 3 т.р.

1 Like

Спасибо за альтернативный вариант, покопаю в эту сторону. Но хотелось бы все же тему с RS 232 добить.

Добрый день!
Для диагностики проблемы пришлите, пожалуйста, архив с диагностической информацией контроллера. Создание архива описано в документации.

Добрый день.

А если отключить от ИБП кабель и замкнув RX/TX проверить “эхо”? Хоть с помощью minicom.

Ага, перечитал - увидел что уже проверено.
Ну, я б проверил еще с компьютера, но, подозреваю что с ИБП что-то.

диагностический архив во вложении
diag_APBCR36S_2025-07-05-09.30.07.zip (326,7 КБ)

Непосредственно перед созданием архива воспроизвел проблему с подключением
Активная конфигурация в /etc/nut/ups.conf на момент сбора логов:

  • driver = powercom
  • type = KIN

Драйвер запускается (active (running)), но в логах появляются ошибки “data receiving error”

а что под этим подразумевается?

А почему процесс powercom занимает порт совместно с драйвером wb-mqtt-serial? То есть - порт в драйвере не выключен.

Поставить на компьютер NUT и попробовать настроить ту же конфигурацию.
Ну и полезно добавить в конфиг debug_min b gjcvjnhtnm -

Порт действительно занят двумя процессами (драйвером и штатной службой mqtt-serial от WB. Если я полностью отключаю в настройках консоли WB данный порт, то такое чувство что он не инициализируется (петлевой тест не работает при включенном драйвере и отключенных настройках в WB). Если я включаю RS 232 на порт /dev/ttyMOD2 в WB, то после инициализации он его не отпускает и драйвер висит вместе с WB на этом порту:

lsof /dev/ttyMOD2
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
wb-mqtt-s 1679 root   10u   CHR   4,70      0t0  427 /dev/ttyS6
powercom  2188  nut    4u   CHR   4,70      0t0  427 /dev/ttyS6
more /etc/wb-mqtt-serial.conf
    {
      "baud_rate" : 2400,
      "data_bits" : 8,
      "devices" : [],
      "enabled" : true,
      "parity" : "N",
      "path" : "/dev/ttyMOD2",
      "stop_bits" : 1
    },

Выполняю остановку wb-mqtt-serial, порт используется только драйвером

lsof /dev/ttyMOD2
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
powercom 2188  nut    4u   CHR   4,70      0t0  427 /dev/ttyS6

Смотрю статус, драйвер с устройством не взаимодействует (параметры пробовал разные, TX RX местами менял)

/lib/nut/powercom -DDDDD -a powerman
Network UPS Tools - PowerCom protocol UPS driver 0.17 (2.7.4)
   0.000000     send_to_all: SETINFO driver.parameter.port "/dev/ttyMOD2"
   0.000218     send_to_all: SETINFO driver.parameter.type "KIN"
   0.000351     debug level is '5'
   0.004385     Flow control disable
   0.004606     Num of bytes requested for reading from UPS: 16
   3.007736     data receiving error (0 instead of 16 bytes)
   3.007871     send_to_all: SETINFO device.type "ups"
   3.007914     send_to_all: SETINFO driver.version "2.7.4"
   3.007952     send_to_all: SETINFO driver.version.internal "0.17"
   3.007992     send_to_all: SETINFO driver.name "powercom"
   3.008029     send_to_all: SETINFO ups.mfr "PowerCom"
   3.008065     send_to_all: SETINFO ups.model "Unknown"
   3.008101     send_to_all: SETINFO ups.serial "Unknown"
   3.008136     send_to_all: SETINFO ups.model.type "KIN"
   3.008172     send_to_all: SETINFO input.voltage.nominal "230"
   3.008209     send_to_all: ADDCMD test.battery.start
   3.008243     send_to_all: ADDCMD shutdown.return
   3.008275     send_to_all: ADDCMD shutdown.stayoff
   3.008399     Num of bytes requested for reading from UPS: 16
   6.011524     data receiving error (0 instead of 16 bytes)
   6.011883     dstate_init: sock /run/nut/powercom-powerman open on fd 5
   6.011970     send_to_all: SETINFO driver.parameter.pollinterval "2"
   6.012012     send_to_all: SETINFO driver.parameter.synchronous "no"
   6.012055     send_to_all: SETINFO device.mfr "PowerCom"
   6.012094     send_to_all: SETINFO device.model "Unknown"
   6.012134     send_to_all: SETINFO device.serial "Unknown"
   6.012270     Num of bytes requested for reading from UPS: 16
   9.015398     data receiving error (0 instead of 16 bytes)

Линукс машины тем более с com портом нет к сожалению, буду искать, но это долгая история

powercom не знает про такой параметр к сожалению работает только с опцией “/lib/nut/powercom -DDDDD -a powerman”, с debug_min выдает ошибку:

Jul 13 09:29:29 wirenboard-APBCR36S upsdrvctl[19911]: Fatal error: 'debug_min' is not a valid variable name for this driver.
Jul 13 09:29:29 wirenboard-APBCR36S systemd[1]: nut-driver.service: Failed with result 'exit-code

Есть ощущение что дело все же в драйвере. Но вот какой драйвер для него применить непонятно тем более с учетом ограниченности выбора на контроллере.
Есть еще какие-то мысли что можно попробовать?

А если nut указать порт в таком виде?
Я понимаю, что симлинк, но мало ли

Порт должен быть сконфигурирован в wb-hardware но не должен быт включен в настройках wb-mqtt-serial.

      "enabled" : false,
1 Like

Попробуй - blazer_ser (упрощённый/китайские клоны) и nutdrv_qx (гибридный драйвер, умеет Megatec и другие). NUTDRV_QX(8)

2 Likes

Ребята, огромное спасибо!!! все завелось))) скупая мужская слеза прокатилась по моей щеке когда я увидел вывод на консоли))

После изменения настроек порт действительно освободился и стал доступен монопольно для драйвера

Да, после замены драйвера на nutdrv_qx увидел первый вывод на экране, но часть парамтров он выдал с ошибками, в частности заряд батареи, который был для меня очень важен. После чего поменял драйвер на blazer_ser и все заработало. Огромное спасибо за совет!!!
Делюсь настройками, может кому-то еще потребуется подружить этот упс с wirenboard по rs 232:

nano /etc/nut/ups.conf
[powerman]
    driver = blazer_ser
#    driver = nutdrv_qx
    port = /dev/ttyMOD2
    desc = "PowerMan Online 1000 Plus on WB"

sudo service nut-server stop
sudo service nut-server start
sudo service nut-server status

● nut-server.service - Network UPS Tools - power devices information server
Loaded: loaded (/lib/systemd/system/nut-server.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2025-07-19 11:19:26 UTC; 14min ago
Process: 12678 ExecStart=/sbin/upsd (code=exited, status=0/SUCCESS)
Main PID: 12679 (upsd)
Tasks: 1 (limit: 4790)
Memory: 428.0K
CPU: 2.029s
CGroup: /system.slice/nut-server.service
└─12679 /lib/nut/upsd

Jul 19 11:19:26 wirenboard-APBCR36S upsd[12678]: listening on ::1 port 3493
Jul 19 11:19:26 wirenboard-APBCR36S upsd[12678]: listening on 127.0.0.1 port 3493
Jul 19 11:19:26 wirenboard-APBCR36S upsd[12678]: listening on ::1 port 3493
Jul 19 11:19:26 wirenboard-APBCR36S upsd[12678]: Connected to UPS [powerman]: blazer_ser-powerman
Jul 19 11:19:26 wirenboard-APBCR36S upsd[12678]: Connected to UPS [powerman]: blazer_ser-powerman
Jul 19 11:19:26 wirenboard-APBCR36S upsd[12679]: Startup successful
Jul 19 11:19:26 wirenboard-APBCR36S systemd[1]: Started Network UPS Tools - power devices information server.
Jul 19 11:19:30 wirenboard-APBCR36S upsd[12679]: User monitor@127.0.0.1 logged into UPS [powerman]
Jul 19 11:29:42 wirenboard-APBCR36S upsd[12679]: Can’t connect to UPS [powerman] (blazer_ser-powerman): Connection refused
Jul 19 11:33:24 wirenboard-APBCR36S upsd[12679]: Connected to UPS [powerman]: blazer_ser-powerman

upsc powerman@localhost

Init SSL without certificate database
battery.charge: 100
battery.voltage: 26.88
battery.voltage.high: 26.00
battery.voltage.low: 20.80
battery.voltage.nominal: 24.0
device.mfr:
device.model:
device.type: ups
driver.name: blazer_ser
driver.parameter.pollinterval: 2
driver.parameter.port: /dev/ttyMOD2
driver.parameter.synchronous: no
driver.version: 2.7.4
driver.version.internal: 1.57
input.current.nominal: 4.0
input.frequency: 50.0
input.frequency.nominal: 50
input.voltage: 226.6
input.voltage.fault: 226.8
input.voltage.nominal: 220
output.voltage: 220.2
ups.beeper.status: enabled
ups.delay.shutdown: 30
ups.delay.start: 180
ups.firmware: V062B000D0
ups.load: 41
ups.mfr:
ups.model:
ups.status: OL
ups.temperature: 21.0
ups.type: online

Пришлось немного подружить mqtt с драйвером. В консоли WB дописал в правилах мост ups-mqtt-bridge.js

/*
 *  Универсальный скрипт для создания виртуального устройства ИБП
 *  и переноса в него данных из NUT.
 *
 *  - Частота обновления: 2 секунды.
 *  - Выводятся все запрошенные параметры.
 */

// --- КОНФИГУРАЦИЯ ---
// ID нашего будущего устройства в /devices/
var DEVICE_ID = "my_ups";
var DEVICE_TITLE = "My UPS"; // Название, которое будет видно в интерфейсе

// --- Часть 1: Создание виртуального устройства ---
// Эта функция будет вызвана один раз при запуске правила.
// Она создаст все необходимые /meta топики, чтобы система "увидела" устройство.
function create_ups_device() {
  log("Creating virtual UPS device '{}'...", DEVICE_ID);

  // Определяем само устройство
  defineVirtualDevice(DEVICE_ID, {
    title: DEVICE_TITLE,
    cells: {
      // Статусные параметры
      ups_status: { type: "text", value: "N/A", readonly: true, order: 1 },
      ups_load: { type: "value", value: 0, units: "%", readonly: true, order: 2 },
      ups_temperature: { type: "temperature", value: 0, readonly: true, order: 3 },
      ups_beeper_status: { type: "text", value: "", readonly: true, order: 4 },
      
      // Параметры входного напряжения
      input_voltage: { type: "voltage", value: 0, readonly: true, order: 10 },
      input_voltage_nominal: { type: "voltage", value: 0, readonly: true, order: 11, title: "Input Voltage Nominal" },
      input_voltage_fault: { type: "voltage", value: 0, readonly: true, order: 12, title: "Input Voltage Fault" },
      input_frequency: { type: "value", value: 0, units: "Hz", readonly: true, order: 13 },
      input_frequency_nominal: { type: "value", units: "Hz", value: 0, readonly: true, order: 14, title: "Input Frequency Nominal" },
      input_current_nominal: { type: "value", units: 'A', value: 0, readonly: true, order: 15, title: "Input Current Nominal" },

      // Параметры выходного напряжения
      output_voltage: { type: "voltage", value: 0, readonly: true, order: 20 },

      // Параметры батареи
      battery_charge: { type: "value", value: 0, units: "%", readonly: true, order: 30 },
      battery_voltage: { type: "voltage", value: 0, readonly: true, order: 31 },
      battery_voltage_high: { type: "voltage", value: 0, readonly: true, order: 32, title: "Battery Voltage High" },
      battery_voltage_low: { type: "voltage", value: 0, readonly: true, order: 33, title: "Battery Voltage Low" },
      battery_voltage_nominal: { type: "voltage", value: 0, readonly: true, order: 34, title: "Battery Voltage Nominal" },

      // Системные и служебные параметры
      ups_delay_shutdown: { type: "value", units: "s", value: 0, readonly: true, order: 40, title: "UPS Delay Shutdown" },
      ups_delay_start: { type: "value", units: "s", value: 0, readonly: true, order: 41, title: "UPS Delay Start" },
      ups_firmware: { type: "text", value: "", readonly: true, order: 100 },
      ups_type: { type: "text", value: "", readonly: true, order: 101 }
    }
  });

  log("Virtual UPS device '{}' has been defined.", DEVICE_ID);
}

// Запускаем функцию создания устройства один раз при старте скрипта
create_ups_device();


// --- Часть 2: Опрос данных и публикация в MQTT ---
// Это правило будет запускаться каждые 2 секунды для обновления данных.
defineRule("poll_ups_data", {
  when: cron("@every 1s"),
  then: function () {
    
    // Выполняем команду upsc
    runShellCommand("upsc powerman@localhost", {
      captureOutput: true,
      exitCallback: function (exitCode, capturedOutput) {
        
        if (exitCode === 0) {
          // Если команда выполнилась успешно, разбираем вывод
          var lines = capturedOutput.split('\n');
          var values = {};

          for (var i = 0; i < lines.length; i++) {
            var parts = lines[i].split(': ');
            if (parts.length === 2) {
              values[parts[0]] = parts[1].trim();
            }
          }

          // ===== Публикуем полученные значения в наши виртуальные контролы =====
          
          function updateValue(key, controlName, isFloat) {
            if (values.hasOwnProperty(key)) {
              var val = isFloat ? parseFloat(values[key]) : values[key];
              if (dev[DEVICE_ID][controlName] !== val) {
                 dev[DEVICE_ID][controlName] = val;
              }
            }
          }
          
          updateValue("ups.status", "ups_status", false);
          updateValue("ups.load", "ups_load", true);
          updateValue("ups.temperature", "ups_temperature", true);
          updateValue("ups.beeper.status", "ups_beeper_status", false);

          updateValue("input.voltage", "input_voltage", true);
          updateValue("input.voltage.nominal", "input_voltage_nominal", true);
          updateValue("input.voltage.fault", "input_voltage_fault", true);
          updateValue("input.frequency", "input_frequency", true);
          updateValue("input.frequency.nominal", "input_frequency_nominal", true);
          updateValue("input.current.nominal", "input_current_nominal", true);
          
          updateValue("output.voltage", "output_voltage", true);
          
          updateValue("battery.charge", "battery_charge", true);
          updateValue("battery.voltage", "battery_voltage", true);
          updateValue("battery.voltage.high", "battery_voltage_high", true);
          updateValue("battery.voltage.low", "battery_voltage_low", true);
          updateValue("battery.voltage.nominal", "battery_voltage_nominal", true);
          
          updateValue("ups.delay.shutdown", "ups_delay_shutdown", true);
          updateValue("ups.delay.start", "ups_delay_start", true);
          updateValue("ups.firmware", "ups_firmware", false);
          updateValue("ups.type", "ups_type", false);

        } else {
          // Если команда upsc провалилась, сообщаем об ошибке
          if (dev[DEVICE_ID]["ups_status"] !== "Error") {
             dev[DEVICE_ID]["ups_status"] = "Error";
          }
          log.error("Failed to get UPS data via upsc. Exit code: " + exitCode);
        }
      }
    });
  }
});

После чего данные пошли на канал mqtt

И я смог их перехватить в Home Assistant

В Home Assistant поставил еще плагин для управления питанием Power Flow Card Plus через HACS, выглядит прикольно, показывает откуда идет питание и какая нагрузка на линии, но пока не донастроил его, добью на следующих выходных видимо уже))

Всем огромное спасибо за помощь! надеюсь мой опыт будет кому-то полезным))

1 Like