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

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

Модератор: immortal

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

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

Сообщение Urbas81 » Ср апр 03, 2013 12:07 am

Почему-то не останавливается owfs если выполнение идет автоматически по определенному времени, точнее может и останавливается но память не высвобождается, если делаю через сценарии руками останов запуск то все проходит нормально, из-за чего может быть, пробовал вставлять в разных местах sleep(1000) не помагает.
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

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

Сообщение Alex » Ср апр 03, 2013 7:44 am

хз. Как запустил систему, так и забыл о ней. С тех пор ни одного сбоя. Она сама себя восстанавливает и лечит.
Urbas81
Сообщения: 289
Зарегистрирован: Вс сен 16, 2012 9:39 am
Благодарил (а): 0
Поблагодарили: 1 раз

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

Сообщение Urbas81 » Пн апр 08, 2013 4:29 pm

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

У меня каждый объект имеет параметр «здоровье». И метод, который периодически выставляет этот параметр от 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 и мы наблюдаем в меню главное сердечко уже не зелёным, а синим.

Всё это делается автоматически и система сама себя диагностирует и сама себя восстанавливает (естественно, в той мере в которой вы это запрограммировали).

Можно увидеть скрины куда писать код который после oneWire.checkHealth и как потом healthColor привязать к сердечкам? У меня пока только получилось, добавлением метода в класс температурных датчиков, получать здоровье для всех датчиков и вызывать этот метод раз в минуту из onNewMinute, но почему-то иногда здоровье равно 0, хотя датчик на связи, или этот метод как-то по другому надо вызывать. У меня каждвй датчик обновляется раз в 30 сек, период для сравнения задаю допустим 65 сек, и все равно иногда выскакивает 0.
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

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

Сообщение Alex » Вт апр 09, 2013 10:21 am

