Просто оставлю это здесь. Может кому нить пригодится.
Купил я 5 штук термостатов китайского производства для управления клапанами теплого пола.
вот такие
http://ru.aliexpress.com/item/BHT-1000- ... dVersion=1
В описании написано RS-485/MODBUS. Ура, подумал я, но нифига подобного ) ! Никаким модбасом там и не пахнет. протокол отдаленно похож,но не модбас. Что бы общаться с устройством ему надо отправить строку типа CMD ID0 ID1 DATA0 DATA1 DATA2 DATA3 CHACKSUM. У производителя был добыт документ( во вложении) и написан скрипт на питоне, затем программа демон на С под линукс, и на конец на PHP для совместимости с MDM. Концепция следующая: все термостаты соединены шиной (RS-485) и воткнуты в малинку которая занимается кое чем, для наших целей на ней поднят ser2net который просто пробрасывает порт переходника USB <--> RS-485 в сеть. МДМ стоит на кубиборд 3 она же кубитрэк и и там крутиться вот это :
Код: Выделить всё
$addr = '192.168.0.250'; // ser2net address
$port = 5331; // ser2net port
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$result = socket_connect($socket, $addr, $port);
$temp = 45; // Значение температуры которое требуется установить (заменить на переменную)
$address = 16; // Десятичный адрес термостата
$mode = 0; // Режим: 0 - получить все данные с устройства. 1 - вкл (data = 10) и выкл (data = 0). 2 - Установка времени дня недели. 3 - Установить желаемую температуру
$data = 10;
// время и день недели для установки
$s = 00;
$m = 15;
$h = 16;
$w = 7;
//
$sec = sprintf("%02X",$s);
$min = sprintf("%02X",$m);
$hour = sprintf("%02X",$h);
$week = sprintf("%02X",$w);
$set_temp = dechex($temp);
$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
*/
if($mode == 3) {$cmd = '0xA9'; $data0 = '0x00'; $data1 = '0x00'; $data2 = '0x00'; $data3 = '0x'.$set_temp;}
if($mode == 2) {$cmd = '0xAA'; $data0 = '0x'.$sec; $data1 = '0x'.$min; $data2 = '0x'.$hour; $data3 = '0x'.$week;}
$checksum = dechex(($cmd + $cda + 0x00 + $data0 + $data1 + $data2 + $data3) & 0xFF ^ 0xA5);
if($mode == 0) { $str = "A0".$dev_addr."000000000015"; } // Get all data
if($mode == 1 && $data == 10) { $str = "A4".$dev_addr."001000000061"; } //turn on device
if($mode == 1 && $data == 0) { $str = "A4".$dev_addr."000000000011"; } //turn off device
if($mode == 2) { $str = "AA".$dev_addr."00".$sec.$min.$hour.$week.$checksum;} // Set clock
if($mode == 3) { $str = "A9".$dev_addr."00000000".$set_temp.$checksum; } // Set temp
$t = pack("H*",$str);
socket_write($socket, $t, strlen($t));
usleep(200 * 1000);
$line = socket_read($socket,64);
$hex = (string)join("", unpack("H*", $line));
$res = str_split($hex,2);
setGlobal('Badroom.cur_temp',hexdec($res[9])); // Текущая температура в помещении
socket_close($socket);
При запросе всех данных у устройства получаем массив из 12 элементов в hex виде, что значит каждый элемент можно посмотреть в приложенном документе, в описании команды 0xA0
Надеюсь кому то пригодится. Для работы с устройством напрямую можно выкинуть работу с сетью и работать напрямую с портом использую fopen fread fwrite или поднять ser2net на том же компе где и MDM.
Спасибо за внимание.