cepxuo, можно поподробнее с привязкой к димерам.cepxuo писал(а):Итак, обо всём по порядку!СпойлерПоказатьДля начала в разделе "Сценарии" создаём новый сценарий, допустим "MiLight":Теперь, чтобы управлять лампой нам нужно запустить этот скрипт с параметрами:Код: Выделить всё
// Прописываем начальные переменные и переносим в них параметры из строки вызова скрипта $ip = $params["ip"]; $hello = hex2bin("200000001602623AD5EDA301AE082D466141A7F6DCAFD3E600001E"); $cmd = $params["cmd"]; $level = str_pad(dechex($params["level"]), 2, '0', STR_PAD_LEFT); // так как нам надо значение в HEX с 0 в начале для значений от 1 до 9, конвертим параметр из DEC в HEX и добавляем 0, если надо $DECcolor = $params["color"]; if( !$params["port"] ) { $port = 5987; // Порт по умолчанию 5987 } else { $port = $params["port"]; } if( !$params["chan"] ) { $chan = "01"; // Канал по умолчанию 01 } else { $chan = $params["chan"]; } if( !$params["mo"] ) { $mo = "05"; // Режим по умолчанию 05 - переключение цветов } else { $mo = $params["mo"]; } //Вычисляем цвет $color = dechex($DECcolor); // Прописываем команды $off = "310000080402000000".$chan."00"; $on = "310000080401000000".$chan."00"; $lvl = "3100000803".$level."000000".$chan."00"; $clr = "3100000801".$color.$color.$color.$color.$chan."00"; $night = "310000080405000000".$chan."00"; $white = "310000080564000000".$chan."00"; $disco = "3100000806".$mo."000000".$chan."00"; $slower = "310000080404000000".$chan."00"; $faster = "310000080403000000".$chan."00"; // Выбираем, какую команду отправлять контроллеру switch($cmd){ case "off"; $outcmd= $off; break; case "on"; $outcmd = $on; break; case "level"; $outcmd = $lvl; break; case "color"; $outcmd = $clr; break; case "night"; $outcmd = $night; break; case "white"; $outcmd = $white; break; case "disco"; $outcmd = $disco; break; case "slower"; $outcmd = $slower; break; case "faster"; $outcmd = $faster; break; } // Высчитываем контрольную сумму команды $crcdec = 0; for ($i = 0; $i <= 21; $i+=2) { $crcdec = $crcdec + hexdec(substr($outcmd,$i,2)); // Отрезаем лишнее } if( strlen(dechex($crcdec)) > 2){ $crc1 = dechex($crcdec); $crc = substr($crc1,1,2); } else { $crc = dechex($crcdec); } // Общаемся с контроллером $sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); socket_sendto($sock, $hello, strlen($hello), 0, $ip, $port); socket_recvfrom($sock, $bufbin, 44, 0, $ip, $port); $buf = bin2hex($bufbin); $sessionID = substr($buf,38,4); // Получаем SessionID из ответа контроллера $outhex = "8000000011".$sessionID."000100".$outcmd.$crc; // Собираем полный текст команды контроллеру $out = hex2bin($outhex); // конвертируем её в BIN socket_sendto($sock, $out, strlen($out), 0, $ip, $port); socket_recvfrom($sock, $buf, 16, 0, $ip, $port); // Так как я всегда отправляю команды с SequenceID = 1, то ответ от контроллера не обрабатываю socket_close($sock);
ip=адрес контроллера
port=порт контроллера (по-умолчанию 5987, так что если ничего не меняли в контроллере, можно не указывать)
chan=канал или зона, кому как нравится (по-умолчанию 01, так что тоже для одной лампы на первом канале - можно не указывать)
ну и самое главное - cmd=команда. Команды бывают такие:
on - включить лампу
off - выключить лампу
nifgt - включить режим ночника
white - отключить цветные светодиоды и оставить только белый. При этом у меня яркость скачет до 100%
lvl - установить яркость. Тут нужно ещё одним параметром указать % яркости: level=процент яркости
disco - установить один из 9 цветовых режимов. Нужно также параметром mo указать номер режима. По-умолчанию ставится режим 05 - последовательное переключение цветов
slower - медленнее или faster - быстрее -- скорость переключения цветов в выбранном режиме
Ну и напоследок цвет:
color - команда установки цвета, которой также нужен параметр color=номер цвета от 0 до 255. А вот тут поподробнее:
На сайте LimitlessLed китайцы указали только несколько цветов. По этим цветам я построил палитру, а мой друг её нарисовал: Эту палитру можно поставить в меню управления, как картинку, а под ней поставить слайдер от 1 до 255. Но тут тоже небольшая засада - Majordomo выводит слева от слайдера текстовое поле с текущим значением слайдера. Так что вопрос к sergejey - можно ли в будущих версиях Majprdomo, в настройках слайдера сделать опцию, чтоб текстовое поле показывалось на следующей строке, а слайдер занимал всю ширину поля?
Вот в принципе и всё. Напоследок пара примеров Допустим Алиса живёт на сервере с адресом 192.168.0.1, а контроллер MiLight имеет адрес 192.168.0.200.
Вызов скрипта по URL:- включит свет (тут я не указал параметры, которые заданы по-умолчанию)Код: Выделить всё
http://192.168.0.1/objects/?script=MiLight&ip=192.168.0.200&cmd=on
- выключит свет (тут я указал все параметры)Код: Выделить всё
http://192.168.0.1/objects/?script=MiLight&ip=192.168.0.200&port=5987&chan=01&cmd=off
Также скрипты можно вызывать командой runScript():Ну и совсем напоследок - в простых устройствах создаём выключатель. Идём в объекты, находим его там и идём в методы нашего выключателя (именно выключателя, а не класса). Там есть методы turnOn и turnOff, правим эти методы и вставляем строку вызова скрипта в поле "Код". Для изменения яркости и цвета я создал по одному диммеру - в простых устройствах.Код: Выделить всё
runScript("MiLight",array("ip"=>"192.168.0.200","cmd"=>"color","color"=>"128"));
А так, в принципе все работает, если отправлять командами.