Страница 1 из 14

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

Добавлено: Сб апр 29, 2017 9:45 am
sergejey
В маркет добавился модуль поддержки оборудования MiLight
Внимание: данный модуль пока не поддерживает новую версию протокола взаимодействия с WiFi-шлюзом (работает только со старым wifi-шлюзом)

Изображение

Ранее поддержка этого оборудования уже была описана через настройку классов/объектов, но модуль несколько упрощает дело.

Список устройств:
Изображение

Данные устройства:
Изображение

Интеграция с объектами/простыми устройствами:
Изображение

Re: Модуль MiLight

Добавлено: Сб апр 29, 2017 2:12 pm
karo
sposibo bolshoe . jdyom na novii milight

Отправлено с моего m1 note через Tapatalk

Re: Модуль MiLight

Добавлено: Ср май 03, 2017 12:22 pm
ILGAS
Сергей, спасибо за модуль.
У меня просьба перебросить ТИП(устройства) в вкладыш "Данные", т.к. у меня стоит устройство с RGBW, который может работать как белой свет или RGB.

Re: Модуль MiLight

Добавлено: Ср май 31, 2017 2:53 pm
barsmaster
Планируется ли поддержка нового WiFi-шлюза?

Re: Модуль MiLight

Добавлено: Ср май 31, 2017 6:48 pm
sergejey
barsmaster писал(а):Планируется ли поддержка нового WiFi-шлюза?
Да, только у меня его нет ) Как только появится, так сразу и адаптирую модуль.

Re: Модуль MiLight

Добавлено: Ср июн 07, 2017 8:00 pm
cepxuo
я там запостил в старую ветку, продублирую тут, так как обсуждение нового модуля будет скорее всего здесь.

http://www.limitlessled.com/apps/ вот тут скачал приложение под Windows. Просканировал им сеть и нашёл свой контроллер. Приложение коннектится к нему на 5987 порту и отлично работает. Кроме того в приложении видно, какие команды оно отправляет, например чтобы выключить свет оно шлёт 31 00 00 08 04 02 00 00 00.

Также по ссылке http://www.limitlessled.com/dev/ есть примеры использования кода.

Сам я - не программист, так что с кодом разобраться не смогу, но надеюсь это кого-нибудь натолкнёт на светлые мысли...

Re: Модуль MiLight

Добавлено: Чт июн 15, 2017 8:56 am
cepxuo
Лёд тронулся, как говорится! Благодаря youtube-каналу "Электроника в объективе" (за что отдельное спасибо автору! Рассказывает итересно, доходчиво и подробно!) а именно, ролику про управление кондиционером, я таки понял, как отправлять UDP-пакеты из Majordomo. Прошу сильно не пинать, я ж писал, что не программист. Ну а постом выше - я давал ссылки на прогу, которая знает, какие именно пакеты отправлять. Осталось только склеить картину воедино.

Далее будет много букв про то, как отправлять команды новому контроллеру (про старый не знаю, так как у меня его нет)
СпойлерПоказать
Итак, общение с контроллером идёт в 2 захода, и это хорошо видно по логу программы LimitlessLED:

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

Switch On:
Start Wifi Bridge Session...
Send UDP commands to 192.168.0.100 port 5987
Sent: 20 00 00 00 16 02 62 3A D5 ED A3 01 AE 08 2D 46 61 41 A7 F6 DC AF D3 E6 00 00 1E
Received: 28 00 00 00 11 00 02 F0 FE 6B 2С C2 A0 14 CA 28 EE 00 01 4D 01 00
LimitlessLEDWifiBridgeSessionID1 is 4D
LimitlessLEDWifiBridgeSessionID2 is 01
IP Address is 192.168.0.100
MAC Address is FE:6B:2С:C2:A0:14
Sequence Number is 05
Checksum is 3F
Sent: 80 00 00 00 11 4D 01 00 05 00 31 00 00 08 04 01 00 00 00 01 00 3F
Command SUCCESSFUL.
Received: 88 00 00 00 03 00 05 00
Command completed.
Первым делом нужно отправить своеобразное приветствие, которое одинаково для всех команд и для всех отправителей (пробовал отправлять с разных компов)

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

