я использую у себя контроллеры megad-2561, а в качестве подсветки - ленты на базе чипов ws2818. Подробнее механизм описан https://ab-log.ru/smart-house/ethernet/megad-ws-2018
В качестве обьектов сделал новый класс RGB_WS2818 на базе SRGB
свойства:
Код: Выделить всё
Chip //Количество чипов в ленте (Ключевые данные)
MegaD_IP //IP Мегадевайса (Ключевые данные)
MegaD_Password //Пароль от меги (Ключевые данные)
MegaD_Port //Порт управления, на котором висит лента (Ключевые данные)
Код: Выделить всё
$megad_ip=$this->getProperty("MegaD_IP");
$megad_port=$this->getProperty("MegaD_Port");
$megad_pass=$this->getProperty("MegaD_Password");
$chip=$this->getProperty("Chip");
$color=$this->getProperty("Color");
$red="";
$green="";
$blue="";
if ($color[0] == '#') {
$color = substr($color, 1);
};
$red=substr($color,0,2);
$green=substr($color,2,2);
$blue=substr($color,4,2);
$color=$blue.$red.$green;
$url = "http://".$megad_ip."/".$megad_pass."/?pt=".$megad_port."&chip=".$chip."&ws=".$color;
file_get_contents($url);
В общем в меню управления блок выбора цвета, привязанный обьект и свойство. Собственно все работает, но вот как мне запрограммировать эффект для ленты? Суть, что надо "где-то отдельно" запустить бесконечный цикл, который будет обрабатывать эффект, еще нужно как-то удобно этот эффект включать и выключать. Я немного "недогоняю" глобальное устройство MD, из-за этого мои "бесконечные циклы" вешают всю систему. Подскажите как организовать это дело?
Либо же можно "наделать" методов для класса, на каждый эффект - свой метод и вызывать их. Но проблема в том, что в доме у меня будет порядка 15 лент и на каждую запускать свой эффект, а на эффект отдельный цикл -- мне кажется все повиснет. Тем более нужды зажигать во всем доме разными эффектами все ленты нет, максимум -- обьединение лент по комнатам и соответственно эффект на комнату свой.
Вот пример скрипта для "гирлянды" (с сайта производителя):
Код: Выделить всё
$url = "http://192.168.4.30/sec/?pt=35&chip=160&ws=";
$url2 = "http://192.168.4.30/sec/?pt=34&chip=160&ws=";
$loop_cnt = 0;
$color = "ff0000";
while(true)
{
$cmd = "";
for ( $i = 0; $i < 6; $i++ )
{
if ( $i == $cnt )
//$cmd .= $cmd_list[$color].$cmd_list[$color];
$cmd .= $color.$color;
else
$cmd .= "000000000000";
}
if ( $cmd == "000000000000000000000000000000000000000000000000000000000000000000000000" )
$cmd = $color.$color."000000000000000000000000000000000000000000000000000000000000";
$cnt++;
if ( $cnt == 12 )
{
$cnt = 0;
$r = 0;
$g = 0;
$b = 0;
for ( $i = 0; $i < 3; $i++ )
{
$r = dechex(rand(0, 50));
$g = dechex(rand(0, 50));
$b = dechex(rand(0, 50));
if ( strlen($r) == 1 )
$r = "0".$r;
if ( strlen($g) == 1 )
$g = "0".$g;
if ( strlen($b) == 1 )
$b = "0".$b;
$color = $r.$g.$b;
}
//$color = rand(0,3);
}
file_get_contents($url.$cmd);
file_get_contents($url2.$cmd);
usleep(50000);
$loop_cnt++;
if ( $loop_cnt == 200 )
return;
}
И еще второй вопрос:
допустим у меня в комнате четыре ленты, каждая сидит на отдельном порту меги, как включать из меню управления разом все ленты в один цвет?
Через вызов метода обьекта, контроллер (или MD???) тормозит нереально, в итоге на ленту вместо нужных данных приходит мусор и она "радугой" светится. Как я думаю, надо сначала получить из колорбокса меню цвет, из всех нужных объектов лент (которые надо зажеч) данные для меги и четыремя подряд командами file_get_contents() отправить скомпонованные команды контроллеру. Но как из сценария получить цвет из колорбокса меню?
Посоветуйте пожалуйста решение с минимальной нагрузкой на систему этими скриптами.