[Модуль] MegaD (megad)

Разработка дополнительных модулей, подключение различных приложений.

Модератор: immortal

Chainik
Сообщения: 1462
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 260 раз
Поблагодарили: 454 раза

Re: [Модуль] MegaD (megad)

Сообщение Chainik » Чт сен 02, 2021 9:43 pm

Точно по портам, куда подключены датчики, нет никаких привязок в модуле "MegaD"?
Посмотрите, может в модуле "MegaD" на вкладке "Общее" в пункте "Период опроса, секунд:" стоит что-то, отличное от "0"?

Я подозреваю, что именно модуль опрашивает датчики и что-то делает потом. Либо ПУ хулиганят. Механизмы в ПУ непрозрачные для пользователя, может попробовать их не использовать?
Gutsu Dmitriy
Сообщения: 26
Зарегистрирован: Вс янв 21, 2018 11:12 pm
Благодарил (а): 6 раз
Поблагодарили: 1 раз

Re: [Модуль] MegaD (megad)

Сообщение Gutsu Dmitriy » Чт сен 02, 2021 10:48 pm

нет , привязки точно нет ,так как удалял все привязки из за проблем с модулем mega d ,мало того есть три датчика температуры agara Zigbee которые управляют мегой , проблема та же , где то на форуме человек писал про примерно такую же историю но про выключатели , что он включал свет и через некоторое время он отключался , как буто запускался таймер , у него четко с равным интервалом отключались , у меня же может через секунду , минуту или даже 10 минут выключится , уверен что в этом виноват ajax , так как после удаление строк проблема ушла полностью
как писал Сергей <Конструкция /ajax/megad.html?op=processCycle используется для периодического опроса>
Gutsu Dmitriy
Сообщения: 26
Зарегистрирован: Вс янв 21, 2018 11:12 pm
Благодарил (а): 6 раз
Поблагодарили: 1 раз

Re: [Модуль] MegaD (megad)

Сообщение Gutsu Dmitriy » Чт сен 02, 2021 11:10 pm

Вот нашел этот пункт , удалил , но вроде было где то еще , отпишусь о изменениях , спасибо
Вложения
Снимок экрана 2021-09-02 в 23.06.38.png
Снимок экрана 2021-09-02 в 23.06.38.png (369.28 КБ) 1875 просмотров
Gutsu Dmitriy
Сообщения: 26
Зарегистрирован: Вс янв 21, 2018 11:12 pm
Благодарил (а): 6 раз
Поблагодарили: 1 раз

Re: [Модуль] MegaD (megad)

Сообщение Gutsu Dmitriy » Пн сен 06, 2021 7:54 pm

Докладываю , проблема осталось , надо еще вторую строку найти и удалить
Chainik
Сообщения: 1462
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 260 раз
Поблагодарили: 454 раза

Re: [Модуль] MegaD (megad)

Сообщение Chainik » Пн сен 06, 2021 8:10 pm

У вас точно в модуле "MegaD" на вкладке "Общее" в пункте "Период опроса, секунд:" стоит "0"?
Gutsu Dmitriy
Сообщения: 26
Зарегистрирован: Вс янв 21, 2018 11:12 pm
Благодарил (а): 6 раз
Поблагодарили: 1 раз

Re: [Модуль] MegaD (megad)

Сообщение Gutsu Dmitriy » Вт сен 07, 2021 9:13 pm

Chainik писал(а):
Пн сен 06, 2021 8:10 pm
У вас точно в модуле "MegaD" на вкладке "Общее" в пункте "Период опроса, секунд:" стоит "0"?
Точно , проверено
Gutsu Dmitriy
Сообщения: 26
Зарегистрирован: Вс янв 21, 2018 11:12 pm
Благодарил (а): 6 раз
Поблагодарили: 1 раз

Re: [Модуль] MegaD (megad)

Сообщение Gutsu Dmitriy » Вт сен 07, 2021 9:15 pm

Снимок экрана 2021-09-07 в 21.13.44.png
Снимок экрана 2021-09-07 в 21.13.44.png (269.86 КБ) 1697 просмотров
на всех опрос , ноль
OlegM
Сообщения: 96
Зарегистрирован: Пт май 15, 2015 3:28 pm
Благодарил (а): 1 раз
Поблагодарили: 7 раз

Re: [Модуль] MegaD (megad)

Сообщение OlegM » Вс ноя 14, 2021 11:50 am

Поделюсь своей наработкой обработки физической кнопки диммированием.
Создаются два файла в ./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);
}
2. SDimmers_release.php

Код: Выделить всё

<?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 ленты. Скоро выложу.
За это сообщение автора OlegM поблагодарил:
Chainik (Вс ноя 14, 2021 8:16 pm)
Рейтинг: 1.16%
OlegM
Сообщения: 96
Зарегистрирован: Пт май 15, 2015 3:28 pm
Благодарил (а): 1 раз
Поблагодарили: 7 раз

Re: [Модуль] MegaD (megad)

Сообщение OlegM » Вс ноя 14, 2021 9:26 pm

А вот настройка цвета 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 хватит.
ВСЕ! Можно пробовать.
При коротких нажатиях вкл/выкл
При длинном нажатии, если выключена лента - включается и начинается перебор цветов. При включенном сразу начинается перебор цветов.
Хотелось бы от Сергея увидеть что-то подобное в Простых устройствах. Вещь тоже полезная. А то как-то кроме функционала вкл/выкл в Простых устройствах больше ничего нет. А ведь диммирование, изменение цвета - очень часто используется. Да и судя по обсуждениям давно ждут.
denisrpn
Сообщения: 3
Зарегистрирован: Пт ноя 26, 2021 7:58 am
Благодарил (а): 0
Поблагодарили: 0

Не вызывается метод при срабатывании датчика

Сообщение denisrpn » Пт ноя 26, 2021 8:20 am

Помогите пожалуйста уже сломал голову. Подключил датчики открытия двери на MegaD-8I7O-R в порты P0 и P1. Сконфигурированы одинаково как IN, P&R. Подключил модуль в Majordomo (модуль MegaD). На P0 все работает нормально. Срабатывает геркон, вызывается указанный метод. На других портах не работает (не вызывается метод). Хотя на самом устройстве светодиоды нормально сигнализируют об открытии/закрытии двери. Пробовал вместо P1 использовать другие порты - то же самое. Т.е. работает только с P0. В чем может быть проблема?
Ответить