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

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

Модератор: immortal

havenofear
Сообщения: 120
Зарегистрирован: Чт янв 30, 2014 7:18 am
Благодарил (а): 4 раза
Поблагодарили: 3 раза

Re: Модуль MiLight

Сообщение havenofear » Вт окт 17, 2017 5:32 am

Если кому интересно, у мменя реализована работа нового WIFI модуля уже больше года. Отправляю команды следующим образом:
СпойлерПоказать
$host = "192.***";
$port = 5987;

$ggcomand = gg ("MiLamp1.Comand");
$arraycmd = explode (",", $ggcomand);

$zoneID = gg ("MiLamp1.Zone");

$PREAMPLE = array(0x80,0x00,0x00,0x00,0x11);
$FILLER = 0x00;

$sesID1 = 0x00;
$sesID2 = 0x00;

$initiate = array(0x20,0x00,0x00,0x00,0x16,0x02,0x62,0x3a,0xd5,0xed,0xa3,0x01,0xae,0x08,0x2d,0x46,0x61,0x41,0xa7,0xf6,0xdc,0xaf,0xfe,0xf7,0x00,0x00,0x1e);
$message = vsprintf(str_repeat('%c', count($initiate)), $initiate);
if ($socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP)) {
$timeout = array('sec'=>2,'usec'=>0);
socket_set_option($socket,SOL_SOCKET,SO_RCVTIMEO,$timeout);
socket_sendto($socket, $message, strlen($message), 0, $host, $port);
socket_recvfrom($socket, $buf, 65000, 0, $host, $port);
$sesID1 = bin2hex($buf[19]);
$sesID2 = bin2hex($buf[20]);

// Sequence Number
$seq = $this -> getProperty ('Seq');
sg ("MiLamp1.Seq", $seq+1);
if ($seq == 50) {sg ("MiLamp1.Seq", 0);}

// command build
$cmd1 = $PREAMPLE;
$cmd1[] = hexdec($sesID1);
$cmd1[] = hexdec($sesID2);
$cmd1[] = 0x00;
$cmd1[] = $seq;
$cmd1[] = $FILLER;

$cmd2 = $arraycmd;
$cmd2[] = $zoneID;;
$cmd2[] = 0x00;

$sum = array_sum ($cmd2);
$chksum = $sum & 0xFF;

$cmd = array_merge ($cmd1, $cmd2);
$cmd[] = $chksum;
//send command
$message = vsprintf(str_repeat('%c', count($cmd)), $cmd);
socket_sendto($socket, $message, strlen($message), 0, $host, $port);
socket_recvfrom($socket, $buf, 65000, 0, $host, $port);
socket_close($socket);

}
Сам вычислил команды, которые нужно отправлять (последовательность байт) и вбил их в кнопки...

Если есть какие-то вопросы - пишите
markovrv
Сообщения: 33
Зарегистрирован: Пт апр 28, 2017 9:10 pm
Благодарил (а): 22 раза
Поблагодарили: 16 раз

Re: Модуль MiLight

Сообщение markovrv » Вс окт 22, 2017 4:13 pm

Я тоже нашел способ. Вот пример от разработчиков, рабочий, нужно только ваш айпи вбить. https://github.com/winosaure/MilightAPI ... ilight.php
Были проблемы с настройкой wifi модуля, решаются с помощью настройки программой, указанной выше в этой теме.

Если кому интересно, опишу подробнее.
Rad81
Сообщения: 193
Зарегистрирован: Пт апр 01, 2016 2:42 pm
Благодарил (а): 10 раз
Поблагодарили: 10 раз

Re: Модуль MiLight

Сообщение Rad81 » Вс окт 22, 2017 7:32 pm

Почему то стандартный программый под виндосом у меня лента не управляется. И по этому не могу управлять из МД. А с помощью телефона и пульта работает.
markovrv
Сообщения: 33
Зарегистрирован: Пт апр 28, 2017 9:10 pm
Благодарил (а): 22 раза
Поблагодарили: 16 раз

Re: Модуль MiLight

Сообщение markovrv » Пн окт 23, 2017 1:07 am

Rad81 писал(а):Почему то стандартный программый под виндосом у меня лента не управляется. И по этому не могу управлять из МД. А с помощью телефона и пульта работает.
Программа LimitlessLEDv6 находит устройство?
Если не находит - нужно настраивать wifi модуль на милайте.
Если находит, значит команды просто не подходят для Вашей конфигурации. Мне, например, достаточно было поменять "хвосты" команд на эти:
'link' => array (0x07, 0x00, 0x00, 0x00, 0x00, 0x00),
'unlink' => array (0x07, 0x00, 0x00, 0x00, 0x00, 0x00),
'on' => array (0x07, 0x03, 0x01, 0x00, 0x00, 0x00),
'off' => array (0x07, 0x03, 0x02, 0x00, 0x00, 0x00),
'white' => array (0x07, 0x03, 0x05, 0x00, 0x00, 0x00),
'blue' => array (0x07, 0x01, 0xBA, 0xBA, 0xBA, 0xBA),
'aqua' => array (0x07, 0x01, 0x85, 0x85, 0x85, 0x85),
'red' => array (0x07, 0x01, 0xFF, 0xFF, 0xFF, 0xFF),
'lavender' => array (0x07, 0x01, 0xD9, 0xD9, 0xD9, 0xD9),
'green' => array (0x07, 0x01, 0x7A, 0x7A, 0x7A, 0x7A),
'lime' => array (0x07, 0x01, 0x54, 0x54, 0x54, 0x54),
'orange' => array (0x07, 0x01, 0x1E, 0x1E, 0x1E, 0x1E),
'yellow' => array (0x07, 0x01, 0x3B, 0x3B, 0x3B, 0x3B),
'brightness' => array (0x07, 0x02, 0x64, 0x00, 0x00, 0x00)
Получилось так:
Вложения
Снимок.PNG
Снимок.PNG (21.4 КБ) 6764 просмотра
havenofear
Сообщения: 120
Зарегистрирован: Чт янв 30, 2014 7:18 am
Благодарил (а): 4 раза
Поблагодарили: 3 раза

