beavisgood писал(а): ↑Пт ноя 23, 2018 7:44 pm
Единственное, если я меняю состояние портов на Меге железной кнопкой, это событие не передается на сервер.
Пока я поставил в Модуле MegaD считывать статусы каждые 15 сек,
поэтому в меню, на сценах, и пр. софт элементах отображается с задержкой.
может есть более оптимальное решение?
Поделюсь и я своим вариантом настройки, когда на некоторые клавиши выключателя могут быть «повешены» разные действия при коротком и при длинном нажатии.
Путь у нас именно таким объектом будет «
Lamp_01». При этом объект «
Lamp_02» будет отрабатывать только короткие нажатия.
Сразу покажу настройку портов, на примере одного из входов (контроллер MegaD-2561, прошивка: 4.13b8).
- Настройка входа Меги
- Настройка входа в интерфейсе контроллера.png (7.6 КБ) 4208 просмотров
Галка напротив поля «Net» говорит о том, что прописанное в нем действие по умолчанию (NetAction) будет выполняться только в том случае, если сервер недоступен.
Теперь рассмотрим настройки в Мажордомо.
1. До запуска Мажордомо проведем модернизацию файла
megad.class.php модуля «MegaD», чтобы модуль научился «отлавливать» приходящий от контроллера параметр «m».
Подробнее о том, как это сделать, можно почитать здесь (
https://ab-log.ru/forum/viewtopic.php?f ... 309#p28309), в самом конце этого длинного поста после подзаголовка «
ДОПОЛНЕНИЕ/УТОЧНЕНИЕ».
2. Выполним базовую настройку по созданию и параметризации объектов, свойств, методов по аналогии с тем, как это описано здесь (
https://ab-log.ru/forum/viewtopic.php?f=1&t=1328) в конце длинного первого поста после подзаголовка «
ДОПОЛНЕНИЕ».
Правда, у нас будут кое-какие дополнения и изменения, о которых я скажу ниже.
3. Дополним состав свойств в классе новым свойством «
clickLong», которое нам будет служить идентификатором того, будет ли использоваться конкретная клавиша выключателя для длинных нажатий (clickLong = «1») или нет (clickLong <> «1»).
Так как решено, что на длинные нажатия будет реагировать объект «
Lamp_01», то сразу уставим у него значение свойства «clickLong» = «1».
4. Дополним состав методов в классе новыми методами
«
clickShortAction» (в нем будет код для действия при коротком нажатии)
и
«
clickLongAction» (в нем будет код для действия при длинном нажатии).
Запишем в КЛАССЕ код метода «
clickShortAction» (он будет таким же, какой ранее мы писали в метод «
switch»):
Код: Выделить всё
file_get_contents("http://".$this->getProperty('ipAddress')."/".$this->getProperty('Password')."/?cmd=".$this->getProperty('Port').":2");
$state = file_get_contents("http://".$this->getProperty('ipAddress')."/".$this->getProperty('Password')."/?pt=".$this->getProperty('Port')."&cmd=get");
if ($state == "ON") {
$this->setProperty('Status', 1);
} else {
$this->setProperty('Status', 0); }
Запишем в ОБЪЕКТЕ «
Lamp_01» код метода «
clickLongAction»:
Поставим радиоточку для «Вызывать родительский метод:» в положение «Никогда».
5. Запишем в КЛАССЕ код метода «
switch»:
Код: Выделить всё
$ot=$this->object_title;
$clickLong = $this->getProperty('clickLong');
//Если в свойстве "clickLong" не выставлена возможность длинного нажатия (clickLong <> 1), выполняем действие для короткого нажатия сразу
if ($clickLong <> "1") {
//Если пришел параметр "m", например, "m=2", игнорируем
if($_GET['m'] <> "") {
return"";}
callMethod($ot.".clickShortAction");
} else {
//Если для входа предусмотрена возможность использования длинного нажатия ("clickLong" = 1), выполняем нижеследующий кусок кода
//Если пришло длинное нажатие, сразу выполняем для него действие
if($_GET['m'] == 2) {
clearTimeOut($ot);
callMethod($ot.".clickLongAction");
return"";
}
//Выполним действие для короткого нажатия, только если в течение 2-х секунд не придет m=2
setTimeOut($ot,"callMethod('".$ot.".clickShortAction');",2);
}
На всякий случай покажу настройку в модуле «MegaD» на вкладке «Данные».
- Настройка в модуле "MegaD"
- Настройка в модуле MegaD на вкладке Данные.png (51.32 КБ) 4208 просмотров
В результате мы имеем следующее.
Если сервер недоступен, выполняется действие по умолчанию (в моем примере -- это переключение входа на другом контроллере (192.168.0.14/sec/?cmd=7:2).
Если клавиша выключателя должна отрабатывать только короткие нажатия (в моем случае это объект «
Lamp_02»), действие выполняется мгновенно (в моем примере – это переключение выхода по параметрам, заданным у объекта в свойствах «
ipAddress», «
Password» и «
Port»).
Если клавиша выключателя должна отрабатывать и короткие и длинные нажатия (в моем случае это объект «
Lamp_01»), короткие нажатия отрабатываются с 2-секундной задержкой, а длинные -- с задержкой, примерно, в секунду-полторы.
При этом статусы объектов изменяются
одновременно с переключением выходов.
Отдельную периодическую проверку текущих статусов на случай выполнения контроллером действий по умолчанию, разумеется, тоже проводить будет не лишним. Только делать это уже можно не так часто, допустим, 1 раз в 15 минут.