Решение проблемы OWFS под Windows
Модератор: immortal
-
- Сообщения: 289
- Зарегистрирован: Вс сен 16, 2012 9:39 am
- Благодарил (а): 0
- Поблагодарили: 1 раз
Re: Решение проблемы OWFS под Windows
Почему-то не останавливается owfs если выполнение идет автоматически по определенному времени, точнее может и останавливается но память не высвобождается, если делаю через сценарии руками останов запуск то все проходит нормально, из-за чего может быть, пробовал вставлять в разных местах sleep(1000) не помагает.
-
- Сообщения: 2357
- Зарегистрирован: Пт апр 20, 2012 12:53 pm
- Благодарил (а): 42 раза
- Поблагодарили: 262 раза
Re: Решение проблемы OWFS под Windows
хз. Как запустил систему, так и забыл о ней. С тех пор ни одного сбоя. Она сама себя восстанавливает и лечит.
-
- Сообщения: 289
- Зарегистрирован: Вс сен 16, 2012 9:39 am
- Благодарил (а): 0
- Поблагодарили: 1 раз
Re: Решение проблемы OWFS под Windows
Alex писал(а):Как определять и что понимать под «здоровьем» датчика вы решаете сами. Делайте так, как вам удобно в каждом конкретном случае.
У меня каждый объект имеет параметр «здоровье». И метод, который периодически выставляет этот параметр от 0 до 100. Как выставлять и как интерпретировать этот параметр решается в каждом случае отдельно.
Сущности (сеть 1-Wire, сетевая Ардуина, группа электродатчиков на этой ардуине или система в целом) представлены в системе отдельными объектами, опять же со своим здоровьем и со своими методами его установки.
Это очень удобно. Можно вывести на страничку или в меню кучу «живых» объектов и одним взглядом видно кому поплохело и насколько. Или наоборот очень приятно наблюдать кучу зелёных сердечек.
Ещё один момент. Если сущность (подсистема) забарахлила, то она сама (автоматически) может предпринять меры для восстановления. Как пример — самовосстановление сети 1-Wire.
Пример.
Раз в минуту вызывается метод checkHealth датчика analog1500. Здесь просто сравнивается время с последнего обновления датчика с заданным максимальным интервалом. Если оно больше, то делается вывод, что датчик отвалился и выставляется здоровье 0.
Это только пример. Логика может быть любая.
analog1500.checkHealth
Здесь собираются данные о здоровье всех датчиков, входящих в сеть 1-Wire. Если все датчики отвалились делается вывод о том, что сеть 1-Wire упала и принудительно перезагружается OWFS.Код: Выделить всё
$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. Дальше раскрашивается сердечко в соответствующий цвет. И мы наблюдаем его невооружённым взглядом на страничке.
oneWire.checkHealth
Далее, по цепочке, «суперсистема» 1- Wire входит в «суперсистему» main и мы наблюдаем в меню главное сердечко уже не зелёным, а синим.Код: Выделить всё
$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');}
Всё это делается автоматически и система сама себя диагностирует и сама себя восстанавливает (естественно, в той мере в которой вы это запрограммировали).
Можно увидеть скрины куда писать код который после oneWire.checkHealth и как потом healthColor привязать к сердечкам? У меня пока только получилось, добавлением метода в класс температурных датчиков, получать здоровье для всех датчиков и вызывать этот метод раз в минуту из onNewMinute, но почему-то иногда здоровье равно 0, хотя датчик на связи, или этот метод как-то по другому надо вызывать. У меня каждвй датчик обновляется раз в 30 сек, период для сравнения задаю допустим 65 сек, и все равно иногда выскакивает 0.
-
- Сообщения: 2357
- Зарегистрирован: Пт апр 20, 2012 12:53 pm
- Благодарил (а): 42 раза
- Поблагодарили: 262 раза
Re: Решение проблемы OWFS под Windows
Создаём класс system. Затем создаём объект этого класса, например, 1-Wire и в метод checkHealth вносим этот код.У меня там 4 датчика, а у вас может быть другое количество датчиков.Можно увидеть скрины куда писать код который после oneWire.checkHealth
<img src="/pChart/pics.php?p=main.one&objt=pic14f&dca=%oneWire.healthColor%">и как потом healthColor привязать к сердечкам?
Дело в том, что МДМ имеет один врождённый недостаток. Во многих местах обновление переменной происходит не по факту опроса, а по факту изменения значения контролируемого параметра. И, если температура медленно меняется, то и обновления значения не происходит. И здоровье падает до 0 при здоровом датчика. Я этот момент озвучивал уже раза три, наверное.У меня пока только получилось, добавлением метода в класс температурных датчиков, получать здоровье для всех датчиков и вызывать этот метод раз в минуту из onNewMinute, но почему-то иногда здоровье равно 0, хотя датчик на связи, или этот метод как-то по другому надо вызывать. У меня каждвй датчик обновляется раз в 30 сек, период для сравнения задаю допустим 65 сек, и все равно иногда выскакивает 0.

- sergejey
- Site Admin
- Сообщения: 4286
- Зарегистрирован: Пн сен 05, 2011 6:48 pm
- Откуда: Минск, Беларусь
- Благодарил (а): 76 раз
- Поблагодарили: 1559 раз
- Контактная информация:
Re: Решение проблемы OWFS под Windows
Это скорее недостаток прошивок, которые отправляют информацию об изменениях, только когда они происходят. Я в своих экспериментальных прошивках научился с этим бороться -- слежу за прошедшим временем, с тех пор, когда в последний раз было отправлено обновление в систему, и если оно выше определённого значения, то принудительно отправляю текущее показание, даже если оно не изменилось.Дело в том, что МДМ имеет один врождённый недостаток. Во многих местах обновление переменной происходит не по факту опроса, а по факту изменения значения контролируемого параметра. И, если температура медленно меняется, то и обновления значения не происходит. И здоровье падает до 0 при здоровом датчика. Я этот момент озвучивал уже раза три, наверное.
Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
-
- Сообщения: 289
- Зарегистрирован: Вс сен 16, 2012 9:39 am
- Благодарил (а): 0
- Поблагодарили: 1 раз
Re: Решение проблемы OWFS под Windows
Alex писал(а):Создаём класс system. Затем создаём объект этого класса, например, 1-Wire и в метод checkHealth вносим этот код.У меня там 4 датчика, а у вас может быть другое количество датчиков.Можно увидеть скрины куда писать код который после oneWire.checkHealth
<img src="/pChart/pics.php?p=main.one&objt=pic14f&dca=%oneWire.healthColor%">и как потом healthColor привязать к сердечкам?
Дело в том, что МДМ имеет один врождённый недостаток. Во многих местах обновление переменной происходит не по факту опроса, а по факту изменения значения контролируемого параметра. И, если температура медленно меняется, то и обновления значения не происходит. И здоровье падает до 0 при здоровом датчика. Я этот момент озвучивал уже раза три, наверное.У меня пока только получилось, добавлением метода в класс температурных датчиков, получать здоровье для всех датчиков и вызывать этот метод раз в минуту из onNewMinute, но почему-то иногда здоровье равно 0, хотя датчик на связи, или этот метод как-то по другому надо вызывать. У меня каждвй датчик обновляется раз в 30 сек, период для сравнения задаю допустим 65 сек, и все равно иногда выскакивает 0.
Спасибо, буду пробовать.
-
- Сообщения: 289
- Зарегистрирован: Вс сен 16, 2012 9:39 am
- Благодарил (а): 0
- Поблагодарили: 1 раз
Re: Решение проблемы OWFS под Windows
Дело в том, что отправляет температуру не ардуино, у меня только ds18b20, и запрос я так понимаю исходит от сервера. И еще из-за чего могло не сработать событие по времени в методе onNewMinute стоит условие if (timeIs('02:00')) {runScript('sunrise'); runScript('sunset');}, сегодня ночью оно не сработало?sergejey писал(а):Это скорее недостаток прошивок, которые отправляют информацию об изменениях, только когда они происходят. Я в своих экспериментальных прошивках научился с этим бороться -- слежу за прошедшим временем, с тех пор, когда в последний раз было отправлено обновление в систему, и если оно выше определённого значения, то принудительно отправляю текущее показание, даже если оно не изменилось.Дело в том, что МДМ имеет один врождённый недостаток. Во многих местах обновление переменной происходит не по факту опроса, а по факту изменения значения контролируемого параметра. И, если температура медленно меняется, то и обновления значения не происходит. И здоровье падает до 0 при здоровом датчика. Я этот момент озвучивал уже раза три, наверное.
-
- Сообщения: 2357
- Зарегистрирован: Пт апр 20, 2012 12:53 pm
- Благодарил (а): 42 раза
- Поблагодарили: 262 раза
Re: Решение проблемы OWFS под Windows
Я тут имею в виду поведение таких модулей как web-переменные, 1-Wire, устройства Online и т.д. Например, в устройствах Online естьЭто скорее недостаток прошивок, которые отправляют информацию об изменениях, только когда они происходят. Я в своих экспериментальных прошивках научился с этим бороться -- слежу за прошедшим временем, с тех пор, когда в последний раз было отправлено обновление в систему, и если оно выше определённого значения, то принудительно отправляю текущее показание, даже если оно не изменилось.
Дело в том, что отправляет температуру не ардуино, у меня только ds18b20, и запрос я так понимаю исходит от сервера.
Действие при переходе в Online: и
Действие при переходе в Offline
, но нет
Действие при успешной проверке:
Или в web-переменных есть
Действие при изменении:
, но нет
Действие при успешной проверке:
То же самое в модуле 1-Wire и в других местах. Пункт «Действие при успешной проверке» обязательно должен быть везде. Озвучил в четвёртый раз.

Вот это я не знаю. Должно было сработать.И еще из-за чего могло не сработать событие по времени в методе onNewMinute стоит условие if (timeIs('02:00')) {runScript('sunrise'); runScript('sunset');}, сегодня ночью оно не сработало?
-
- Сообщения: 289
- Зарегистрирован: Вс сен 16, 2012 9:39 am
- Благодарил (а): 0
- Поблагодарили: 1 раз
Re: Решение проблемы OWFS под Windows
Я уже кажется увидел из-за чего это произошло, вчера после того как я добавил в метод onNewMinute такие строки для вызова проверки здоровьяAlex писал(а):Вот это я не знаю. Должно было сработать.И еще из-за чего могло не сработать событие по времени в методе onNewMinute стоит условие if (timeIs('02:00')) {runScript('sunrise'); runScript('sunset');}, сегодня ночью оно не сработало?
callMethod('TempIn.checkHealth');
callMethod('TempOut.checkHealth');
callMethod('TempU.checkHealth');
callMethod('TempD.checkHealth');
все что стояло после этих строк не выполнялось, наверное нельзя так делать, хотя ошибок не выдавало.
-
- Сообщения: 289
- Зарегистрирован: Вс сен 16, 2012 9:39 am
- Благодарил (а): 0
- Поблагодарили: 1 раз
Re: Решение проблемы OWFS под Windows
А по поводу остановки через autoitv3 не получилось у меня с кодом приведенным выше, пока остановился на таком варианте, owserver.exe работает пока не отвалися, а каждую минуту вызывается скрипт запуска owfs который у меня срабатывает в отличие от останова, помониторю пока такой вариант.