Объясните пжст странности с параметрами контрола при создании устройства

беру вот такой код

var devtest = 'devtest'
var celltest = {"order":44,"value":4342.226134575478567,"title":"test","type":"power_consumption","description":"","units":"","max":1.7976931348623157e+308,"min":-1.7976931348623157e+308,"precision":0.000001,"readonly":true,"error":""}
			defineVirtualDevice(devtest, {
				title: devtest,
				cells: {celltest:celltest},
			})

получаю результат без max,min,precision

Summary

перечень и значения параметров взяты с реального счетчика

Что я делаю не так?

приложен диагностический архив, доступен только сотрудникам поддержки
(551.9 KB)

Добрый день.
Да, что-то мне знакомым показалось, 1.7976931348623157e+308 ~ Number.MAX_VALUE
При этом:

//02_19_test_01.js
var devtest = 'devtest'
var celltest = {"order":44,"value":4342.226134575478567,"title":"test","type":"range","description":"","units":"","max":1.7e+308,"min":-1.79,"precision":0.000001,"readonly":true,"error":""}

			defineVirtualDevice(devtest, {
				title: devtest,
				cells: {celltest:celltest},
			})

for (var key in celltest) {
  if (celltest.hasOwnProperty(key)) {
    log.info("Имя: " + key + ", Значение: " + celltest[key]);
  }
}

публикует

/devices/devtest/meta/driver wb-rules
/devices/devtest/meta/name devtest
/devices/devtest/meta {"driver":"wb-rules","title":{"en":"devtest"}}
/devices/devtest/controls/celltest/meta/min -1.79
/devices/devtest/controls/celltest/meta/order 44
/devices/devtest/controls/celltest/meta/readonly 1
/devices/devtest/controls/celltest/meta/type range
/devices/devtest/controls/celltest/meta/max 170000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
/devices/devtest/controls/celltest/meta {"max":1.7e+308,"min":-1.79,"order":44,"precision":0.000001,"readonly":true,"title":{"en":"test"},"type":"range"}
/devices/devtest/controls/celltest 4342.226135

А для чего планируете использовать максимально возможное значение?

