Класс Sensors. Улучшенная обработка различных датчиков
Модератор: immortal
-
- Сообщения: 60
- Зарегистрирован: Чт мар 19, 2015 10:27 pm
- Благодарил (а): 8 раз
- Поблагодарили: 22 раза
Класс Sensors. Улучшенная обработка различных датчиков
Приветствую всех.
Буквально на днях задумывался о существенной модификации существующих решений классов tempSensors и humSensors, плюс, часто возникает необходимость хранить историю значений с разной дискретностью, например месячную с дискретностью 20 минут, а суточную с разрешением в минуту. Иногда приходится фильтровать получаемые значения с датчиков для фильтрации некорректных показаний, резких изменений.
Для реализации всего этого написал новый класс Sensors, плюс там же реализовал возможность задать пороговые значения для датчиков и время после которого выход за пределы будет обработан методом, то есть легко реализовать сценарий вроде "если температура батареи ниже 20 градусов в течение 15 минут - отправить оповещение"
Постарался наиболее подробно описать значение свойств, чтобы было понятно обычным пользователям. В классе есть метод ReadMe с небольшим описанием.
Привязка датчика осуществляется к свойству input.
Для корректной работы необходимо в цикл onNewMinute поместить код:
$objects=getObjectsByClass("Sensors");
foreach($objects as $obj) {
callMethod($obj['TITLE'].".Periodic");
}
Это необходимо для корректной обработки заполнения данных с разным разрешением, определения свойства alive и подсчета на протяжении какого времени значение за пределами нормального.
Буду рад советам по доработке или доработанным вариантам.
Если заметите ошибки - пишите сюда, буду обновлять файл в шапке.
Буквально на днях задумывался о существенной модификации существующих решений классов 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%
-
- Сообщения: 50
- Зарегистрирован: Пт янв 17, 2014 1:47 am
- Откуда: Карпинск, Свердловская область
- Благодарил (а): 135 раз
- Поблагодарили: 12 раз
Re: Класс Sensors. Улучшенная обработка различных датчиков
Спасибо, полезный класс. Попробую и отпишусь.
-
- Сообщения: 60
- Зарегистрирован: Чт мар 19, 2015 10:27 pm
- Благодарил (а): 8 раз
- Поблагодарили: 22 раза
Re: Класс Sensors. Улучшенная обработка различных датчиков
Обратная связь была бы очень полезна, потому что многие, судя по всему посмотрели, но ничего не написали, либо не к чему придраться, либо сочли бесполезной штукой...Molostov писал(а):Спасибо, полезный класс. Попробую и отпишусь.
-
- Сообщения: 393
- Зарегистрирован: Чт сен 25, 2014 5:37 pm
- Откуда: Екатеринбург
- Благодарил (а): 25 раз
- Поблагодарили: 52 раза
Re: Класс Sensors. Улучшенная обработка различных датчиков
А можно небольшую инструкцию? Сейчас стоит примерно такая же задача, вот думаю свое колдовать или ваше впишется как нельзя лучше.Fav0rit писал(а):Обратная связь была бы очень полезна, потому что многие, судя по всему посмотрели, но ничего не написали, либо не к чему придраться, либо сочли бесполезной штукой...Molostov писал(а):Спасибо, полезный класс. Попробую и отпишусь.
-
- Сообщения: 60
- Зарегистрирован: Чт мар 19, 2015 10:27 pm
- Благодарил (а): 8 раз
- Поблагодарили: 22 раза
Re: Класс Sensors. Улучшенная обработка различных датчиков
Там все просто и в методе к свойствам даны очень подробные комментарии, плюс есть метод ReadMe в котором тоже даны некоторые пояснения. Если в двух словах, то импортируем класс, создаем нужный объект, например датчик температуры.eygen писал(а):А можно небольшую инструкцию? Сейчас стоит примерно такая же задача, вот думаю свое колдовать или ваше впишется как нельзя лучше.Fav0rit писал(а):Обратная связь была бы очень полезна, потому что многие, судя по всему посмотрели, но ничего не написали, либо не к чему придраться, либо сочли бесполезной штукой...Molostov писал(а):Спасибо, полезный класс. Попробую и отпишусь.
В метод onNewMinute добавляем следующий код:
$objects=getObjectsByClass("Sensors");
foreach($objects as $obj) {
callMethod($obj['TITLE'].".Periodic");
}
Это для корректного заполнения некоторых свойств и обработки встроенных временных интервалов(счетчиков)
От физического датчика входящие свойства привязываем в свойство input и после этого автоматически заполняются дочерние val1m val5m и.т.д. для регулярной записи в историю, то есть можно делать датчики с частым опросом, но записывать показания выборочно.
Для оповещений используем поля minTreshold, maxTreshold (задание предельных величин) и tresholdTime предельное время. Когда значение пересечет min или max и пробудет там время tresholdTime, сработает метод maxTresholdAlert или minTresholdAlert в зависимости от того в какую сторону ушло значение.
- Рейтинг: 1.16%
-
- Сообщения: 393
- Зарегистрирован: Чт сен 25, 2014 5:37 pm
- Откуда: Екатеринбург
- Благодарил (а): 25 раз
- Поблагодарили: 52 раза
Re: Класс Sensors. Улучшенная обработка различных датчиков
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, может не там искал?
-
- Сообщения: 52
- Зарегистрирован: Ср фев 04, 2015 12:28 am
- Благодарил (а): 54 раза
- Поблагодарили: 6 раз
Re: Класс Sensors. Улучшенная обработка различных датчиков
Не стал новую тему создавать, Ваша - максимально приближена к тому, что я хочу описать:
Если добавить данный код в метод systemStates объекта System класса systemStates, то алиса будет проверять ВСЕ датчики класса Sensors на свойство alive. Если какой то датчик очень редко отвечает, рекомендую поднять таймаут, по истечении которого свойство alive переходит в ноль.
Если добавить данный код в метод 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." не обновляется";
}
}
-
- Сообщения: 60
- Зарегистрирован: Чт мар 19, 2015 10:27 pm
- Благодарил (а): 8 раз
- Поблагодарили: 22 раза
Re: Класс Sensors. Улучшенная обработка различных датчиков
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, войдите в редактирование методов класса и увидите...
Обновил класс в шапке, есть мелкие правки, раньше некорректно работал возврат к норме, если было задано только одно пороговое значение, сейчас вроде все ОК...