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

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

Добавлено: Сб июн 03, 2017 2:27 pm
Gelezako
Всем привет, у меня возникла следующия проблема. Есть датчик качества воздуха, данные по MQTT передаются в МД, в методе onNewMinute делается проверка, если значение с датчика превысило определённое число, то выдаётся голосовое оповещение. Но как правило даже если начать проветривать помещение, то уровень не падает сразу и получается что голосовое сообщение я слышу ещё несколько раз. В качестве решения я думаю создать счётчик, после превышения порога делать инкремент и после повторного срабатывания проверять значение счётчика, если 0, то проговаривать, если 1, то ждать к примеру 5 мин и по истечении времени если всё норм, то сбрасывать счётчик снова в ноль. Но я вот думаючто что наверно есть более лучшее решение, сто процентов кто-то уже сталкивался с такой задачей. Может я неверно делаю оповещение, может использовать другой подход? Буду рад любым идеям, кроме как использовать метод onNewHour, во-первых проверять раз в час это слишком долго, а во-вторых он у меня почему-то не работает.

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

Добавлено: Сб июн 03, 2017 11:06 pm
xor
А вы не смотрели в сторону использования механизма ивентов:

registerEvent($eventName, $details='',$expire_in=365); -- регистрация события $eventName
registeredEventTime($eventName); -- возвращает время последней регистрации события $eventName (-1 если еще не было такого события)?

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

Добавлено: Вс июн 04, 2017 1:01 am
Gelezako
я не знаю как работают события, можно более развёрнуто рассказать про них? Честно говоря из вышеприведённого примера я не понял сути где и как их использовать.

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

Добавлено: Вс июн 04, 2017 3:49 pm
xor
Это не пример, это выдернуто из описания.
Для меня ивенты в мжд - это глобальные переменные с временем создания, заданной длительностью и деталями.
Напр, при ухудшении качества воздуха создается ивент
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;
}

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

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

Что я сделал? Я взял из вашего примера строку "registerEvent("нечем дышать", $details='в сортире',$expire_in=1/24);" и выполнил её. Но я не пойму где мне искать эти события, куда они добавляются, на какой вкладке смотреть?

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

Добавлено: Пн июн 05, 2017 3:39 pm
xor
xray вкладка events))
А еще можно посмотреть функции работы с историей. Типа, за последний час/полчаса/n минут среднее значение не улучшилось, опять покричать.

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

Добавлено: Вт июн 06, 2017 12:49 am
xor
вот что-то похожее на ваш случай у себя раскопал.
За ивенты простити))
Всё на функциях истории сделано
Определяется начало/конец дождя и сообщается не чаще раза в полчаса:

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

$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);  
  }
   
}

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

Добавлено: Вт июн 06, 2017 12:54 am
Gelezako
начал реализовывать на ивентах и понял что с ними чуть сложнее даже получается чем и правда иметь переменную с нулём и еденицей. Но всё равно спасибо, буду знать, уверен они пригодятся для других проектов.

ЗЫ: а откуда вы брали значение "ws.rainfallRate" ? Своя метеостанция с датчиком или какой-то паблик сервис?

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

Добавлено: Вт июн 06, 2017 1:15 am
xor
Своя https://ru.aliexpress.com/item/Pro-Wire ... 0.0.I858we
Причем внешний блок мог не брать - ловит две соседские)

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

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

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