Форум обсуждения систем  

Вернуться   Форум обсуждения систем "Умный дом", проектов Ардуино, OpenWRT и других DIY устройств > Форум умного дома > Сделай сам > OpenWRT/LEDE

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 04.04.2018, 17:03   #1
paulerr
Senior Member
 
Регистрация: 04.01.2013
Адрес: Москва
Сообщений: 461
Вес репутации: 1152
paulerr has a reputation beyond reputepaulerr has a reputation beyond reputepaulerr has a reputation beyond reputepaulerr has a reputation beyond reputepaulerr has a reputation beyond reputepaulerr has a reputation beyond reputepaulerr has a reputation beyond reputepaulerr has a reputation beyond reputepaulerr has a reputation beyond reputepaulerr has a reputation beyond reputepaulerr has a reputation beyond repute
По умолчанию Управление термостатом из OpenWRT

Есть на просторах Ali термостат для управления теплым полом с RS-485.

Умеет помнить отдельные периоды (4 шт) по времени и температуре и выглядит не сильно гадко. На середину 2017 года такой термостат можно было купить на Али в нескольких магазинах, но к 2018 осталось у одного (или я плохо искал). SML-1000GB У этого продавца, если только надо, отдельно заказывать внешний датчик температуры. Другое наименование, которое мне попадалось: BHT-1000GBLN.
Плюсы
  • Внешнее управление.
  • Программный / ручной режимы.
  • Не сильно гадкий дизайн, есть выбор при заказе белая или черная лицевая панель.
  • У продавца есть разные варианты устройств с разными выходами.
  • Ставится в стандартный подрозетник.
  • Не сильно дорого – 32$ на январь 2018.
Минусы
  • Нет батарейки на часы, при пропадании электричества время собьется (причем есть вариант такого-же дизайна без RS-485, но с батарейкой для RTC).
  • Часы в устройстве убегают в день минуты на две.
  • Конкретный продавец просит 2,5$ за отдельный термодатчик с проводом 2,5 м.
  • Документация на сайте магазина и приложенной к устройству не совпадает.
Интересно было научиться управлять им из OpenWRT без СМС и дополнительных библиотек.
Изображения
 

Последний раз редактировалось paulerr; 05.04.2018 в 18:10.
paulerr вне форума   Ответить с цитированием
Старый 04.04.2018, 17:40   #2
paulerr
Senior Member
 
Регистрация: 04.01.2013
Адрес: Москва
Сообщений: 461
Вес репутации: 1152
paulerr has a reputation beyond reputepaulerr has a reputation beyond reputepaulerr has a reputation beyond reputepaulerr has a reputation beyond reputepaulerr has a reputation beyond reputepaulerr has a reputation beyond reputepaulerr has a reputation beyond reputepaulerr has a reputation beyond reputepaulerr has a reputation beyond reputepaulerr has a reputation beyond reputepaulerr has a reputation beyond repute
По умолчанию

Из той документации, что нашлась, имеем RS-485, скорость 9600 8N1, протокол Modbus RTU
Регистры для чтения (03):
  • 01 – состояние устройства: 0x5A–выключено, 0xA5–включено;
  • 02 – температура с внутреннего термодатчика х2, пример: 0x33 -> 51/2=25.5
  • 03 – температура с внешнего термодатчика х2, 0 – если нет внешнего термодатчика
  • 04 – состояние реле нагрева: 0 - выключено, 1 – включено
  • 05 - установленная температура в программном режиме х2
  • 09 – режим работы: 0 – программный, 1 - ручной
  • 10 - установленная температура в ручном режиме х2
Регистры для записи (06):
  • 01 – состояние устройства: 0x5A–выключено, 0xA5–включено;
  • 04 – установить минуты
  • 05 – установить часы
  • 06 – установить день недели
  • 09 – установить режим работы: 0 – программный, 1 - ручной
  • 10 - установить температуру в ручном режиме х2
Без библиотек не получилось , надо поставить 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 на свой и поставить нужные разрешения. В командниках при наличии «кривого» ответа выводиться «ххх» в неполученной строке.
  • Чтение состояния устройства read.sh
  • Установки времени clockset.sh
  • Установки температуры tempset.sh
  • Установки режима работы modeprogmanual.sh
  • Включения / выключения poweronoff.sh
Из-за особенностей работы внутренних часов желательно в crond добавить строки установки времени:
Код:
*/30  *    *   *  *  /data/clockset.sh 1
Результат на скриншоте:
Миниатюры
Нажмите на изображение для увеличения
Название: Снимок1.JPG
Просмотров: 141
Размер:	39.8 Кб
ID:	4968  
Вложения
Тип файла: rar termostat.rar (4.6 Кб, 73 просмотров)

Последний раз редактировалось paulerr; 05.04.2018 в 18:14.
paulerr вне форума   Ответить с цитированием
Старый 01.10.2018, 16:14   #3
paulerr
Senior Member
 
Регистрация: 04.01.2013
Адрес: Москва
Сообщений: 461
Вес репутации: 1152
paulerr has a reputation beyond reputepaulerr has a reputation beyond reputepaulerr has a reputation beyond reputepaulerr has a reputation beyond reputepaulerr has a reputation beyond reputepaulerr has a reputation beyond reputepaulerr has a reputation beyond reputepaulerr has a reputation beyond reputepaulerr has a reputation beyond reputepaulerr has a reputation beyond reputepaulerr has a reputation beyond repute
По умолчанию

Пользователь нашего форума BatGen прислал новый вариант документации на схожий по внешнему виду термостат
Регистры для чтения (03), High Byte=00 :
  • 01 – Setting Power On/off: 0–means closed, 1–means open
  • 02 – Temperature for internal sensor*10
  • 03 – Hand:1 Automatic:0
  • 04 – Heating status: 0: Not Heating 1: Heating
  • 05 – Setting Temperature-hand*10
  • 06 – Weekly Program Setting Temperature
  • 07 – Setting lock:0-unlock 1-lock
Регистры для записи (06), High Byte=00 :
  • 01 – Setting Power On/off: 0–means close, 1–means open
  • 03 – Hand:1 Automatic:0
  • 05 – Setting Temperature-hand*10
  • 06 – Weekly Program Setting Temperature
  • 07 – Setting lock:0-unlock 1-lock
Вложения
Тип файла: doc SML-1000 modbus protocol 20180321.doc (63.0 Кб, 66 просмотров)
paulerr вне форума   Ответить с цитированием
Старый 15.12.2018, 22:43   #4
ZigFisher
Junior Member
 
Регистрация: 15.09.2013
Сообщений: 13
Вес репутации: 0
ZigFisher is an unknown quantity at this point
По умолчанию

Приветствую

Утилитка для работы с RS485 под OpenWrt, только собрал и выложил, думаю пригодится

Последний раз редактировалось ZigFisher; 15.12.2018 в 22:46.
ZigFisher вне форума   Ответить с цитированием
Ответ

Метки
термостат, rs485, thermostat


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 21:01. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Яндекс.Метрика