делаю полные виртуальные клоны счетчиков с добавлением коэффициентов от трансформаторов тока, а оно вот клонируется, но не всё ((

var dvID="CTP-VRU_3_1-QF3_1-WH1_1"
var ctrlName="Total P"
  var dv= getDevice(dvID)
  var dvctrl = dv.getControl(ctrlName) 

  var cell = {}
  cell.type =  dvctrl.getType()
  cell.title =  { en: dvctrl.getTitle(), ru: dvctrl.getTitle('ru') }
  cell.description =  dvctrl.getDescription()
  cell.units =  dvctrl.getUnits()
  cell.max =  dvctrl.getMax()
  cell.min =  dvctrl.getMin()
  cell.precision =  dvctrl.getPrecision()
  cell.value =  dvctrl.getValue()
  cell.order =  dvctrl.getOrder()
  cell.readonly =  dvctrl.getReadonly()
  cell.error = dvctrl.getError()
log (JSON.stringify(cell))

var devtest = 'devtest'
			defineVirtualDevice(devtest, {
				title: devtest,
				cells: {celltest:cell},
			})

тут dvID это реальный счетчик MAP3E
cell выдал в лог вот такое

{"type":"power","title":{"en":"","ru":"P по трем фазам"},"description":"","units":"","max":1.7976931348623157e+308,"min":-1.7976931348623157e+308,"precision":0.01,"value":675.41,"order":19,"readonly":true,"error":""}

в итоге devtest получился без precision/max/min

Summary

Я никогда не видел счетчиков с подобными коэффициентами. Хочу обратить внимание: попытка создать контрол в котором количество ступеней (“precision”:0.000001) на 6 порядков больше чем максимально возможная к обработке величина выглядит странным. Какая практическая ценность этого, что за задачу решаете?

специально я ничего не настраивал, все с шаблона

кусок шаблона выглядит так

Summary
        {
          "baud_rate" : 1152,
          "channels" : 
          [
            {
              "name" : "Urms L1",
              "read_period_ms" : 15000
            },
            {
              "name" : "U L1-L2",
              "read_period_ms" : 5000
            },
            {
              "enabled" : false,
              "name" : "Upeak L1"
            },
            {
              "enabled" : false,
              "name" : "Voltage angle L1",
              "read_period_ms" : 5000
            },
            {
              "name" : "Irms L1",
              "read_period_ms" : 5000
            },
            {
              "name" : "Ipeak L1",
              "read_period_ms" : 5000
            },
            {
              "name" : "P L1",
              "read_period_ms" : 5000
            },
            {
              "enabled" : false,
              "name" : "Q L1",
              "read_period_ms" : 5000
            },
            {
              "enabled" : false,
              "name" : "S L1",
              "read_period_ms" : 5000
            },
            {
              "enabled" : false,
              "name" : "PF L1",
              "read_period_ms" : 5000
            },
            {
              "name" : "AP energy L1",
              "read_period_ms" : 5000
            },
            {
              "enabled" : false,
              "name" : "AN energy L1",
              "read_period_ms" : 5000
            },
            {
              "enabled" : false,
              "name" : "RP energy L1",
              "read_period_ms" : 5000
            },
            {
              "enabled" : false,
              "name" : "RN energy L1",
              "read_period_ms" : 5000
            },
            {
              "enabled" : false,
              "name" : "Phase angle L1",
              "read_period_ms" : 5000
            },
            {
              "name" : "Urms L2",
              "read_period_ms" : 15000
            },
            {
              "name" : "U L2-L3",
              "read_period_ms" : 5000
            },
            {
              "enabled" : false,
              "name" : "Upeak L2"
            },
            {
              "enabled" : false,
              "name" : "Voltage angle L2",
              "read_period_ms" : 5000
            },
            {
              "name" : "Irms L2",
              "read_period_ms" : 5000
            },
            {
              "name" : "Ipeak L2",
              "read_period_ms" : 5000
            },
            {
              "name" : "P L2",
              "read_period_ms" : 5000
            },
            {
              "enabled" : false,
              "name" : "Q L2",
              "read_period_ms" : 5000
            },
            {
              "enabled" : false,
              "name" : "S L2",
              "read_period_ms" : 5000
            },
            {
              "enabled" : false,
              "name" : "PF L2",
              "read_period_ms" : 5000
            },
            {
              "name" : "AP energy L2",
              "read_period_ms" : 5000
            },
            {
              "enabled" : false,
              "name" : "AN energy L2",
              "read_period_ms" : 5000
            },
            {
              "enabled" : false,
              "name" : "RP energy L2",
              "read_period_ms" : 5000
            },
            {
              "enabled" : false,
              "name" : "RN energy L2",
              "read_period_ms" : 5000
            },
            {
              "enabled" : false,
              "name" : "Phase angle L2",
              "read_period_ms" : 5000
            },
            {
              "name" : "Urms L3",
              "read_period_ms" : 15000
            },
            {
              "name" : "U L3-L1",
              "read_period_ms" : 5000
            },
            {
              "enabled" : false,
              "name" : "Upeak L3"
            },
            {
              "enabled" : false,
              "name" : "Voltage angle L3",
              "read_period_ms" : 5000
            },
            {
              "name" : "Irms L3",
              "read_period_ms" : 5000
            },
            {
              "name" : "Ipeak L3",
              "read_period_ms" : 5000
            },
            {
              "name" : "P L3",
              "read_period_ms" : 5000
            },
            {
              "enabled" : false,
              "name" : "Q L3",
              "read_period_ms" : 5000
            },
            {
              "enabled" : false,
              "name" : "S L3",
              "read_period_ms" : 5000
            },
            {
              "enabled" : false,
              "name" : "PF L3",
              "read_period_ms" : 5000
            },
            {
              "name" : "AP energy L3",
              "read_period_ms" : 5000
            },
            {
              "enabled" : false,
              "name" : "AN energy L3",
              "read_period_ms" : 5000
            },
            {
              "enabled" : false,
              "name" : "RP energy L3",
              "read_period_ms" : 5000
            },
            {
              "enabled" : false,
              "name" : "RN energy L3",
              "read_period_ms" : 5000
            },
            {
              "enabled" : false,
              "name" : "Phase angle L3",
              "read_period_ms" : 5000
            },
            {
              "name" : "Total P",
              "read_period_ms" : 5000
            },
            {
              "enabled" : false,
              "name" : "Total Q",
              "read_period_ms" : 5000
            },
            {
              "enabled" : false,
              "name" : "Total S",
              "read_period_ms" : 5000
            },
            {
              "enabled" : false,
              "name" : "Total PF",
              "read_period_ms" : 5000
            },
            {
              "name" : "Total AP energy",
              "read_period_ms" : 5000
            },
            {
              "enabled" : false,
              "name" : "Total AN energy",
              "read_period_ms" : 5000
            },
            {
              "enabled" : false,
              "name" : "Total RP energy",
              "read_period_ms" : 5000
            },
            {
              "enabled" : false,
              "name" : "Total RN energy",
              "read_period_ms" : 5000
            },
            {
              "name" : "Frequency",
              "read_period_ms" : 15000
            },
            {
              "name" : "Serial",
              "read_period_ms" : 1000000
            }
          ],
          "device_type" : "WB-MAP3E fw2",
          "enabled" : true,
          "id" : "CTP-VRU_3_1-QF3_1-WH1_1",
          "l1_ct_reverse" : 0,
          "l1_phase" : 1,
          "l1_phi" : 1499,
          "l1_turns" : 1996,
          "l2_ct_reverse" : 0,
          "l2_phase" : 2,
          "l2_phi" : 1598,
          "l2_turns" : 1996,
          "l3_ct_reverse" : 0,
          "l3_phase" : 3,
          "l3_phi" : 1779,
          "l3_turns" : 1997,
          "name" : "!!! \u0411\u0415\u0417 \u041a\u041e\u042d\u0424-\u0422\u041e\u0412 !!! \u0426\u0422\u041f-Wh1.1-QF3.1 - \u0412\u0412\u041e\u0414-\u0412\u0420\u04233.1\u043f",
          "peaks_measurement_period_s" : 60,
          "phase_loss_detection" : 1,
          "slave_id" : "225"
        }```

задачу описал вот тут

в этом посте считываю данные вот с этого устройства

Summary

точность такая берется с Total AP energy

Summary

я правильно понял, что у вас нормально опубликовался precision/max/min?
min в вашем примере не такой, как в моем

может mqtt explorer не все отображать?
как мне проверить по-другому?
почему может у меня не публиковаться?

Как я вижу: Вы берете дефолтное (максимальное) значение (в контроле-источнике оно не определено) и выставляете его в качестве параметров целевого.
Для объекта типа value (источник) и так параметры минимального-максимального дефолтные.
Ну и физически - не совсем понятно, для чегоиспользовать такое, какого никогда не сможет отдать само устройство.

Да, в том случае когда точность помещается в максимальное значение.

Не пользуюсь, не могу сказать.

mosquitto_sub - отлично работает. На компьютере, например.

Это не я беру, это вы мне даете его как результат dvctrl.getMax() и dvctrl.getMin().
Если значение не определено, то почему я получаю что-то конкретное, которое я не могу использовать?

ну если я пытаюсь всунуть минимальный min и максимальный max, то в принципе понятно, почему они не применяются, а вот почему precision при этом потерялся?

тут я не понимаю, что вы имеете виду.
Я повторюсь. У меня есть несколько электрических счетчиков, у которых коэффициент трансформации не помещается в 2 байта. Я в скрипте делаю автоматическое создание полного виртуального клона счетчика со всеми имеющимися контролами и их параметрами. Те контролы, конторые зависят от коэффициента трансформации, я умножаю на этот коэффициент в процессе транслянции значения от реального устройства.

я не совсем понял, в моем примере какое условие не дало примениться параметрам precision/max/min?

ЗЫ: Вы вообще-то неверно у себя воспроизвели. Ваш cells для создания виртуального устройства похож на мой лишь наполовину

Расскажу чуть подробнее, как я вижу.
В работе с физическими устройствами диапазон значений, которые можно с них получить ограничен как раз аппаратно. То есть - нельзя считать что измеритель может отдать значение большее чем разрядность его регистров.
Вы получаете теоретически возможное значение, максимальное с которым может работать софт.
Как вы планируете его использовать?

А для чего, опять же, брать максимум?

потому что если, условно максимальное 2^32 то его можно поделить на 1. Но нельзя поделить на 0,1 - результат будет больше максимального.

Если грубо описать, то у меня есть массив из ~10 строк-имен счетчиков + коэффициент для каждого счетчика. Я их перебираю и создаю пустые виртуальные устройства. Для каждого устройства в цикле перебираю все его контролы. cell для виртуального контрола заполняю таким же образом как тут, с помощью get… Добавляю правило, которое следит за контролом реального устройства и с коэффициентом применяет это значение на виртуальное устройство. Как результат ожидаю увидеть полный клон устройства с такими же meta для всех топиков.
Я не хочу разбираться, что там у контрола есть внутри, какие максимумы/минимумы/типы и т.д. Хочу не глядя взять все параметры контролов живого устройства и сделать клон.
Если у контрола не определено max, то результатом getMax, по идее, тоже должно быть неопределенное значение/пустая строка.

Андрей, поймите меня правильно, не я беру максимум, максимум мне дает результат getDevice(dvID).getControl(ctrlName).getMax() для контрола, у которого этот максимум не указан в meta, т.е. не определен.

у вас в conventions написано, что значение определено только для типа range, а для остального - не определено, вот я и хочу в результате получить “не определено”

Summary
// Maximum allowed control's value. Default value for range type is 10^9, for other types no limit specified by default
"max": 100,

// Minimum allowed control's value. Default value for range type is 0, for other types no limit specified by default
"min": -100.1,

// Control's value is rounded to defined precision by a driver and it is also used during user input validation
// If no precision is present, the value is used as-is
"precision": 0.1,

UPD:

а при чем тут деление?
если у меня есть число (Number.MAX_VALUE - 0,1111111) мне как его получить с точностью до 2-го знака? Ведь мы же для этого задаем поле precision

Да, это понятно.

Да, видел.
Собственно проблема - в том что для контрола типа value (power) устанавливается свойство max. То есть максимальное значение.
Это свойство имеет смысл только для range, так как описывает отрисовку в интерфейсе.

Не могу, к сожалению, согласиться с подходом.

Но почему? max - это максимальное значение которое можно в контрол записать. Логично что для простого значения оно ограничено только самой средой.

Я даже засомневался.
Но прочитал цитату. Буквально “максимально допустимое значение контрола”.
Как я рассуждаю: В свойстве “max” указано наибольшее значение которое может принять контрол.
То есть, для тех контролов для которых это актуально - я могу проверить что записываемое значение не превышает его - и тогда записывать.
Для тех контролов для которых не определено (не задано при создании) - оно и есть максимальное.

Да, для него, конечно, будет работать.
Проверю, кстати.

проблема не в том, что устанавливается значение max, а в том, что я получаю ОПРЕДЕЛЕННОЕ значение (Number.MAX_VALUE), в случае, когда это значение в meta НЕОПРЕДЕЛЕНО.

Если я штатными средствами получаю значения meta полей, то почему я должен сомневаться, что я получил что-то некорректное? Зачем мне еще делать какие-то дополнительные проверки? Это задача системы делать проверки при присваивании значений.

циата из документации:

Контролам можно устанавливать значения мета-полей при помощи сеттеров. Например, установить description можно при помощи метода setDescription(string) , unitssetUnits(string) и т.д. Аналогично можно и получать значения этих полей геттерами, например, для descriptiongetDescription()

если значение в meta не установлено, то я хочу получить результат get… как неопределенный/пустой, а не Number.MAX_VALUE. Вот когда в шаблоне устройства будет присутствовать “max”: Number.MAX_VALUE, вот тогда вопросов не будет.
Так же и про set. Если устанавливаю meta через set… ,то хочу его там увидеть или получить ошибку, почему это сделать нельзя. А если устанаваливаю set…(null), то сделать meta-поле неопределенным, т.е удалить (не пробовал, возможно это уже реализовано).

вы не дочитали цитату до конца

for other types no limit specified by default

когда это значение указано, то да, все именно так

вот тут я с вами в корне не согласен. Вы, как программисты JS, как никто лучше знаете разницу между undefined/null/NaN/Number.MAX_VALUE.
неопределено == no limit == null/undefined, но совсем != Number.MAX_VALUE


И тема с precision так и не раскрыта. Почему при явном задании этого значения, оно не было применено и не появилось в meta. Даже warning никакого не выдает.
И при чем тут деление на 0,1

Если оно неопеределено, то как и описано - дефолное для типа контрола.

Потому что поля (контролы) содержат значения соответствующие определенным регистрам устройства.
То есть - логично ожидать от поля с напряжением или мощностью, например - только то что может отдать устройство.

Вот тут ниже, как раз.

Тип “value” не ограничен. В него можно записать максимально возможное значение.

“Не определено” - значит что не установлено с помощью записи max c каким-то значением.

Для примера.
Указываю

"precision":0.01

Получаю

"precision":0.0001

дефолтное тоже неопределено, ссылку на доку приводил. no limit - это нет лимита, т.е. неопределено.

максимально возможное значение не определено

правильно, именно этот результат “не определено” я и ожидаю получить в результате исполнения функции, которая возвращает значение отсутствующего meta поля max.

к чему был этот пример?

“Default value for range type is 10^9, for other types no limit specified by default.”
Буквально значит: “Для остальных типов ограничение не задано по умолчанию.”
Я понимаю как “не задан по молчанию” - это не означаете что он пуст или null.
Попрошу наверно переписать эту строку.

Установка округления работает.

еще раз приведу цитата из документации:

Контролам можно устанавливать значения мета-полей при помощи сеттеров. Например, установить description можно при помощи метода setDescription(string) , unitssetUnits(string) и т.д. Аналогично можно и получать значения этих полей геттерами, например, для descriptiongetDescription()

с помощью set… и get… устанавливаются и получаются значения meta полей.
если meta-поле неопределено, то и результат должен быть неопределенным.

вопрос был совсем не про это. Вопрос был про то, что я пытаюсь задать значение meta-поля precision с помощью setPrecision(getPrecision(device_control)), а оно не применяется