Управление лампочками Yeelight
Сообщение erandess » Чт июл 06, 2017 4:57 pm
В ожидании пока кто-то из знатоков PHP приобретет себе какую-нибудь лампочку семейства Yeelight и напишет модуль для управления этим хозяйством из Majordomo, я решил хоть что-нибудь сварганить самому. PHP я знаю на уровне скриптов в Majordomo, т.е. на минимуме, поэтому по качеству кода претензий не принимаю, но советам буду рад.
API Yeelight довольно подробно описан, и, в принципе, все управление сводится к поиску лампочек через широковещательные пакеты UDP и обмену JSON строками между лампочкой и сервером. Ниже я выкладываю свой гуглоперевод этого API. За основу взял класс Yeelight отсюда: https://github.com/elberth90/yeelight-api-client , и немного упростил его.
Итак, что же нужно чтобы управлять лампочкой (светильником, RGB-лентой) Yeelight:
1. Поставить на смартфон фирменное приложение Yeelight и в настройках включить режим разработчика.
2. Распаковать из прикрепленного архива библиотеку классов Yeelight_library.php в папку . /htdocs/modules/Yeelight/.
Проблемы с лампой YEELIGHT YLDP06YL Smart Light Bulb
3. Создать сценарий поиска лампочек и формирования класса, объектов и методов для Majordomo, назовем его, например, searchYeelightBulb с нижеследующим кодом.
//Скрипт для MD, поиск устройств в сети, создание объектов MD, создание и заполнение свойств объектов MD include_once(DIR_MODULES.’Yeelight/Yeelight_library.php’); //Создание класса MD Yeelight, классовых свойств и методов addClass(‘Yeelight’); addClassProperty(‘Yeelight’, ‘id’, 0); //Создаёт свойство класса и указывает, что необходимо хранить историю значений 0 дней addClassProperty(‘Yeelight’, ‘model’, 0); addClassProperty(‘Yeelight’, ‘status’, 0); addClassProperty(‘Yeelight’, ‘model’, 0); addClassProperty(‘Yeelight’, ‘bright’, 0); addClassProperty(‘Yeelight’, ‘Location’, 0); addClassProperty(‘Yeelight’, ‘name’, 0); addClassProperty(‘Yeelight’, ‘support’, 0); addClassMethod(‘Yeelight’, ‘on_off’); addClassMethod(‘Yeelight’, ‘set_bright’); addClassMethod(‘Yeelight’, ‘set_name’); //======================================= //Создание объектов класса // Поиск устройств $client = new YeelightClient(); $bulbList_prop = $client->search_prop(); foreach ($bulbList_prop as $bulb) < //получаем из массива bulbList_prop характеристики устройств $id = trim($bulb[id]); $Location = trim($bulb[Location]); $model = trim($bulb[model]); $name = trim($bulb[name]); $COLOR_MODE = trim($bulb[color_mode]); $powerTXT = $bulb[power]; if ($powerTXT == «on») < $power = 1; >if ($powerTXT = «off») < $power = 0; >$bright = trim($bulb[bright]); $ct = trim($bulb[ct]); $rgb = dechex($bulb[rgb]); $hue = trim($bulb[hue]); $sat = trim($bulb[sat]); $support = trim($bulb[support]); //получаем список объектов класса $objects=getObjectsByClass(«Yeelight»); $searhID = 0; foreach($objects as $obj) < if ((gg($obj[‘TITLE’].».id»)) == $id)< $searhID += 1; >> if ($searhID) < echo «Устройство с id».$id.» в базе MD уже есть».»
Ремонт светодиодной лампы Yeelight Color Xiaomi / как разобрать смарт лампу
«; > else < echo «Устройство с ID».$id.» в базе MD не найдено. Добавляем новый объект».»
«; if ($name) < $objName = $name; >else < $objName = «Bulb_».$id; >addClassObject(‘Yeelight’, $objName); //создаем объект с новым id //заполняем классовые свойства объекта setGlobal($objName.».id»,$id); setGlobal($objName.».model»,$model); setGlobal($objName.».status»,$power); setGlobal($objName.».bright»,$bright); setGlobal($objName.».Location»,$Location); setGlobal($objName.».name»,$name); setGlobal($objName.».support»,$support); //создаем свойства объекта с учетом специфики ламп if ($model ==»stripe» OR $model ==»color») < echo «Лампа цветная — создаем свойства и методы управления цветом».»
«; $result = strpos ($support, ‘set_rgb’); if ($result) < setGlobal($objName.».rgb»,$rgb); addClassMethod(‘Yeelight’, ‘set_rgb’); echo «Cоздается свойство RGB».»
«; > $result = strpos ($support, ‘set_ct_abx’); if ($result) < setGlobal($objName.».ct»,$ct); addClassMethod(‘Yeelight’, ‘set_ct’); echo «Cоздается свойство CT».»
«; > $result = strpos ($support, ‘set_hsv’); if ($result) < setGlobal($objName.».hue»,$hue); setGlobal($objName.».sat»,$sat); addClassMethod(‘Yeelight’, ‘set_hsv’); echo «Cоздается свойство HSV».»
«; > > elseif ($model ==»mono») < echo «Лампа монохромная — базовые свойства созданы».»
«; > > >
Запускать сценарий надо каждый раз для подключения новой лампочки. Сценарий ищет лампочки, определяет тип лампы, в зависимости от типа создает набор свойств и заполняет свойства значениями.
4. Также сценарий создает пустые методы, которые надо будет заполнить кодом из нижеследующего списка согласно имени метода:
//========= метод on_off (включение/выключение) =================== include_once(DIR_MODULES.’Yeelight/Yeelight_library.php’); $Location = $this->getProperty(‘Location’); $id = $this->getProperty(‘id’); $status = $this->getProperty(‘status’); if ($status) if (!$status) $data = [ «Location» => $Location, «id» => $id, ]; $socketFactory = new Factory(); $bulbFactory = new BulbFactory($socketFactory); $bulb = $bulbFactory->create($data); $res = $bulb->setPower($power, ‘smooth’, 1000); //включить/выключить if (array_key_exists(‘result’, $res)) < $result = $res [result][0]; //переменная содержит ответ от лампочки >if (array_key_exists(‘error’, $res)) < $result = $res [error][message].». Code «.$res [error][code]; DebMes(«Ошибка Yeelight: «.$result); >//========= метод set_bright (установка яркости) ==================== include_once(DIR_MODULES.’Yeelight/Yeelight_library.php’); $Location = $this->getProperty(‘Location’); $id = $this->getProperty(‘id’); $bright = (int) ($this->getProperty(‘bright’)); $data = [ «Location» => $Location, «id» => $id, ]; $socketFactory = new Factory(); $bulbFactory = new BulbFactory($socketFactory); $bulb = $bulbFactory->create($data); $res = $bulb->setBright($bright, ‘smooth’, 1000); //установить яркость if (array_key_exists(‘result’, $res)) < $result = $res [result][0]; //переменная содержит ответ от лампочки >if (array_key_exists(‘error’, $res)) < $result = $res [error][message].». Code «.$res [error][code]; DebMes(«Ошибка Yeelight: «.$result); >//=======метод set_rgb (установка цвета RGB)====================== include_once(DIR_MODULES.’Yeelight/Yeelight_library.php’); $Location = $this->getProperty(‘Location’); $id = $this->getProperty(‘id’); $rgb = hexdec($this->getProperty(‘rgb’)); $data = [ «Location» => «$Location», «id» => «$id», ]; $socketFactory = new Factory(); $bulbFactory = new BulbFactory($socketFactory); $bulb = $bulbFactory->create($data); $res = $bulb->setRgb($rgb, ‘smooth’, 1000); //установить цвет if (array_key_exists(‘result’, $res)) < $result = $res [result][0]; //переменная содержит ответ от лампочки >if (array_key_exists(‘error’, $res)) < $result = $res [error][message].». Code «.$res [error][code]; DebMes(«Ошибка Yeelight: «.$result); >//=======метод set_ct (установка цвета CT)======================= include_once(DIR_MODULES.’Yeelight/Yeelight_library.php’); $Location = $this->getProperty(‘Location’); $id = $this->getProperty(‘id’); $ct = (int) ($this->getProperty(‘ct’)); $data = [ «Location» => «$Location», «id» => «$id», ]; $socketFactory = new Factory(); $bulbFactory = new BulbFactory($socketFactory); $bulb = $bulbFactory->create($data); $res = $bulb->setCtAbx($ct, ‘smooth’, 1000); //установить цвет if (array_key_exists(‘result’, $res)) < $result = $res [result][0]; //переменная содержит ответ от лампочки >if (array_key_exists(‘error’, $res)) < $result = $res [error][message].». Code «.$res [error][code]; DebMes(«Ошибка Yeelight: «.$result); >//=======метод set_hsv (установка цвета Hsv)====================== include_once(DIR_MODULES.’Yeelight/Yeelight_library.php’); $Location = $this->getProperty(‘Location’); $id = $this->getProperty(‘id’); $hue = (int) ($this->getProperty(‘hue’)); $sat = (int) ($this->getProperty(‘sat’)); $data = [ «Location» => «$Location», «id» => «$id», ]; $socketFactory = new Factory(); $bulbFactory = new BulbFactory($socketFactory); $bulb = $bulbFactory->create($data); $res = $bulb->setHsv($hue, $sat, ‘smooth’, 1000); //установить цвет if (array_key_exists(‘result’, $res)) < $result = $res [result][0]; //переменная содержит ответ от лампочки >if (array_key_exists(‘error’, $res)) < $result = $res [error][message].». Code «.$res [error][code]; DebMes(«Ошибка Yeelight: «.$result); >//=======метод set_name(установка имени)======================= include_once(DIR_MODULES.’Yeelight/Yeelight_library.php’); $Location = $this->getProperty(‘Location’); $id = $this->getProperty(‘id’); $name = $this->getProperty(‘name’); $data = [ «Location» => «$Location», «id» => «$id», ]; $socketFactory = new Factory(); $bulbFactory = new BulbFactory($socketFactory); $bulb = $bulbFactory->create($data); $res = $bulb->setName($name); //установить имя if (array_key_exists(‘result’, $res)) < $result = $res [result][0]; //переменная содержит ответ от лампочки >if (array_key_exists(‘error’, $res))
5. Здесь у нас возникает вопрос: привязывать ли методы к изменению свойств? Думаю однозначно можно привязать метод set_name(установка имени устройства) к свойству name. Привязка остальных зависит от вашего желания иметь обратную связь.
6. По поводу обратной связи. Конечно лампочка подтверждает исполнение команды и мы это отслеживаем в методах.
Но полноценной обратной связи в данной реализации управления нет, т.е. если мы включим лампочку из приложения Yeelight со смартфона, статус ее в Majordomo не изменится. Что же делать?
Вариант первый — обратная связь не нужна, мы управляем лампочкой только через Majordomo. Привязываем исполнение всех методов к изменению соответствующих свойств и не паримся больше по этому поводу.
Вариант второй — можно периодически проверять состояние лампочек отдельным сценарием и обновлять свойства. Частоту запуска сценария выбираем исходя из компромисса между временем отображения изменений и нагрузкой сети.
include_once(DIR_MODULES.’Yeelight/Yeelight_library.php’); $objects=getObjectsByClass(«Yeelight»); foreach($objects as $obj) < $objName = $obj[‘TITLE’]; $id = gg($objName.».id»); $Location = gg($objName.».Location»); $data = [ «Location» =>$Location, «id» => $id, ]; $socketFactory = new Factory(); $bulbFactory = new BulbFactory($socketFactory); $bulb = $bulbFactory->create($data); $res = $bulb->getProp([BulbProperties::POWER,BulbProperties::BRIGHT,BulbProperties::RGB,BulbProperties::COLOR_TEMPERATURE,BulbProperties::HUE,BulbProperties::SATURATION]); $powerTXT = $res[result][0]; if ($powerTXT == «on») < $power = 1; >if ($powerTXT = «off») < $power = 0; >setGlobal($objName.».status»,$power); $bright = $res[result][1]; setGlobal($objName.».bright»,$bright); $rgb = dechex($res[result][2]); if ($rgb) $ct = $res[result][3]; if ($ct) $hue = $res[result][4]; if ($hue) $sat = $res[result][5]; if ($sat) echo «. «; > echo «ok»;
Вариант третий — который я пока не смог реализовать. В API Yeelight предусмотрена обратная связь — при изменении любого свойства лампы любым контроллером(программой управления), все контроллеры получают сообщения класса Notification. Т.е. все, что нам надо — в цикле слушать все входящие сообщения на TCP порту 55443, и анализировать их. Но моих знаний на это пока не хватает.
В последних двух вариантах привязку методов к свойствам не делаем, так как при работе скрипта обновления получим повторную отработку методов.
7. Далее создаем пункты меню с контролами для управления. Здесь все типовое, единственно следует иметь ввиду, что если методы у нас не привязаны к свойствам, при настройке контрола указываем и свойство и метод. И аналогично при использовании в своих сценариях устанавливаем свойство и запускаем метод. А если привязаны — управляем только изменением свойств.
P.S. Код я протестировал пока только на белой лампочке. Скоро придет цветная — протестирую и на ней.
Вложения Yeelight_library.zip Класс Yeelight (9.65 КБ) 362 скачивания Yeelight_API перевод.zip Yeelight API (157.97 КБ) 341 скачивание
Последний раз редактировалось erandess Чт авг 24, 2017 8:02 pm, всего редактировалось 3 раза.
За это сообщение автора erandess поблагодарили (всего 5): VooDooN (Чт июл 06, 2017 5:17 pm) • skysilver (Чт июл 06, 2017 5:32 pm) • chimik (Сб июл 08, 2017 12:46 am) • Gelezako (Сб дек 02, 2017 6:31 pm) • stellhawk (Пт янв 04, 2019 4:46 pm)
Источник: mjdm.ru
Лампочка Xiaomi Yeelight E27. устраняем писк и меняем диоды на 3000k
получив данную лампочку и будучи крайне недовольным ее цветовой температурой и писком, было принято решение заменить в ней диоды и как-то исправить писк при малой яркости. благо за несколько дней до этого я уронил лампочку из икеи, у нее внутри оторвался трансформатор, а она имела аналогичные диоды (теплого белого света 2700к, которые фактически 3000к), посему стала донором
итак, чтобы разобрать лампочку, я попытался свернуть рассеиватель, проворачивая его и корпус лампочки в разные стороны. теоретически можно растянуть их без поворота, но у меня это не получилось. внутри лампочки белый силикон, который и держал рассеиватель
под крышкой мы так же видим семь светодиодов 3030 мощностью 1w и плату радиомодуля
плата сделана из алюминия держится на двух винтах (откручиваем) и двух проводах (отпаиваем), под платой термопаста (стираем) и фиксируем, чтобы было проще работать феном
плату приходится хорошо прогреть, так как корпус ее из алюминия он должен полностью прогреться, после чего снимаем светодиоды
новые диоды установлены
как позже выяснилось припаялись они плохо, поэтому пришлось зачищать лак и проверять каждый диод в отдельности на контакт. к слову в икеевской лампочке уже есть для этого контактная площадка рядом с каждым диодом (первое фото). так же на фото видно, что внутри лампочка полая и не залита герметиком, отсюда и шум. при установке платы с диодами не забываем, что сажать ее надо на термопасту
заполняем лампочку и все отверстия вокруг платы питания силиконовым герметиком из пистолета и оставляем сохнуть на несколько часов
для приклеивания колпака я использовал китайский силиконовый клей, который продавался как термоклей, предварительно зачистив и обезжирив поверхности
излишки клея убраны и на фото готовый результат
полтора месяца после замены диодов и заливки лампочки, полет нормальный. лампочкой теперь можно комфортно пользоваться, уровень шума стал раза в три меньше и теперь его слышно только у самой лампочки
по соотношению цена/качество данная лампочка довольно интересная, но отсутствие моделей с цветовой температурой 2700к или 3000к сильно огорчает. так же судя по отзывам, китайцы перестали заполнять лампочки герметиком (если раньше заполняли) и новые партии ощутимо пищат
Планирую купить +5 Добавить в избранное Обзор понравился +21 +33
- xiaomi,
- Xiaomi Mi Yeelight,
- Лампочки
- 30 августа 2017, 02:24
- автор: bOBERmASTER
- просмотры: 10123
Источник: mysku.club
Переделка светильника Yeelight 450, добавление Zigbee модуля и подсветки
Ну и собственно, мой процесс переделки.
Снял лампу, покрутил против часовой стрелки и снял плафон. Видим плату, она отличается от Yeelight 650. Просто тёплый и холодные каналы, цветовых нет. Было решено оставить не исправленные каналы цвета GLEDOPTO, теплый-холодный подключить к модулю GLEDOPTO. Плюс, решил поставить дополнительный блок питания, для питания ленты.
Не стал заморачиваться с подгонкой питания родного блока питания.
Блок питания такой. 12 вольт 2 ампера. Выкинул корпус и отпаял лишнее.
GLEDOPTO в разборе.
Модуль лампы.
Блок питания в разборе.
Лента, обычная 12-вольтовая, цветная. Маркировку не помню, давно валяется.
Итак, приступим!
Это основное фото от Георгия. По этой схеме и подключал GND, WW и CW.
Блок питания к 220в. И 12в на питание GLEDOPTO.
Синий и зеленый — это теплый и холодный. Черный — земля.
Паяльником сделал паз для ленты.
Бортик протер спиртом и наклеил ленту.
Жидкие гвозди для плат и скотч для проводов. Получилось как-то так.
Кстати, у Георгия, были какие-то проблемы с перепутанными WW и CW. У меня было также. Поменял местами зеленый и синий провод, все стало на места. Значит, правильно.
Заключение
Получил, в итоге, стабильность работы, лампа больше не виснет. Подсветку цветную. Какие-то эффекты включения и выключения. И быстрее стало срабатывать — это удивило. Ну и фотки результатов в конце.
Хотел еще перепаять теплые диоды на холодные. Все равно для света они не нужны мне. Возможно, получится яркость лампы увеличить. Но в этот раз не получилось, на будущее запланирую. Всем спасибо.
Источник: sprut.ai