Класс Sensors. Улучшенная обработка различных датчиков

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

Модератор: immortal

Ответить
Fav0rit
Сообщения: 60
Зарегистрирован: Чт мар 19, 2015 10:27 pm
Благодарил (а): 8 раз
Поблагодарили: 22 раза

Класс Sensors. Улучшенная обработка различных датчиков

Сообщение Fav0rit » Пт дек 09, 2016 12:51 am

Приветствую всех.
Буквально на днях задумывался о существенной модификации существующих решений классов tempSensors и humSensors, плюс, часто возникает необходимость хранить историю значений с разной дискретностью, например месячную с дискретностью 20 минут, а суточную с разрешением в минуту. Иногда приходится фильтровать получаемые значения с датчиков для фильтрации некорректных показаний, резких изменений.
Для реализации всего этого написал новый класс Sensors, плюс там же реализовал возможность задать пороговые значения для датчиков и время после которого выход за пределы будет обработан методом, то есть легко реализовать сценарий вроде "если температура батареи ниже 20 градусов в течение 15 минут - отправить оповещение"
Постарался наиболее подробно описать значение свойств, чтобы было понятно обычным пользователям. В классе есть метод ReadMe с небольшим описанием.
Привязка датчика осуществляется к свойству input.

Для корректной работы необходимо в цикл onNewMinute поместить код:

$objects=getObjectsByClass("Sensors");
foreach($objects as $obj) {
callMethod($obj['TITLE'].".Periodic");
}


Это необходимо для корректной обработки заполнения данных с разным разрешением, определения свойства alive и подсчета на протяжении какого времени значение за пределами нормального.

Буду рад советам по доработке или доработанным вариантам.
Если заметите ошибки - пишите сюда, буду обновлять файл в шапке.
Вложения
Sensors.txt
(18.32 КБ) 777 скачиваний
Последний раз редактировалось Fav0rit Пн янв 09, 2017 11:03 am, всего редактировалось 1 раз.
За это сообщение автора Fav0rit поблагодарили (всего 9):
Amarok (Пт дек 09, 2016 7:13 am) • Victor_S (Пт дек 09, 2016 10:16 am) • gorobey (Вт дек 13, 2016 10:21 pm) • Molostov (Ср дек 21, 2016 12:21 am) • MihaNN52 (Ср дек 21, 2016 7:55 pm) • I_I_Imonder (Вт янв 17, 2017 2:38 pm) • Genplane (Чт янв 19, 2017 11:44 am) • Logrus (Вт фев 06, 2018 1:27 am) • ypiter2006 (Вс фев 11, 2018 1:07 pm)
Рейтинг: 10.47%
Molostov
Сообщения: 50
Зарегистрирован: Пт янв 17, 2014 1:47 am
Откуда: Карпинск, Свердловская область
Благодарил (а): 135 раз
Поблагодарили: 12 раз

Re: Класс Sensors. Улучшенная обработка различных датчиков

Сообщение Molostov » Ср дек 21, 2016 12:21 am

Спасибо, полезный класс. Попробую и отпишусь.
Fav0rit
Сообщения: 60
Зарегистрирован: Чт мар 19, 2015 10:27 pm
Благодарил (а): 8 раз
Поблагодарили: 22 раза

Re: Класс Sensors. Улучшенная обработка различных датчиков

Сообщение Fav0rit » Пн дек 26, 2016 9:47 pm

Molostov писал(а):Спасибо, полезный класс. Попробую и отпишусь.
Обратная связь была бы очень полезна, потому что многие, судя по всему посмотрели, но ничего не написали, либо не к чему придраться, либо сочли бесполезной штукой...
eygen
Сообщения: 393
Зарегистрирован: Чт сен 25, 2014 5:37 pm
Откуда: Екатеринбург
Благодарил (а): 25 раз
Поблагодарили: 52 раза

Re: Класс Sensors. Улучшенная обработка различных датчиков

Сообщение eygen » Вт дек 27, 2016 8:35 pm

Fav0rit писал(а):
Molostov писал(а):Спасибо, полезный класс. Попробую и отпишусь.
Обратная связь была бы очень полезна, потому что многие, судя по всему посмотрели, но ничего не написали, либо не к чему придраться, либо сочли бесполезной штукой...
А можно небольшую инструкцию? Сейчас стоит примерно такая же задача, вот думаю свое колдовать или ваше впишется как нельзя лучше.
Fav0rit
Сообщения: 60
Зарегистрирован: Чт мар 19, 2015 10:27 pm
Благодарил (а): 8 раз
Поблагодарили: 22 раза

Re: Класс Sensors. Улучшенная обработка различных датчиков

Сообщение Fav0rit » Пт дек 30, 2016 9:20 pm

eygen писал(а):
Fav0rit писал(а):
Molostov писал(а):Спасибо, полезный класс. Попробую и отпишусь.
Обратная связь была бы очень полезна, потому что многие, судя по всему посмотрели, но ничего не написали, либо не к чему придраться, либо сочли бесполезной штукой...
А можно небольшую инструкцию? Сейчас стоит примерно такая же задача, вот думаю свое колдовать или ваше впишется как нельзя лучше.
Там все просто и в методе к свойствам даны очень подробные комментарии, плюс есть метод ReadMe в котором тоже даны некоторые пояснения. Если в двух словах, то импортируем класс, создаем нужный объект, например датчик температуры.
В метод onNewMinute добавляем следующий код:

