Проверка на двойное срабатывание в onNewMinute

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

Модератор: immortal

Аватара пользователя
Gelezako
Сообщения: 963
Зарегистрирован: Чт июн 02, 2016 9:33 pm
Благодарил (а): 205 раз
Поблагодарили: 106 раз
Контактная информация:

Проверка на двойное срабатывание в onNewMinute

Сообщение Gelezako » Сб июн 03, 2017 2:27 pm

Всем привет, у меня возникла следующия проблема. Есть датчик качества воздуха, данные по MQTT передаются в МД, в методе onNewMinute делается проверка, если значение с датчика превысило определённое число, то выдаётся голосовое оповещение. Но как правило даже если начать проветривать помещение, то уровень не падает сразу и получается что голосовое сообщение я слышу ещё несколько раз. В качестве решения я думаю создать счётчик, после превышения порога делать инкремент и после повторного срабатывания проверять значение счётчика, если 0, то проговаривать, если 1, то ждать к примеру 5 мин и по истечении времени если всё норм, то сбрасывать счётчик снова в ноль. Но я вот думаючто что наверно есть более лучшее решение, сто процентов кто-то уже сталкивался с такой задачей. Может я неверно делаю оповещение, может использовать другой подход? Буду рад любым идеям, кроме как использовать метод onNewHour, во-первых проверять раз в час это слишком долго, а во-вторых он у меня почему-то не работает.
фанат Мажордомо
тематический блог http://blog.gelezako.com
плейлист про Мажордомо на ютубе https://www.youtube.com/playlist?list=P ... EdBGtX084E
Аватара пользователя
xor
Сообщения: 2045
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 289 раз
Поблагодарили: 633 раза

Re: Проверка на двойное срабатывание в onNewMinute

Сообщение xor » Сб июн 03, 2017 11:06 pm

А вы не смотрели в сторону использования механизма ивентов:

registerEvent($eventName, $details='',$expire_in=365); -- регистрация события $eventName
registeredEventTime($eventName); -- возвращает время последней регистрации события $eventName (-1 если еще не было такого события)?
За это сообщение автора xor поблагодарил:
Gelezako (Пн июн 05, 2017 5:49 pm)
Рейтинг: 1.16%
Аватара пользователя
Gelezako
Сообщения: 963
Зарегистрирован: Чт июн 02, 2016 9:33 pm
Благодарил (а): 205 раз
Поблагодарили: 106 раз
Контактная информация:

Re: Проверка на двойное срабатывание в onNewMinute

Сообщение Gelezako » Вс июн 04, 2017 1:01 am

я не знаю как работают события, можно более развёрнуто рассказать про них? Честно говоря из вышеприведённого примера я не понял сути где и как их использовать.
Последний раз редактировалось Gelezako Пн июн 05, 2017 6:02 pm, всего редактировалось 1 раз.
фанат Мажордомо
тематический блог http://blog.gelezako.com
плейлист про Мажордомо на ютубе https://www.youtube.com/playlist?list=P ... EdBGtX084E
Аватара пользователя
xor
Сообщения: 2045
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 289 раз
Поблагодарили: 633 раза

Re: Проверка на двойное срабатывание в onNewMinute

Сообщение xor » Вс июн 04, 2017 3:49 pm

Это не пример, это выдернуто из описания.
Для меня ивенты в мжд - это глобальные переменные с временем создания, заданной длительностью и деталями.
Напр, при ухудшении качества воздуха создается ивент
registerEvent("нечем дышать", $details='в сортире',$expire_in=1/24);
в системе появится ивент нечем дышать, можно узнать где(см. ниже registeredEventDetails) и во сколько (registeredEventTime("нечем дышать"))
+ несколько функций по работе с ивентами:

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


function registeredEventExpire($eventName){
 $even=SQLSelectOne("SELECT UNIX_TIMESTAMP(EXPIRE) t FROM events WHERE EVENT_NAME='".$eventName."'"); 
 if (is_array ($even )) {
  return $even['t'];
 } else {
  return false;
 }
}
// Получить детали события по его имени
function registeredEventDetails($eventName) {
 $even=SQLSelectOne("SELECT * FROM events WHERE EVENT_NAME='".$eventName."'"); 
 if (is_array ($even )) {
  return $even['DETAILS'];
 } else {
  return false;
 }
}
// Удалить событие по его имени
function registeredEventDelete($eventName) {
 $fn = SQLExec("DELETE FROM events WHERE EVENT_NAME='".$eventName."'"); 
 return $fn;
}
За это сообщение автора xor поблагодарил:
Gelezako (Пн июн 05, 2017 6:53 pm)
Рейтинг: 1.16%
Аватара пользователя
Gelezako
Сообщения: 963
Зарегистрирован: Чт июн 02, 2016 9:33 pm
Благодарил (а): 205 раз
Поблагодарили: 106 раз
Контактная информация:

Re: Проверка на двойное срабатывание в onNewMinute

Сообщение Gelezako » Пн июн 05, 2017 1:16 pm

