04.04.2018, 17:03 | #1 |
Senior Member
Регистрация: 04.01.2013
Адрес: Москва
Сообщений: 461
Вес репутации: 1152 |
Управление термостатом из OpenWRT
Есть на просторах Ali термостат для управления теплым полом с RS-485.
Умеет помнить отдельные периоды (4 шт) по времени и температуре и выглядит не сильно гадко. На середину 2017 года такой термостат можно было купить на Али в нескольких магазинах, но к 2018 осталось у одного (или я плохо искал). SML-1000GB У этого продавца, если только надо, отдельно заказывать внешний датчик температуры. Другое наименование, которое мне попадалось: BHT-1000GBLN. Плюсы
Последний раз редактировалось paulerr; 05.04.2018 в 18:10. |
04.04.2018, 17:40 | #2 |
Senior Member
Регистрация: 04.01.2013
Адрес: Москва
Сообщений: 461
Вес репутации: 1152 |
Из той документации, что нашлась, имеем RS-485, скорость 9600 8N1, протокол Modbus RTU
Регистры для чтения (03):
В теории можно попытаться использовать внутренний порт роутера при умении отключать его от терминала 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. |
01.10.2018, 16:14 | #3 |
Senior Member
Регистрация: 04.01.2013
Адрес: Москва
Сообщений: 461
Вес репутации: 1152 |
Пользователь нашего форума BatGen прислал новый вариант документации на схожий по внешнему виду термостат
Регистры для чтения (03), High Byte=00 :
|
Метки |
термостат, rs485, thermostat |
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1) | |
|
|