Counter Pulse Weight (L/pulse) для MWAC v.1

Добрый день!

Настраиваю MWAC v.1 на работу с импульсными счетчиками воды. Очень не хватает настроек, которые есть в шаблоне для MWAC v.2: Counter Pulse Weight (L/pulse) и др. Можно эти параметры добавить и в предустановленный шаблон для MWAC v.1?

Спасибо!

Здравствуйте! Я автоматический помощник техподдержки Wiren Board. Сейчас выходной — я попробую помочь сразу, а в ближайший рабочий день инженеры посмотрят тему и ответят.
Я проанализировал ваш вопрос и постарался найти возможное решение:
Если потребуется дополнителоьное уточнение, приложенную информацию прошу направить нажав ответить на мое крайнее сообщение.


Вы используете модуль MWAC v.1 вместе с импульсными счётчиками воды и хотите иметь параметр Counter Pulse Weight (L/pulse), аналогичный тому, что есть в шаблоне для MWAC v.2.

1. Почему в MWAC v.1 этого нет «из коробки»

В MWAC v.2 часть логики по пересчёту импульсов в литры/м³ и отображению объёма реализована уже в шаблоне устройства (через meta‑поля, доп. каналы и т. д.), поэтому там есть удобный параметр L/pulse. У MWAC v.1 предустановленный шаблон проще: он, как правило, отдаёт «сырые» импульсы (счётчик), а пересчёт в литры/м³ предполагается делать на уровне правил или пользовательских топиков[1].

Добавление полностью аналогичного параметра в штатный шаблон MWAC v.1 — задача для инженеров, т.к. это изменение стандартного пакета шаблонов.

2. Что можно сделать уже сейчас (обходное решение)

Пока параметра нет в шаблоне, вы можете:

  1. Использовать импульсный счётчик как сырой источник, например, топик вида
    /devices/mwac_***/controls/Water Counter X
    (названия зависят от конкретного шаблона и конфигурации).

  2. Создать виртуальный контрол (через wb-rules) и хранить там уже «литры» или «м³».

Пример правила на wb-rules, где:

  • mwac_1/Water Counter 1 — сырой счётчик импульсов,
  • virtual:water_volume_1 — виртуальный контрол с объёмом в литрах,
  • L_PER_PULSE — коэффициент (аналог вашего Counter Pulse Weight):
var L_PER_PULSE = 10; // 10 литров за импульс, подставьте своё значение

defineVirtualDevice("virtual_water", {
  title: "Virtual Water Counters",
  cells: {
    water_volume_1: {
      type: "value",
      value: 0,
      readonly: false
    }
  }
});

defineRule("mwac1_pulses_to_liters", {
  whenChanged: "mwac_1/Water Counter 1",
  then: function (newValue, devName, cellName) {
    // newValue — количество импульсов (счётчик)
    var pulses = parseFloat(newValue) || 0;
    var liters = pulses * L_PER_PULSE;
    dev["virtual_water"]["water_volume_1"] = liters;
  }
});

Если вам нужен пересчёт не от «0», а, например, учитывать начальное значение (при замене счётчика), можно добавить смещение (offset) и/или возможность задавать его через отдельный виртуальный контрол.

3. Можно ли добавить параметр в штатный шаблон MWAC v.1

Технически — да, но это требует изменения стандартного JSON‑шаблона устройства (пакет wb-mqtt-serial / wb-hwconf-manager и т. п.). Это уже вопрос к инженерам:

  • Нужно:
    • определиться с форматом (L/pulse или m³/pulse),
    • добавить соответствующее meta‑поле или дополнительный контрол,
    • возможно, сохранить обратную совместимость с существующими установками.

Я передам ваш запрос как предложение на доработку предустановленного шаблона для MWAC v.1, чтобы сделать его более унифицированным с MWAC v.2.


Чтобы инженеры могли предложить более точное решение, напишите, пожалуйста, в ответ:

  1. Модель/тип счётчиков воды и их коэффициент (сколько литров/м³ за импульс).
  2. Какой формат отображения вы хотите:
    • литры,
    • м³,
    • оба варианта?
  3. Достаточно ли вам пересчёта через виртуальный контрол (как в примере), или принципиально нужно именно через стандартный шаблон?

Примечание: Я — искусственный интеллект, а не сотрудник-человек. В моих ответах возможны неточности.


  1. Общая информация по модулям и шаблонам устройств Wiren Board: https://wirenboard.com/wiki/Modules ↩︎

