Решение проблемы OWFS под Windows

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

Модератор: immortal

Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Решение проблемы OWFS под Windows

Сообщение Alex » Пн фев 25, 2013 9:40 am

OWFS под Windows работает крайне нестабильно и основной виновник тому — процесс owserver.exe. Зависает со 100% загрузкой одного ядра, пожирает память прямо на глазах (для 4-и датчиков это 200МБ в сутки).

Решение — принудительная перезагрузка процесса owserver.exe раз в сутки и по отваливанию 1-Wire сети.

Как это организовать:

------------------------------------- 1

В папке
C:\_majordomo\apps\autoitv3\

Создаём файл owstart.au3 с содержимым
Run("C:\Program Files\OWFS\bin\owserver.exe -u -p8234", "", @SW_MINIMIZE)

-u -p8234 надо заменить на свои параметры.

Затем создаём файл owstop.au3 с таким содержимым
ProcessClose("owserver.exe")

Копируем оба файла (owstart.au3 и owstop.au3) в папку
C:\_majordomo\htdocs\

------------------------------------- 2

В MajorDoMo, в сценариях создаём 2 скрипта
au3_owstart

с содержимым
safe_exec('"C:\_majordomo\apps\autoitv3\AutoIt3.exe owstart.au3"');

au3_owstop

с содержимым
safe_exec('"C:\_majordomo\apps\autoitv3\AutoIt3.exe owstop.au3"');

------------------------------------- 3

В объектах находим объект ClockChime и в методе onNewMinute помещаем такой код

if (timeIs('00:00')) {
runScript('au3_owstop');
runScript('au3_owstart');
}

Теперь в 0:00 процесс owserver.exe автоматически перезагрузится, освободит память и вероятность зависания станет минимальной.

------------------------------------- 4

В принципе этого достаточно, но у меня ещё введено дополнительное слежение за работой 1-Wire сети. Каждый датчик имеет такой параметр, как «здоровье». Если все 4 датчика «заболели», то вступает в действие код

if($h1==0 && $h2==0 && $h3==0 && $h4==0){
runScript('au3_owstop');
runScript('au3_owstart');
}

И 1-Wire сеть восстанавливает свою работу. Нерабочее состояние сети длится не более 180 секунд (это время дано датчику, чтобы одуматься и начать работать :) , его можно сократить).

Вот и всё! Теперь OWFS под Windows обрёл невиданную стабильность. Для внешнего наблюдателя он просто работает так как и должен работать. :)
За это сообщение автора Alex поблагодарил:
RomChik (Чт апр 30, 2015 7:31 pm)
Рейтинг: 1.16%
anemcov
Сообщения: 211
Зарегистрирован: Вт янв 08, 2013 11:50 pm
Откуда: Санкт-Петербург
Благодарил (а): 0
Поблагодарили: 6 раз

Re: Решение проблемы OWFS под Windows

Сообщение anemcov » Пн фев 25, 2013 11:08 am

поделитесь опытом, как определяете "здоровье" датчиков? Тема интересная, так как и под Линуксом замечена необходимость мониторинга сервиса 1-wire
Urbas81
Сообщения: 289
Зарегистрирован: Вс сен 16, 2012 9:39 am
Благодарил (а): 0
Поблагодарили: 1 раз

Re: Решение проблемы OWFS под Windows

Сообщение Urbas81 » Пн фев 25, 2013 11:17 am

Вот это хорошая новость, а то я уже решил что прийдется отказаться от OWFS, а по поводу "здоровья" тоже интересно.
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: Решение проблемы OWFS под Windows

Сообщение Alex » Пн фев 25, 2013 12:53 pm

Как определять и что понимать под «здоровьем» датчика вы решаете сами. Делайте так, как вам удобно в каждом конкретном случае.

У меня каждый объект имеет параметр «здоровье». И метод, который периодически выставляет этот параметр от 0 до 100. Как выставлять и как интерпретировать этот параметр решается в каждом случае отдельно.