$objects=getObjectsByClass("Sensors");
foreach($objects as $obj) {
callMethod($obj['TITLE'].".Periodic");
}

Это для корректного заполнения некоторых свойств и обработки встроенных временных интервалов(счетчиков)
От физического датчика входящие свойства привязываем в свойство input и после этого автоматически заполняются дочерние val1m val5m и.т.д. для регулярной записи в историю, то есть можно делать датчики с частым опросом, но записывать показания выборочно.
Для оповещений используем поля minTreshold, maxTreshold (задание предельных величин) и tresholdTime предельное время. Когда значение пересечет min или max и пробудет там время tresholdTime, сработает метод maxTresholdAlert или minTresholdAlert в зависимости от того в какую сторону ушло значение.
За это сообщение автора Fav0rit поблагодарил:
eygen (Вт янв 03, 2017 9:53 pm)
Рейтинг: 1.16%
eygen
Сообщения: 393
Зарегистрирован: Чт сен 25, 2014 5:37 pm
Откуда: Екатеринбург
Благодарил (а): 25 раз
Поблагодарили: 52 раза

Re: Класс Sensors. Улучшенная обработка различных датчиков

Сообщение eygen » Вт янв 03, 2017 9:55 pm

Fav0rit писал(а):
Там все просто и в методе к свойствам даны очень подробные комментарии, плюс есть метод ReadMe в котором тоже даны некоторые пояснения. Если в двух словах, то импортируем класс, создаем нужный объект, например датчик температуры.
В метод onNewMinute добавляем следующий код:

$objects=getObjectsByClass("Sensors");
foreach($objects as $obj) {
callMethod($obj['TITLE'].".Periodic");
}

Это для корректного заполнения некоторых свойств и обработки встроенных временных интервалов(счетчиков)
От физического датчика входящие свойства привязываем в свойство input и после этого автоматически заполняются дочерние val1m val5m и.т.д. для регулярной записи в историю, то есть можно делать датчики с частым опросом, но записывать показания выборочно.
Для оповещений используем поля minTreshold, maxTreshold (задание предельных величин) и tresholdTime предельное время. Когда значение пересечет min или max и пробудет там время tresholdTime, сработает метод maxTresholdAlert или minTresholdAlert в зависимости от того в какую сторону ушло значение.

Замечательно, как раз то что мне и надо. У себя в mdm не нашел метод ReadMe, может не там искал? :(
tsember
Сообщения: 52
Зарегистрирован: Ср фев 04, 2015 12:28 am
Благодарил (а): 54 раза
Поблагодарили: 6 раз

Re: Класс Sensors. Улучшенная обработка различных датчиков

Сообщение tsember » Чт янв 05, 2017 2:40 am

Не стал новую тему создавать, Ваша - максимально приближена к тому, что я хочу описать:

Если добавить данный код в метод systemStates объекта System класса systemStates, то алиса будет проверять ВСЕ датчики класса Sensors на свойство alive. Если какой то датчик очень редко отвечает, рекомендую поднять таймаут, по истечении которого свойство alive переходит в ноль.
СпойлерПоказать

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

// Проверка всех сенсоров системы на alive
$sensors=array();
$objects = getObjectsByClass("Sensors");
foreach($objects as $object)
{
$obj_title = $object['TITLE'];
$obj_id = $object['ID'];
$obj=getObject($obj_title); 
$sensors[$obj_title] = $obj_title;
}

foreach($sensors as $k=>$v) {
 if (!gg($k.'.alive')) {
  $yellow_state=1;
  $details[]="Сенсор ".$v."  не обновляется";
 }
} 
Fav0rit
Сообщения: 60
Зарегистрирован: Чт мар 19, 2015 10:27 pm
Благодарил (а): 8 раз
Поблагодарили: 22 раза

Re: Класс Sensors. Улучшенная обработка различных датчиков

Сообщение Fav0rit » Пн янв 09, 2017 11:01 am

tsember писал(а):Не стал новую тему создавать, Ваша - максимально приближена к тому, что я хочу описать:

Если добавить данный код в метод systemStates объекта System класса systemStates, то алиса будет проверять ВСЕ датчики класса Sensors на свойство alive. Если какой то датчик очень редко отвечает, рекомендую поднять таймаут, по истечении которого свойство alive переходит в ноль.
СпойлерПоказать

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

// Проверка всех сенсоров системы на alive
$sensors=array();
$objects = getObjectsByClass("Sensors");
foreach($objects as $object)
{
$obj_title = $object['TITLE'];
$obj_id = $object['ID'];
$obj=getObject($obj_title); 
$sensors[$obj_title] = $obj_title;
}

foreach($sensors as $k=>$v) {
 if (!gg($k.'.alive')) {
  $yellow_state=1;
  $details[]="Сенсор ".$v."  не обновляется";
 }
}

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

eygen, метод ReadMe находится в классе Sensors, войдите в редактирование методов класса и увидите...

Обновил класс в шапке, есть мелкие правки, раньше некорректно работал возврат к норме, если было задано только одно пороговое значение, сейчас вроде все ОК...
Ответить