[Модуль] MiLight (milight)

Разработка дополнительных модулей, подключение различных приложений.

Модератор: immortal

airafree
Сообщения: 162
Зарегистрирован: Сб янв 28, 2017 2:17 pm
Благодарил (а): 13 раз
Поблагодарили: 7 раз

Re: Модуль MiLight

Сообщение airafree » Ср июл 05, 2017 5:41 pm

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 китайцы указали только несколько цветов. По этим цветам я построил палитру, а мой друг её нарисовал:
img.jpg
Эту палитру можно поставить в меню управления, как картинку, а под ней поставить слайдер от 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():

Код: Выделить всё

runScript("MiLight",array("ip"=>"192.168.0.200","cmd"=>"color","color"=>"128")); 
Ну и совсем напоследок - в простых устройствах создаём выключатель. Идём в объекты, находим его там и идём в методы нашего выключателя (именно выключателя, а не класса). Там есть методы turnOn и turnOff, правим эти методы и вставляем строку вызова скрипта в поле "Код". Для изменения яркости и цвета я создал по одному диммеру - в простых устройствах.
cepxuo, можно поподробнее с привязкой к димерам.
А так, в принципе все работает, если отправлять командами.
Аватара пользователя
cepxuo
Сообщения: 98
Зарегистрирован: Вт май 02, 2017 7:31 am
Благодарил (а): 31 раз
Поблагодарили: 6 раз

Re: Модуль MiLight

Сообщение cepxuo » Ср июл 05, 2017 9:47 pm

airafree писал(а):cepxuo, можно поподробнее с привязкой к димерам.
А так, в принципе все работает, если отправлять командами.
Создаём в простых устройствах диммер. Появляется объект Dimmer01. Идём в методы этого объекта и правим метод levelUpdated. Добавляем туда код:

Код: Выделить всё

$lvl = gg('Dimmer01.level');
getURL("http://192.168.0.1/objects/?script=MiLight&ip=192.168.0.200&port=5987&cmd=level&chan=01&level=$lvl");
Далее в меню создаём слайдер со значениями от 1 до 100 и шагом 1, и привязываем его к объекту Dimmer01 и свойству level

Для цвета я делал RGB-контроллер (тоже в простых устройствах). Создался объект Rgb01. В его методах есть colorUpdated. Вот там пишем код:

Код: Выделить всё

$color = gg('RGB01.color');
getURL("http://192.168.0.1/objects/?script=MiLight&ip=192.168.0.200&port=5987&cmd=color&chan=01&color=$color");
В менюхе делаем HTML- блок и выводим картинку палитры:

Код: Выделить всё

<img src="урл до картинки">
Потом делаем слайдер со значениями от 1 до 255 и шагом 1. И привязываем его к объекту Rgb01 и свойству color.

По идее - всё. Должно работать

PS: можно вызывать скрипт более красиво, не через getURL, а через RunScript(), как я писал выше, но про это я прочитал уже после того, как сделал те объекты, а переделывать лень... хотя может и доберусь на досуге :)
За это сообщение автора cepxuo поблагодарил:
airafree (Сб июл 08, 2017 7:01 am)
Рейтинг: 1.16%
airafree
Сообщения: 162
Зарегистрирован: Сб янв 28, 2017 2:17 pm
Благодарил (а): 13 раз
Поблагодарили: 7 раз

Re: Модуль MiLight

Сообщение airafree » Чт июл 06, 2017 7:36 pm

cepxuo писал(а):
airafree писал(а):cepxuo, можно поподробнее с привязкой к димерам.
А так, в принципе все работает, если отправлять командами.
Создаём в простых устройствах диммер. Появляется объект Dimmer01. Идём в методы этого объекта и правим метод levelUpdated. Добавляем туда код:

Код: Выделить всё

$lvl = gg('Dimmer01.level');
getURL("http://192.168.0.1/objects/?script=MiLight&ip=192.168.0.200&port=5987&cmd=level&chan=01&level=$lvl"); 
Далее в меню создаём слайдер со значениями от 1 до 100 и шагом 1, и привязываем его к объекту Dimmer01 и свойству level

Для цвета я делал RGB-контроллер (тоже в простых устройствах). Создался объект Rgb01. В его методах есть colorUpdated. Вот там пишем код:

Код: Выделить всё

$color = gg('RGB01.color');
getURL("http://192.168.0.1/objects/?script=MiLight&ip=192.168.0.200&port=5987&cmd=color&chan=01&color=$color"); 
В менюхе делаем HTML- блок и выводим картинку палитры:

Код: Выделить всё

<img src="урл до картинки"> 
Потом делаем слайдер со значениями от 1 до 255 и шагом 1. И привязываем его к объекту Rgb01 и свойству color.

По идее - всё. Должно работать

