Меня зовут Андрей, я незрячий и работаю за компьютером с NVDA. Недавно я купил источник бесперебойного питания ExeGate LLB-3000. Для работы с ним на компьютере использовал PowerManagerII, но её интерфейс оказался плохо доступен для моей программы экранного доступа. Устройство моё, а самостоятельно добраться до нужных настроек и показаний не получается.
Я плохо умею мириться с такими вещами. Пока не получу доступ к собственному устройству, могу и сон отложить. Поэтому взялся за дополнение для NVDA, которое помогло бы мне пользоваться PowerManagerII с клавиатуры и понимать, что происходит на экране.
В разработке мне помогал Codex от OpenAI с моделью GPT-6 Astra. Он написал большой объём кода, помог разобраться с графическим меню и исправлял ошибки. Я задавал направление, проверял поведение с NVDA, вносил правки и возвращал ему замечания. Результат называется PowerManagerII Access. Уже можно читать показания, переходить по разделам и пользоваться нужными командами. Выключение я отдельно проверил на своём ИБП: работает.
Программа, которую я должен слышать
NVDA - бесплатная программа экранного доступа для Windows с открытым исходным кодом. Она произносит текст и сведения об элементах интерфейса. Например, сообщает название кнопки, выбранный пункт списка или состояние флажка. NVDA также умеет выводить информацию на брайлевский дисплей, но в этой работе я проверял прежде всего управление с клавиатуры и речевое сопровождение.
Чтобы такое управление работало, приложению нужно передавать сведения о своих элементах. Видимой надписи рядом с полем бывает недостаточно: NVDA должна понимать, к какому полю она относится. У графической кнопки могут отсутствовать название или подходящее действие. А элемент, который удаётся прочитать, ещё не обязательно получает клавиатурный фокус.
Фокус - это место, куда сейчас направлен ввод с клавиатуры. Если NVDA называет одну кнопку, а нажатие Enter получает другая, пользоваться программой нельзя уверенно. При настройке питания такая неопределённость особенно мешает.
Сам ИБП нужен, чтобы при пропадании внешнего питания некоторое время питать подключённую технику от батареи. Продолжительность работы зависит от нагрузки и состояния аккумуляторов. Но мне нужен был и доступ к его программе: читать заряд и нагрузку, смотреть напряжение, разбираться в событиях, управлять настройками. В руководстве ExeGate можно посмотреть сведения об устройствах этой серии; здесь речь пойдёт о доступе к программе управления.
В моём случае это Richcomm PowerManagerII 4.1 revision 646 с русским интерфейсом. Графическое меню, неподписанные элементы и неудобные переходы мешали работать на слух. Именно с этой установленной сборкой мы и разбирались.

