Skip to content

feat: коррекция значений контролов виджетов - #1

Open
ilyatikhonyuk wants to merge 6 commits into
masterfrom
feature/value-correction
Open

feat: коррекция значений контролов виджетов#1
ilyatikhonyuk wants to merge 6 commits into
masterfrom
feature/value-correction

Conversation

@ilyatikhonyuk

@ilyatikhonyuk ilyatikhonyuk commented Mar 11, 2026

Copy link
Copy Markdown
Owner

Описание

Добавлена функция коррекции значений для контролов виджетов. Позволяет пользователю задать формулу преобразования отображаемого значения прямо в редакторе виджетов.

Зачем это нужно

Контролы Wiren Board отдают значения в системных единицах (милливольты, байты, °C). На практике пользователям часто нужны другие единицы — вольты, гигабайты, °F. Особенно актуально для объектов в ЕС, где используется Фаренгейт и другие локальные стандарты.

До этого изменения для пересчёта приходилось писать правила в wb-rules вручную. Теперь — галочка и формула в редакторе виджета.

Примеры использования

Задача Формула Единицы
мВ → В / 1000 В
°C → °F * 1.8, + 32 °F
байт → ГБ / 1024 GB
Масштабирование * 500, / 1000

Скриншоты

Тестовый виджет на панели (дашборде)

Виджет с различными типами коррекции: перевод единиц, цепочки формул, отключённая коррекция, нечисловые типы контролов.

image

Редактор виджета — настройка коррекции

Верхняя часть: колонка «Коррекция» с чекбоксами, раскрытые панели формул.

image

Нижняя часть: нечисловые типы (switch, text, pushbutton) с прочерками вместо коррекции.

image

Страница «Устройства» — каналы коррекции

Скорректированные каналы появляются рядом с оригинальными: A1_corrections, CPU Temperature_corrections, ram_used_corrections и другие.

Устройства — каналы коррекции

Канал Vin_corrections в блоке «Статус питания»: оригинал 24.2 В → скорректированное 0.0242 kV.

image)


Что изменено

1. Утилита коррекции (frontend/src/utils/correction.ts)

  • Парсер формул с поддержкой операций * / + -
  • Цепочки операций: * 1.8, + 32 (запятые как разделители)
  • Валидация: пустая формула, деление на ноль, невалидный формат
  • Применение формулы к числовому значению

2. Отображение значений (frontend/src/components/cell/)

  • CellValue применяет формулу к значению через useMemo
  • Пользовательские единицы измерения заменяют оригинальные
  • Коррекция передаётся через цепочку: страница → Cell → CellValue

3. Редактор виджетов (frontend/src/pages/dashboards/.../widget-edit/)

  • Колонка «Коррекция» для числовых типов контролов
  • Чекбокс включения/выключения (для нечисловых типов — прочерк)
  • Раскрывающаяся панель с полями «Формула» и «Единицы измерения»
  • Валидация формулы в реальном времени
  • Ошибки блокируют сохранение виджета

4. CSS-сетка (styles.css)

  • Адаптивная сетка для всех комбинаций колонок
  • Заголовки переносят слова вместо обрезания (поддержка длинных переводов)

5. Переводы (EN/RU)

  • Подписи: Correction/Коррекция, формула, единицы, плейсхолдеры
  • Ошибки валидации на обоих языках

6. Серверный скрипт (wb-corrections.js)

  • Скрипт для wb-rules (Duktape, ES5)
  • Создаёт MQTT-топики {control}_corrections с readonly значениями
  • Правила создаются один раз, формулы читаются из глобальной карты
  • Автоматический опрос конфига каждые 5 секунд
  • Дедупликация: один контрол = одна коррекция
  • Двухуровневое логирование: log.info (общее) + log.debug (детали)
  • Стиль кода соответствует системным скриптам Wiren Board

Типы данных

interface CorrectionConfig {
  enabled: boolean;    // включена ли коррекция
  formula: string;     // формула: "* 2, / 1000, + 5"
  units?: string;      // кастомные единицы (опционально)
}

Хранится в widget.cells[].extra.correction в /etc/wb-webui.conf.


MQTT-топики (серверная часть)

Для каждого контрола с включённой коррекцией создаётся readonly топик:

/devices/power_status/controls/Vin           → 24200 (оригинал)
/devices/power_status/controls/Vin_corrections → 24.2  (скорректированное)

Скорректированные топики можно использовать в сценариях автоматизации.


Развёртывание

Фронтенд:

cd frontend && npm run build
# Скопировать frontend/dist/* → /var/www/ на контроллере

Серверный скрипт:

# Скопировать wb-corrections.js → /etc/wb-rules/wb-corrections.js
# wb-rules подхватит автоматически (hot-reload)

Тестирование

