Виртуальное устройство с контроллом типа text

Скажите я создал виртуальное устройство с контроллом типа text
Потом в это устройство значение отправляю новый текст с автоматизации


смотрю на устройство и появляется новый текст. Но если я заново открываю устройство (перезагружаю страницу, то текст пропадает и подгружается значение по умолчанию)

Как сохранить новый текст в данном контролле, после обновления страницы?

Идея такая что при ошибки в этот контрол пишется описание ошибки и потом когда заходишь в ВБ можно почитать описание.

Добрый день.
Покажите как у вас описано виртуальное устройство.

В какой именно топик пишется новое значение? Топик имеет ‘/on’?
Пожалуйста прочитайте MQTT в контроллерах Wiren Board — Wiren Board а также документацию на брокер, убедитесь что понимаете все пункты.

// 1. НЕОБХОДИМО ЗАПОЛНИТЬ ДАННЫЕ ПО УСТРОЙСТВУ

// 1.1 путь до внешних физических устройств
var temperatureSensorDoor = “wb-mai6_66/IN 2 P Temperature”
var temperatureSensorDeep = “wb-mai6_66/IN 2 N Temperature”
var redLamp = “wb-mrm2-mini_54/K2”
var greenLamp = “wb-gpio/A4_OUT”
var yellowLamp = “wb-gpio/A3_OUT”
var loock = “wb-m1w2_78/Input 1”
var cleaning = “wb-mrm2-mini_54/Input 2 counter”

// 1.2 введите Id и Имя холодильника (устройства (обычно +1 к предыдущему)
var idDevice = 2
var idName = “Холодильник с сыром”

// -------------------------------------------------------------------------- //

// 2. СКРИПТ НА СОЗДАНИЕ УСТРОЙСТВА
defineVirtualDevice(“fridge_”+idDevice, {
title: idName ,
cells: {
temperatureSensorDoor: {
title: “Температура у двери”,
type: “temperature”,
value: 0,
order: 8
},
temperatureSensorDeep: {
title: “Температура у блока”,
type: “temperature”,
value: 0,
order: 9
},
redLamp: {
title: “Красная лампа”,
type: “switch”,
value: false,
order: 3
},
greenLamp: {
title: “Зеленая лампа”,
type: “switch”,
value: false,
order: 5
},
yellowLamp: {
title: “Желтая лампа”,
type: “switch”,
value: false,
order: 7
},
cleaning: {
title: “Режим уборки”,
type: “switch”,
value: false,
order: 4
},
loock: {
title: “Дверь заперта”,
type: “switch”,
value: false,
order: 6
},
alarm: {
title: “ОШИБКА”,
type: “alarm”,
value: false,
order: 1
},
textAlarm: {
title: “”,
type: “text”,
value: “описание ошибки”,
order: 2
},
}
});

// привязка показаний физических устройств (внешних)
// датчик у двери
defineRule( {
whenChanged: temperatureSensorDoor,
then: function (newValue) {
dev [“fridge_” +idDevice+ “/temperatureSensorDoor”] = newValue
}
});
// датчик у блока
defineRule( {
whenChanged: temperatureSensorDeep,
then: function (newValue) {
dev [“fridge_” +idDevice+ “/temperatureSensorDeep”] = newValue
}
});

// Красная лампа
defineRule( {
whenChanged: redLamp,
then: function (newValue) {
dev [“fridge_”+idDevice+“/redLamp”] = newValue
}
});
defineRule( {
whenChanged: “fridge_”+idDevice+“/redLamp”,
then: function (newValue) {
dev [redLamp] = newValue
}
});

// Зеленая лампа
defineRule( {
whenChanged: greenLamp,
then: function (newValue) {
dev [“fridge_”+idDevice+“/greenLamp”] = newValue
}
});
defineRule( {
whenChanged: “fridge_”+idDevice+“/greenLamp”,
then: function (newValue) {
dev [greenLamp] = newValue
}
});

// Желтая лампа
defineRule( {
whenChanged: yellowLamp,
then: function (newValue) {
dev [“fridge_”+idDevice+“/yellowLamp”] = newValue
}
});
defineRule( {
whenChanged: “fridge_”+idDevice+“/yellowLamp”,
then: function (newValue) {
dev [yellowLamp] = newValue
}
});

// геркон (датчик на закрытие двери)
defineRule( {
whenChanged: loock,
then: function (newValue) {
dev [“fridge_” + idDevice + “/loock”] = !newValue
}
});

// Режим уборки
defineRule( {
whenChanged: cleaning,
then: function () {
dev [“fridge_”+idDevice+“/cleaning”] = true
}
});

// активация аларм
defineRule( {
whenChanged: “fridge_”+idDevice+“/redLamp”,
then: function (newValue) {
dev [“fridge_” + idDevice + “/alarm”] = newValue
}
});

я уже пробовал и если топик имеет ‘/on’ то не работает. Тока без него опрашивается

я нашел выход, я создал повтор опроса каждые 5 секунд. И сейчас он при обновлении страницы через 5 сек подгружает

Едиственное не сильно я так гружу процессор?

К сожалению я не уверен что правильно понимаете принцип работы.
Еще раз в документации написано:

Для того чтобы убедиться можете выполнить

mosquitto_pub -t '/devices/fridge_2/controls/alarm/on' -r -m 1

Установленное значение будет в топике до его изменения.

Это не выход. Это прямая запись в обход драйвера, что может вызвать совершенно неожиданные эффекты.
Пожалуйста, прочитайте документацию.

у меня то это не релейный модуль и у него нет состояния 0 и 1.
У меня опрашивается контрол с типом text

А как сделать чтобы данные с переменной в node red (там текст с описанием ошибки) навсегда записывались в значение данного топика.
При этом в памяти node red хранится эта переменная а при обновлении страницы WB она стрирается на дефолтное

Я тестировал с on и без него

При это у меня в топике в значении просто текст без исполнительного устройства

Проверял изменение топика на этой странице

Записывать в подтопик /on, обращу внимание - если снаружи то только в топик с установленным readonly: false
Screenshot_20240411_214906

  textAlarm: {
  title: "",
  type: "text",
  value: "описание ошибки",
  readonly: false,
  order: 2
  },

Например так

mosquitto_pub -t '/devices/fridge_2/controls/textAlarm/on' -r -m "SomeText"

я не совсем понял это нужно в ноде функция такую команду сделать?

Я добавил
textAlarm: {
title: “”,
type: “text”,
value: “описание ошибки”,
readonly: false,
order: 2
},

Да заработало через on (хотя и без него приходят команды). Но минус в том что появился квадрат и текст обрезается и не видно полностью. Это крайне неудобно. Вот смотрите
с readonly: false,

Вот я убрал readonly: false,
и теперь работает только без on но без рамки и не обрезан (так как мне надо)

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

все верно я вижу ошибку и через ноде ред записываю в переменную текст с описанием ошибки

Вот пример с ошибкой

Понимаю, что вы хотите увидеть в итоге.

Но считаю, что так, как у вас сейчас это реализовано, не корректно. Выше писали почему. Плюс значение данного контрола будет “сбрасываться”, как вы уже заметили.

Какой возможен вариант, если именно такое представление вы желаете иметь в виджете:

  1. Создать отдельное виртуальные устройство с нужным вам количеством контролов с типом alarm в таком виде (т.е. чтобы readonly: false был)
textAlarm: {
title: “”,
type: “text”,
value: “описание ошибки”,
readonly: false,
order: 2
},
  1. Писать ваш текст из Node-RED’а именно в данные топики через /on.
  2. Создать правило, которое будет обрабатывать изменение данного контрола и через
dev["virtual-fridge_2/textAlarm"] = newValue;

будет более корректно писать уже в топик вашего первоначального виртуального устройства (виджет холодильника).
Пока только такие соображения. Попробуйте и сообщите о результате.


да сейчас делаю по такой схеме и при перезагрузке значение сохраняется. Теперь осталось решить вопрос с рамкой

Как ее расширить чтобы весь текст влез?

Вот как раз в этом виртуальном устройстве, т.е. основном и подразумевается, что для контрола textAlarm не надо readonly: false. Или удалите строку или сделайте readonly: true.

я поставил readonly: true .
У меня исчезла рамка, но перестало принимать команды через on и при обновлении данные стираются, то есть как было и раньше