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

Если вы только начинаете осваивать систему MajorDoMo и чего-то не знаете или не можете понять, то задавайте свои вопросы в этой ветке.

Модератор: immortal

madbob
Сообщения: 24
Зарегистрирован: Пт ноя 25, 2016 11:50 am
Откуда: Москва

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

Сообщение madbob »

Подскажите пожалуйста! Нужен код метода statusUpdated
Чтобы пока status=1 Алиса постоянно проговаривала сообщение. Если

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

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

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

while (gg('Relay19.status') == 1)
{
 say("пожар в гараже",5);
}
То не перестает проговаривать даже при изменении статуса в 0.
Как остановить выполнение этого метода, когда болтает без остановки? Я смог только перезагрузкой , существуют же менее радикальные способы?
В железе сделано с помощью ESP, на которой висит датчик качества воздуха. Простое устройство, в которое шлются значения этого датчика. При превышении уставки условное управление другим ПУ типа реле «включить», при снижении «выключить».
Raspberry Pi 3 образ 3.31+GUI ESP12(IoT)кучка+ESP32
skysilver
Сообщения: 3006
Зарегистрирован: Чт авг 21, 2014 8:28 am
Откуда: Киров, Россия
Контактная информация:

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

Сообщение skysilver »

Через таймеры нужно такие вещи делать. setTimeOut в Базе знаний.
MajorDoMo (GitHub) на Cubietruck. ОС Debian 7 (wheezy) (kernel 3.4.105) с переносом на HDD.
Мой CONNECT | Блоги | Telegram
Chainik
Сообщения: 1465
Зарегистрирован: Вс янв 10, 2016 11:05 am

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

Сообщение 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);
}
Denis_k
Сообщения: 587
Зарегистрирован: Сб мар 19, 2016 7:24 pm

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

Сообщение Denis_k »

чтобы не плодить тем:
добавляю в методе statusUpdated объекта OpenClose01 следующие строки:

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

$open=gg("OpenClose01.status");
if ($open==1) 
{say ("Входная дверь закрыта",2);
}
else 
{say ("Входная дверь открыта",2);
}
и получаю в чате "Входная дверь открыта" дважды, сообщение про закрытие приходит в единственно числе
MD на raspberry pi3
Аватара пользователя
xor
Сообщения: 2044
Зарегистрирован: Сб ноя 22, 2014 8:45 pm

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

Сообщение xor »

Denis_k писал(а):чтобы не плодить тем:
добавляю в методе statusUpdated объекта OpenClose01 следующие строки:

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

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

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

Chainik
Сообщения: 1465
Зарегистрирован: Вс янв 10, 2016 11:05 am

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

Сообщение Chainik »

Для начала надо убедиться, что этот метод не запускается дважды (скорее всего, запускается).
Для этого можно перед вашим кодом добавить проверочное:

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

say("Метод запустился_".time());
И вообще, неплохо бы понять, какое оборудование запускает у вас этот метод.
Denis_k
Сообщения: 587
Зарегистрирован: Сб мар 19, 2016 7:24 pm

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

Сообщение Denis_k »

Chainik писал(а): Чт фев 27, 2020 7:37 pm И вообще, неплохо бы понять, какое оборудование запускает у вас этот метод.
датчик xiaomi из модуля zigbee2mqtt
MD на raspberry pi3
Chainik
Сообщения: 1465
Зарегистрирован: Вс янв 10, 2016 11:05 am

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

Сообщение Chainik »

Может быть у вас дребезг контактов геркона. Можете действительно, как предлагает ув.xor, "подавить" этот повтор установкой задержки:

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

$open=gg("OpenClose01.status");
if ($open==1) 
{say ("Входная дверь закрыта",2);
}
else 
{setTimeOut('myTimer_99','say("Входная дверь открыта",5);',2);
}
Аватара пользователя
xor
Сообщения: 2044
Зарегистрирован: Сб ноя 22, 2014 8:45 pm

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

Сообщение xor »

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

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

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

Отправлено с моего Redmi 4X через Tapatalk
Аватара пользователя
xor
Сообщения: 2044
Зарегистрирован: Сб ноя 22, 2014 8:45 pm

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

Сообщение xor »

писал по памяти, а её нету(

$params['NEW_VALUE'] , $params['OLD_VALUE']
Ответить