Можно увидеть скрины куда писать код который после oneWire.checkHealth
Создаём класс system. Затем создаём объект этого класса, например, 1-Wire и в метод checkHealth вносим этот код.У меня там 4 датчика, а у вас может быть другое количество датчиков.
и как потом healthColor привязать к сердечкам?
<img src="/pChart/pics.php?p=main.one&objt=pic14f&dca=%oneWire.healthColor%">
У меня пока только получилось, добавлением метода в класс температурных датчиков, получать здоровье для всех датчиков и вызывать этот метод раз в минуту из onNewMinute, но почему-то иногда здоровье равно 0, хотя датчик на связи, или этот метод как-то по другому надо вызывать. У меня каждвй датчик обновляется раз в 30 сек, период для сравнения задаю допустим 65 сек, и все равно иногда выскакивает 0.
Дело в том, что МДМ имеет один врождённый недостаток. Во многих местах обновление переменной происходит не по факту опроса, а по факту изменения значения контролируемого параметра. И, если температура медленно меняется, то и обновления значения не происходит. И здоровье падает до 0 при здоровом датчика. Я этот момент озвучивал уже раза три, наверное. :(
Аватара пользователя
sergejey
Site Admin
Сообщения: 4286
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 76 раз
Поблагодарили: 1559 раз
Контактная информация:

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

Сообщение sergejey » Вт апр 09, 2013 10:56 am

Дело в том, что МДМ имеет один врождённый недостаток. Во многих местах обновление переменной происходит не по факту опроса, а по факту изменения значения контролируемого параметра. И, если температура медленно меняется, то и обновления значения не происходит. И здоровье падает до 0 при здоровом датчика. Я этот момент озвучивал уже раза три, наверное.
Это скорее недостаток прошивок, которые отправляют информацию об изменениях, только когда они происходят. Я в своих экспериментальных прошивках научился с этим бороться -- слежу за прошедшим временем, с тех пор, когда в последний раз было отправлено обновление в систему, и если оно выше определённого значения, то принудительно отправляю текущее показание, даже если оно не изменилось.

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Urbas81
Сообщения: 289
Зарегистрирован: Вс сен 16, 2012 9:39 am
Благодарил (а): 0
Поблагодарили: 1 раз

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

Сообщение Urbas81 » Вт апр 09, 2013 11:46 am

Alex писал(а):
Можно увидеть скрины куда писать код который после oneWire.checkHealth
Создаём класс system. Затем создаём объект этого класса, например, 1-Wire и в метод checkHealth вносим этот код.У меня там 4 датчика, а у вас может быть другое количество датчиков.
и как потом healthColor привязать к сердечкам?
<img src="/pChart/pics.php?p=main.one&objt=pic14f&dca=%oneWire.healthColor%">
У меня пока только получилось, добавлением метода в класс температурных датчиков, получать здоровье для всех датчиков и вызывать этот метод раз в минуту из onNewMinute, но почему-то иногда здоровье равно 0, хотя датчик на связи, или этот метод как-то по другому надо вызывать. У меня каждвй датчик обновляется раз в 30 сек, период для сравнения задаю допустим 65 сек, и все равно иногда выскакивает 0.
Дело в том, что МДМ имеет один врождённый недостаток. Во многих местах обновление переменной происходит не по факту опроса, а по факту изменения значения контролируемого параметра. И, если температура медленно меняется, то и обновления значения не происходит. И здоровье падает до 0 при здоровом датчика. Я этот момент озвучивал уже раза три, наверное. :(

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

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

Сообщение Urbas81 » Вт апр 09, 2013 11:55 am

sergejey писал(а):
Дело в том, что МДМ имеет один врождённый недостаток. Во многих местах обновление переменной происходит не по факту опроса, а по факту изменения значения контролируемого параметра. И, если температура медленно меняется, то и обновления значения не происходит. И здоровье падает до 0 при здоровом датчика. Я этот момент озвучивал уже раза три, наверное.
Это скорее недостаток прошивок, которые отправляют информацию об изменениях, только когда они происходят. Я в своих экспериментальных прошивках научился с этим бороться -- слежу за прошедшим временем, с тех пор, когда в последний раз было отправлено обновление в систему, и если оно выше определённого значения, то принудительно отправляю текущее показание, даже если оно не изменилось.
Дело в том, что отправляет температуру не ардуино, у меня только ds18b20, и запрос я так понимаю исходит от сервера. И еще из-за чего могло не сработать событие по времени в методе onNewMinute стоит условие if (timeIs('02:00')) {runScript('sunrise'); runScript('sunset');}, сегодня ночью оно не сработало?
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

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

Сообщение Alex » Вт апр 09, 2013 3:40 pm

Это скорее недостаток прошивок, которые отправляют информацию об изменениях, только когда они происходят. Я в своих экспериментальных прошивках научился с этим бороться -- слежу за прошедшим временем, с тех пор, когда в последний раз было отправлено обновление в систему, и если оно выше определённого значения, то принудительно отправляю текущее показание, даже если оно не изменилось.


Дело в том, что отправляет температуру не ардуино, у меня только ds18b20, и запрос я так понимаю исходит от сервера.
Я тут имею в виду поведение таких модулей как web-переменные, 1-Wire, устройства Online и т.д. Например, в устройствах Online есть

Действие при переходе в Online: и
Действие при переходе в Offline

, но нет

Действие при успешной проверке:

Или в web-переменных есть

Действие при изменении:

, но нет

Действие при успешной проверке:

То же самое в модуле 1-Wire и в других местах. Пункт «Действие при успешной проверке» обязательно должен быть везде. Озвучил в четвёртый раз. :)
И еще из-за чего могло не сработать событие по времени в методе onNewMinute стоит условие if (timeIs('02:00')) {runScript('sunrise'); runScript('sunset');}, сегодня ночью оно не сработало?
Вот это я не знаю. Должно было сработать.
Urbas81
Сообщения: 289
Зарегистрирован: Вс сен 16, 2012 9:39 am
Благодарил (а): 0
Поблагодарили: 1 раз

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

Сообщение Urbas81 » Вт апр 09, 2013 4:08 pm

Alex писал(а):
И еще из-за чего могло не сработать событие по времени в методе onNewMinute стоит условие if (timeIs('02:00')) {runScript('sunrise'); runScript('sunset');}, сегодня ночью оно не сработало?
Вот это я не знаю. Должно было сработать.
Я уже кажется увидел из-за чего это произошло, вчера после того как я добавил в метод onNewMinute такие строки для вызова проверки здоровья

callMethod('TempIn.checkHealth');
callMethod('TempOut.checkHealth');
callMethod('TempU.checkHealth');
callMethod('TempD.checkHealth');

все что стояло после этих строк не выполнялось, наверное нельзя так делать, хотя ошибок не выдавало.
Urbas81
Сообщения: 289
Зарегистрирован: Вс сен 16, 2012 9:39 am
Благодарил (а): 0
Поблагодарили: 1 раз

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

Сообщение Urbas81 » Вт апр 09, 2013 4:16 pm

А по поводу остановки через autoitv3 не получилось у меня с кодом приведенным выше, пока остановился на таком варианте, owserver.exe работает пока не отвалися, а каждую минуту вызывается скрипт запуска owfs который у меня срабатывает в отличие от останова, помониторю пока такой вариант.
Ответить