Как мы с Codex разделили работу
Я пришёл с конкретной задачей: хочу самостоятельно пользоваться программой своего ИБП. Мог описать, где теряюсь при переходах, что произносит NVDA и какого поведения ожидаю. Это и определяло следующие изменения.
Codex помогал исследовать интерфейс, сопоставлять элементы с их назначением, писал код дополнения и дорабатывал его по замечаниям. Отдельно пригодилась работа со снимками экрана. По ним он помог разобраться в графических кнопках и меню, сформулировать понятные названия и связать нужные действия с элементами программы.
После изменений я снова открывал программу и проверял её с NVDA. Если переход оказывался неудобным или озвучивание не объясняло, где я нахожусь, я поправлял результат и направлял Codex дальше. Он тоже проверял код, помогал находить причины ошибок и готовить исправления. Так мы последовательно доводили навигацию и чтение данных.
Рабочее дополнение получилось довольно быстро. Я описывал, что нужно поправить, и вскоре мог проверять новую версию.
Для проекта я использовал GPT-6 Astra. Распознавание изображений помогало во время разработки. В готовом дополнении обращения к модели нет: при обычной работе оно взаимодействует с NVDA и PowerManagerII на компьютере пользователя.
Под графическими кнопками нашлись обычные элементы Windows
Решение оформлено как модуль NVDA для конкретного приложения. Такой модуль загружается при работе с соответствующей программой и может уточнять названия элементов, их роли и реакцию на клавиши. Этот механизм описан в руководстве разработчика NVDA.
У многих кнопок и полей PowerManagerII есть внутренние числовые идентификаторы. В проекте появилась карта, которая связывает их с понятными названиями. Например, небольшой фрагмент из model.py выглядит так:
1012: "Состояние ИБП", 1013: "График измерений", 1014: "Текущие измерения", 1016: "Номинальные параметры ИБП",
Это часть словаря названий кнопок. Когда NVDA встречает соответствующий элемент в распознанном главном окне, дополнение сообщает его назначение. В коде отдельно описаны команды меню и их идентификаторы. Чтобы нажать кнопку или выполнить команду меню, дополнение использует средства Windows. По картинке заново искать кнопку при каждом нажатии не требуется.
При этом одного номера элемента недостаточно. Одинаковые идентификаторы могут встречаться в разных диалогах. Дополнение сопоставляет набор элементов окна с известными шаблонами из dialog_map.json и применяет подписи с учётом распознанного диалога. Если совпадение недостаточно уверенное или неоднозначное, шаблон не выбирается. Для главного окна тоже проверяется характерный набор элементов.
Это помогло уточнить и неудачные названия в самой программе. Например, пункт «Блок схема…» открывает расписание задач ИБП. По исходной подписи трудно догадаться, что внутри находятся даты, время и действия по расписанию. В дополнении он получил название «Расписание задач ИБП (Блок-схема ИБП)», чтобы назначение было понятно, а связь с исходным меню сохранялась.
Для работы с меню есть F10. Оно содержит разделы «Система», «Вид», «Управление ИБП» и «Помощь». Настройки, журналы и расписание открываются командами PowerManagerII. Обменом с самим ИБП продолжает заниматься программа производителя.
Озвучить вкладку оказалось недостаточно
Мне нужно было спокойно прослушать названия разделов, а затем открыть выбранный. Перемещение по заголовкам не должно само менять данные под ними. Для этого пришлось разделить фокус на заголовке и открытую вкладку.
Для чтения дополнение создаёт окно с тремя вкладками: «Состояние ИБП», «Текущие измерения» и «График измерений». У них принят следующий порядок работы.
Стрелки или
Control+Tabперемещают фокус между заголовками.Enter или пробел открывает вкладку, на которой стоит фокус.
Tab переводит к содержимому открытой страницы. Стрелками вверх и вниз можно читать строки.
F5 обновляет данные с сохранением выбранной строки. Escape возвращает в PowerManagerII.
Допустим, я читаю состояние ИБП и перевожу фокус на «Текущие измерения». Если сразу нажму Tab, то вернусь к прежним данным состояния. Чтобы открыть измерения, сначала нужен Enter или пробел. NVDA сообщает, какая вкладка выбрана, а заголовок окна и подпись списка уточняют, что я сейчас читаю.

На уровне Windows это реализовано через стиль вкладок TCS_BUTTONS и сообщение TCM_SETCURFOCUS. В таком сочетании можно перемещать фокус, сохраняя прежнюю выбранную страницу. Поведение описано у Microsoft, а реализация находится в manual_tabs.py.
Похожая проблема возникала с группами переключателей. В этой программе фокус на другом варианте может менять доступные поля. Поэтому по Tab фокус переходит на выбранный вариант группы, а стрелки позволяют сознательно выбрать другой. При простом обходе окна состав полей остаётся предсказуемым.
Когда программа возвращает тебя назад
У переходов обнаружилась ещё одна тонкость. Некоторые действия выполняются с небольшой задержкой, пока окно открывается или Windows обрабатывает события. За это время пользователь уже может нажать Tab или переключиться в другое приложение. Если отложенный обработчик потом без проверки возвращает фокус, он отменяет более новое действие человека.
В дополнении такие обработчики проверяют, не было ли нового ввода. Перед исправлением сведений о фокусе для NVDA код сверяется с активным окном и фактическим фокусом Windows. NVDA должна озвучивать элемент, на который сейчас направлен ввод с клавиатуры.
Для проверки этого поведения есть отдельные тесты. В отчёте о работе с запущенной NVDA зафиксирован и быстрый переход: Tab через 40 миллисекунд после открытия окна. Проверялось, что позднее событие не возвращает пользователя на заголовок. Когда читаешь интерфейс на слух, подобный возврат легко сбивает с места.
Показание должно быть свежим и понятным
У дополнения есть доступ к текстам элементов и таблицам PowerManagerII. Из них оно собирает строки с названиями параметров и единицами измерения. Так можно прочитать входное и выходное напряжение, частоту, заряд батареи, нагрузку и остальные значения, которые передала программа.
В таблице производителя параметры расположены двумя группами по три столбца: название, значение, единица измерения. Код проходит обе группы и превращает их в последовательный список. Иначе при чтении только левой части можно было бы потерять половину показаний.

