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

голосовое оповещение про открытую дверь

Добавлено: Вс мар 19, 2017 10:52 pm
yurat2008
Помогите разобраться , а то запутался совсем

Задача следующая: есть esp8266 с прошивкой wifi-iot. Majordomo крутится на raspberry pi3. Пытаюсь используя activesend по wifi используя mqtt контролировать входную дверь. При открытии и закрытии одноразово Алиса должна проговорить что двери открыты или закрыты.
Сразу говорю (статья Подключаем датчик открытия въездных ворот) не подходит. Делал все по примеру . С использованием mqtt Получается циклическая ссылка.

Сделал следующим образом

Создал класс SMK
Свойства
SMK>status, SMK>statusText, SMK>updatedTimestamp

Методы

refresh

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

$status=$this->getProperty("status");
if ($status) {
 $this->callMethod('turnOn');
} else {
 $this->callMethod('turnOff');
}
statusСhanged

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

Он  пустой
turnOff

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

$this->setProperty("status",0);
$this->setProperty("statusText","открыто");
$this->setProperty("updatedTimestamp",time());
turnOn

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

$this->setProperty("status",1);
$this->setProperty("statusText","закрыто");
$this->setProperty("updatedTimestamp",time());
Создал обьект

smk>zzz

До этого момента все ок, все работает
СпойлерПоказать
005.jpg
005.jpg (26.04 КБ) 8379 просмотров
А вот дальше есть ньансы. Переделал код с форума под себя. Если запускать вручную он работает

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

if (gg("zzz.status")=="1") {
 ClearTimeOut("reminderGarageTimer");
 say("Входная дверь закрыта.",5);
} else {
 SetTimeOut("reminderGarageTimer","runScript('reminderGarage');", 15*60);
 say("Внимание! Открывается входная дверь.",5);
} 

А если вписывать в statusСhanged или turnOn (*turnOff *) получается многократный повтор.
006.jpg
006.jpg (34.08 КБ) 8379 просмотров
Вообщем помогите разобраться куда код пристроить чтобы работало

Re: голосовое оповещение про открытую дверь

Добавлено: Пн мар 20, 2017 1:16 am
DimSun75
Что за скрипт reminderGarage

Отправлено с моего SM-A520F через Tapatalk

Re: голосовое оповещение про открытую дверь

Добавлено: Пн мар 20, 2017 6:42 am
nick7zmail
У вас скорее всего метод со свойством связаны...и каждый раз когда MQTT передаёт статус - отрабатывает метод...попробуйте через дополнительное свойство....например status2, которое будет записываться только в случае, если значение из mqtt отличается от предыдущего...и с ним уже связывайте методы...должно быть всё ок....

Ну либо ещё вариант сделать обработку в методе используя $params['OLD_VALUE']; $params['NEW_VALUE'];...или как там они называются...

Re: голосовое оповещение про открытую дверь

Добавлено: Пн мар 20, 2017 10:42 am
yurat2008
DimSun75 писал(а):Что за скрипт reminderGarage

Отправлено с моего SM-A520F через Tapatalk
Напоминалка через 15 минут

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

say('Напоминаю, что открыта входная дверь',5);
SetTimeOut("reminderGarageTimer","runScript('reminderGarage');", 15*60); 

Re: голосовое оповещение про открытую дверь

Добавлено: Пн мар 20, 2017 10:45 am
DimSun75
Ну я так и подумал. А что мешает добавить запуск таймера и оповещение в методы turnOn и turnOff?

Отправлено с моего SM-A520F через Tapatalk

Re: голосовое оповещение про открытую дверь

Добавлено: Пн мар 20, 2017 10:48 am
yurat2008
nick7zmail писал(а):У вас скорее всего метод со свойством связаны...и каждый раз когда MQTT передаёт статус - отрабатывает метод...
Так и есть заходит в цикл при опросе в 5 сек через mqtt
nick7zmail писал(а): попробуйте через дополнительное свойство....например status2, которое будет записываться только в случае, если значение из mqtt отличается от предыдущего...и с ним уже связывайте методы...должно быть всё ок....

Ну либо ещё вариант сделать обработку в методе используя $params['OLD_VALUE']; $params['NEW_VALUE'];...или как там они называются...
Если есть под рукой ссылка - ткните носом в пример, а то пока ничего внятного не могу нагуглить

Re: голосовое оповещение про открытую дверь

Добавлено: Пн мар 20, 2017 11:06 am
nick7zmail
Ссылки нет, просто заключаете ваш код целиком в условие

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

if($params['NEW_VALUE']!=$params['OLD_VALUE']) {
//тут ваш код
} 
Тогда должно срабатывать только при изменении состояния.

UPD: Ссылка оказывается есть)) http://majordomo.smartliving.ru/Hints/Onchangemethod поиском нашел.

Re: голосовое оповещение про открытую дверь

Добавлено: Пн мар 20, 2017 11:17 am
DimSun75
Зачем усложнять? Просто в метод turnOn добавляем запуск таймера и say ("Открываю дверь"), а в метод turnOff убиваем таймер и say закрываем.

Отправлено с моего SM-A520F через Tapatalk

Re: голосовое оповещение про открытую дверь

Добавлено: Пн мар 20, 2017 11:21 am
yurat2008
Скажите или это работоспособно (нет сейчас возможности проверить)

метод refresh

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

$params['oldstatus'] =$this->getProperty('oldstatus');
$oldstatus=$this->getProperty("oldstatus");
$status=$this->getProperty("status");

if ($status)==("oldstatus") {
 break;
} else {
 if ($status) {
 $this->callMethod('turnOn');
} else {
 $this->callMethod('turnOff');
}
}
 
turnOff

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

$status=$this->getProperty("status");
$this->setProperty("oldstatus","status");
$this->setProperty("statusText","открыто");
$this->setProperty("updatedTimestamp",time());
 SetTimeOut("reminderGarageTimer","runScript('reminderGarage');", 15*60);
 say("Внимание! Открывается входная дверь.",5); 
turnOn

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

$status=$this->getProperty("status");
$this->setProperty("oldstatus","status");
$this->setProperty("statusText","закрыто");
$this->setProperty("updatedTimestamp",time());
 ClearTimeOut("reminderGarageTimer");
 say("Входная дверь закрыта.",5); 

Re: голосовое оповещение про открытую дверь

Добавлено: Пн мар 20, 2017 11:22 am
nick7zmail
DimSun75 писал(а):Зачем усложнять? Просто в метод turnOn добавляем запуск таймера и say ("Открываю дверь"), а в метод turnOff убиваем таймер и say закрываем.

Отправлено с моего SM-A520F через Tapatalk
А кто эти методы в таком случае вызывать будет?) метод, на сколько я понял, вызывается statuschanged...2 метода к 1 свойству не привязать...turnon и turnoff вроде вообще в этой схеме не используются.