Проверено на контроллере WB8.5.3 (wb-2507, wb-rules 2.34.0):

  • Формулы: простые (/ 1000), цепочки (* 1.8, + 32), с запятыми
  • Типы контролов: voltage, temperature, value, range
  • Нечисловые типы (switch, text, pushbutton) — коррекция недоступна
  • Дедупликация при одном контроле в нескольких виджетах
  • Отключённая коррекция — формула не применяется
  • Валидация: пустая формула, деление на ноль, невалидный формат
  • Локализация: EN и RU корректно отображаются
  • MQTT: скорректированные топики создаются и обновляются
  • Перезагрузка контроллера: скрипт стартует автоматически

🤖 Generated with Claude Code

ilyatikhonyuk and others added 6 commits March 11, 2026 16:43
## Что сделано

Добавлена утилита для коррекции числовых значений контролов
виджетов. Позволяет пользователю задать формулу преобразования
(например: "/ 1000" для перевода мВ → В), которая применяется
к отображаемому значению в интерфейсе.

## Формулы

Поддерживаемые операции: умножение (*), деление (/),
сложение (+), вычитание (-).

Операции можно объединять в цепочки:
- "* 1.8, + 32" — перевод °C → °F
- "/ 1000" — перевод мВ → В
- "* 500, / 1000" — сложное преобразование

Запятые и точки с запятой — необязательные разделители
для удобства чтения.

## Валидация

Встроенная проверка формул с отчётом об ошибках:
- пустая формула
- деление на ноль
- неверный формат (посторонние символы)

## Типы данных

Добавлен интерфейс CorrectionConfig (enabled, formula, units)
в типы ячеек, виджетов и хранилища.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
## Что сделано

При наличии включённой коррекции у ячейки виджета — формула
автоматически применяется к отображаемому значению.
Если заданы пользовательские единицы измерения — они
заменяют оригинальные.

## Как это работает

Пример: датчик отдаёт напряжение 24200 мВ.
С формулой "/ 1000" и единицами "В" пользователь увидит "24.2 В"
вместо "24200 мВ".

## Затронутые компоненты

Параметр correction передаётся по цепочке компонентов:
- Страницы (dashboard, widgets, widget-add)
- Компонент Cell
- Компонент CellValue (здесь применяется формула)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
## Что сделано

В редактор виджетов добавлена колонка «Коррекция» для числовых
типов контролов. Пользователь может включить/выключить коррекцию
чекбоксом, задать формулу и единицы измерения.

## Интерфейс

- Чекбокс в строке ячейки — включает/выключает коррекцию
- Для нечисловых типов (switch, text, pushbutton) — прочерк
- При включении раскрывается панель с двумя полями:
  - «Формула коррекции» — с валидацией в реальном времени
  - «Единица измерения» — опциональная замена оригинальных единиц
- Ошибки валидации блокируют сохранение виджета

## CSS-сетка

Адаптивная сетка с поддержкой комбинаций колонок:
- Базовая (sort, id, name, type, remove)
- С инвертированием (+ invert)
- С коррекцией (+ correction)
- С обоими (+ invert + correction)

Заголовки колонок переносят слова вместо обрезания —
для корректного отображения длинных переводов
(например, «Инвертировать» на русском).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
## Что сделано

Добавлены ключи локализации для интерфейса коррекции значений
на английском и русском языках.

## Добавленные ключи

Подписи элементов интерфейса:
- Заголовок колонки (Correction / Коррекция)
- Подпись поля формулы и единиц измерения
- Плейсхолдер «Без изменений» / «No change»
- Подсказка результата

Сообщения об ошибках валидации:
- Пустая формула
- Деление на ноль
- Неверный формат

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
## Что сделано

Скрипт для движка правил wb-rules, который создаёт MQTT-топики
со скорректированными значениями контролов. Позволяет использовать
скорректированные данные в сценариях автоматизации.

## Как это работает

1. Читает конфиг виджетов /etc/wb-webui.conf
2. Находит ячейки с включённой коррекцией
3. Для каждой создаёт readonly MQTT-топик:
   power_status/Vin → power_status/Vin_corrections
4. При изменении оригинального значения — применяет формулу
   и публикует результат в топик коррекции

## Архитектура

Правила (defineRule) создаются один раз на контрол,
формулы читаются из глобальной карты correctionMap.
Это обходит ограничение wb-rules (Duktape): defineRule
не поддерживает destroy().

Конфиг опрашивается каждые 5 секунд — изменения в виджетах
подхватываются автоматически без перезапуска сервиса.

## Логирование

- log.info — общие события (старт, количество коррекций)
- log.debug — детали (формулы, значения, дедупликация)
- log.warning — ошибки чтения конфига

## Дедупликация

Если один контрол встречается в нескольких виджетах —
используется первая найденная коррекция.

## Стиль кода

Написан в стиле системных скриптов Wiren Board:
ES5, IIFE-обёртка, 2 пробела, одинарные кавычки,
имена правил с префиксом _wb_correction_.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Скриншоты для документации PR:
- Тестовый виджет на дашборде с коррекцией
- Редактор виджета (настройка формул и единиц)
- Страница «Устройства» с каналами коррекции

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant