MQTT + Node-RED = регулировка температуры

Добрый день. Цель : регулировка температуры через MQTT в Node-Red . Использую датчик ds18b20 ,подключенный к WB7 и модуль wb-mr6c (пробно использую один выход реле). Если вносить постоянное значение в настройках кубика switch ,то реле отрабатывает по заданной температуре как положено. Как вносить изменения значения температуры через топик MQTT ? Не могу разобраться ,весь интернет перерыл. Посылаю в топик значение ,Node-Red значение принимает(в дебаге отображается) ,но прикрутить к регулировке не могу, все перепробовал. Языка JS не знаю, потому пользуюсь визуальны программированием. Прошу помощи разобраться с данной задачей, с пояснениями пожалуйста.

Добрый день.
Не совсем понятно что такое сущность?
Покажите код пожалуйста, опишите (желаемую) логику его работы.

Использование NR подразумевает, с моей точки рения знаний больших, чем при простом написании кода.

Суть внести значение с мобильного приложения в топик брокера,node-red подписывается на этот топик и вносит значение в переменную для изменения значения заданной температуры. Nod-red настроил на подписку, значения в него приходят, а как отправить это значение в переменную для смены значения заданного значения температуры не знаю .

Да, поле с уставкой.

Вот пример термостата на штатном js:
https://wirenboard.com/wiki/Rule_Examples#Термостат

Ну и, собственно, “отправлять” переменную никуда в общем случае не надо:
создал топик

defineVirtualDevice("test_14411", {
  title: "03_07_test_14411.js",
  cells: {
    SetTemp: {
      type: "range",
      max: 30,
      value: 22
    },


  }
});

Ну и набрасываю что-то такое

где в функции пишу

var setPoint = context.get('setPoint')||0;
var realTemp = 0;

if (msg.topic === "/devices/test_14411/controls/SetTemp") {
  context.set('setPoint', msg.payload)
}

if (msg.topic === "/devices/hwmon/controls/CPU Temperature") {
  //node.warn("topick realTemp" + msg.payload);
  realTemp = msg.payload;
}

node.warn("realTemp " + realTemp);
node.warn("setPoint " + setPoint);


if (realTemp> setPoint){
    msg.payload = 0;
}
else{
    msg.payload = 1;
}

return ("doIt", msg);

и выглядит оно так:


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


С постоянными цифрами ,которые я вношу в узел switch все отрабатывает .Скажите пожалуйста ,что внести за место этих цифр ,чтобы можно было через топик их менять? Топик,в котором меняю значения set/reg.temp ,на него в node-red подписан. Датчик температуры подключен по 1-wire к WB.

Что такое “узел switch”?
Такой?
Screenshot_20230913_160737

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

defineVirtualDevice(“setpoint”, {
title: “Регулятор температуры”,
cells: {
“temperature”: {
type: “range”,
value: 29,
min: 20,
max: 40
},
}
});

defineRule(“temp”, {
whenChanged: “wb-w1/28-3c01f096016a”,
then: function (newValue, devName, cellName) {
if (newValue < dev[“setpoint/temperature”]) {
dev[“wb-mr6c_1/K1”] = true;
} else {
dev[“wb-mr6c_1”][“K1”] = false;
}
}
});

Подскажите ,что в коде нужно дописать ,чтобы гистерезис добавить в программу ?
И второй вопрос, при смене задающей температуры ползунком в виджетах ,слишком долго обрабатывает информацию на включение и выключение реле .Бывает сразу через пару секунд включается реле, бывает по несколько минут ждешь. Чем проц занят, если только одна программа ,которая выше написана больше ,ничего нет ? Если я напрямую в виджетах клацаю релюхами, то все сразу исполняется.

Именно такой вопрос уже обсуждался Пример термостата из wiki некорректен
И да, отлично что это заметили.


В таком исполнении все заработало .Но появился еще вопрос ,как присвоить свое имя к примеру датчику температуры ds18b20, который подключен к WB к 1-wire ? У него большое название и очень неудобно вписывать такое название датчика в программу. Да и еще таких датчиков на шине будет с десяток ,так совсем можно запутаться. Поправьте пожалуйста в программе ,что нужно дописать и куда .Может лишнего чего в проге написал ,выслушаю ваше замечания . Только пишите по человечески ,я не программист.

Куда проще объявить в программе имя константой и обращаться уже по ней.
Ну или переменной:

var some_temp_sensor = "wb-w1/28-хххххххх"

whenChanged some_temp_sensor, then:

GitHub - wirenboard/wb-mqtt-w1: Wiren Board Smart Home MQTT generic 1-Wire (w1) driver compatible with HomA conventions не предусматревает смену идентификаторов.

С моей точки зрения - вполне работоспособно. И, что главное - понятно как работает. Я ведь тоже не программист, так, по верхам понахватался.
Посмотрите, кстати: Написание скриптов для начинающих — Wiren Board

Все получилось, спасибо .Есть еще вопрос ,как сделать массив управления реле (к примеру по одному событию надо включать 3 реле) ? Или каждое реле дописывать в свою строку проги ? В одной строке программы как сделать ?

Делаю подобное функцией, куда передаю json с именами, чтобьы в функции перебрать циклом. Но так себе путь, годится только тогда когда состав переключаемых каналов может меняться.

Да, каждое реле - это надежно и работает всегда.

Эта тема была автоматически закрыта через 7 дней после последнего ответа. В ней больше нельзя отвечать.