[Модуль] MiLight (milight)
Модератор: immortal
- sergejey
- Site Admin
- Сообщения: 4284
- Зарегистрирован: Пн сен 05, 2011 6:48 pm
- Откуда: Минск, Беларусь
- Благодарил (а): 75 раз
- Поблагодарили: 1559 раз
- Контактная информация:
[Модуль] MiLight (milight)
В маркет добавился модуль поддержки оборудования MiLight
Внимание: данный модуль пока не поддерживает новую версию протокола взаимодействия с WiFi-шлюзом (работает только со старым wifi-шлюзом)
Ранее поддержка этого оборудования уже была описана через настройку классов/объектов, но модуль несколько упрощает дело.
Список устройств:
Данные устройства:
Интеграция с объектами/простыми устройствами:
Внимание: данный модуль пока не поддерживает новую версию протокола взаимодействия с WiFi-шлюзом (работает только со старым wifi-шлюзом)
Ранее поддержка этого оборудования уже была описана через настройку классов/объектов, но модуль несколько упрощает дело.
Список устройств:
Данные устройства:
Интеграция с объектами/простыми устройствами:
Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Re: Модуль MiLight
sposibo bolshoe . jdyom na novii milight
Отправлено с моего m1 note через Tapatalk
Отправлено с моего m1 note через Tapatalk
-
- Сообщения: 366
- Зарегистрирован: Пт июл 26, 2013 4:11 pm
- Благодарил (а): 71 раз
- Поблагодарили: 18 раз
Re: Модуль MiLight
Сергей, спасибо за модуль.
У меня просьба перебросить ТИП(устройства) в вкладыш "Данные", т.к. у меня стоит устройство с RGBW, который может работать как белой свет или RGB.
У меня просьба перебросить ТИП(устройства) в вкладыш "Данные", т.к. у меня стоит устройство с RGBW, который может работать как белой свет или RGB.
- barsmaster
- Сообщения: 60
- Зарегистрирован: Пн апр 03, 2017 12:21 pm
- Откуда: Киев
- Благодарил (а): 10 раз
- Поблагодарили: 1 раз
- sergejey
- Site Admin
- Сообщения: 4284
- Зарегистрирован: Пн сен 05, 2011 6:48 pm
- Откуда: Минск, Беларусь
- Благодарил (а): 75 раз
- Поблагодарили: 1559 раз
- Контактная информация:
Re: Модуль MiLight
Да, только у меня его нет ) Как только появится, так сразу и адаптирую модуль.barsmaster писал(а):Планируется ли поддержка нового WiFi-шлюза?
Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
- cepxuo
- Сообщения: 98
- Зарегистрирован: Вт май 02, 2017 7:31 am
- Благодарил (а): 31 раз
- Поблагодарили: 6 раз
Re: Модуль MiLight
я там запостил в старую ветку, продублирую тут, так как обсуждение нового модуля будет скорее всего здесь.
http://www.limitlessled.com/apps/ вот тут скачал приложение под Windows. Просканировал им сеть и нашёл свой контроллер. Приложение коннектится к нему на 5987 порту и отлично работает. Кроме того в приложении видно, какие команды оно отправляет, например чтобы выключить свет оно шлёт 31 00 00 08 04 02 00 00 00.
Также по ссылке http://www.limitlessled.com/dev/ есть примеры использования кода.
Сам я - не программист, так что с кодом разобраться не смогу, но надеюсь это кого-нибудь натолкнёт на светлые мысли...
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
Лёд тронулся, как говорится! Благодаря youtube-каналу "Электроника в объективе" (за что отдельное спасибо автору! Рассказывает итересно, доходчиво и подробно!) а именно, ролику про управление кондиционером, я таки понял, как отправлять UDP-пакеты из Majordomo. Прошу сильно не пинать, я ж писал, что не программист. Ну а постом выше - я давал ссылки на прогу, которая знает, какие именно пакеты отправлять. Осталось только склеить картину воедино.
Далее будет много букв про то, как отправлять команды новому контроллеру (про старый не знаю, так как у меня его нет)
Далее будет много букв про то, как отправлять команды новому контроллеру (про старый не знаю, так как у меня его нет)
СпойлерПоказать
Итак, общение с контроллером идёт в 2 захода, и это хорошо видно по логу программы LimitlessLED:
Первым делом нужно отправить своеобразное приветствие, которое одинаково для всех команд и для всех отправителей (пробовал отправлять с разных компов)
В ответ на это приветствие, контроллер ответит, например так:
Из этого ответа нам нужен SessionID. Далее отправляем команду на включение света, которая будет выглядеть так:
В качестве разделителя между частями команды используется 00
На это контроллер ответит:
В принципе можно всегда использовать 01 для Sequence number, а можно и хранить его где-то в глобальной переменной, и при следующем вызове команды добавлять 1, но помнить, что это значение должно быть в HEX-виде. Я заморачиваться на это не стал
Теперь, как прикрутить это к МДМ. Я сделал скрипт, такого содержания:
Кстати, в ролике про управление кондиционером, автор сделал функцию для преобразования HEX в BIN. Погуглив обратное преобразование, я нашёл, что в РНР это уже всё встроено.
Теперь для включения лампы можно вызывать этот скрипт с параметрами ip=ip_контроллера&port=5987&chan=01&cmd=on
Так как я пользуюсь интеграцией МДМ и HomeKit, которая работает только с "простыми устройствами", управление лампочкой я привязал к Switch1. В методах этого объекта (turnOn и turnOff) я добавил РНР-код вызова скрипта с соответствующими параметрами.
Жаль, что обратной связи нет. В планах поиграть с уровнями яркости, как настрою - отпишу тут.
Код: Выделить всё
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
[ ]--вот это не знаю, что, но оно всегда одинаковое
Код: Выделить всё
[начало команды] [ ]--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 [ ]--контрольная сумма команды
[ ]--команда
На это контроллер ответит:
Код: Выделить всё
[ ]--начало
88 00 00 00 03 00 05 00
[ ]--текущий Sequence number
Теперь, как прикрутить это к МДМ. Я сделал скрипт, такого содержания:
Код: Выделить всё
$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);
Теперь для включения лампы можно вызывать этот скрипт с параметрами ip=ip_контроллера&port=5987&chan=01&cmd=on
Так как я пользуюсь интеграцией МДМ и HomeKit, которая работает только с "простыми устройствами", управление лампочкой я привязал к Switch1. В методах этого объекта (turnOn и turnOff) я добавил РНР-код вызова скрипта с соответствующими параметрами.
Жаль, что обратной связи нет. В планах поиграть с уровнями яркости, как настрою - отпишу тут.
- cepxuo
- Сообщения: 98
- Зарегистрирован: Вт май 02, 2017 7:31 am
- Благодарил (а): 31 раз
- Поблагодарили: 6 раз
Re: Модуль MiLight
И снова - здасьти! Немного проапгрейдил скрипт - добавил коменты, причесал и добавил поддержку диммирования.А вот с цветом не могу понять, что там курили китайцы, когда это придумывали?при этом для красного надо командовать так:для зелёного так:именно по 4 раза и не понятно как кодируется цвет? точнее как его перекодировать от обычного #RRGGBB?
СпойлерПоказать
Код: Выделить всё
// Прописываем начальные переменные и переносим в них параметры из строки вызова скрипта
$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
-
- Сообщения: 162
- Зарегистрирован: Сб янв 28, 2017 2:17 pm
- Благодарил (а): 13 раз
- Поблагодарили: 7 раз
Re: Модуль MiLight
Подскажите, куда данный скрипт закидываете?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
именно по 4 раза и не понятно как кодируется цвет? точнее как его перекодировать от обычного #RRGGBB?Код: Выделить всё
31 00 00 00 01 7A 7A 7A 7A
- cepxuo
- Сообщения: 98
- Зарегистрирован: Вт май 02, 2017 7:31 am
- Благодарил (а): 31 раз
- Поблагодарили: 6 раз
Re: Модуль MiLight
Скрипт сохранил в "сценариях" и запускаю его из соответствующего метода объекта. Например из метода turnOn можно запустить скрипт с параметрами ip=ip_контроллера&port=5987&chan=01&cmd=onairafree писал(а):Подскажите, куда данный скрипт закидываете?