Но прочитанное число ещё нужно соотнести с состоянием интерфейса. Когда PowerManagerII показывает график, скрытые числовые индикаторы могут сохранять старые значения. Они всё ещё существуют в окне, только текущими показаниями уже не служат.
Поэтому дополнение определяет, какое представление действительно открыто. Если видна таблица, оно читает таблицу. Если экран состояния, использует его индикаторы. В режиме графика скрытые числа не выдаются за свежие. После команды переключения код ждёт появления нужного представления и лишь затем читает данные.
Дополнение проверяет состояние связи с ИБП. Неопределённый статус не считается успешным подключением. Если связь не подтверждена, дополнение помечает числовые значения как недоступные. Рядом оно показывает время чтения, а данные обновляет при открытии вкладки и по F5.
Эти правила можно увидеть в native.py, model.py и тестах. Например, есть проверка, что режим графика не возвращает старые значения скрытых индикаторов. Здесь мне полезнее услышать объяснение, почему данные сейчас недоступны, чем уверенно озвученное устаревшее число.
Точки графика пока недоступны
Получить точные числовые точки самого графика не удалось. Его компонент ActiveX не отдаёт их через MSAA, один из интерфейсов доступности Windows. Поэтому дополнение объясняет назначение графика и предлагает два перехода: к текущим измерениям или к сохранённой истории.

