Большое спасибо
dimitrystd за ответы. Понимаю, что по хорошему нужно сначала было изучить синтаксис PHP,
но отсутствие опыта программирования дает о себе знать - просто не знаешь с какой стороны подойти к изучению.
то тогда должно было правильно сконвертировать шестнадцатеричное число в десятиричное. Но если где то в интерфейсе МД, то я уверен оно хранится как строка.
Итак %d означает показать целое число, оно пытается сконвертировать строку "0x00bd768d" в число и получает 0. Я думаю лучше написать так
Код: Выделить всё
$msg = sprintf("#DEVICE,%s,%d,14,%d,00/x0D\r\n",$params['number'],$params['zone'],$params['level']);
отлично, так, конечно же, заработало, пока ждал ответа, решил вопрос так:
Код: Выделить всё
$SN = $params['number']
$msg = sprintf("#DEVICE,$SN,%d,14,%d,00/x0D\r\n",$params['zone'],$params['level']);
но уже сделал, как Вы написали, а то феншуй совсем испугается и никогда ко мне не придет ))).
Касательно свойства zone у меня вопросы
От инсталляторов у меня осталась вот такая бумажечка:
Включение зоны на определенный уровень яркости (на примере группы
контроллера QSNE-2DAL-D)
#DEVICE,0x007ABC1A,301,14,75,05/x0
301 - номер группы на устройстве 007ABC1A;
14 - команда установления определенной яркости;
75 - значение яркости в процентах, где 0 - выключено, 100 - включено на макс
яркость;
05 - время перехода от текущего значения яркости к устанавливаемому данной
командой.
Включение зоны на определенный уровень яркости (на примере группы
контроллера реле QSNE-4S10-D)
#DEVICE,0x007b03bf,5,14,0/x0 или #DEVICE,0x007b03bf,301,14,100/x0
5 - номер 1-й группы на устройстве 007b03bf;
14 - команда установления определенной яркости;
0 или 100 - крайние значения яркости в процентах, где 0 - выключено, 100 -
включено на макс яркость, так как группа не диммируемая, то допустимы только
значения 0 и 100;
время перехода задать невозможно.
Включение зоны на определенный уровень яркости (на примере группы
контроллера QSGR-6P)
#DEVICE,0x006d6f84,1,14,75,05/x0
1 - номер 1-й группы на устройстве 006d6f84;
14 - команда установления определенной яркости;
75 - значение яркости в процентах, где 0 - выключено, 100 - включено на макс
яркость;
05 - время перехода от текущего значения яркости к устанавливаемому данной
командой.
И табличка с планом помещения на котором обозначены лампочки, объединенные в зоны
и помеченные, как 1-301; 1-302 ;1-303.............15-6
1 - 007ABC1A - 301-332 (от 1-й до 32-х)
2 - 007ABC1B - 301-332 (от 1-й до 32-х)
3 - 007ABC14 - 301-332 (от 1-й до 32-х)
4 - 007ABC13 - 301-332 (от 1-й до 32-х)
5 - 007ABC1E - 301-332 (от 1-й до 32-х)
6 - 007ABC19 - 301-332 (от 1-й до 32-х)
7 - 007ABC1D - 301-332 (от 1-й до 32-х)
8 - 007ABC16 - 301-332 (от 1-й до 32-х)
9 - 007ABC17 - 301-332 (от 1-й до 32-х)
10- 007b03bf - 5-8 (от 1-й до 4-х)
11- 007b03Ae - 5-8 (от 1-й до 4-х)
12- 007b03c5 - 5-8 (от 1-й до 4-х)
13- 007b03cb - 5-8 (от 1-й до 4-х)
14- 006d6f84 - 1-6 (от 1-й до 6-ти)
15- 006d6304 - 1-6 (от 1-й до 6-ти)
получается зоны, вроде как и не виртуальные, а соответствуют контроллерам, но
сами лампочки, входящие в зону могут быть подключены и к другому контроллеру.
с 1 по 9 - это контроллеры с двумя каналами DALI, на каждый канал которых можно
подключать до 64 устройств (в моем случае - это балласты для светодиодных светильников)
В общем, заработал класс, может, конечно из-за недостатка опыта(или мозгов))) имена методам и
свойствам дал нелогичные - обозвал их еще до вашей рекомендации.
1. Создал класс
lightlutron со свойствами:
enabled - текущее состояние(0 или 1)
level
level2
number - s/n контроллера
zone - номер зоны на этом контроллере
и методами
switchLevel
Код: Выделить всё
say ('вызван switchLevel');
$params['number'] = $this-> getProperty('number');
$params['zone'] = $this-> getProperty('zone');
$params['level'] = $this-> getProperty('level');
$params['propertyName'] = $this->object_title.'.enabled';
say ('установили enabled будем вызывать controllerlutron');
callMethod ("controllerlutron1.output",$params);
say ('вернулись из controllerlutron');
switchOff
Код: Выделить всё
say ('вызван switchOff');
$params['number'] = $this-> getProperty('number');
$params['zone'] = $this-> getProperty('zone');
$params['level'] = 0;
$params['propertyName'] = $this->object_title.'.enabled';
callMethod ("controllerlutron1.output",$params);
toggleSwitch
Код: Выделить всё
say ('вызван toggleSwitсh');
if ($this->getProperty('enabled') == 1)
{
say ('вызов switchLevel из toggleSwith');
$this->callMethod('switchLevel');}
else
{say ('вызов switchOff из toggleSwith');
$this->callMethod('switchOff');
}
И в этом классе, пока, два объекта для тестов:
zal1bl8ceil1 со свойствами level=100; number=0x00bd768d; zone=5
zal1bl8ceil2 со свойствами level=100; number=0x00bd768d; zone=6
2. Создал класс
controllerlutron со свойствами:
ipAddress
login
и один объект controllerlutron1 со свойствами ipAddress=192.168.0.3; login=nwk
Но использовать эти свойства в коде пока не стал, т.к. в отличие от мегадевайса
я отправляю данные не на каждый контроллер по отдельности, а в шлюз.
Метод пока один:
output
Код: Выделить всё
$address = '192.168.0.3';
$port = 23;
say ('controllerlutron начал выполняться');
say ($params['number']);
say ($params['zone']);
say ($params['level']);
if (($socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) {return 0;}
else {}
$result = socket_connect($socket, $address, $port);
if ($result === false) {return 0;} else {}
$out = socket_read($socket, 7); //Читаем сообщение от сервера
say ($out);
$msg = "nwk\r\n";
socket_write($socket, $msg, strlen($msg)); //Отправляем серверу сообщение
say ($msg);
$out = socket_read($socket, 24); //Читаем сообщение от сервера
//$msg = "#DEVICE,0x00bd768d,5,14,0,00/x0D\r\n"; //Команда отключения
$msg = sprintf("#DEVICE,%s,%d,14,%d,00/x0D\r\n",$params['number'], $params['zone'],$params['level']);
say ($msg);
socket_write($socket, $msg, strlen($msg));
socket_close($socket);
$level = $params['level'];
if ($level == 0) {setGlobal($params['propertyName'], 0);}
else {setGlobal($params['propertyName'], 1);}
Сразу хотел еще считывать статус, но есть несколько проблем:
1. Как считать в переменную то, что ответил шлюз, я понял, но еще не научился выделять из этой строки нужную мне информацию,
но это ладно - вопрос пары часов.
2. Два контроллера, почему-то упорно не хотят отвечать, команды исполняют, но на запросы не отвечают
3. Система и так работает тормознуто - 100 зон включаются больше минуты, боюсь предположить, что будет,
если я перед включением-выключением буду слать еще и запрос состояния.
И в конце концов, при отправке команды, я сохраняю статус. И если я буду управлять из МДМ, по состояния сходятся.