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

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

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

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

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


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

Буду рад советам по доработке или доработанным вариантам.
Если заметите ошибки - пишите сюда, буду обновлять файл в шапке.

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

Добавлено: Ср дек 21, 2016 12:21 am
Molostov
Спасибо, полезный класс. Попробую и отпишусь.

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

Добавлено: Пн дек 26, 2016 9:47 pm
Fav0rit
Molostov писал(а):Спасибо, полезный класс. Попробую и отпишусь.
Обратная связь была бы очень полезна, потому что многие, судя по всему посмотрели, но ничего не написали, либо не к чему придраться, либо сочли бесполезной штукой...

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

Добавлено: Вт дек 27, 2016 8:35 pm
eygen
Fav0rit писал(а):
Molostov писал(а):Спасибо, полезный класс. Попробую и отпишусь.
Обратная связь была бы очень полезна, потому что многие, судя по всему посмотрели, но ничего не написали, либо не к чему придраться, либо сочли бесполезной штукой...
А можно небольшую инструкцию? Сейчас стоит примерно такая же задача, вот думаю свое колдовать или ваше впишется как нельзя лучше.

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

Добавлено: Пт дек 30, 2016 9:20 pm
Fav0rit
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 в зависимости от того в какую сторону ушло значение.

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

Добавлено: Вт янв 03, 2017 9:55 pm
eygen
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, может не там искал? :(

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

Добавлено: Чт янв 05, 2017 2:40 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."  не обновляется";
 }
} 

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

Добавлено: Пн янв 09, 2017 11:01 am
Fav0rit
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, войдите в редактирование методов класса и увидите...

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