История читается по 50 записей за страницу. Для показанных записей рассчитываются минимум и максимум числовых значений. Фильтром PowerManagerII можно выбрать нужный период, а в текстовом окне переключать страницы сочетаниями Control+PageDown и Control+PageUp.
У сохранённой истории свой интервал записи, заданный в настройках программы. По ней нельзя обещать восстановление каждой точки текущего графика. Минимум и максимум тоже относятся только к открытой странице. Эти пояснения есть прямо в тексте, который читает NVDA.
Для меня такой доступ уже полезен: можно изучать числа и записи, не разбирая линии на экране. При этом сам графический компонент остаётся ограничением первой версии.
Кнопка выключения должна делать ровно то, что я подтвердил
Когда речь дошла до управления питанием, понадобились отдельные подтверждения. Команды выключения, самотестирования, записи расписания и удаления могут повлиять на оборудование или данные. Для поддерживаемых действий через дополнение открывается окно с описанием команды и параметрами. По умолчанию выбран ответ «Нет».
После подтверждения код снова проверяет окно и элемент. Если параметры успели измениться или выбрана другая запись, действие отменяется. Быстрое повторное нажатие одной кнопки подавляется. А изменение и удаление записи без предварительного выбора блокируются с объяснением.
В тестах команд проверяется, в частности, такой случай: пользователь открыл подтверждение питания, после чего параметры стали другими. Дополнение не должно выполнять команду. Отдельный тест проверяет, что подтверждённая неизменившаяся команда отправляется один раз.
Выключение я отдельно проверил на своём ИБП, команда сработала. Этот результат дополняет опубликованный отчёт об испытаниях, где работа с командами питания ограничивалась открытием подтверждений и последующей отменой.
Подтверждения действуют при выполнении команд через дополнение. Прямое нажатие мышью в программе или команда стороннего инструмента может пройти другим путём. А подтверждённое выключение действительно способно отключить питание подключённых устройств. Работу с этой командой нужно планировать с учётом подключённой нагрузки.
Что именно проверено
В репозитории есть отчёт об испытаниях. В нём разделены программные тесты и сценарии в работающей NVDA. Для первого публичного выпуска зафиксирована такая среда:
Компонент | Версия и разрядность |
|---|---|
Программа ИБП | Richcomm PowerManagerII 4.1 revision 646, русский интерфейс |
Файл PowerManager.exe | 1.0.348.273 |
Программа экранного доступа | NVDA 2025.3.3, 32-разрядное приложение |
Операционная система | Windows 11 25H2, 64-разрядная система (x64) |
Windows на моём компьютере 64-разрядная. Указанные 32 бита относятся только к приложению NVDA 2025.3.3, с которым проводились проверки.
Код доступности прошёл 88 модульных тестов. При подготовке выпуска добавились три теста упаковки, всего их стало 91. Они проверяют обработку показаний, распознавание окон, навигацию, подтверждения команд и состав архивов. Эти тесты запускаются с заменами объектов NVDA и элементов программы, без управления настоящим ИБП.
Для работающего интерфейса в отчёте записаны три серии: 100 сценариев вкладок и чтения, 91 общий сценарий и 63 дополнительных. Всего 254. Общая серия включала 159 прямых и обратных переходов Tab. Это описание проведённых проверок конкретных сборок разработки; публичная версия 1.0.0 сохраняет проверенный код доступности.
Среди сценариев есть переходы по настройкам и оповещениям, чтение журналов, возврат из окон, обновление с сохранением строки и отмена подтверждений. Проверялись разные варианты питания, самотестирования и расписания, включая связанные с ними поля.
Число успешных проверок само по себе не рассказывает, удобно ли пользоваться программой. Я проверял результат с NVDA и возвращался к тому, что мешало работе. Дополнительная проверка выключения на моём устройстве расширяет этот опыт, но не означает, что все аппаратные режимы уже испытаны.
Совместимость и оставшиеся ограничения
Минимальная версия NVDA в манифесте - 2025.3, проверенная серия тоже 2025.3. Более новые выпуски NVDA и другие сборки PowerManagerII требуют отдельной проверки. Интерфейс дополнения в версии 1.0.0 русский. Наличие английской документации не означает поддержку английского интерфейса программы производителя.
В опубликованные испытания не входили разряд батареи, реальный самотест, выполнение сохранённого расписания, отправка уведомлений и удаление пользовательских записей. Не проверялись физический брайлевский дисплей, удалённый ИБП и восстановление настоящих документов через окно сохранённых файлов. Для них нужны отдельные сценарии.
Дополнение читает данные PowerManagerII и не проверяет точность датчиков устройства. Проект независимый, распространяется под GPL-2.0-only без гарантии. Исходники открыты, а условия лицензии входят в репозиторий и пакет дополнения.
Как попробовать
Первый публичный выпуск - PowerManagerII Access 1.0.0. На странице выпуска находится файл powerManagerAccess-1.0.0.nvda-addon. NVDA и PowerManagerII устанавливаются отдельно; Python для использования дополнения не нужен.
Перед установкой сверьте версии программ с таблицей выше. Затем откройте файл дополнения, подтвердите установку и перезапустите NVDA. В PowerManagerII нажмите F6: откроется доступное окно для чтения текущего представления, а фокус перейдёт к его содержимому.
Для первого знакомства достаточно нескольких клавиш:
Клавиша | Действие |
|---|---|
F6 в главном окне | Открыть чтение содержимого текущей вкладки |
| Перевести фокус на следующий заголовок вкладки |
Enter или пробел на заголовке | Открыть выбранную вкладку |
Tab, затем стрелки вверх и вниз | Перейти к данным и читать строки |
F5 в окне чтения | Обновить данные |
F10 | Открыть меню программы |
F1 | Открыть помощь по текущему окну |
Escape | Вернуться из окна чтения в PowerManagerII |
Дополнительные сочетания с NVDA+Alt работают в исходном окне PowerManagerII. Из окна чтения к нему можно вернуться по Escape. NVDA+Alt+F2 произносит текущее состояние ИБП. NVDA+Alt+F8 открывает историю измерений, а повторное нажатие в исходном окне истории - текстовое чтение записей. Сочетания с NVDA здесь используют настроенную у вас клавишу NVDA: Insert или Caps Lock.
Можно включить сообщения об изменении статусов через NVDA+Alt+F5. Тогда дополнение опрашивает отображаемые состояния каждые пять секунд и сообщает об изменениях. Колебания напряжения оно при этом постоянно не зачитывает. Повторное нажатие выключает режим. Полный список команд и порядок работы с настройками есть в русском руководстве.
Разработчикам пригодятся описание устройства проекта и инструкции по сборке. Код написан на Python; окна дополнения используют wxPython, который уже входит в NVDA. В проекте отдельно лежат карта элементов, обработка данных и работа с окнами Windows. Проверки GitHub настроены на Python 3.11 и 3.14. В выпуск входят дополнение, архив исходников и контрольные суммы SHA-256.
Следующие проверки на других установках помогут понять, что ещё нужно исправить в дополнении.
Если попробуете его, напишите версии NVDA и PowerManagerII, последовательность клавиш и то, что получилось. Ошибки удобно собирать в GitHub Issues. Со мной можно связаться в Telegram: @zotovsmol.

