Объединение данных по фазам с MAP3E

Необходимо сохранять мощность и напряжение по трём фазам как одну запись. Сейчас на контроллере настроен мост до сервера. На сервере Telegraf забирает данные, откругляет время до 1мс и пишет в InfluxDB. При попытке использовать функицю pivot() для объединения записей с одинаковым временм выяснилось, что напряжение приходит реже мощности, и в записях получаются дыры. Как можно решить эту задачу либо на любой из сторон?

Добрый день!
Хотел, на всякий случай, обратить ваше внимание, что среднеквадратичное значение напряжения считается как среднее за 16 периодов, т.е. каждые 320 мс, а мощность вычисляется из мгновенных значений. Поэтому пара напряжение-мощность будет всегда иметь некоторую “неопределенность”. Думаю, и округление до 1 мс избыточно – можно грубее округлять.
Насколько я понимаю, Influx позволяет в таких случаях использовать fill(usePrevious: true).
Возможно настраивать “Интервал публикации неизменившихся значений” в “Настройках wb-mqtt-serial” (минимальный – раз в секунду), но нет гарантии, что оба показателя будут попадать в нужное вам окно.
Наверное, можно написать правило, которое срабатывает и по изменению мощности, и по изменению напряжения, и передает оба значения в виртуальное устройство, а в Telegraf брать напряжение и мощность из топиков виртуального устройства, а не из счетчика – так выше вероятность, что оба значения будут публиковаться с минимальным интервалом. Но полностью исключить неодновременность тут тоже не удастся.

Благодарю за развёрнутый ответ. Период как-то задаётся или определяется лишь скоростью передачи данных по RS485?

Да, период опроса настраивается отдельно для каждого канала, а его минимальное значение ограничивается соростью передачи, количеством опрашиваемых регистров и возможными ошибками при обмене данными с устройствами.
Более подробно про периодичночть опроса можно прочесть в разделе “Настройка периода опроса” в документе “Начальное конфигурирование устройств через веб-интерфейс”.

Где об этом можно почитать? В MQTT я вижу только топики вида /devices/wb-map3e_232/controls. Это виртуальное устройство?

Добрый день! Топики /devices/wb-map3e_232/controls относятся к реальному устройству, а виртуальное устройство создается в движке правил, описание которого можно прочесть в этой статье и в документации на GitHub.

Поясню немного детальнее на примере: предположим, что нам надо публиковать вместе пару напряжений, полученных от АЦП контроллера, например на шинах 3.3 В и 5 В, не важно, какое из них изменилось.

Шаг 1: создаем виртуальное устройство adc_pack с двумя контролами:

defineVirtualDevice('adc_pack', {
  title: 'ADC packed',
  cells: {
    V3_3: { type: 'value', value: 0.000, readonly: true, units: 'V' },
    V5_0: { type: 'value', value: 0.000, readonly: true, units: 'V' }
  }
});

Шаг 2: Создаем функцию, которая принудительно публикует значение контрола:

function forceSet(devId, cell, val) {
  getControl(devId + '/' + cell).setValue({ value: val, notify: true });
}

тут мы указываем notify: true , чтобы значение всегда публиковалось, даже если оно не изменилось.

Шаг 3. Создаем функцию, которая читает текущие значения напряжений и публикует их вместе:

function republishBoth() {
  var v33 = Number(dev['wb-adc/V3_3']);
  var v50 = Number(dev['wb-adc/V5_0']);
  forceSet('adc_pack', 'V3_3', v33);
  forceSet('adc_pack', 'V5_0', v50);
}

Шаг 4: пишем правило, которое публикует значения при изменении любого из них:

defineRule('adc_pack_on_any', {
  whenChanged: ['wb-adc/V3_3', 'wb-adc/V5_0'],
  then: republishBoth
});

Сохраняем правило и смотрим, как публикуются значения:

mosquitto_sub -v -t '/devices/adc_pack/controls/#' | ts '%Y-%m-%d %H:%M:%.S'

Вывод будет примерно такой:


2025-10-17 16:16:47.761873 /devices/adc_pack/controls/V3_3 3.284
2025-10-17 16:16:47.765647 /devices/adc_pack/controls/V5_0 5.157
2025-10-17 16:16:48.461630 /devices/adc_pack/controls/V3_3 3.283
2025-10-17 16:16:48.463304 /devices/adc_pack/controls/V5_0 5.159

Видно, что значения публикуются не одновременно, но с очень небольшой разницей: 2-4 миллисекунды.