Добрый день. Цель : регулировка температуры через 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”?
Такой?
Я, к сожалению, не достаточно разбираюсь в 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 с именами, чтобьы в функции перебрать циклом. Но так себе путь, годится только тогда когда состав переключаемых каналов может меняться.
Да, каждое реле - это надежно и работает всегда.