спасибо за ваши примеры, но прошу ещё немного помочь разобраться, я прошерстил весь сайт на предмет ивеннотов и попытался сам разобраться, но всё что я нашёл это лишь упоминание что они есть но как с ними работать так и не нашёл.
http://majordomo.smartliving.ru/Main/Pr ... gFunctions
http://majordomo.smartliving.ru/Main/ScSecurityWireless

Что я сделал? Я взял из вашего примера строку "registerEvent("нечем дышать", $details='в сортире',$expire_in=1/24);" и выполнил её. Но я не пойму где мне искать эти события, куда они добавляются, на какой вкладке смотреть?
фанат Мажордомо
тематический блог http://blog.gelezako.com
плейлист про Мажордомо на ютубе https://www.youtube.com/playlist?list=P ... EdBGtX084E
Аватара пользователя
xor
Сообщения: 2045
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 289 раз
Поблагодарили: 633 раза

Re: Проверка на двойное срабатывание в onNewMinute

Сообщение xor » Пн июн 05, 2017 3:39 pm

xray вкладка events))
А еще можно посмотреть функции работы с историей. Типа, за последний час/полчаса/n минут среднее значение не улучшилось, опять покричать.
Вложения
2017-06-05_15-31-47.png
2017-06-05_15-31-47.png (7.52 КБ) 6707 просмотров
Аватара пользователя
xor
Сообщения: 2045
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 289 раз
Поблагодарили: 633 раза

Re: Проверка на двойное срабатывание в onNewMinute

Сообщение xor » Вт июн 06, 2017 12:49 am

вот что-то похожее на ваш случай у себя раскопал.
За ивенты простити))
Всё на функциях истории сделано
Определяется начало/конец дождя и сообщается не чаще раза в полчаса:

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

$rate=(float)gg("ws.rainfallRate");
$isr=gg("ws.isRain");
if ($rate>0) {
//-----------------------------------------
//оценим сам дождь
    $status='';
    if ($rate==0) { $status='Сухо';
    } elseif ($rate<0.31) { $status='Очень слабый дождь';
    } elseif ($rate<2.6)  { $status='Слабый дождь';
    } elseif ($rate<8.1)  { $status='Умеренный дождь';
    } elseif ($rate<16.1) { $status='Ливень';
    } elseif ($rate<50.1) { $status='Сильный ливень';
    } else { $status='Потоп!';
    }
   sg('ws.rainfallRateStatus',$status);

 //-----------------------------------------
 if ($isr==0 && gethistorymax("ws.isRain",strtotime("-30 minute"))<1) { //переход из 0 в 1
  say(getRandomLine("maybe").', сейчас за окном '.gg('ws.rainfallRateStatus'),1);
 }
 sg("ws.isRain",1); 
 
} else { //rainfallRate=0
 sg("ws.isRain",0);
 sg('ws.rainfallRateStatus','Сухо');
 sg('ws.rainfallStatus','Сухо');
 if ($isr==1&&getHistorymax("ws.isRain",strtotime("-30 minute"))>0) { //переход из 1 в 0
     //say(getRandomLine("maybe").", дождь закончился...",1);  
  }
   
}
За это сообщение автора xor поблагодарил:
Gelezako (Вт июн 06, 2017 12:52 am)
Рейтинг: 1.16%
Аватара пользователя
Gelezako
Сообщения: 963
Зарегистрирован: Чт июн 02, 2016 9:33 pm
Благодарил (а): 205 раз
Поблагодарили: 106 раз
Контактная информация:

Re: Проверка на двойное срабатывание в onNewMinute

Сообщение Gelezako » Вт июн 06, 2017 12:54 am

начал реализовывать на ивентах и понял что с ними чуть сложнее даже получается чем и правда иметь переменную с нулём и еденицей. Но всё равно спасибо, буду знать, уверен они пригодятся для других проектов.

ЗЫ: а откуда вы брали значение "ws.rainfallRate" ? Своя метеостанция с датчиком или какой-то паблик сервис?
фанат Мажордомо
тематический блог http://blog.gelezako.com
плейлист про Мажордомо на ютубе https://www.youtube.com/playlist?list=P ... EdBGtX084E
Аватара пользователя
xor
Сообщения: 2045
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 289 раз
Поблагодарили: 633 раза

Re: Проверка на двойное срабатывание в onNewMinute

Сообщение xor » Вт июн 06, 2017 1:15 am

Своя https://ru.aliexpress.com/item/Pro-Wire ... 0.0.I858we
Причем внешний блок мог не брать - ловит две соседские)
SolarW
Сообщения: 179
Зарегистрирован: Вс июл 31, 2016 11:24 pm
Благодарил (а): 35 раз
Поблагодарили: 24 раза

Re: Проверка на двойное срабатывание в onNewMinute

Сообщение SolarW » Вт июн 06, 2017 9:54 am

xor писал(а):Своя https://ru.aliexpress.com/item/Pro-Wire ... 0.0.I858we
Причем внешний блок мог не брать - ловит две соседские)
Ух ты, знакомая станция/продавец.
Прицениваюсь взять но есть вопросы как оно с сервером умного дома связывается.
У вас как реализовано?

P.S. С соседями у которых с такими же уличными блоками станции оказались - интересно получилось :-)
Ответить