Контроль "мёртвых" объектов

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

Модератор: immortal

Ответить
Аватара пользователя
Bagir
Сообщения: 1615
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 375 раз

Контроль "мёртвых" объектов

Сообщение Bagir » Пн дек 15, 2014 9:00 pm

Все же я собрался духом взяться за эту, казалось бы простую, но в тоже время очень объемную тему. В системе уже полно датчиков. У их объектов есть свойство alive. Это все уже настроено и отлично работает. Теперь вопрос о контроле.
Перебрать все объекты нужного класса, и посмотреть их свойство совершенно не трудно. Более того, итогом работы этого перебора будет составляющая для класса systemStates. Если есть неживые объекты, то статус здоровья системы можно установить желтый.
Перебираем мы все объекты, находим неживые. А дальше что? По всей видимости нужно как то это оформить, и вывести результат. Оформление будет явно не пользовательское, но я все же подумываю о размещении такой информации на одной из домашних страниц. Пока что видится мне это в виде простого списка неживых объектов. Туда же я хочу включить объекты беспроводных датчиков, у которых садиться батарейка. Одним словом это будет список проблемных объектов.
Возможно было бы удобно сразу делать на них ссылки, чтобы при клике открывалась админка с этим объектом.
Может быть кто то уже делал нечто подобное. Расскажите что получилось. Какие были подводные камни. Идеи, оформление, и все такое.
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Аватара пользователя
Bagir
Сообщения: 1615
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 375 раз

Re: Контроль "мёртвых" объектов

Сообщение Bagir » Пн дек 15, 2014 9:56 pm

Вот и первые грабли. Есть группа датчиков, данные с которых приходят крайне редко. Например датчики дыма и протечки. Устанавливать таймер alive тут бесполезно.
Варианта два. Либо каким то образом "пинговать" такие датчики, либо вообще снять их с контроля.
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Аватара пользователя
sergejey
Site Admin
Сообщения: 4286
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 76 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: Контроль "мёртвых" объектов

Сообщение sergejey » Вт дек 16, 2014 12:09 am

Я в checkState пробегаюсь по списку важных объектов/циклов и если что-то не так, то пишу детали в свойство stateDetails. Далее вывожу иконки разных цветов в меню и на сценах, а так же пишу рядом детали того, что именно не так.

Для редко-срабатывающих объектов типа датчиков движения в малопосещаемых местах ставлю длинные период, через который считать их неживыми. Если они вдруг всё же отображаются как неживые, то просто прохожу там, где они должны сработать и/или корректирую контрольное время. Вообще, если датчик с обратной связью, то не обязятаельно ставить его в ситуацию сработки -- такие датчики просто должны отзываться.
кодПоказать

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

$details=array();
$red_state=0;
$yellow_state=0;

$cycles=array('states'=>'цикл проверки состояния','main'=>'главный цикл','execs'=>'цикл запуска команд','scheduler'=>'цикл планировщика');
foreach($cycles as $k=>$v) {
 $tm=getGlobal('ThisComputer.cycle_'.$k.'Run');
 if (time()-$tm>5*60) {
  $red_state=1;
  $details[]="Остановлен ".$v;
 }
}

$cycles=array('ping'=>'цикл пинг','webvars'=>'цикл веб переменных','watchfolders'=>'цикл слежения за папками','rss'=>'цикл эр-эс-эс');
foreach($cycles as $k=>$v) {
 $tm=getGlobal('ThisComputer.cycle_'.$k.'Run');
 if (time()-$tm>10*60) {
  $yellow_state=1;
  $details[]="Остановлен ".$v;
 }
}

$tm=getGlobal('Serge.CoordinatesUpdatedTimestamp');
if (time()-$tm>(2*60*60)) {
  $yellow_state=1;
  $details[]="Неизвестно местоположение Сергея";
}
$tm=getGlobal('Alesya.CoordinatesUpdatedTimestamp');
if (time()-$tm>(2*60*60)) {
  $yellow_state=1;
  $details[]="Неизвестно местоположение Алеси";
}


if (!getGlobal('sensorPower.status')) {
 $red_state=1;
 $details[]="Нет электричества в сети";
}