Сущности (сеть 1-Wire, сетевая Ардуина, группа электродатчиков на этой ардуине или система в целом) представлены в системе отдельными объектами, опять же со своим здоровьем и со своими методами его установки.

Это очень удобно. Можно вывести на страничку или в меню кучу «живых» объектов и одним взглядом видно кому поплохело и насколько. Или наоборот очень приятно наблюдать кучу зелёных сердечек.

Ещё один момент. Если сущность (подсистема) забарахлила, то она сама (автоматически) может предпринять меры для восстановления. Как пример — самовосстановление сети 1-Wire.

Пример.

Раз в минуту вызывается метод checkHealth датчика analog1500 :). Здесь просто сравнивается время с последнего обновления датчика с заданным максимальным интервалом. Если оно больше, то делается вывод, что датчик отвалился и выставляется здоровье 0.

Это только пример. Логика может быть любая.

analog1500.checkHealth

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

$last=$this->getProperty('updated');
$now=time();
$per=$this->getProperty('period');
if ($now-$last>$per){
  $this->setProperty('health','0');
} else {
  $this->setProperty('health','100');
} 
Здесь собираются данные о здоровье всех датчиков, входящих в сеть 1-Wire. Если все датчики отвалились делается вывод о том, что сеть 1-Wire упала и принудительно перезагружается OWFS.

Если хотя бы один датчик жив — делается вывод о том, что сеть ещё жива и вычисляется «интегральное» здоровье сети 1-Wire. Дальше раскрашивается сердечко в соответствующий цвет. И мы наблюдаем его невооружённым взглядом на страничке.


oneWire.checkHealth

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

$h1=gg("analog02.health");
$h2=gg("analog1500.health");
$h3=gg("analog1501.health");
$h4=gg("analog1502.health");

if($h1==100 || $h2==100 || $h3==100 || $h4==100){
  $h=100;
}else{
  $h=($h1+$h2+$h3+$h4)/4;
}

if($h1==0 && $h2==0 && $h3==0 && $h4==0){
  runScript('au3_owstop');
  runScript('au3_owstart');
}

$this->setProperty('health',$h);

$this->setProperty('healthColor','lightgray');
if($h==100){$this->setProperty('healthColor','green');}
if($h<100){$this->setProperty('healthColor','blue');}
if($h<75){$this->setProperty('healthColor','blue');}
if($h<50){$this->setProperty('healthColor','orange');}
if($h<25){$this->setProperty('healthColor','red');}
Далее, по цепочке, «суперсистема» 1- Wire входит в «суперсистему» main и мы наблюдаем в меню главное сердечко уже не зелёным, а синим.

Всё это делается автоматически и система сама себя диагностирует и сама себя восстанавливает (естественно, в той мере в которой вы это запрограммировали).
Вложения
h.png
health
h.png (41.32 КБ) 16015 просмотров
anemcov
Сообщения: 211
Зарегистрирован: Вт янв 08, 2013 11:50 pm
Откуда: Санкт-Петербург
Благодарил (а): 0
Поблагодарили: 6 раз

Re: Решение проблемы OWFS под Windows

Сообщение anemcov » Пн фев 25, 2013 1:06 pm

класс!!! Решено - реализую у себя!!!
denis
Сообщения: 284
Зарегистрирован: Сб ноя 24, 2012 11:47 am
Благодарил (а): 28 раз
Поблагодарили: 28 раз

Re: Решение проблемы OWFS под Windows

Сообщение denis » Пн фев 25, 2013 1:44 pm

чудесно! обязательно попробую, а то тоже уже не надеялся на owfs!
Urbas81
Сообщения: 289
Зарегистрирован: Вс сен 16, 2012 9:39 am
Благодарил (а): 0
Поблагодарили: 1 раз

Re: Решение проблемы OWFS под Windows

