Статья

Датчик дождя и снега с подогревом по Modbus RTU

В моем доме есть несколько автоматизированных мансардных окон, следовательно надо сделать так, чтобы они закрывались автоматически, в случае дождя. Искал датчик, работающий по modbus rtu. Вариантов было немного, всего один. Здесь я расскажу, что мне удалось выяснить, как это работает. Документации по девайсу крайне мало, пришлось выпрашивать доки у китайцев.

Ссылка на али

Датчик выпускается в нескольких вариантах:

1) датчик дождя "сухой-контакт"

2) датчик дождя с подогревом и "сухой-контакт"

3) датчик дождя "сухой-контакт" интерфейс rs485

4) датчик дождя с подогревом и "сухой-контакт"  интерфейс rs485

Стоимость от 37$ до 52$, стоит переплатить за подогрев, чем потом жалеть об его отсутствии. Датчик с rs485 стоит столько же, сколько без него, особой разницы нет.  Я выбрал самую жирную комплектацию 4. 

Схема подключения

Коричневый - питание от 10 до 30В

Черный - земля.

Зеленый белый - это "сухой-контакт", я его подключил на модуль WBIO-DI-DR-16. В случае обнаружения дождя, замыкается. 

Желтый - RS485 A

Синий - RS485 B

Для многих будет достаточно подключить питание и "сухой-контакт" и пользоваться как есть. Заводские настройки чувствительности настроены оптимально, одной капли достаточно, чтобы датчик щелкнул реле и замкнул "сухой-контакт". 

По подогреву мало информации и она отличается. Подогрев должен включаться при долгосрочной температуре < 0°C или при высокой влажности с температурой < 15°C, греет до 45°C

Для чего нужен rs485

Подключить rs485 можно через вот такой usb конвертер. Либо, как в моем случае, напрямую к Wiren Board.


Настройки подключения:

Адрес устройства: 1
Baud rate: 9600 (может быть 4800)
Data bit: 8
Stop bit: 1 
Parity: None

Все что удалось достать по документации:

Документация 1 (конкретно от продавца)

Документация 2 (от другого продавца, к визуально такому же датчику)

Описано всего 3 регистра, данные неполные, я попытался найти значения самостоятельно, во многие регистры нельзя записывать данные.

Карта регистров

Используются только holding регистры. Чтение - 0x03, запись - 0x06. Записываются только 48-52 регистры, это что-то вроде настроек, которые можно поменять.


Не найдены регистры! Регистр адреса устройства, скорость порта, стоп бит.

Во второй документации указан регистр, по которому можно сменить адрес устройства, но с моим датчиком это не работает, я пытался перезаписывать все регистры, содержащие 1, но это не увенчалось успехом.

Вот вывод всего, что записано на датчике:

#Считать данные с порта /dev/ttyRS485-2, 0-100 holding registers modbus_client --debug -mrtu -b9600 -s1 -pnone -s1 /dev/ttyRS485-2 -a1 -t3 -r0 -c100 Opening /dev/ttyRS485-2 at 9600 bauds (N, 8, 2) [01][03][00][00][00][64][44][21] SUCCESS: read 100 of elements: Data: 0x0000 0x0000 0x0001 0x010b 0x0000 0x0004 0x0000 0x0000 0x0000 0x0001 0x0101 0x0000 0x01f4 0x0001 0x0096 0x0001 0x03e8 0x0001 0x0000 0x0001 0x0005 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0001 0x0005 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x01f4 0x0096 0x00fa 0x0001 0x0320 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 #Я просканировал все адреса до 80000, вот что нашел, что-то типа дэфолтных настроек, записать можно в 65587, но кажется это тоже самое, что и 51 адрес modbus_client --debug -mrtu -b9600 -s2 -pnone /dev/ttyRS485-2 -a1 -t3 -r65500 -c100 Opening /dev/ttyRS485-2 at 9600 bauds (N, 8, 2) [01][03][FF][DC][00][64][B5][CF] SUCCESS: read 100 of elements: Data: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0001 0x00de 0x0000 0x0004 0x0000 0x0000 0x0000 0x0001 0x0101 0x0000 0x0064 0x0001 0x0096 0x0001 0x03e8 0x0001 0x0000 0x0001 0x0005 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0001 0x0005 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0064 0x0096 0x0028 0x0001 0x0320 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000