/*
if (isOnline('Контроллер Arduino 2')!==1) {
 $red_state=1;
 $details[]="Недоступен исполнительный контроллер";
}
*/

if (isOnline('Контроллер Arduino Relay')!==1) {
 $red_state=1;
 $details[]="Недоступен контроллер реле";
}


if (isOnline('Контроллер Arduino_RF_RCV')!==1) {
 $yellow_state=1;
 $details[]="Недоступен RF-приёмник";
}


if (!isOnline('Контроллер Arduino 1')) {
 $red_state=1;
 $details[]="Недоступен контроллер датчиков";
}

$sensors=array();
$sensors['sensorMovement1']="датчик движения в коридоре";
$sensors['sensorMovement2']="датчик движения в зале";
$sensors['sensorMovement3']="датчик движения в спальне";
$sensors['sensorMovement4']="датчик движения в ванной";
$sensors['sensorMovement6']="датчик движения в топочной";
$sensors['sensorMovement7']="датчик движения в гостиной";
$sensors['sensorMovement8']="датчик движения в гараже";
$sensors['sensorMovement9']="датчик движения на веранде";
$sensors['sensorMovement10']="датчик движения на кухне";
$sensors['sensorMovement11']="датчик движения в мастерской";
$sensors['sensorKotel']="датчик температуры на котле";
$sensors['sensorZal']="датчик температуры в зале";
$sensors['sensorTempRemote1']="датчик температуры в гараже";
$sensors['sensorTempRemote2']="датчик температуры в спальне";
//$sensors['sensorTempRemote5']="датчик температуры на втором этаже";
$sensors['sensorTempRemote6']="датчик температуры в подвале";
$sensors['sensorHumidityRemote3']="датчик влажности в спальне";
//$sensors['sensorHumidityRemote5']="датчик влажности на втором этаже";
$sensors['sensorHumidityRemote6']="датчик влажности в подвале";
//$sensors['sensorTempRemote4']="датчик температуры в веранде";
//$sensors['sensorLight5']="датчик освещённости на втором этаже";
$sensors['ws']="модуль погодной станции";



$sensors['sensorKey1']="датчик на двери в гараж";


foreach($sensors as $k=>$v) {
 if (!gg($k.'.alive')) {
  $yellow_state=1;
  $details[]="Не обновляется ".$v;
 }
}

if ($red_state) {
 $state='red';
 $state_title='Красный'; 
} elseif ($yellow_state) {
 $state='yellow';
 $state_title='Жёлтый';  
} else {
 $state='green';
 $state_title='Зелёный';   
}

$new_details=implode(". ",$details);
if ($this->getProperty("stateDetails")!=$new_details) {
 $this->setProperty('stateDetails',$new_details);
}

if ($this->getProperty('stateColor')!=$state) {
 $this->setProperty('stateColor',$state);
 $this->setProperty('stateTitle',$state_title);
 if ($state!='green') {
  say("Уровень целостности системы изменился на ".$state_title.".");
  say(implode(". ",$details));
 } else {
  say("Уровень целостности системы восстановился на ".$state_title);
 }
 $this->callMethod('stateChanged');
} 

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Аватара пользователя
Bagir
Сообщения: 1615
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 375 раз

Re: Контроль "мёртвых" объектов

Сообщение Bagir » Вт дек 16, 2014 12:25 am

Меня немного смутило частое выполнение checkState. Не хотелось сильно нагружать его. Сейчас сделал скрипт, который перебирает все объекты в указанных классах, и если был вызван со страницы, печатает список. Если вызван из onNewMinute - только устанавливает событие. По этому событию checkState видит, что надо включить желтый.
Но такой общий подход к классам уже озадачил некоторыми трудностями. Конечно, если составлять список из важных датчиков, то проблем не будет, но при добавлении новых объектов придется добавлять их и в список.
Общий подход, это конечно может и не хуже, но тогда придется быть аккуратней со свойством alive, чтобы оно у всех обновлялось.
С пожарными и датчиками протечки пока сделал так: Отключил у их подкласса обновление свойства alive, и сам выставил его =2 (чтобы отличалось, но не попадало в список). Пока еще в раздумьях.
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Аватара пользователя
shemnik69
Сообщения: 590
Зарегистрирован: Пн дек 24, 2012 3:01 pm
Откуда: Саратов Saratov
Благодарил (а): 67 раз
Поблагодарили: 63 раза

