термостат BHT-1000
Добавлено: Ср окт 21, 2015 11:46 pm
Добрый день!
Проошу помощи в подключении термостата с RS485.
Сделал следующее:
Majordomo развернут на расбери. К нему переходник RS485-USB. Поднял ser2net. Его настройки:
5331:telnet:600:/dev/ttyUSB0:2400 8DATABITS NONE 1STOPBIT banner
У термостата такое дано описание:
BaudRate 2400
ByteSize 8 Bit
StopBits 1
Parity None
ParityCheck None
Затем создал класс в Majordomo с методом чтения данных (это пока просто для теста)
$Ip=$this->getProperty("Ip"); //=192.168.1.117
$Port=$this->getProperty("Port"); //=5331
$Address=$this->getProperty("Address"); //=10
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$result = socket_connect($socket, $Ip, $Port);
$dev_addr = dechex($Address);
$cda = '0x'.$dev_addr;
/*
0xA0 - Read all data 160
0xA4 - On/Off device 164
0xA9 - Temp setting 169
0xAA - Clock setting 170 CMD,DEV_ID0,DEV_ID1,DATA0,DATA1,DATA2,DATA3,CHKSUM
*/
$checksum = dechex(($cmd + $cda + 0x00 + $data0 + $data1 + $data2 + $data3) & 0xFF ^ 0xA5);
$str = "A0".$dev_ip."000000000015"; // Get all data
$t = pack("H*",$str); // Упаковывает данные в бинарную строку 16го формата с верхнего разряда
socket_write($socket, $t, strlen($t)); // отправляем строку
usleep(200 * 1000); //Откладывает выполнение на микросекунды
$line = socket_read($socket,64); // чтение строки длинной 64 бита (8 байтов)
$hex = (string)join("", unpack("H*", $line));
$res = str_split($hex,2); // Преобразует строку в массив по 2 бита
$this->setProperty('FloorTemperature',implode(",", $res));
$this->setProperty('RoomTemperature',$hex); // присвоить свойству RoomTemperature этого же объекта считанное значение
socket_close($socket);
В последних строчках это я временно вывожу значения в свойства для того чтобы понять что получаю.
В RoomTemperature записывается вот что: 506f727420616c726561647920696e207573650a0d
В FloorTemperature записывается вот что: 50,6f,72,74,20,61,6c,72,65,61,64,79,20,69,6e,20,75,73,65,0a,0d
А по мануалу ответ от термостата должен быть типа:50 10 00 10 14 FF 23 05 2D 15 1B AD;
Где ответ разбирается таким образом:
resposne: 0x50 OK
Data package:0x50 + ID0 + ID1 + Data0 + Data1 + Data2 + Data3 + Data4 + Data5 +
Data6 + Data7 + CheckSum
ID0,ID1 => IP
Data0 => Bit0-Bit1 sensor type
00 -> internal and external sensor
01 -> internal sensor only
10 -> external sensor only
11 -> standby
Bit2-Bit3 Valve Control Selectionon
00 -> Valve is controlled by thermostat
01 -> PC open the valve (thermostat can not control)
10 -> PC close the valve (thermostat can not control)
11 -> Standby
Bit4 turn-on/off
0 -> turn-off
1 -> turn-on
Bit5 Standby
Bit6 low temperature protection flag
0-> need low temperature protection
1-> cancel low temperature protection
Bit7 high temperature protection flag
0-> need high temperature protection
1-> cancel high temperature protection
Data1 => Bit0 lock mode
0-> Buttons are locked except on/off.
1-> All bottons are locked.
Bit1 Lock status
0->unlock
1->lock
Bit2 Load status
0-> load close
1-> load open
Bit3 Sensor status
0-> sensor normal
1-> sensor error
Bit4~bit7 deadzone temperature(1℃~5℃)
Data2 => calibration temperature(-9℃~9℃)
Data3 => seng temperature(5℃~35℃)
Data4 => low temperature protecctioon (5℃~10℃)
Data5 => high temperature protection (35℃~70℃)
Data6 => Room Temperature
Data7 => Floor Temperature
CheckSum
Т.е приходит полная ерунда. И не могу понять, где косяк. Толи отправляю, толи разбираю ответ не правильно, толи ошибка в настройках ser2net?
Подскажите, пожалуйста.
Проошу помощи в подключении термостата с RS485.
Сделал следующее:
Majordomo развернут на расбери. К нему переходник RS485-USB. Поднял ser2net. Его настройки:
5331:telnet:600:/dev/ttyUSB0:2400 8DATABITS NONE 1STOPBIT banner
У термостата такое дано описание:
BaudRate 2400
ByteSize 8 Bit
StopBits 1
Parity None
ParityCheck None
Затем создал класс в Majordomo с методом чтения данных (это пока просто для теста)
$Ip=$this->getProperty("Ip"); //=192.168.1.117
$Port=$this->getProperty("Port"); //=5331
$Address=$this->getProperty("Address"); //=10
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$result = socket_connect($socket, $Ip, $Port);
$dev_addr = dechex($Address);
$cda = '0x'.$dev_addr;
/*
0xA0 - Read all data 160
0xA4 - On/Off device 164
0xA9 - Temp setting 169
0xAA - Clock setting 170 CMD,DEV_ID0,DEV_ID1,DATA0,DATA1,DATA2,DATA3,CHKSUM
*/
$checksum = dechex(($cmd + $cda + 0x00 + $data0 + $data1 + $data2 + $data3) & 0xFF ^ 0xA5);
$str = "A0".$dev_ip."000000000015"; // Get all data
$t = pack("H*",$str); // Упаковывает данные в бинарную строку 16го формата с верхнего разряда
socket_write($socket, $t, strlen($t)); // отправляем строку
usleep(200 * 1000); //Откладывает выполнение на микросекунды
$line = socket_read($socket,64); // чтение строки длинной 64 бита (8 байтов)
$hex = (string)join("", unpack("H*", $line));
$res = str_split($hex,2); // Преобразует строку в массив по 2 бита
$this->setProperty('FloorTemperature',implode(",", $res));
$this->setProperty('RoomTemperature',$hex); // присвоить свойству RoomTemperature этого же объекта считанное значение
socket_close($socket);
В последних строчках это я временно вывожу значения в свойства для того чтобы понять что получаю.
В RoomTemperature записывается вот что: 506f727420616c726561647920696e207573650a0d
В FloorTemperature записывается вот что: 50,6f,72,74,20,61,6c,72,65,61,64,79,20,69,6e,20,75,73,65,0a,0d
А по мануалу ответ от термостата должен быть типа:50 10 00 10 14 FF 23 05 2D 15 1B AD;
Где ответ разбирается таким образом:
resposne: 0x50 OK
Data package:0x50 + ID0 + ID1 + Data0 + Data1 + Data2 + Data3 + Data4 + Data5 +
Data6 + Data7 + CheckSum
ID0,ID1 => IP
Data0 => Bit0-Bit1 sensor type
00 -> internal and external sensor
01 -> internal sensor only
10 -> external sensor only
11 -> standby
Bit2-Bit3 Valve Control Selectionon
00 -> Valve is controlled by thermostat
01 -> PC open the valve (thermostat can not control)
10 -> PC close the valve (thermostat can not control)
11 -> Standby
Bit4 turn-on/off
0 -> turn-off
1 -> turn-on
Bit5 Standby
Bit6 low temperature protection flag
0-> need low temperature protection
1-> cancel low temperature protection
Bit7 high temperature protection flag
0-> need high temperature protection
1-> cancel high temperature protection
Data1 => Bit0 lock mode
0-> Buttons are locked except on/off.
1-> All bottons are locked.
Bit1 Lock status
0->unlock
1->lock
Bit2 Load status
0-> load close
1-> load open
Bit3 Sensor status
0-> sensor normal
1-> sensor error
Bit4~bit7 deadzone temperature(1℃~5℃)
Data2 => calibration temperature(-9℃~9℃)
Data3 => seng temperature(5℃~35℃)
Data4 => low temperature protecctioon (5℃~10℃)
Data5 => high temperature protection (35℃~70℃)
Data6 => Room Temperature
Data7 => Floor Temperature
CheckSum
Т.е приходит полная ерунда. И не могу понять, где косяк. Толи отправляю, толи разбираю ответ не правильно, толи ошибка в настройках ser2net?
Подскажите, пожалуйста.