• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Нужна помощь Несколько DS18B20 на Esp8266 + Node Red + Domoticz

Amadeus71rus

New member
Всем доброго времени!

Есть Esp8266 (прошивка Tasmota, но это не принципиально). Подключены несколько DS18B20 по Onewire. Esp посылает через MQTT состояние датчиков в JSON формате (насколько я понимаю) строкой вида {"Time":"2017-11-10T13:30:03", "DS18x20":{"DS1":{"Type":"DS18B20", "Address":"28FFB0A26415023D", "Temperature":1.0}, "DS2":{"Type":"DS18B20", "Address":"28FFBBF46415029C", "Temperature":25.5}}, "TempUnit":"C"}.

С помощью промежуточной обработки в Node Red нужно "вытащить" показания каждого датчика и отправить в Domoticz отдельными сообщениями вида {"idx":4,"nvalue":0,"svalue":"1.0"} и {"idx":5,"nvalue":0,"svalue":"25.5"}

И вот тут я впал в ступор. Вообще не понимаю как достать показания из msg.payload.
Как образец пользовал вот это 1-wire, Node-Red, Domoticz & Grafana – The Lodge
Но что-то не выходит ничего... Потому что не понимаю...

Код:
temp = msg.payload/16;
Address = msg.payload.DS18x20;

msg.payload = {};
switch (Address) {
case "28b8c81d300e5":
msg.payload.idx = 4;
break;
case "28ac871d300e4":
msg.payload.idx = 5;
break;
}
msg.payload.Address = Address;
temp = temp.toString();
msg.payload.svalue = temp;
return msg;
Если не трудно - напишите функцию.

Помогите люди добрые тупому пользователю.
 

gerkimuyda

New member
Это на каком языке?
А вообще - заводите массив адресов всех датчиков и подсчитываете их количество. (setup/init)
Потом даете команду ВСЕМ приготовить свою температуру (можно каждому по его адресу, но проще сразу всем одной командой).
Далее - через цикл перебираете все датчики и по их адресам получаете их значение. Вот тут можно сразу формировать строку ответа.
Отправляете строку и счастливо поджигаете бенгальский огонь, можно и салют :) Все вокруг разливают шампанское, раздают детям мороженное, желают друг-другу долгих лет жизни :)
 

Amadeus71rus

New member
Это функция в Node Red. Насколько я понимаю - java script.

По поводу вашего предложения - подумайте сами - я функцию осилить не могу, а вы мне про массивы ))))

Я обычный юзер, пользуюсь стандартными прошивками. И все получилось, кроме этого мультисенсорного модуля.
 

igrushkin

Member
@Amadeus71rus
Tasmota прекрасно работает с Domoticz напрмяую, без всякого Node Red
Я правда не знал, что Tasmota поддерживает несколько ds18b20
 

Amadeus71rus

New member
Tasmota прекрасно работает с Domoticz напрмяую, без всякого Node Red
Работает. И хорошо работает. Не спорю

Я правда не знал, что Tasmota поддерживает несколько ds18b20
При сборке прошивки через Platformio возможно задать опции сборки и там есть возможность собрать прошивку до 8 датчиков в шлейфе. И вот тут возникает проблема с предачей в Domoticz. Tasmota посылает все это одной строкой. Можно конечно ковырнуть Tasmota, но разработчик четко ответил что это не его забота, и при обновлении прошивки придется вновь ковырять. Поэтому на мой взгляд лучше сделать промежуточную обработку. Первое что пришло в голову - Node Red. Т.к. в скриптах для Domoticz я вообще не силен, но думаю можно и там распихать полученные значения по виджетам.

Пока решил проблему переехав на EspEasy. Но и там не без приколов. Нет возможности инвертировать реле при управлении через mqtt. Приходится управлять через http, но посылка разовая и не отслеживает статус.
 

Amadeus71rus

New member
В моем случае это выглядит так.
{"Time":"2017-11-10T13:30:03", "DS18x20":{"DS1":{"Type":"DS18B20", "Address":"28FFB0A26415023D", "Temperature":1.0}, "DS2":{"Type":"DS18B20", "Address":"28FFBBF46415029C", "Temperature":25.5}}, "TempUnit":"C"}

Может конечно не корректно говорить "одна строка" про JSON массив, но уж простите неграмотного.

Т.е. нужна функция которая разберет этот массив и соберет новый вида {"idx":4,"nvalue":0,"svalue":"1.0"} и {"idx":5,"nvalue":0,"svalue":"25.5"}
 

Amadeus71rus

New member
igrushkin, я понимаю что знающему работы на 5 минут. Черкнуть 5 строк. Поэтому и обращаюсь за помощью. Ну не программист я. Я пользователь. Помогите пожалуйста безвозмездно и без отсыла к мануалам.
 

Amadeus71rus

New member
Все равно спасибо за ссылку. Покурю на досуге. Видимо придется самому вникать.
 

gerkimuyda

New member
{"Time":"2017-11-10T13:30:03", "DS18x20":{"DS1":{"Type":"DS18B20", "Address":"28FFB0A26415023D", "Temperature":1.0}, "DS2":{"Type":"DS18B20", "Address":"28FFBBF46415029C", "Temperature":25.5}}, "TempUnit":"C"}
Массив:
Код:
Array(
    "Time" = "2017-11-10T13:30:03",
    "DS18x20" = Array(
        "DS1" = Array(
            "Type" = "DS18B20",
            "Address" = "28FFB0A26415023D",
            "Temperature" = "1.0"
        ),
        "DS2" = Array)
            "Type" = "DS18B20",
            "Address" = "28FFBBF46415029C",
            "Temperature" = "25.5"
        )
    ),
    "TempUnit" = "C"
);
Не знаю, как на NodeRed, может поможет, как это на PHP будет:
PHP:
$data = json_decode( $json, TRUE);
print "Time: ".$data['Time'].PHP_EOL;
print "DS1:  ".$data['DS18x20']['DS1']['Address']." = ".$data['DS18x20']['DS1']['Temperature']." ".$data['TempUnit'].PHP_EOL;
print "DS2:  ".$data['DS18x20']['DS2']['Address']." = ".$data['DS18x20']['DS2']['Temperature']." ".$data['TempUnit'].PHP_EOL;
 

Amadeus71rus

New member
Все оказалось проще некуда. Создал 2 вот такие функции. Во второй естественно прописал путь до второго значения температуры (msg.payload.DS18x20.DS2.Temperature).

Код:
temp = msg.payload.DS18x20.DS1.Temperature
msg.payload = {};
msg.payload.idx = 6;
msg.payload.nvalue = 0;
msg.payload.svalue = temp.toString();
return msg;
 
Сверху Снизу