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

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

Модератор: immortal

Аватара пользователя
sergejey
Site Admin
Сообщения: 4284
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 75 раз
Поблагодарили: 1559 раз
Контактная информация:

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

Сообщение sergejey » Сб апр 29, 2017 9:45 am

В маркет добавился модуль поддержки оборудования MiLight
Внимание: данный модуль пока не поддерживает новую версию протокола взаимодействия с WiFi-шлюзом (работает только со старым wifi-шлюзом)

Изображение

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

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

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

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

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
karo
Сообщения: 22
Зарегистрирован: Сб июл 09, 2016 10:05 am
Благодарил (а): 6 раз
Поблагодарили: 0

Re: Модуль MiLight

Сообщение karo » Сб апр 29, 2017 2:12 pm

sposibo bolshoe . jdyom na novii milight

Отправлено с моего m1 note через Tapatalk
ILGAS
Сообщения: 366
Зарегистрирован: Пт июл 26, 2013 4:11 pm
Благодарил (а): 71 раз
Поблагодарили: 18 раз

Re: Модуль MiLight

Сообщение ILGAS » Ср май 03, 2017 12:22 pm

Сергей, спасибо за модуль.
У меня просьба перебросить ТИП(устройства) в вкладыш "Данные", т.к. у меня стоит устройство с RGBW, который может работать как белой свет или RGB.
Аватара пользователя
barsmaster
Сообщения: 60
Зарегистрирован: Пн апр 03, 2017 12:21 pm
Откуда: Киев
Благодарил (а): 10 раз
Поблагодарили: 1 раз

Re: Модуль MiLight

Сообщение barsmaster » Ср май 31, 2017 2:53 pm

Планируется ли поддержка нового WiFi-шлюза?
Аватара пользователя
sergejey
Site Admin
Сообщения: 4284
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 75 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: Модуль MiLight

Сообщение sergejey » Ср май 31, 2017 6:48 pm

barsmaster писал(а):Планируется ли поддержка нового WiFi-шлюза?
Да, только у меня его нет ) Как только появится, так сразу и адаптирую модуль.

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Аватара пользователя
cepxuo
Сообщения: 98
Зарегистрирован: Вт май 02, 2017 7:31 am
Благодарил (а): 31 раз
Поблагодарили: 6 раз

Re: Модуль MiLight

Сообщение cepxuo » Ср июн 07, 2017 8:00 pm

я там запостил в старую ветку, продублирую тут, так как обсуждение нового модуля будет скорее всего здесь.

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

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

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

Re: Модуль MiLight

Сообщение cepxuo » Чт июн 15, 2017 8:56 am

Лёд тронулся, как говорится! Благодаря 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) я добавил РНР-код вызова скрипта с соответствующими параметрами.
Жаль, что обратной связи нет. В планах поиграть с уровнями яркости, как настрою - отпишу тут.
Аватара пользователя
cepxuo
Сообщения: 98
Зарегистрирован: Вт май 02, 2017 7:31 am
Благодарил (а): 31 раз
Поблагодарили: 6 раз

Re: Модуль MiLight

Сообщение cepxuo » Пт июн 16, 2017 12:43 pm

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

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

// Прописываем начальные переменные и переносим в них параметры из строки вызова скрипта
$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?
airafree
Сообщения: 162
Зарегистрирован: Сб янв 28, 2017 2:17 pm
Благодарил (а): 13 раз
Поблагодарили: 7 раз

Re: Модуль MiLight

Сообщение airafree » Ср июн 21, 2017 8:07 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?
Подскажите, куда данный скрипт закидываете?
Аватара пользователя
cepxuo
Сообщения: 98
Зарегистрирован: Вт май 02, 2017 7:31 am
Благодарил (а): 31 раз
Поблагодарили: 6 раз

Re: Модуль MiLight

Сообщение cepxuo » Ср июн 21, 2017 9:15 pm

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