Сообщение Urbas81 » Чт фев 28, 2013 7:49 am

Мне непонятен один момент, что является признаком успешного опроса датчика, чем отличается опрос "здорового" дотчика от "больного", а кажись понял, 'updated' должно меняться, но если один датчик отвалился а 4 в работе, то мы не имеем механизма его перезапуска, и надо ждать когда отвалятся все датчики, чтоб перезапустить сервер.
anemcov
Сообщения: 211
Зарегистрирован: Вт янв 08, 2013 11:50 pm
Откуда: Санкт-Петербург
Благодарил (а): 0
Поблагодарили: 6 раз

Re: Решение проблемы OWFS под Windows

Сообщение anemcov » Чт фев 28, 2013 8:27 am

Опрос зависит от типа датчика. Например для 1-wire можно у устройства контролировать изменение свойства "STATUS", и при его изменении устанавливать значение "здоровья" соответствующему объекту.
Для сетевых устройств (например Arduino) можно создать "Устройство Онлайн", пинговать его, и при переходе в оффлайн выставить здоровье другому объекту.
Я вообще создал класс Health, у него подклассы 1-wire_health и Net_health. В этих подклассах создал объекты доя каждого устройства, которое хочу контролировать. Ну и в зависимости от типа устройства решаю, как определять и получать уровень здоровья.
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: Решение проблемы OWFS под Windows

Сообщение Alex » Чт фев 28, 2013 9:56 am

что является признаком успешного опроса датчика
Обновление значения или сам факт успешности опроса.
чем отличается опрос "здорового" дотчика от "больного"
Ничем. Критерий «больной» датчик или «здоровый» вы определяете сами. В моём случае дохлым считается датчик, который не обновился за 180 секунд. А у вас может быть совсем другой критерий.
если один датчик отвалился а 4 в работе, то мы не имеем механизма его перезапуска,
Механизм мы имеем всегда. Просто мы сами для себя определили, что если «один датчик отвалился а 4 в работе», то сеть 1-Wire жива и перезапускать её нет смысла.
Я вообще создал класс Health, у него подклассы 1-wire_health и Net_health.
Можно и так. Но, мне больше нравится иметь объект 1-Wire, у него здоровье, как свойство и всё относящаяся к 1-Wire, как сущности (визуальное представление, реакции на внешнюю среду, здоровье, настроение, жизненную силу и все прочее) в одном объекте. Тогда он сам (сущность-объект) заживёт своей жизнью и сам себя будет обслуживать. У нас тут всё таки ООП идеология. :) Почувствуйте себя творцом, так сказать. :)
anemcov
Сообщения: 211
Зарегистрирован: Вт янв 08, 2013 11:50 pm
Откуда: Санкт-Петербург
Благодарил (а): 0
Поблагодарили: 6 раз

Re: Решение проблемы OWFS под Windows

Сообщение anemcov » Чт фев 28, 2013 11:22 am

Alex писал(а): Можно и так. Но, мне больше нравится иметь объект 1-Wire, у него здоровье, как свойство и всё относящаяся к 1-Wire, как сущности (визуальное представление, реакции на внешнюю среду, здоровье, настроение, жизненную силу и все прочее) в одном объекте. Тогда он сам (сущность-объект) заживёт своей жизнью и сам себя будет обслуживать. У нас тут всё таки ООП идеология. :) Почувствуйте себя творцом, так сказать. :)
Ну, про выбор объектной модели холивары можно развести большие :)
Жаль, что у самого устройства 1-wire нет возможности расширения свойств - тогда бы мы могли добавить свойство Health прямо к нему. А сейчас все равно приходится создавать отдельный класс.
Или вам удалось каким-то методом получить значение свойства STATUS от 1-wire устройства из других объектов? А то я столкнулся с тем, что не всегда система генерирует событие изменения STATUS, и в итоге не выполняется скрипт из настроек 1-wire устройства.
Ответить