![]() |
|
|
#1 |
|
Senior Member
Регистрация: 04.01.2013
Адрес: Москва
Сообщений: 461
Вес репутации: 1153 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Есть на просторах Ali термостат для управления теплым полом с RS-485.
Умеет помнить отдельные периоды (4 шт) по времени и температуре и выглядит не сильно гадко. На середину 2017 года такой термостат можно было купить на Али в нескольких магазинах, но к 2018 осталось у одного (или я плохо искал). SML-1000GB У этого продавца, если только надо, отдельно заказывать внешний датчик температуры. Другое наименование, которое мне попадалось: BHT-1000GBLN. Плюсы
и дополнительных библиотек.
Последний раз редактировалось paulerr; 05.04.2018 в 18:10. |
|
|
|
|
|
#2 |
|
Senior Member
Регистрация: 04.01.2013
Адрес: Москва
Сообщений: 461
Вес репутации: 1153 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Из той документации, что нашлась, имеем RS-485, скорость 9600 8N1, протокол Modbus RTU
Регистры для чтения (03):
, надо поставить STTY (для управления портом) и драйвера для конвертора USB-RS485, например такого: В теории можно попытаться использовать внутренний порт роутера при умении отключать его от терминала OpenWRT и использовании конвертора с автоопределением направления для RS485. С помощью этого форума получилось написать 2 основных скрипта, которые пишут и читают данные с этого термостата, по сути выполняют функции Modbus 03(datamodbus_r.sh) и 06(datamodbus_w.sh). Текущий косяк: не смотря, на то что в скрипте datamodbus_r.sh производиться несколько раз попытка прочитать пришедшие данные, может случиться, что процедура вернет не правильный результат. Мне победить не удалось, предлагаете исправления. Развернуть для просмотраКод:
#!/bin/sh
# функция расчета CRC
crccalc () {
str=$1
cnt=$((${#str}-2))
crc=0xFFFF
for i in `seq 0 2 $cnt`; do
crc=$(( crc ^ 0x${str:$i:2} ))
for j in `seq 0 7`; do
c=$(( crc >> 1 ))
if [ $(( crc & 1 )) = 1 ]; then
let 'c ^= 0xA001'
fi
crc=$c
done
done
c=$(( crc & 0xFF ))
c=$(( c << 8 ))
crc=$(( crc >> 8 ))
crc=$(( crc + c ))
printf "%04X" $crc
}
# функция получения данных из tty с проверкой CRC
getdatawcrc3() {
ans='/tmp/ans.dat'
result=2
k=1
#разбор ввода
id=`echo $1 |awk '{printf "%02X\n", $1 }'`
instruction=`echo $2 |awk '{printf "%02X\n", $1 }'`
start=`echo $3 |awk '{printf "%04X\n", $1 }'`
quantity=`echo $4 |awk '{printf "%04X\n", $1 }'`
com=-x"${id}"-x"${instruction}"-x"${start:0:2}"-x"${start:2:2}-x"${quantity:0:2}"-x"${quantity:2:2}
com=${com//-/\\}
# Расчет CRC для команды
value=$(crccalc ${com//\\x/})
com=$com"\x""${value:0:2}""\x""${value:2:2}"
until [[ $result -le 1 ]] # до тех пор, пока меньше или равно 1
do
# получение данных из tty
anw=""
echo -en "$com" > /dev/$port &
( dd if=/dev/$port of=$ans count=128 ) & `sleep 1`; kill $! # данные из порта
anw="`hexdump -ve '1/1 "%.2x"' $ans`" # данные из hex
if [[ ${#anw} -gt 13 ]]; then
anw=`echo $anw | sed 'y/abcdef/ABCDEF/'` # в верхний регистр
result=0
number=`printf "%d\n" "0x"${anw:4:2}` # количество значимых байт
let endnumber=number*2+6 # конец значимых байт
# проверка по CRC принятого
crcrec=$(crccalc ${anw:0:$endnumber}) # подсчитанная CRC
crcorig="${anw:$endnumber:4}" # принятая CRC
if [[ $crcrec != $crcorig ]]; then # сравним CRC
result=2
else
let number=number*2
anw="${anw:6:$number}" # обрежем лишнее
fi
else
result=2
fi
# 3 попыток получения, иначе все нули
if [[ $k = 3 ]]; then
result=1
anw=`seq 1 20 | sed -e ':a;N;$!ba;s/\n/+/g' -e 's/[0-9]*/0/g' -e 's/[+]*//g'`
fi
let k++
done
# вывод данных
# result=0 - данные правильны
# result=1 - данные неверны, вывод 000000
echo $result $anw
}
[свернуть] Командные файлы для работы в архиве, не забудьте поменять порт ttyX на свой и поставить нужные разрешения. В командниках при наличии «кривого» ответа выводиться «ххх» в неполученной строке.
Код:
*/30 * * * * /data/clockset.sh 1 Последний раз редактировалось paulerr; 05.04.2018 в 18:14. |
|
|
|
|
|
#3 |
|
Senior Member
Регистрация: 04.01.2013
Адрес: Москва
Сообщений: 461
Вес репутации: 1153 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Пользователь нашего форума BatGen прислал новый вариант документации на схожий по внешнему виду термостат
Регистры для чтения (03), High Byte=00 :
|
|
|
|
![]() |
| Метки |
| термостат, rs485, thermostat |
| Здесь присутствуют: 1 (пользователей: 0 , гостей: 1) | |
|
|