Re: Контроль "мёртвых" объектов

Сообщение shemnik69 » Вт дек 23, 2014 8:12 am

Есть еще один способ.
Он правда смещен в схемотехнику но реализовать его просто. Например у нас, 4 контактных датчика (это либо герконы. либо какие либо "концевики") параллельно датчику ставим резистор например на 1 кОм. А вот анализ состояния проводим средствами АЦП т.е на резисторе, будет некоторое напряжение, например если 2 резистора одного номинала (с подтягивающим) то на самом датчике, будет половина напряжения питания т.е около 2,5 в. Иными словами на отключенном датчике будет некоторое напряжение, его можно использовать как эталон, (и учитывая разброс скажем +(-)10-20%) для определения состояния.
При срабатывании же, датчика, напряжение, стремится к 0. Такой вариант довольно затратен, но как показывает практика на тех же Atmega данный вариант хорошо работает. Поскольку портов достаточно.
А вот в анализе alive будем как раз ориентироваться на уровень именно при отключенном датчике. Вот как то так. Да и вообще датчики которые по логике работы 99% времени "спят" (датчики протечки, открытого окна, створы, ДД используемые в контрольных системах и тп.) то лучше использовать именно такой либо подобный метод.
Ivan
Сообщения: 1473
Зарегистрирован: Сб окт 12, 2013 11:03 pm
Благодарил (а): 49 раз
Поблагодарили: 327 раз

Re: Контроль "мёртвых" объектов

Сообщение Ivan » Вт дек 23, 2014 8:24 am

У меня на объектах есть 2 свойства.
1. CheckAlive
2. AliveTimeOut

1. Чтобы отключать от общей проверки
2. Нужно для датчиков движения. Я там ставлю около 3 дней - т.к в некоторые комнаты не захожу долго (например в детскую по выходным, когда доч у бабушки). Но все равно есть проблемы когда летом уезжали в отпуск.

И резисторы тут к сожалению не помогут. Датчик движения RF433 готовый китайский вариант. Может в скором времени раскурочу и переведу их в mySensors, там хотя бы батарейка раз в полчаса анонсируется.
Linux, Raspberry PI, MySensors
Connect: http://connect.smartliving.ru/profile/53
Мои проекты: http://smartliving.ru/profile/4
Аватара пользователя
shemnik69
Сообщения: 590
Зарегистрирован: Пн дек 24, 2012 3:01 pm
Откуда: Саратов Saratov
Благодарил (а): 67 раз
Поблагодарили: 63 раза

Re: Контроль "мёртвых" объектов

Сообщение shemnik69 » Вт дек 23, 2014 8:36 am

Ivan! Резистор можно ставить не внутри датчика. А на входе т.е на самой плате контроллера. А в целом Вы правы.
Аватара пользователя
Bagir
Сообщения: 1615
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 375 раз

Re: Контроль "мёртвых" объектов

Сообщение Bagir » Вт дек 23, 2014 1:19 pm

shemnik69, До знакомства с МД я как раз и использовал только такой способ. У меня есть плата ewclid для контроля внешних датчиков. Она как раз и меряет сопротивление шлейфа. Но передать в МД по GET запросом может только одно из пяти состояний. Резисторы подключены параллельно и последовательно, что позволяет видеть обрыв и КЗ шлейфа.
Сейчас у меня появились несколько МедаD. Для не критичных датчиков использую блок 7I7O. А та же самая пожарка висит с контролем шрейфа. Но этот способ подходит только для проводных датчиков. А у меня есть еще и Z-Wave.
Ivan, я думал на счет свойства CheckAlive. Пока что сделал без него, но скорее всего добавлю. Часто получается, что код пишу быстрее, чем прикручиваю железо, и теперь у меня постоянно висит желтый статус )) Думаю сделаю так: скрипт будет выводить на экран список всех проблемных датчиков, не зависимо от их свойств CheckAlive, но итоговое общее свойство ("есть проблема") будет устанавливать уже учитывая CheckAlive.
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Ответить