[Модуль] MegaD (megad)
Модератор: immortal
-
- Сообщения: 1463
- Зарегистрирован: Вс янв 10, 2016 11:05 am
- Благодарил (а): 260 раз
- Поблагодарили: 454 раза
Re: [Модуль] MegaD (megad)
Точно по портам, куда подключены датчики, нет никаких привязок в модуле "MegaD"?
Посмотрите, может в модуле "MegaD" на вкладке "Общее" в пункте "Период опроса, секунд:" стоит что-то, отличное от "0"?
Я подозреваю, что именно модуль опрашивает датчики и что-то делает потом. Либо ПУ хулиганят. Механизмы в ПУ непрозрачные для пользователя, может попробовать их не использовать?
Посмотрите, может в модуле "MegaD" на вкладке "Общее" в пункте "Период опроса, секунд:" стоит что-то, отличное от "0"?
Я подозреваю, что именно модуль опрашивает датчики и что-то делает потом. Либо ПУ хулиганят. Механизмы в ПУ непрозрачные для пользователя, может попробовать их не использовать?
-
- Сообщения: 26
- Зарегистрирован: Вс янв 21, 2018 11:12 pm
- Благодарил (а): 6 раз
- Поблагодарили: 1 раз
Re: [Модуль] MegaD (megad)
нет , привязки точно нет ,так как удалял все привязки из за проблем с модулем mega d ,мало того есть три датчика температуры agara Zigbee которые управляют мегой , проблема та же , где то на форуме человек писал про примерно такую же историю но про выключатели , что он включал свет и через некоторое время он отключался , как буто запускался таймер , у него четко с равным интервалом отключались , у меня же может через секунду , минуту или даже 10 минут выключится , уверен что в этом виноват ajax , так как после удаление строк проблема ушла полностью
как писал Сергей <Конструкция /ajax/megad.html?op=processCycle используется для периодического опроса>
как писал Сергей <Конструкция /ajax/megad.html?op=processCycle используется для периодического опроса>
-
- Сообщения: 26
- Зарегистрирован: Вс янв 21, 2018 11:12 pm
- Благодарил (а): 6 раз
- Поблагодарили: 1 раз
Re: [Модуль] MegaD (megad)
Вот нашел этот пункт , удалил , но вроде было где то еще , отпишусь о изменениях , спасибо
- Вложения
-
- Снимок экрана 2021-09-02 в 23.06.38.png (369.28 КБ) 2124 просмотра
-
- Сообщения: 26
- Зарегистрирован: Вс янв 21, 2018 11:12 pm
- Благодарил (а): 6 раз
- Поблагодарили: 1 раз
-
- Сообщения: 1463
- Зарегистрирован: Вс янв 10, 2016 11:05 am
- Благодарил (а): 260 раз
- Поблагодарили: 454 раза
Re: [Модуль] MegaD (megad)
У вас точно в модуле "MegaD" на вкладке "Общее" в пункте "Период опроса, секунд:" стоит "0"?
-
- Сообщения: 26
- Зарегистрирован: Вс янв 21, 2018 11:12 pm
- Благодарил (а): 6 раз
- Поблагодарили: 1 раз
-
- Сообщения: 26
- Зарегистрирован: Вс янв 21, 2018 11:12 pm
- Благодарил (а): 6 раз
- Поблагодарили: 1 раз
-
- Сообщения: 96
- Зарегистрирован: Пт май 15, 2015 3:28 pm
- Благодарил (а): 1 раз
- Поблагодарили: 7 раз
Re: [Модуль] MegaD (megad)
Поделюсь своей наработкой обработки физической кнопки диммированием.
Создаются два файла в ./modules/devices
1. SDimmers_longPress.php
2. SDimmers_release.php
Создаются для них методы в диммируемых объектах.
Первый привязывается к long_press кнопке
Второй к release кнопки
В объектах в свойствах диммируемого устройства создать 2 свойства: direction и longClick
Через простые устройства не привязывать. Иначе будет двойное срабатывание.
input в кнопке MedaD не используется.
При коротком нажатии переключается (вкл/выкл)
При длинном нажатии либо ярче, либо тускнее. Повторно длинное нажатие меняет направление.
Если кому-то интересно изменять скорость диммирования, можно вместо :v7 :^7 там где 7 добавить в свойства и менять через веб.
В принципе ВСЕ!
Если бы Сергей добавил это в простые устройства, было бы шикарно.
Сейчас дорабатываю обработку физической кнопки для MegaD по долгому нажатию для регулировки цветов RGB ленты. Скоро выложу.
Создаются два файла в ./modules/devices
1. SDimmers_longPress.php
Код: Выделить всё
<?php
$ot = $this->object_title;
$properties = SQLSelect("SELECT NUM, DEVICE_ID FROM megadproperties WHERE LINKED_OBJECT LIKE '" . $ot . "' AND LINKED_PROPERTY LIKE 'levelWork'");
$device = SQLSelect("SELECT IP, PASSWORD FROM `megaddevices` WHERE `ID` = '".$properties[0]['DEVICE_ID']."'");
if ($properties && $device) {
//Если произошло длинное нажатие ("m=2")
if ($this->getProperty('direction') == "Up") {
file_get_contents("http://".$device[0]['IP']."/".$device[0]['PASSWORD']."/?cmd=".$properties[0]['NUM'].":v7");
$this->setProperty('direction', "Down");
debmes("http://".$device[0]['IP']."/".$device[0]['PASSWORD']."/?cmd=".$properties[0]['NUM'].":v7", 'megad_test');
} else {
file_get_contents("http://".$device[0]['IP']."/".$device[0]['PASSWORD']."/?cmd=".$properties[0]['NUM'].":^7");
$this->setProperty('direction', "Up");
debmes("http://".$device[0]['IP']."/".$device[0]['PASSWORD']."/?cmd=".$properties[0]['NUM'].":^7", 'megad_test');
}
$this->setProperty('longClick', 2);
}
Код: Выделить всё
<?php
// Действие при отпускании кнопки ("m=1") после длинного нажатия ("m=2")
$ot = $this->object_title;
$properties = SQLSelect("SELECT NUM, DEVICE_ID FROM megadproperties WHERE LINKED_OBJECT LIKE '" . $ot . "' AND LINKED_PROPERTY LIKE 'levelWork'");
$device = SQLSelect("SELECT IP, PASSWORD FROM `megaddevices` WHERE `ID` = '".$properties[0]['DEVICE_ID']."'");
if ($properties && $device) {
//"m=1" приходит после длинного нажатия ("m=2")
if ($this->getProperty('longClick') == "2") {
$this->setProperty('longClick', 0);
file_get_contents("http://".$device[0]['IP']."/".$device[0]['PASSWORD']."/?cmd=".$properties[0]['NUM'].":x");
$levelWork = file_get_contents("http://".$device[0]['IP']."/".$device[0]['PASSWORD']."/?pt=".$properties[0]['NUM']."&cmd=get");
if (is_numeric($levelWork)) {
$this->setProperty('levelWork', $levelWork);
debmes('levelWork: '.$levelWork, 'megad_test');
}
} else {
// "m=1" приходит после короткого нажатия ("m=")
$value = file_get_contents("http://".$device[0]['IP']."/".$device[0]['PASSWORD']."/?pt=".$properties[0]['NUM']."&cmd=get");
debmes('m: '.$value, 'megad_test');
if ($value) {
$this->callMethod('turnOff');
return "";
} else {
$this->callMethod('turnOn');
return "";
}
}
}
Первый привязывается к long_press кнопке
Второй к release кнопки
В объектах в свойствах диммируемого устройства создать 2 свойства: direction и longClick
Через простые устройства не привязывать. Иначе будет двойное срабатывание.
input в кнопке MedaD не используется.
При коротком нажатии переключается (вкл/выкл)
При длинном нажатии либо ярче, либо тускнее. Повторно длинное нажатие меняет направление.
Если кому-то интересно изменять скорость диммирования, можно вместо :v7 :^7 там где 7 добавить в свойства и менять через веб.
В принципе ВСЕ!
Если бы Сергей добавил это в простые устройства, было бы шикарно.
Сейчас дорабатываю обработку физической кнопки для MegaD по долгому нажатию для регулировки цветов RGB ленты. Скоро выложу.
- Рейтинг: 1.16%
-
- Сообщения: 96
- Зарегистрирован: Пт май 15, 2015 3:28 pm
- Благодарил (а): 1 раз
- Поблагодарили: 7 раз
Re: [Модуль] MegaD (megad)
А вот настройка цвета RGB ленты при долгом нажатии физической кнопки.
Файл rand.php в корне сайта:
Соответственно MD, R, G, B - ваши данные.
К физической кнопке создаете 2 метода:
1. long
2. stop_long
Соответственно megadRelay04 и megadRelay05 ваши физические порты, которые отключают питание на RGB ленты. У меня их 2 покругу. Поэтому 2 канала.
megadButton11 = это физическая кнопка.
Методы привязываете к кнопке в MegaD long_press и release. input так-же как и с диммированием не используется.
В объекте физической кнопки в свойствах создаете 3 параметра:
1. speed - скорость изменения цвета
2. s - насыщенность (оптимально 100)
3. l - яркость (оптимально 50)
На сайте их можно привязать как ползунки от 0 до 100. Скорость от 1 до 5 хватит.
ВСЕ! Можно пробовать.
При коротких нажатиях вкл/выкл
При длинном нажатии, если выключена лента - включается и начинается перебор цветов. При включенном сразу начинается перебор цветов.
Хотелось бы от Сергея увидеть что-то подобное в Простых устройствах. Вещь тоже полезная. А то как-то кроме функционала вкл/выкл в Простых устройствах больше ничего нет. А ведь диммирование, изменение цвета - очень часто используется. Да и судя по обсуждениям давно ждут.
Файл 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)";
}
?>
К физической кнопке создаете 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'));
Код: Выделить всё
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");
}
megadButton11 = это физическая кнопка.
Методы привязываете к кнопке в MegaD long_press и release. input так-же как и с диммированием не используется.
В объекте физической кнопки в свойствах создаете 3 параметра:
1. speed - скорость изменения цвета
2. s - насыщенность (оптимально 100)
3. l - яркость (оптимально 50)
На сайте их можно привязать как ползунки от 0 до 100. Скорость от 1 до 5 хватит.
ВСЕ! Можно пробовать.
При коротких нажатиях вкл/выкл
При длинном нажатии, если выключена лента - включается и начинается перебор цветов. При включенном сразу начинается перебор цветов.
Хотелось бы от Сергея увидеть что-то подобное в Простых устройствах. Вещь тоже полезная. А то как-то кроме функционала вкл/выкл в Простых устройствах больше ничего нет. А ведь диммирование, изменение цвета - очень часто используется. Да и судя по обсуждениям давно ждут.
Не вызывается метод при срабатывании датчика
Помогите пожалуйста уже сломал голову. Подключил датчики открытия двери на MegaD-8I7O-R в порты P0 и P1. Сконфигурированы одинаково как IN, P&R. Подключил модуль в Majordomo (модуль MegaD). На P0 все работает нормально. Срабатывает геркон, вызывается указанный метод. На других портах не работает (не вызывается метод). Хотя на самом устройстве светодиоды нормально сигнализируют об открытии/закрытии двери. Пробовал вместо P1 использовать другие порты - то же самое. Т.е. работает только с P0. В чем может быть проблема?