ИБП многие используют просто как розетку с батарейкой. Но на самом деле это, обычно, весьма «умные» устройства. На всех ИБП, что мне доводилось видеть, имеется разъем для управления и получения информации. До 2015 года этот разъем чаще всего представлял из себя DB-9 Female с обменом по протоколу RS232. Для работы через USB с такой моделью будет необходим специальный UART. В более новых устройствах это обычно USB с тем же RS232 (UART, позволяющий обмениваться по протоколу RS232 через USB, в этом случае, находится внутри ИБП). Желая заработать еще немного денег на кабелях, соединяющих ИБП с компьютером, производитель мудрит с сигнальными линиями и их распиновкой на разъеме DB-9. Поэтому обычный Null-Modem кабель для обмена данными с ИБП не подойдет. При попытке подключить такой кабель, ИБП уйдет в защитный режим и/или отключится. Впрочем о физическом подключении будет отдельная статья.
Итак, есть ИБП, есть кабель, но нет программы управления. Либо необходимо написать для каких-то целей свою программу. Попробуем разобраться как это сделать.
Обмен данными с ИБП APC (особенно серии Smart-UPS) осуществляется через последовательный порт (COM/USB) на скорости 2400 бод (8N1) с использованием текстовых команд, отправляемых через терминал (Putty, Minicom).
Основные аспекты обмена с UPS APC
- Настройка порта: Используйте 2400 Baud, 8 data bits, 1 Stop bit, no parity, протокол Xon/Xoff.
- Подключение: Требуется специальный кабель (Smart Signaling) или USB-кабель (UART).
- Интерфейс: Используйте PuTTY, Minicom или аналогичный терминальный клиент для отправки команд и получения ответа.
Для получения данных используются символьные коды Smart-протокола APC. При отправке команд следует учитывать, что ответ ИБП может сопровождаться специальными символами (!, $). Символы в Smart-протоколе APC — это лаконичные маркеры подтверждения или специальные служебные сигналы.
!!! Команды чувствительны к регистру. !!!
Особенности программирования
- Тайминги: Не отправляйте команды слишком быстро. Рекомендуется делать паузу между символами или командами, иначе ИБП может перестать отвечать.
- Конец строки: Большинство ответов завершаются символами \n\r.
Инициализация (Режим Smart)
По умолчанию современные ИБП могут находиться в режиме «Simple Signaling» (простое замыкание контактов). Чтобы активировать расширенный обмен командами:
- Отправьте символ Y (0x59).
- ИБП должен ответить SM (Smart Mode).
- Только после этого он начнет понимать команды вроде A, B, L.
Информационные команды (чтение)
Эти команды возвращают текущие параметры системы:
- A — Состояние ИБП (Front Panel Test). Ответ: OK.
- B — Напряжение батареи (в вольтах, например, 27.74).
- C — Внутренняя температура ИБП (в градусах Цельсия).
- F — Частота питающей сети (Гц).
- G — Причина последнего перехода на батареи (возвращает код: R — скачок, H — высокое, L — низкое напряжение и т.д.).
- L — Входное напряжение сети (Input Line Voltage).
- M — Максимальное входное напряжение с момента последнего запроса.
- N — Минимальное входное напряжение с момента последнего запроса.
- O — Выходное напряжение ИБП.
- P — Текущая нагрузка в % от номинала.
- Q — Статус ИБП в виде 16-ричного флага (битовое поле: работа от сети/батарей, перегрузка и т.д.).
- f — Уровень заряда батареи в процентах.
- j — Оставшееся время работы в минутах (Runtime).
Команды управления (действие)
- Y — Активация Smart-режима. Ответ: SM.
- R — Выход из Smart-режима («Turn dumb»). Ответ: BYE.
- K — Выключение ИБП с задержкой (без автоматического включения при появлении сети). Нужно отправить дважды с паузой > 1.5 сек.
- S — «Мягкое» выключение (Soft Shutdown). ИБП выключается после паузы, но включится сам, когда появится сеть.
- W — Самотестирование (Self-Test).
- U — Симуляция сбоя питания (переход на батареи на короткое время).
- Z — Немедленное выключение (Shutdown now).
Настройка параметров (чтение/запись)
Команды в нижнем регистре часто используются для чтения/записи установок в EEPROM:
- c — ID ИБП (8 символов).
- m — Дата изготовления батареи.
- n — Серийный номер устройства.
- v — Версия прошивки.
- x — Дата замены батареи.
Будьте осторожны с командами записи (например, через + или — в режиме настройки PROG), так как неправильные значения в EEPROM могут сбить калибровку вольтметра или датчика заряда.
Основные служебные символы в ответах
- OK — стандартное подтверждение того, что команда принята и выполнена успешно (например, после команд выключения или теста).
- * (звездочка) — в старых моделях заменяет OK при успешном выполнении команд.
- NA (Not Available) — команда не может быть выполнена в данный момент (например, если ИБП занят или команда не поддерживается).
- ! (восклицательный знак) — часто сопровождает широковещательные уведомления о критических событиях (например, переход на батарею или низкий заряд).
- $ — используется в некоторых версиях протокола как разделитель или признак конца строки данных при чтении EEPROM.
Символы причины переключения (команда G)
Если вы отправите G, ИБП ответит одной буквой, объясняющей причину последнего перехода на батареи:
- R — слишком высокая скорость изменения напряжения сети.
- H — слишком высокое входное напряжение.
- L — слишком низкое входное напряжение.
- T — помехи или скачки напряжения («выбросы»).
- S — переключение по команде пользователя или при самотестировании.
- O — переключений не было с момента включения.
Прочие важные символы
- BYE — ответ на команду R, означающий выход из режима Smart (ИБП перестает слушать команды до новой инициализации).
- + и — — используются для изменения значений в режиме настройки (например, порога чувствительности или напряжения).
Примеры
Смена даты замены батареи
Сбросить дату замены батареи можно двумя основными способами: через встроенную утилиту (для Linux-систем) apctest (входит в пакет apcupsd) или вручную через терминал.
Способ 1: С помощью apctest (рекомендуется)
Это самый простой и безопасный метод, так как утилита имеет текстовое меню.
1. Остановите службу apcupsd, иначе порт будет занят:
sudo systemctl stop apcupsd
2. Запустите утилиту настройки:
sudo apctest
3. В появившемся меню выберите пункт 2) Change Battery date.
4. Введите новую дату в формате DD/MM/YY (день/месяц/год).
5. Выйдите из программы (пункт Q) и снова запустите службу:
sudo systemctl start apcupsd
Способ 2: Вручную через терминал
Если вы работаете напрямую через терминал (PuTTY/Minicom):
1. Убедитесь, что вы в Smart-режиме (отправьте Y, получите ответ SM).
2. Отправьте символ x. ИБП вернет текущую дату замены батареи.
3. Для входа в режим программирования (EEPROM) отправьте 1, подождите 2 секунды и отправьте 1 еще раз. ИБП должен ответить PROG.
4. Снова отправьте x, а затем используйте символы + (плюс) или — (минус) для изменения цифр в дате.
5. После установки нужной даты отправьте R, чтобы выйти из режима программирования (ответ BYE).
Зачем это нужно? Обновление даты важно, так как алгоритмы ИБП используют её для расчета примерного износа батарей и своевременного включения индикатора «Replace Battery». Если индикатор продолжает гореть после замены, рекомендуется также провести калибровку.
Калибровка
Для выполнения калибровки (Runtime Calibration) важно соблюсти два условия: нагрузка должна быть стабильной и выше 30% (оптимально 35–50%), а батарея заряжена на 100%.
Способ 1: Через утилиту apctest (самый надежный)
Этот метод позволяет контролировать процесс в реальном времени.
1. Остановите службу:
sudo systemctl stop apcupsd
2. Запустите тест:
sudo apctest
3. Выберите пункт 3) Runtime Calibration. Программа проверит условия (заряд и нагрузку). Если всё в норме, ИБП перейдет на батареи. Дождитесь окончания: ИБП будет работать от батарей, пока их заряд не упадет примерно до 25%, после чего сам вернется на сеть.
4. После завершения выходите (Q) и запускайте службу:
sudo systemctl start apcupsd
Способ 2: Командой через терминал
Если вы общаетесь с ИБП напрямую через терминал:
1. Войдите в Smart-режим: отправьте Y (ответ SM).
2. Запустите калибровку: отправьте D.
3. ИБП ответит ! и перейдет на батареи.
Чтобы убедиться, что калибровка идет, можно отправлять f (процент заряда) или Q (статус).
Прерывание: Если нужно срочно остановить тест, снова отправьте D.
Способ 3: Через apcaccess (дистанционно)
Если служба запущена и работает, можно отправить команду через стандартную утилиту управления:
sudo apccontrol calibrate
Внимание: эта команда просто инициирует процесс, визуального подтверждения в консоли может не быть, смотрите на статус в apcaccess status.
!!! Важные предупреждения !!!:
- Не меняйте нагрузку во время процесса. Если выдернуть или воткнуть вилку в розетку ИБП, калибровка сбросится или даст неверные данные.
- Смерть старых АКБ: Если батареи очень старые, калибровка может их «добить» и/или привести к резкому выключению нагрузки. Убедитесь, что на нагрузке нет несохраненных данных.
Результат: После калибровки значение ITEMP и TIMELEFT в apcaccess станет более точным.
Возможные причины и методы решения проблем с apcaccess
Терминал видит ИБП, а apcaccess не видит. Это классическая ситуация. Если терминал (например, minicom или putty) получает данные, а apcaccess выдает COMMLOST, проблема в том, что служба apcupsd не может захватить порт или неправильно его инициализирует.
Проверьте следующие пункты по порядку:
1. Конфликт доступа
Самая частая причина: Если у вас открыт терминал с подключением к /dev/ttyUSB0, то служба apcupsd не сможет открыть этот же порт.
- Закройте все терминальные программы (minicom, putty).
- Перезапустите службу:
sudo systemctl restart apcupsd.
2. Режим «Smart» в конфиге
Для некоторых моделей (например SC 450) через USB-COM критически важны эти три строки в /etc/apcupsd/apcupsd.conf. Проверьте, что нет опечаток:
UPSCABLE smart
UPSTYPE apcsmart
DEVICE /dev/ttyUSB0
Если там стоит UPSTYPE usb, работать не будет, так как для системы это последовательный порт (TTY), а не нативное USB-устройство.
3. Проверка блокировки (Lock-файлы)
Иногда после терминала остаются lock-файлы в /var/lock.
Выполните:
ls /var/lock/
Если видите файлы типа LCK..ttyUSB0, удалите их:
sudo rm /var/lock/LCK..ttyUSB0
4. Ручная проверка связи через apctest
Это лучший способ понять, видит ли драйвер ИБП:
sudo systemctl stop apcupsd
sudo apctest
Выберите пункт 1 (Test communications).
- Если пишет «Communications with UPS established» — проблема была в настройках демона.
- Если пишет «Unable to open UPS circuit» — порт занят или нет прав.
5. Скорость порта
Хотя apcupsd должен сам выставлять 2400 бод, иногда порт «залипает» на 9600 после терминала. Попробуйте принудительно сбросить настройки порта перед запуском службы:
sudo stty -F /dev/ttyUSB0 2400 cs8 -cstopb -parenb
Скрипт «реанимации» связи
Попробуйте выполнить эту последовательность:
sudo systemctl stop apcupsd
sudo fuser -k /dev/ttyUSB0
sudo stty -F /dev/ttyUSB0 2400
sudo systemctl start apcupsd
apcaccess status
С какими моделями это работает?
Все описанные методы были опробованы с ИБП APC Smart-UPS SC 450. Собственно, сама статья родилась как результат попытки разобраться с мониторингом и управлением этой модели.
Буду признателен если укажете в комментариях с какими моделями ИБП описанное выше работает, а с какими нет.
Заведомо работает
- APC Smart-UPS SC 450