Проблема с умной розеткой (двойное срабатывание метода)

Использование системы в различных ситуациях, вопросы программирования сценариев.

Модератор: immortal

Ответить
dmnbi4
Сообщения: 9
Зарегистрирован: Ср мар 07, 2018 1:10 pm
Благодарил (а): 1 раз
Поблагодарили: 0

Проблема с умной розеткой (двойное срабатывание метода)

Сообщение dmnbi4 » Чт мар 22, 2018 11:10 am

Добрый день!

Система MJD установлена с образа Сергея с полследними обновлениями. на Raspberry Pi.
Настроил в своей системе умную розетку Xiaomi. Через модуль XiaomiHome и простые устройства.
Вывел её на главную сцену и настроил простенький метод который срабатывает при изменении статуса:

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

$current_state = getGlobal('XiRelay04.status');
$date = date("Y-m-d H:i:s");// 2001-03-10 17:16:18
if ($current_state == 0) {
        say("Розетка выключена $date.", 2);
 } 
else {
        say("Розетка включена $date.", 2);
} 
Если выключить или включить розетку с кнопки на устройстве то приходит одно сообщение о смене статуса.
Но при срабатывание этого метода при вызове со сцены происходит двойное срабатывание. И сообщения о включении или выключении задваиваются.
Пробывал переопределять метод statusupdated но всё тоже-самое. Я так понимаю что вызывается метод обновления состояния дважды.
Вложения
Снимок экрана 2018-03-22 в 11.05.39.png
Сцена с которой происходит вызов
Снимок экрана 2018-03-22 в 11.05.39.png (2.23 МБ) 5072 просмотра
Снимок экрана 2018-03-22 в 11.03.05.png
История (Чат с Алисой)
Снимок экрана 2018-03-22 в 11.03.05.png (63.38 КБ) 5072 просмотра
dmnbi4
Сообщения: 9
Зарегистрирован: Ср мар 07, 2018 1:10 pm
Благодарил (а): 1 раз
Поблагодарили: 0

Re: Проблема с умной розеткой (двойное срабатывание метода)

Сообщение dmnbi4 » Чт мар 22, 2018 3:51 pm

Уточняющая информация:
Вложения
Снимок экрана 2018-03-22 в 15.24.16.png
Снимок экрана 2018-03-22 в 15.24.16.png (138.92 КБ) 5046 просмотров
Снимок экрана 2018-03-22 в 15.22.44.png
Снимок экрана 2018-03-22 в 15.22.44.png (177.37 КБ) 5046 просмотров
Снимок экрана 2018-03-22 в 15.23.34.png
Снимок экрана 2018-03-22 в 15.23.34.png (163.65 КБ) 5046 просмотров
Снимок экрана 2018-03-22 в 15.33.37.png
Снимок экрана 2018-03-22 в 15.33.37.png (44.19 КБ) 5046 просмотров
Снимок экрана 2018-03-22 в 15.36.40.png
Снимок экрана 2018-03-22 в 15.36.40.png (80.13 КБ) 5046 просмотров
fandaymon
Сообщения: 1555
Зарегистрирован: Сб янв 13, 2018 5:00 pm
Благодарил (а): 39 раз
Поблагодарили: 574 раза

Re: Проблема с умной розеткой (двойное срабатывание метода)

Сообщение fandaymon » Чт мар 22, 2018 4:04 pm

Это абсолютно нормальная работа - Нажали на иконку - вызвался метод - изменился статус - сработал метод изменения статуса - модуль отправил пакет розетке - розетка переключилась - отправила информацию об изменении статуса - статуса ещё раз проапдейтался - сработал метод.
Не очень понятно зачем говорить что розетка сработала, но если очень надо, то проверяйте старое значение статуса - если оно поменялось - выводите сообщение, если нет - не выводите
Logrus
Сообщения: 2088
Зарегистрирован: Пт апр 07, 2017 12:20 pm
Благодарил (а): 313 раз
Поблагодарили: 459 раз

Re: Проблема с умной розеткой (двойное срабатывание метода)

Сообщение Logrus » Чт мар 22, 2018 4:56 pm