20 00 00 00 16 02 62 3A D5 ED A3 01 AE 08 2D 46 61 41 A7 F6 DC AF D3 E6 00 00 1E
В ответ на это приветствие, контроллер ответит, например так:

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

[   начало ответа  ][MAC адрес контроллера]             [     ]--SessionID. Вот его нам и надо! 
28 00 00 00 11 00 02 F0 FE 6B 2С C2 A0 14 CA 28 EE 00 01 4D 01 00
                                          [       ]--вот это не знаю, что, но оно всегда одинаковое
Из этого ответа нам нужен SessionID. Далее отправляем команду на включение света, которая будет выглядеть так:

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

[начало команды]       [  ]--Sequence number            [  ]--канал
80 00 00 00 11 4D 01 00 05 00 31 00 00 08 04 01 00 00 00 01 00 3F
               [    ]--SessionID                              [  ]--контрольная сумма команды 
                              [                         ]--команда
В качестве разделителя между частями команды используется 00
На это контроллер ответит:

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

[             ]--начало
88 00 00 00 03 00 05 00
                 [  ]--текущий Sequence number
В принципе можно всегда использовать 01 для Sequence number, а можно и хранить его где-то в глобальной переменной, и при следующем вызове команды добавлять 1, но помнить, что это значение должно быть в HEX-виде. Я заморачиваться на это не стал :)
Теперь, как прикрутить это к МДМ. Я сделал скрипт, такого содержания:

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

$ip = $params["ip"];
$hello = hex2bin("200000001602623AD5EDA301AE082D466141A7F6DCAFD3E600001E");
$port = $params["port"];
$cmd = $params["cmd"];
$chan = $params["chan"];
$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);
$outhex = "8000000011".$sessionID."00".$chan."00";
$off = "3100000804020000000100";
$on  = "3100000804010000000100";
switch($cmd){
 case "off";
  $outcmd= $off;
  break;
 case "on";
  $outcmd = $on;
  break;
}
$crcdec = 0;
for ($i = 0; $i <= 21; $i+=2) {
    $crcdec = $crcdec + hexdec(substr($outcmd,$i,2));
}
$crc = dechex($crcdec);
$outhex = $outhex.$outcmd.$crc;
$out = hex2bin($outhex);
socket_sendto($sock, $out, strlen($out), 0, $ip, $port);
socket_recvfrom($sock, $buf, 16, 0, $ip, $port);
socket_close($sock); 
Кстати, в ролике про управление кондиционером, автор сделал функцию для преобразования HEX в BIN. Погуглив обратное преобразование, я нашёл, что в РНР это уже всё встроено.
Теперь для включения лампы можно вызывать этот скрипт с параметрами ip=ip_контроллера&port=5987&chan=01&cmd=on
Так как я пользуюсь интеграцией МДМ и HomeKit, которая работает только с "простыми устройствами", управление лампочкой я привязал к Switch1. В методах этого объекта (turnOn и turnOff) я добавил РНР-код вызова скрипта с соответствующими параметрами.
Жаль, что обратной связи нет. В планах поиграть с уровнями яркости, как настрою - отпишу тут.

Re: Модуль MiLight

Добавлено: Пт июн 16, 2017 12:43 pm
cepxuo
И снова - здасьти! Немного проапгрейдил скрипт - добавил коменты, причесал и добавил поддержку диммирования.
СпойлерПоказать

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

// Прописываем начальные переменные и переносим в них параметры из строки вызова скрипта
$ip = $params["ip"];
$hello = hex2bin("200000001602623AD5EDA301AE082D466141A7F6DCAFD3E600001E");
$port = $params["port"];
$cmd = $params["cmd"];
$chan = $params["chan"];
$level = str_pad(dechex($params["level"]), 2, '0', STR_PAD_LEFT); // так как нам надо значение в HEX с 0 в начале для значений от 1 до 9, конвертим параметр из DEC в HEX и добавляем 0, если надо

