А вот настройка цвета RGB ленты при долгом нажатии физической кнопки.
Файл rand.php в корне сайта:
Код: Выделить всё
<?php
define("R", "10");
define("G", "12");
define("B", "11");
define("MD", "http://10.10.100.10/sec/?");
$param = $argv;
$filename = "/var/run/rand.pid";
$shortopts = "";
$shortopts .= "s::";
$longopts = array(
"stop::",
);
$options = getopt($shortopts, $longopts);
if (array_key_exists("s", $options) || array_key_exists("stop", $options)) {
$stop = true;
if (file_exists($filename)) {
$str = htmlentities(file_get_contents($filename));
shell_exec("kill " . $str);
unlink($filename);
exit;
}
} else {
$stop = false;
if (file_exists($filename)) {
$str = htmlentities(file_get_contents($filename));
shell_exec("kill " . $str);
unlink($filename);
}
}
/**
* pcntl_fork() - данная функция разветвляет текущий процесс
*/
$pid = pcntl_fork();
if ($pid == -1) {
/**
* Не получилось сделать форк процесса, о чем сообщим в консоль
*/
die('Error fork process' . PHP_EOL);
} elseif ($pid) {
/**
* В эту ветку зайдет только родительский процесс, который мы убиваем и сообщаем об этом в консоль
*/
$fp = fopen($filename, "w");
fwrite($fp, $pid);
fclose($fp);
die('Die parent process ' . $pid . PHP_EOL);
} else {
/**
* Бесконечный цикл
*/
while(!$stop) {
if ($param[1] == 1 || $param[1] == 3) rgb($param);
else rgb($param, $data);
}
}
/**
* Установим дочерний процесс основным, это необходимо для создания процессов
*/
posix_setsid();
function rgb($param) {
if ($param[1] == 1) {
$r = file_get_contents(MD."pt=".R."&cmd=get");
$g = file_get_contents(MD."pt=".G."&cmd=get");
$b = file_get_contents(MD."pt=".B."&cmd=get");
$rgb = array($r, $g, $b);
$hsl = rgb2hsl($rgb);
$h = $hsl[0];
$s = $param[3];
$l = $param[4];
$h = $h + 10;
if ($h >= 360) $h = 0;
$hsl = [$h, $s, $l];
$rgb = convertHSL($hsl);
$r = $rgb[0]; $g = $rgb[1]; $b = $rgb[2];
file_get_contents(MD."pt=".R."&pwm=".$r);
file_get_contents(MD."pt=".G."&pwm=".$g);
file_get_contents(MD."pt=".B."&pwm=".$b);
usleep($param[2]*100000);
}
}
/*
* Преобразование RGB в HSL
*/
function rgb2hsl($rgb){
$clrR = ($rgb[0] / 255);
$clrG = ($rgb[1] / 255);
$clrB = ($rgb[2] / 255);
$clrMin = min($clrR, $clrG, $clrB);
$clrMax = max($clrR, $clrG, $clrB);
$deltaMax = $clrMax - $clrMin;
$l = ($clrMax + $clrMin) / 2 * 100;
if (0 == $deltaMax){
$h = 0;
$s = 0;
} else {
if (50 > $l){
$s = $deltaMax / ($clrMax + $clrMin) * 100;
}else{
$s = $deltaMax / (2 - $clrMax - $clrMin) * 100;
}
$deltaR = ((($clrMax - $clrR) / 6) + ($deltaMax / 2)) / $deltaMax;
$deltaG = ((($clrMax - $clrG) / 6) + ($deltaMax / 2)) / $deltaMax;
$deltaB = ((($clrMax - $clrB) / 6) + ($deltaMax / 2)) / $deltaMax;
if ($clrR == $clrMax){
$h = ($deltaB - $deltaG) * 360;
if ($clrG == $clrMin && $h <> 0) {
$h = (1 + $deltaB - $deltaG) * 360;
}
}else if ($clrG == $clrMax){
$h = (1/3 + $deltaR - $deltaB) * 360;
}else if ($clrB == $clrMax){
$h = (2/3 + $deltaG - $deltaR) * 360;
}
}
return array(round($h), round($s,1), round($l,1));
}
/**
* преобразовать цветовую схему HSL в RGB.
*
* Нам нужен метод, в котором мы можем программно генерировать серию цветов
* между двумя значениями (например, от красного к зеленому), что легко сделать с помощью HSL,
* потому что вы просто меняете оттенок. (0 = красный, 120 = зеленый).
* Вы можете использовать эту функцию для преобразования этих значений цвета hsl в цветовую схему rgb.
* Например у вас есть hsl (50, 100%, 50%). Чтобы преобразовать, $rgb = convertHSL (50,100,50); // возвращает rgb (255, 213, 0)
*
* @param int $h оттенок
* @param int $s насыщенность
* @param int $l яркость
* @return string
*/
function convertHSL($hsl){
list($h, $s, $l) = $hsl;
$h /= 360;
$s /=100;
$l /=100;
$r = $l;
$g = $l;
$b = $l;
$v = ($l <= 0.5) ? ($l * (1.0 + $s)) : ($l + $s - $l * $s);
if ($v > 0){
$m;
$sv;
$sextant;
$fract;
$vsf;
$mid1;
$mid2;
$m = $l + $l - $v;
$sv = ($v - $m ) / $v;
$h *= 6.0;
$sextant = floor($h);
$fract = $h - $sextant;
$vsf = $v * $sv * $fract;
$mid1 = $m + $vsf;
$mid2 = $v - $vsf;
switch ($sextant)
{
case 0:
$r = $v;
$g = $mid1;
$b = $m;
break;
case 1:
$r = $mid2;
$g = $v;
$b = $m;
break;
case 2:
$r = $m;
$g = $v;
$b = $mid1;
break;
case 3:
$r = $m;
$g = $mid2;
$b = $v;
break;
case 4:
$r = $mid1;
$g = $m;
$b = $v;
break;
case 5:
$r = $v;
$g = $m;
$b = $mid2;
break;
}
}
$r = round($r * 255, 0);
$g = round($g * 255, 0);
$b = round($b * 255, 0);
return array($r, $g, $b); //"rgb($r, $g, $b)";
}
?>
Соответственно MD, R, G, B - ваши данные.
К физической кнопке создаете 2 метода:
1. long
Код: Выделить всё
if (!gg(megadRelay04.status) || !gg(megadRelay05.status)) {
callMethod("megadRelay04.turnOn");
callMethod("megadRelay05.turnOn");
}
$this->setProperty('longClick', 2);
safe_exec('sudo php /var/www/html/rand.php 1 '.gg('megadButton11.speed')." ".gg('megadButton11.s')." ".gg('megadButton11.l'));
2. stop_long
Код: Выделить всё
if ($this->getProperty('longClick') == 2) {
$this->setProperty('longClick', 0);
safe_exec('sudo php /var/www/html/rand.php -s');
} else {
callMethod("megadRelay04.switch");
callMethod("megadRelay05.switch");
}
Соответственно megadRelay04 и megadRelay05 ваши физические порты, которые отключают питание на RGB ленты. У меня их 2 покругу. Поэтому 2 канала.
megadButton11 = это физическая кнопка.
Методы привязываете к кнопке в MegaD long_press и release. input так-же как и с диммированием не используется.
В объекте физической кнопки в свойствах создаете 3 параметра:
1. speed - скорость изменения цвета
2. s - насыщенность (оптимально 100)
3. l - яркость (оптимально 50)
На сайте их можно привязать как ползунки от 0 до 100. Скорость от 1 до 5 хватит.
ВСЕ! Можно пробовать.
При коротких нажатиях вкл/выкл
При длинном нажатии, если выключена лента - включается и начинается перебор цветов. При включенном сразу начинается перебор цветов.
Хотелось бы от Сергея увидеть что-то подобное в Простых устройствах. Вещь тоже полезная. А то как-то кроме функционала вкл/выкл в Простых устройствах больше ничего нет. А ведь диммирование, изменение цвета - очень часто используется. Да и судя по обсуждениям давно ждут.