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

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

Модератор: immortal

madbob
Сообщения: 19
Зарегистрирован: Пт ноя 25, 2016 11:50 am
Откуда: Москва
Благодарил (а): 9 раз
Поблагодарили: 3 раза

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

Сообщение madbob » Сб фев 01, 2020 5:26 pm

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

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

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

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

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

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

Сообщение skysilver » Чт фев 27, 2020 12:56 pm

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

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

Сообщение Chainik » Чт фев 27, 2020 5:10 pm

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);
}
За это сообщение автора Chainik поблагодарил:
madbob (Чт фев 27, 2020 7:42 pm)
Рейтинг: 1.25%
Denis_k
Сообщения: 532
Зарегистрирован: Сб мар 19, 2016 7:24 pm
Благодарил (а): 273 раза
Поблагодарили: 24 раза

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

Сообщение Denis_k » Чт фев 27, 2020 7:24 pm

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

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

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

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

Сообщение xor » Чт фев 27, 2020 7:36 pm

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

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

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

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

За это сообщение автора xor поблагодарил:
Denis_k (Чт фев 27, 2020 7:43 pm)
Рейтинг: 1.25%
Chainik
Сообщения: 1068
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 130 раз
Поблагодарили: 325 раз

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

Сообщение Chainik » Чт фев 27, 2020 7:37 pm

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

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

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

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

Сообщение Denis_k » Чт фев 27, 2020 7:45 pm

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

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

Сообщение Chainik » Чт фев 27, 2020 7:57 pm

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

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

$open=gg("OpenClose01.status");
if ($open==1) 
{say ("Входная дверь закрыта",2);
}
else 
{setTimeOut('myTimer_99','say("Входная дверь открыта",5);',2);
}
За это сообщение автора Chainik поблагодарил:
Denis_k (Чт фев 27, 2020 9:42 pm)
Рейтинг: 1.25%
Аватара пользователя
xor
Сообщения: 1468
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 131 раз
Поблагодарили: 406 раз

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

Сообщение xor » Чт фев 27, 2020 8:33 pm

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

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

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

Отправлено с моего Redmi 4X через Tapatalk
За это сообщение автора xor поблагодарил:
Denis_k (Чт фев 27, 2020 9:43 pm)
Рейтинг: 1.25%
Аватара пользователя
xor
Сообщения: 1468
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 131 раз
Поблагодарили: 406 раз

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

Сообщение xor » Чт фев 27, 2020 10:52 pm

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

$params['NEW_VALUE'] , $params['OLD_VALUE']
За это сообщение автора xor поблагодарил:
Denis_k (Пт фев 28, 2020 2:19 pm)
Рейтинг: 1.25%
Ответить