вот нормально и подробно оформлено и сразу ответ )))
viewtopic.php?f=6&t=4122&start=90#p67429
Telegram | Блог
Raspberry Pi3, с образа от Сергея 3.31, PHP 7, флешка 16 Гб работает с 10.09.2017
Почти всё время уходит на исправление ошибок, оставшееся - на их повторение. (с) ))) Спасибо
Dicont
Сообщения: 112
Зарегистрирован: Вс дек 17, 2017 11:24 pm
Благодарил (а): 34 раза
Поблагодарили: 11 раз

Re: Проблема с умной розеткой (двойное срабатывание метода)

Сообщение Dicont » Пт мар 23, 2018 4:55 pm

Помогает просто поставить задержку, допустим выключил розетку
проверка состояния
if (gg("Relay08.status")!="0"){
say ("Розетка выключена",2);
sg ("Relay08.status",0);
sleep (5);
//для обновления значений
sg ("Relay08.status",0);
}
Но это наверно не совсем правильно
dmnbi4
Сообщения: 9
Зарегистрирован: Ср мар 07, 2018 1:10 pm
Благодарил (а): 1 раз
Поблагодарили: 0

Re: Проблема с умной розеткой (двойное срабатывание метода)

Сообщение dmnbi4 » Пт мар 23, 2018 4:59 pm

Если я пишу такой код, то метод вообще не работает:

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

include(DIR_MODULES . 'telegram/telegram.class.php');
$telegram_module = new telegram();
$current_state = getGlobal('XiRelay04.status');
$date = date("Y-m-d H:i:s");// 2001-03-10 17:16:18
if ($params['NEW_VALUE']==$params['OLD_VALUE']) return;
if ($current_state == 0) {
        say("Розетка выключена $date.", 2);
        //$telegram_module->sendMessageToAll("Розетка выключена $date.");
} 
else {
        say("Розетка включена $date.", 2);
        //$telegram_module->sendMessageToAll("Розетка включена $date.");   
} 
dmnbi4
Сообщения: 9
Зарегистрирован: Ср мар 07, 2018 1:10 pm
Благодарил (а): 1 раз
Поблагодарили: 0

Re: Проблема с умной розеткой (двойное срабатывание метода)

Сообщение dmnbi4 » Пт мар 23, 2018 5:29 pm

Подскажите как правильно применить вот эту конструкцию:

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

if ($params['NEW_VALUE']==$params['OLD_VALUE']) return; 
fandaymon
Сообщения: 1555
Зарегистрирован: Сб янв 13, 2018 5:00 pm
Благодарил (а): 39 раз
Поблагодарили: 574 раза

Re: Проблема с умной розеткой (двойное срабатывание метода)

Сообщение fandaymon » Пт мар 23, 2018 6:54 pm

dmnbi4 писал(а):Подскажите как правильно применить вот эту конструкцию:

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

if ($params['NEW_VALUE']==$params['OLD_VALUE']) return; 
Надо её применять в том методе, который отрабатывает при изменении свойства status. И лучше её ставить первой.
И вместо этого $current_state = getGlobal('XiRelay04.status'); можно просто написать $current_state = $params['NEW_VALUE'];

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

if ($params['NEW_VALUE']==$params['OLD_VALUE']) return;
$current_state = $params['NEW_VALUE'];
$date = date("Y-m-d H:i:s");// 2001-03-10 17:16:18

include(DIR_MODULES . 'telegram/telegram.class.php');
$telegram_module = new telegram();

if ($current_state == 0) {
        say("Розетка выключена $date.", 2);
        //$telegram_module->sendMessageToAll("Розетка выключена $date.");
} 
else {
        say("Розетка включена $date.", 2);
        //$telegram_module->sendMessageToAll("Розетка включена $date.");   
} 
За это сообщение автора fandaymon поблагодарили (всего 2):
dmnbi4 (Сб мар 24, 2018 12:49 am) • dengi.76 (Вс апр 01, 2018 12:37 pm)
Рейтинг: 2.33%
dmnbi4
Сообщения: 9
Зарегистрирован: Ср мар 07, 2018 1:10 pm
Благодарил (а): 1 раз
Поблагодарили: 0

Re: Проблема с умной розеткой (двойное срабатывание метода)

Сообщение dmnbi4 » Сб мар 24, 2018 12:50 am

Эврика!!! Спасибло большое! Всё заработало! Добавил в метод statusupdated и всё пучком!
Ответить