Re: Модуль MiLight

Сообщение havenofear » Ср окт 25, 2017 1:51 pm

markovrv писал(а):
Rad81 писал(а):Почему то стандартный программый под виндосом у меня лента не управляется. И по этому не могу управлять из МД. А с помощью телефона и пульта работает.
Программа LimitlessLEDv6 находит устройство?
Если не находит - нужно настраивать wifi модуль на милайте.
Если находит, значит команды просто не подходят для Вашей конфигурации. Мне, например, достаточно было поменять "хвосты" команд на эти:
Я уже точно не помню, как было у меня, но что-то я тоже менял. Непонятно, почему изначально там неправильные команды вбиты...
Аватара пользователя
barsmaster
Сообщения: 60
Зарегистрирован: Пн апр 03, 2017 12:21 pm
Откуда: Киев
Благодарил (а): 10 раз
Поблагодарили: 1 раз

Re: Модуль MiLight

Сообщение barsmaster » Пн окт 30, 2017 2:20 pm

СпойлерПоказать

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

// Прописываем начальные переменные и переносим в них параметры из строки вызова скрипта
$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, если надо

$cct = str_pad(dechex($params["cct"]), 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";
$cct = "3100000805".$cct."000000".$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 "cct";
  $outcmd = $cct;
  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);
Немного модифицировал код, добавил поддержку плавного изменения температуры белого.
Вызывается

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

http://192.168.0.114/objects/?script=MiLight&ip=192.168.0.115&port=5987&cmd=cct&chan=01&cct=100   
где cmd=cct = новая команда
cct=100 величина от 1 до 100 меняет температуру белого.
За это сообщение автора barsmaster поблагодарил:
markovrv (Пт ноя 10, 2017 1:46 am)
Рейтинг: 1.16%
EvgenySM
Сообщения: 27
Зарегистрирован: Сб ноя 19, 2016 10:33 pm
Благодарил (а): 10 раз
Поблагодарили: 1 раз

Re: Модуль MiLight

Сообщение EvgenySM » Чт ноя 09, 2017 7:46 pm

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

Re: Модуль MiLight

Сообщение Rad81 » Чт ноя 09, 2017 9:16 pm

markovrv писал(а):Я тоже нашел способ. Вот пример от разработчиков, рабочий, нужно только ваш айпи вбить. https://github.com/winosaure/MilightAPI ... ilight.php
Были проблемы с настройкой wifi модуля, решаются с помощью настройки программой, указанной выше в этой теме.

Если кому интересно, опишу подробнее.
Была бы хорошо если напишите подробно. Еще лучше будет если скриншотами покажете.
markovrv
Сообщения: 33
Зарегистрирован: Пт апр 28, 2017 9:10 pm
Благодарил (а): 22 раза
Поблагодарили: 16 раз

Re: Модуль MiLight

Сообщение markovrv » Пт ноя 10, 2017 12:59 am

Хорошо, пишу подробнее.
1. Сбросим настройки на стандартные.
2. Скачаем и запустим программу LimitlessLEDv6
3. Подключаемся к wifi сети milight3.0-трампампам
4. В программе LimitlessLEDv6 нажимаем кнопку Изображение
5. Смотрим лог. Если увидели это Изображение, идем дальше, если нет - что-то не так с wifi подключением, перезагрузитесь и начните снова.
6. Нажимаем Изображение чтобы знать логин - пароль админки модуля.
7. Жмем Изображение, откроется админ-панель wifi-модуля.
Изображение
На этой странице у вас не будет пока раздела sta mode, его надо настроить. см. скрины:
Изображение
Здесь пока выбираем ap+sta mode. После успешной настройки, чтобы не раздавать лишний wifi, можно будет зайти сюда и поменять на sta mode.

Чуть не забыл -- нужно статический айпи настроить на роутере для милайта
Изображение
Настраивайтесь на ваш wifi. После успешного подключения запомните полученный айпи адрес, пригодится

Изображение
Здесь не трогаем serial port, нам нужен Server Address. Если он не совпадает с полученным от роутера, надо поменять на него. Если поле не активно, попробуйте сменить протокол Protocol на другой и сменить адрес, сохранить и поменять протокол обратно на tcp-server, сохранить снова.

Настройка окончена, перезагрузите модуль, подключитесь к wifi вашего роутера, зайдите по адресу, который вбивали выше. Если видите админку модуля, всё работает!
Rad81
Сообщения: 193
Зарегистрирован: Пт апр 01, 2016 2:42 pm
Благодарил (а): 10 раз
Поблагодарили: 10 раз

Re: Модуль MiLight

Сообщение Rad81 » Пт ноя 10, 2017 12:51 pm

Прошу прощения за наглость . Но хотелось бы именно увидеть интеграции Махором скриншотами.
Заранее спасибо
Ответить