• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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;
 
Сверху Снизу