// Прописываем команды
$off = "3100000804020000000100";
$on  = "3100000804010000000100";
$lvl = "3100000803".$level."0000000100";

// Выбираем, какую команду отправлять контроллеру
switch($cmd){
 case "off";
  $outcmd= $off;
  break;
 case "on";
  $outcmd = $on;
  break;
 case "level";
  $outcmd = $lvl;
  break;
}

// Высчитываем контрольную сумму команды
$crcdec = 0;
for ($i = 0; $i <= 21; $i+=2) {
    $crcdec = $crcdec + hexdec(substr($outcmd,$i,2));
}
$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."00".$chan."00".$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);
А вот с цветом не могу понять, что там курили китайцы, когда это придумывали?

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

31 00 00 00 01 BA BA BA BA = Set Color to Blue (BA) (FF = Red, D9 = Lavender, BA = Blue, 85 = Aqua, 7A = Green, 54 = Lime, 3B = Yellow, 1E = Orange)
при этом для красного надо командовать так:

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

31 00 00 00 01 FF FF FF FF
для зелёного так:

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

31 00 00 00 01 7A 7A 7A 7A
именно по 4 раза и не понятно как кодируется цвет? точнее как его перекодировать от обычного #RRGGBB?

Re: Модуль MiLight

Добавлено: Ср июн 21, 2017 8:07 pm
airafree
cepxuo писал(а):И снова - здасьти! Немного проапгрейдил скрипт - добавил коменты, причесал и добавил поддержку диммирования.
СпойлерПоказать

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

// Прописываем начальные переменные и переносим в них параметры из строки вызова скрипта
$ip = $params["ip"];
$hello = hex2bin("200000001602623AD5EDA301AE082D466141A7F6DCAFD3E600001E");
$port = $params["port"];
$cmd = $params["cmd"];
$chan = $params["chan"];
$level = str_pad(dechex($params["level"]), 2, '0', STR_PAD_LEFT); // так как нам надо значение в HEX с 0 в начале для значений от 1 до 9, конвертим параметр из DEC в HEX и добавляем 0, если надо

// Прописываем команды
$off = "3100000804020000000100";
$on  = "3100000804010000000100";
$lvl = "3100000803".$level."0000000100";

// Выбираем, какую команду отправлять контроллеру
switch($cmd){
 case "off";
  $outcmd= $off;
  break;
 case "on";
  $outcmd = $on;
  break;
 case "level";
  $outcmd = $lvl;
  break;
}

// Высчитываем контрольную сумму команды
$crcdec = 0;
for ($i = 0; $i <= 21; $i+=2) {
    $crcdec = $crcdec + hexdec(substr($outcmd,$i,2));
}
$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."00".$chan."00".$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); 
А вот с цветом не могу понять, что там курили китайцы, когда это придумывали?

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

31 00 00 00 01 BA BA BA BA = Set Color to Blue (BA) (FF = Red, D9 = Lavender, BA = Blue, 85 = Aqua, 7A = Green, 54 = Lime, 3B = Yellow, 1E = Orange) 
при этом для красного надо командовать так:

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

31 00 00 00 01 FF FF FF FF
для зелёного так:

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

31 00 00 00 01 7A 7A 7A 7A
именно по 4 раза и не понятно как кодируется цвет? точнее как его перекодировать от обычного #RRGGBB?
Подскажите, куда данный скрипт закидываете?

Re: Модуль MiLight

Добавлено: Ср июн 21, 2017 9:15 pm
cepxuo
airafree писал(а):Подскажите, куда данный скрипт закидываете?
Скрипт сохранил в "сценариях" и запускаю его из соответствующего метода объекта. Например из метода turnOn можно запустить скрипт с параметрами ip=ip_контроллера&port=5987&chan=01&cmd=on