Счетчик Itelma WFK2 (https://www.i-bs.ru/production/schetchiki-itelma/mehanicheskie-krilchatie-schetchiki-vodi-itelma-s-impulsnim-vihodom)

Цена импульса литр/имп. - 10 (х0,0001)

Пересчет нужен в куб.метры (в литры - опционально).

Желательно в самом шаблоне, как параметры настройки, как в MWAC v.2

Добрый день.
В WB-MWAC v1 нет внутреннего пересчета. Шаблон - позволяет работать только с тем функционалом который есть в модуле.
Соответственно - реализовать можно только программно, правилами на контроллере.

Получается, остается создать виртуальный контрол (через wb-rules) который будет забирать данные с двух импульсных счетчиков воды и хранить там уже «литры» или «м³» и публиковать эти данные в mqtt-топики.

для счетчика P1:

  • mwac_1/Water Counter 1 — сырой счётчик импульсов,

  • virtual:water_volume_m3_1— виртуальный контрол с объёмом в м3 с пересчетом из virtual:water_volume_L_1 * 1000

  • virtual:water_volume_L_1 - виртуальный контрол с объёмом в литрах

  • L_PER_PULSE_1 — коэффициент пересчета импульсов в литры (аналог Counter Pulse Weight)

  • Offset_water_volume_m3_1 - начальное значение в м3

  • Offset_water_volume_L_1 - начальное значение в литрах, пересчитанное из Offset_water_volume_m3_1 / 1000

для счетчика P2:

  • mwac_1/Water Counter 2— сырой счётчик импульсов,

  • virtual:water_volume_m3_2— виртуальный контрол с объёмом в м3 с пересчетом из virtual:water_volume_L_2 * 1000

  • virtual:water_volume_L_2 - виртуальный контрол с объёмом в литрах

  • L_PER_PULSE_2— коэффициент пересчета импульсов в литры (аналог Counter Pulse Weight)

  • Offset_water_volume_m3_2 - начальное значение в м3

  • Offset_water_volume_L_2- начальное значение в литрах, пересчитанное из Offset_water_volume_m3_2 / 1000

Здравствуйте! Я автоматический помощник техподдержки Wiren Board. Сейчас выходной — я попробую помочь сразу, а в ближайший рабочий день инженеры посмотрят тему и ответят.
Я проанализировал ваш вопрос и постарался найти возможное решение:
Если потребуется дополнителоьное уточнение, приложенную информацию прошу направить нажав ответить на мое крайнее сообщение.


Да, в вашем случае остаётся именно вариант с виртуальным устройством и правилами — как вы описали. Ниже приведу готовый пример wb-rules, который реализует вашу логику для двух счётчиков P1 и P2, с учётом:

  • сырого счётчика импульсов mwac_1/Water Counter 1 и mwac_1/Water Counter 2,
  • коэффициента L_PER_PULSE_X,
  • начальных значений (offset) в м³,
  • пересчёта м³ ↔ литры,
  • публикации в удобные MQTT‑топики виртуального устройства.

Пример правила wb-rules для двух счётчиков

Создайте файл, например /etc/wb-rules/water_counters.js со следующим содержимым (подправьте имена устройств/топиков под свои):

// Коэффициенты пересчета: литров за один импульс
var L_PER_PULSE_1 = 10;  // ваш Itelma WFK2: 10 л/имп
var L_PER_PULSE_2 = 10;  // если второй счётчик с тем же коэффициентом

// Начальные значения в м3 (можете менять из веб-интерфейса после загрузки правил)
var DEFAULT_OFFSET_M3_1 = 0.0;
var DEFAULT_OFFSET_M3_2 = 0.0;

defineVirtualDevice("virtual_water", {
  title: "Virtual Water Counters",
  cells: {
    // ----- Счётчик P1 -----
    // Объём в литрах
    water_volume_L_1: {
      type: "value",
      value: 0,
      readonly: true
    },
    // Объём в м3
    water_volume_m3_1: {
      type: "value",
      value: 0,
      readonly: true
    },
    // Коэффициент литров за импульс (можно править из интерфейса)
    L_PER_PULSE_1: {
      type: "value",
      value: L_PER_PULSE_1,
      readonly: false
    },
    // Начальное значение в м3 (offset), редактируемое
    Offset_water_volume_m3_1: {
      type: "value",
      value: DEFAULT_OFFSET_M3_1,
      readonly: false
    },
    // Начальное значение в литрах (рассчитывается из offset м3)
    Offset_water_volume_L_1: {
      type: "value",
      value: DEFAULT_OFFSET_M3_1 * 1000,
      readonly: true
    },

    // ----- Счётчик P2 -----
    water_volume_L_2: {
      type: "value",
      value: 0,
      readonly: true
    },
    water_volume_m3_2: {
      type: "value",
      value: 0,
      readonly: true
    },
    L_PER_PULSE_2: {
      type: "value",
      value: L_PER_PULSE_2,
      readonly: false
    },
    Offset_water_volume_m3_2: {
      type: "value",
      value: DEFAULT_OFFSET_M3_2,
      readonly: false
    },
    Offset_water_volume_L_2: {
      type: "value",
      value: DEFAULT_OFFSET_M3_2 * 1000,
      readonly: true
    }
  }
});

// ---- Служебные правила для поддержания связи offset м3 ↔ литры ----

// Если меняем offset в м3 для P1 — обновляем offset в литрах
defineRule("update_offset_L_from_m3_1", {
  whenChanged: "virtual_water/Offset_water_volume_m3_1",
  then: function (newValue) {
    var m3 = parseFloat(newValue) || 0;
    dev["virtual_water"]["Offset_water_volume_L_1"] = m3 * 1000.0;
  }
});

// Если меняем offset в м3 для P2 — обновляем offset в литрах
defineRule("update_offset_L_from_m3_2", {
  whenChanged: "virtual_water/Offset_water_volume_m3_2",
  then: function (newValue) {
    var m3 = parseFloat(newValue) || 0;
    dev["virtual_water"]["Offset_water_volume_L_2"] = m3 * 1000.0;
  }
});

// ---- Основные правила пересчёта импульсов в литры и м3 ----

// P1: mwac_1/Water Counter 1 -> литры и м3
defineRule("mwac1_p1_pulses_to_volume", {
  whenChanged: "mwac_1/Water Counter 1",
  then: function (newValue) {
    var pulses = parseFloat(newValue) || 0;

    var kL = parseFloat(dev["virtual_water"]["L_PER_PULSE_1"]) || 0;
    var offsetL = parseFloat(dev["virtual_water"]["Offset_water_volume_L_1"]) || 0;

    // Объем в литрах = импульсы * литров/импульс + offset в литрах
    var liters = pulses * kL + offsetL;
    var m3 = liters / 1000.0;

    dev["virtual_water"]["water_volume_L_1"] = liters;
    dev["virtual_water"]["water_volume_m3_1"] = m3;
  }
});

// P2: mwac_1/Water Counter 2 -> литры и м3
defineRule("mwac1_p2_pulses_to_volume", {
  whenChanged: "mwac_1/Water Counter 2",
  then: function (newValue) {
    var pulses = parseFloat(newValue) || 0;

    var kL = parseFloat(dev["virtual_water"]["L_PER_PULSE_2"]) || 0;
    var offsetL = parseFloat(dev["virtual_water"]["Offset_water_volume_L_2"]) || 0;

    var liters = pulses * kL + offsetL;
    var m3 = liters / 1000.0;

    dev["virtual_water"]["water_volume_L_2"] = liters;
    dev["virtual_water"]["water_volume_m3_2"] = m3;
  }
});

Как это будет выглядеть в MQTT / интерфейсе

Появится виртуальное устройство virtual_water с контролами:

  • virtual_water/water_volume_L_1 и _2 — литры (readonly),

Не могу добиться, чтобы отображение и передача в топики MQTT показаний в м3 передавалась в формате 3 знака после запятой. Как это правильно сделать?

// UI поля m3 как текст для правильного отображения
“p1_m3”: { type: “text”, value: “0.000”, readonly: true, title: “P1 текущие показания (м³)”, group: “Показания” },
“p1_day_usage”: { type: “text”, value: “0.000”, readonly: true, title: “P1 расход за сутки (м³)”, group: “Показания” },

“p2_m3”: { type: “text”, value: “0.000”, readonly: true, title: “P2 текущие показания (м³)”, group: “Показания” },
“p2_day_usage”: { type: “text”, value: “0.000”, readonly: true, title: “P2 расход за сутки (м³)”, group: “Показания” },

// ------------------- MQTT Export -------------------
defineVirtualDevice(“water_counters_export”, {
title: “Water Counters Export”,
cells: {
“p1_m3”: { type: “text”, value: “0.000”, units: “m3” },
“p1_liters”: { type: “value”, value: 0, units: “L” },
“p1_day_usage”: { type: “text”, value: “0.000”, units: “m3” },

“p2_m3”: { type: “text”, value: “0.000”, units: “m3” },
“p2_liters”: { type: “value”, value: 0, units: “L” },
“p2_day_usage”: { type: “text”, value: “0.000”, units: “m3” }
}
});

Здравствуйте! Я автоматический помощник техподдержки Wiren Board. Сейчас выходной — я попробую помочь сразу, а в ближайший рабочий день инженеры посмотрят тему и ответят.
Я проанализировал ваш вопрос и постарался найти возможное решение:
Если потребуется дополнителоьное уточнение, приложенную информацию прошу направить нажав ответить на мое крайнее сообщение.


Чтобы и в веб‑интерфейсе, и в MQTT значения в м³ всегда были с 3 знаками после запятой, нужно:

  1. Хранить числа как value (тип value или text — не важно для MQTT, важно ЧТО вы туда записываете).
  2. При записи в контрол форматировать число сами, а не полагаться на автоформат.

Сейчас у вас контролы объявлены как type: "text" и начальное значение "0.000", но дальше вы, скорее всего, записываете в них «сырые» числа, например:

dev["water_counters_export"]["p1_m3"] = someFloatValue;

В этом случае в MQTT уйдёт просто число (например 1 или 1.2), без обязательных трёх знаков.

Как правильно сделать формат 3 знака после запятой

Используйте toFixed(3) при записи:

// Пример пересчёта и экспорта P1
defineRule("export_p1_to_mqtt", {
  whenChanged: "virtual_water/water_volume_m3_1",
  then: function (newValue) {
    var m3 = parseFloat(newValue) || 0;
    // Форматируем с тремя знаками: "1.234"
    var m3_formatted = m3.toFixed(3);

    dev["water_counters_export"]["p1_m3"] = m3_formatted;
  }
});

// Аналогично для суточного расхода
defineRule("export_p1_day_usage_to_mqtt", {
  whenChanged: "virtual_water/p1_day_usage_raw", // ваш вычисляемый суточный объём в м3
  then: function (newValue) {
    var m3 = parseFloat(newValue) || 0;
    dev["water_counters_export"]["p1_day_usage"] = m3.toFixed(3);
  }
});

// И для P2 — по той же схеме
defineRule("export_p2_to_mqtt", {
  whenChanged: "virtual_water/water_volume_m3_2",
  then: function (newValue) {
    var m3 = parseFloat(newValue) || 0;
    dev["water_counters_export"]["p2_m3"] = m3.toFixed(3);
  }
});

Ключевой момент:
toFixed(3) возвращает строку, поэтому:

  • type: "text" — полностью подходит (в MQTT будут строки "1.234").
  • Если вы хотите именно «число» в MQTT, но с фиксированным видом, то это уже зависит от того, кто потребляет данные:
    MQTT сам по себе не отличает строку от числа, это дело клиента. Обычно для «красивого» формата достаточно строки.

Ваш JSON можно оставить как есть

Ваши определения:

"p1_m3": { type: "text", value: "0.000", readonly: true, title: "P1 текущие показания (м³)", group: "Показания" },
"p1_day_usage": { type: "text", value: "0.000", readonly: true, title: "P1 расход за сутки (м³)", group: "Показания" },

"p2_m3": { type: "text", value: "0.000", readonly: true, title: "P2 текущие показания (м³)", group: "Показания" },
"p2_day_usage": { type: "text", value: "0.000", readonly: true, title: "P2 расход за сутки (м³)", group: "Показания" },

и

"p1_m3": { type: "text", value: "0.000", units: "m3" },
"p1_liters": { type: "value", value: 0, units: "L" },
"p1_day_usage": { type: "text", value: "0.000", units: "m3" },

"p2_m3": { type: "text", value: "0.000", units: "m3" },
"p2_liters": { type: "value", value: 0, units: "L" },
"p2_day_usage": { type: "text", value: "0.000", units: "m3" }

корректны — важно только, чтобы в правилах в эти поля писалась строка с toFixed(3), а не «сырое» число.

Если пришлёте фрагмент ваших текущих правил, где вы обновляете p1_m3 / p2_m3, я смогу прямо в вашем коде показать, куда лучше вставить форматирование.


Примечание: Я — искусственный интеллект, а не сотрудник-человек. В моих ответах возможны неточности.