PS: можно вызывать скрипт более красиво, не через getURL, а через RunScript(), как я писал выше, но про это я прочитал уже после того, как сделал те объекты, а переделывать лень... хотя может и доберусь на досуге :)
cepxuo, спасибо!

Все работает.
Аватара пользователя
barsmaster
Сообщения: 60
Зарегистрирован: Пн апр 03, 2017 12:21 pm
Откуда: Киев
Благодарил (а): 10 раз
Поблагодарили: 1 раз

Re: Модуль MiLight

Сообщение barsmaster » Чт июл 27, 2017 4:21 pm

У меня вопрос к автору скрипта cepxuo.
Планируется ли поддержка модулей
RGBWW https://www.aliexpress.com/snapshot/0.h ... 2735264295
и
ССТ https://ru.aliexpress.com/item/Mi-Light ... 0.0.qFylNY
?

UPD покопался в LimitlessLED нашел управление температурой белого, но только 3 режима, а не плавное изменение.

Так же, возможно кто знает, можно ли подключить больше чем 4 канала?
Rad81
Сообщения: 193
Зарегистрирован: Пт апр 01, 2016 2:42 pm
Благодарил (а): 10 раз
Поблагодарили: 10 раз

Re: Модуль MiLight

Сообщение Rad81 » Вс авг 06, 2017 4:30 pm

К сожалению я не смог заставить работать данный контроллер.
Аватара пользователя
cepxuo
Сообщения: 98
Зарегистрирован: Вт май 02, 2017 7:31 am
Благодарил (а): 31 раз
Поблагодарили: 6 раз

Re: Модуль MiLight

Сообщение cepxuo » Пн авг 07, 2017 7:37 pm

barsmaster писал(а):У меня вопрос к автору скрипта cepxuo.
Планируется ли поддержка модулей
RGBWW https://www.aliexpress.com/snapshot/0.h ... 2735264295
и
ССТ https://ru.aliexpress.com/item/Mi-Light ... 0.0.qFylNY
?

UPD покопался в LimitlessLED нашел управление температурой белого, но только 3 режима, а не плавное изменение.

Так же, возможно кто знает, можно ли подключить больше чем 4 канала?
К сожалению - первая ссылка не работает, а модуля по второй ссылке у меня нет - так что не знаю, как он работает.

По поводу LimitkessLed - там с цветами тоже было всего несколько вариантов, и пришлось строить палитру, беря эти цвета за известные точки, а далее - экстраполировать. Может с цветовой температурой также?

по поводу каналов - есть параметр ch. Теоретически, можно скормить ему любой номер канала.
Последний раз редактировалось cepxuo Пн авг 07, 2017 7:40 pm, всего редактировалось 1 раз.
Аватара пользователя
cepxuo
Сообщения: 98
Зарегистрирован: Вт май 02, 2017 7:31 am
Благодарил (а): 31 раз
Поблагодарили: 6 раз

Re: Модуль MiLight

Сообщение cepxuo » Пн авг 07, 2017 7:38 pm

Rad81 писал(а):К сожалению я не смог заставить работать данный контроллер.
в чём загвоздка? сделали по инструкции? у вас точно модуль с версией софта V6?
Rad81
Сообщения: 193
Зарегистрирован: Пт апр 01, 2016 2:42 pm
Благодарил (а): 10 раз
Поблагодарили: 10 раз

Re: Модуль MiLight

Сообщение Rad81 » Пн авг 07, 2017 8:20 pm

Даже с помощью программы LimitlessLEDv6.exe ничего не работает .
НО с телефона с помощью Mi-Light 3.0 все работает даже подключен какой то облаке и управляется откуда угодна .
Вложения
Безымянный2.jpg
Безымянный2.jpg (283.53 КБ) 7132 просмотра
Безымянный.png
Безымянный.png (13.81 КБ) 7132 просмотра
Аватара пользователя
cepxuo
Сообщения: 98
Зарегистрирован: Вт май 02, 2017 7:31 am
Благодарил (а): 31 раз
Поблагодарили: 6 раз

Re: Модуль MiLight

Сообщение cepxuo » Ср авг 09, 2017 2:53 pm

Rad81 писал(а):Даже с помощью программы LimitlessLEDv6.exe ничего не работает .
НО с телефона с помощью Mi-Light 3.0 все работает даже подключен какой то облаке и управляется откуда угодна .
Если не работает с прогой LimitlessLED, значит и мой скрипт работать не будет. Я по их данным его писал. Может с родным модкrgejey sergejey заработает?
Странно, но LimitlessLED общается с контроллером нормально, судя по скриншоту. Может у вас лампа на другом канале (по их терминологии - Zone)?
Rad81
Сообщения: 193
Зарегистрирован: Пт апр 01, 2016 2:42 pm
Благодарил (а): 10 раз
Поблагодарили: 10 раз

Re: Модуль MiLight

Сообщение Rad81 » Ср авг 09, 2017 3:07 pm

Проверил тоже не работает
Ответить