Страница 1 из 3

Постоянное проговаривание свойства.

Добавлено: Сб фев 01, 2020 5:26 pm
madbob
Подскажите пожалуйста! Нужен код метода statusUpdated
Чтобы пока status=1 Алиса постоянно проговаривала сообщение. Если

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

If  ($this->getProperty('status')) {
 say("пожар в гараже",3);
}
То, соответственно, проговаривает один раз, как и должна при изменении статуса. Если

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

while (gg('Relay19.status') == 1)
{
 say("пожар в гараже",5);
}
То не перестает проговаривать даже при изменении статуса в 0.
Как остановить выполнение этого метода, когда болтает без остановки? Я смог только перезагрузкой , существуют же менее радикальные способы?
В железе сделано с помощью ESP, на которой висит датчик качества воздуха. Простое устройство, в которое шлются значения этого датчика. При превышении уставки условное управление другим ПУ типа реле «включить», при снижении «выключить».

Re: Постоянное проговаривание свойства.

Добавлено: Чт фев 27, 2020 12:56 pm
skysilver
Через таймеры нужно такие вещи делать. setTimeOut в Базе знаний.

Re: Постоянное проговаривание свойства.

Добавлено: Чт фев 27, 2020 5:10 pm
Chainik
madbob писал(а):
Сб фев 01, 2020 5:26 pm
Подскажите пожалуйста! Нужен код метода statusUpdated
Чтобы пока status=1 Алиса постоянно проговаривала сообщение. Если

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

If  ($this->getProperty('status')) {
 say("пожар в гараже",3);
}
То, соответственно, проговаривает один раз, как и должна при изменении статуса....
Скорее всего при while у вас "набросало" сообщений в очередь и будет проговаривать до второго пришествия (хотя сам метод фактически закончил выполнение).
Попробуйте, как правильно подсказали, добавить в код строчку с SetTimeOut, скажем, с 10-секундной задержкой выполнения).

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

If  ($this->getProperty('status')) {
 say("пожар в гараже",3);
 SetTimeOut("MyTimer_33","$this->callMethod('ИМЯ_ТЕКУЩЕГО_МЕТОДА');",10);
}

Re: Постоянное проговаривание свойства.

Добавлено: Чт фев 27, 2020 7:24 pm
Denis_k
чтобы не плодить тем:
добавляю в методе statusUpdated объекта OpenClose01 следующие строки:

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

$open=gg("OpenClose01.status");
if ($open==1) 
{say ("Входная дверь закрыта",2);
}
else 
{say ("Входная дверь открыта",2);
}
и получаю в чате "Входная дверь открыта" дважды, сообщение про закрытие приходит в единственно числе

Re: Постоянное проговаривание свойства.

Добавлено: Чт фев 27, 2020 7:36 pm
xor
Denis_k писал(а):чтобы не плодить тем:
добавляю в методе statusUpdated объекта OpenClose01 следующие строки:

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

$open=gg("OpenClose01.status");
if ($open==1) 
{say ("Входная дверь закрыта",2);
}
else 
{say ("Входная дверь открыта",2);
}
и получаю в чате "Входная дверь открыта" дважды, сообщение про закрытие приходит в единственно числе
Стандарт для МДМ - говорить только при смене статуса с 0 на 1 или наоборот. Если лень читать про олд_валюе/нью_валюе, а дублирование идёт с небольшим интервалом, вместо сэй можно использовать тайм-аут с тем же сэй, но с задержкой в неск секунд. Так будет подавляться повтор, но это, кмк, неправильно

Отправлено с моего Redmi 4X через Tapatalk


Re: Постоянное проговаривание свойства.

Добавлено: Чт фев 27, 2020 7:37 pm
Chainik
Для начала надо убедиться, что этот метод не запускается дважды (скорее всего, запускается).
Для этого можно перед вашим кодом добавить проверочное:

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

say("Метод запустился_".time());
И вообще, неплохо бы понять, какое оборудование запускает у вас этот метод.

Re: Постоянное проговаривание свойства.

Добавлено: Чт фев 27, 2020 7:45 pm
Denis_k
Chainik писал(а):
Чт фев 27, 2020 7:37 pm
И вообще, неплохо бы понять, какое оборудование запускает у вас этот метод.
датчик xiaomi из модуля zigbee2mqtt

Re: Постоянное проговаривание свойства.

Добавлено: Чт фев 27, 2020 7:57 pm
Chainik
Может быть у вас дребезг контактов геркона. Можете действительно, как предлагает ув.xor, "подавить" этот повтор установкой задержки:

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

$open=gg("OpenClose01.status");
if ($open==1) 
{say ("Входная дверь закрыта",2);
}
else 
{setTimeOut('myTimer_99','say("Входная дверь открыта",5);',2);
}

Re: Постоянное проговаривание свойства.

Добавлено: Чт фев 27, 2020 8:33 pm
xor
Chainik писал(а):Для начала надо убедиться, что этот метод не запускается дважды (скорее всего, запускается).
Для этого можно перед вашим кодом добавить проверочное:

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

say("Метод запустился_".time());
И вообще, неплохо бы понять, какое оборудование запускает у вас этот метод.
Мои датчики все сигналы дублируют, но самое правильное решение, кмк, проверка в связанном методе
If($params['NEW_VALUE']<>$params['OLD_VALUE']){//тут код}

Отправлено с моего Redmi 4X через Tapatalk

Re: Постоянное проговаривание свойства.

Добавлено: Чт фев 27, 2020 10:52 pm
xor
писал по памяти, а её нету(

$params['NEW_VALUE'] , $params['OLD_VALUE']