#Смена задержки срабатывания на 10сек modbus_client --debug -mrtu -b9600 -pnone -s2 /dev/ttyRS485-2 -a1 -t6 -r51 10 #Смена чувсвительности на 1000 modbus_client --debug -mrtu -b9600 -pnone -s2 /dev/ttyRS485-2 -a1 -t6 -r52 1000

Настройка в Wiren Board

Шаблон сохранить в файл /usr/share/wb-mqtt-serial/templates/config-rain-sensor.json

{ "device_type":"RainSensor", "device":{ "name":"Rain Sensor", "id":"rain", "max_read_registers":0, "channels":[ { "name":"Rain", "reg_type":"holding", "readonly":true, "address":0, "type":"switch" }, { "name":"Heatbed temperature", "reg_type":"holding", "readonly":true, "address":3, "type":"value", "scale":0.1, "format":"s16" }, { "name":"Heating", "reg_type":"holding", "readonly":true, "address":4, "type":"switch" }, { "name":"Sensitivity", "reg_type":"holding", "readonly":true, "address":5, "type":"value", "max":3500 }, { "name":"Unknown 48", "reg_type":"holding", "readonly":false, "address":48, "type":"range", "max":1500 }, { "name":"Heating Threshold", "reg_type":"holding", "readonly":false, "address":49, "type":"range", "scale":0.1, "max":400 }, { "name":"Heating Delta", "reg_type":"holding", "readonly":false, "address":50, "type":"range", "max":400, "scale":0.1 }, { "name":"Detect Delay", "reg_type":"holding", "readonly":false, "address":51, "type":"range", "max":300 }, { "name":"Sensitivity Threshold", "reg_type":"holding", "readonly":false, "address":52, "type":"range", "max":3500 } ] } }

Смена адреса и скорости устройства

Я не нашел, в каком регистре хранится эта информация, но нашел как можно поменять адрес.:)

Подключить к компу через usb<->rs485 конвертер (ссылка выше), подключить внешнее питание 0-30В, соединить общей землей.

Поставить драйвер: скачать cp210x driver

Запустить китайскую программу: скачать RS485ControlV22.exe

Выбрать порт конвертера, нажать "Search Device"

Устройство найдется, и здесь же можно поменять скорость на 9600 и выбрать любой адрес из диапазона 0-247.

Если кто-нибудь найдет, в каких регистрах хранятся эти данные - сообщите.


Можно ли управлять подогревом по Modbus?

Китайская логика запрограммировала подогрев включаться только по заданной минимальной температуре. Нет отдельного регистра для включения прогрева. Подогрев никак не зависит от влажности. А было бы логично, при дожде, включать подогрев, чтобы датчик быстрее высох. Можно добавить эту логику через сценарий: если сильно влажно, меняем параметр мин. температуры на 400 - прогрев включается и держит температуру. Датчик высох - меняем параметр назад на 0. 

Как датчик ведет себя? сбоев не дает?

Монтировать буду где-то через месяц, и начну наблюдать.

"Чтение - 0x03, запись - 0x06"
Это в обычном виде как? Чтобы считать 49-й регистр, надо 49 или 30049? И чтобы записать - 49 или как еще?

наверное смотря в каком софте считывать

не знаю, что такое. в обычном виде



Добрый день как показал себя датчик? И что за значение должно быть в первой строчке Path to device ?

https://sprut.ai/static/media/cache/00/21/98/5/5991899/70535/1000x_image.png?1605452884" alt="1000x_image.png?1605452884" />

Датчик своеобразный. Есть плюсы и минусы. За полгода коррозии пока не замечено. При положительных температурах неплохо работает. А вот ниже 0 начинаются проблемы. Если текущая температура грелки падает ниже 0 то начинает показывать всякую чушь. Разумеется, регистр читается как signed. Последнее что показывает нормально это -0.1 градус (FFFF в приходящем значении), а дальше срыв и полная ерунда в десятки и сотни положительных пляшущих градусов. В принципе если греть печку постоянно - то можно этого не допускать. Но если в мороз ее мощности не хватит - то печаль, при отрицательных температурах текущего показания грелки датчик будет считать что уже перегрет, печку выключит и не включит больше. 


Вернуться назад

Устройства


Вернуться назад