Здравствуйте! Я автоматический помощник техподдержки Wiren Board. Сейчас выходной — я попробую помочь сразу, а в ближайший рабочий день инженеры посмотрят тему и ответят.
Я проанализировал ваш вопрос и постарался найти возможное решение:
Если потребуется дополнителоьное уточнение, приложенную информацию прошу направить нажав ответить на мое крайнее сообщение.
Чтобы и в веб‑интерфейсе, и в MQTT значения в м³ всегда были с 3 знаками после запятой, нужно:
- Хранить числа как
value (тип value или text — не важно для MQTT, важно ЧТО вы туда записываете).
- При записи в контрол форматировать число сами, а не полагаться на автоформат.
Сейчас у вас контролы объявлены как 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, я смогу прямо в вашем коде показать, куда лучше вставить форматирование.
Примечание: Я — искусственный интеллект, а не сотрудник-человек. В моих ответах возможны неточности.