[Сценарий] OnlineStatusCheck

Не требует установки программ или изменения файлов

Модераторы: immortal, newz20

Ответить
PAV
Сообщения: 949
Зарегистрирован: Пт дек 06, 2013 11:30 am
Откуда: Москва
Благодарил (а): 68 раз
Поблагодарили: 94 раза

[Сценарий] OnlineStatusCheck

Сообщение PAV » Чт июл 03, 2014 10:41 am

Уже есть в базовом образе "Устройства онлайн"
Ищет объекты со свойством IP, пингует их.
Если результат 1 и отличается от предыдущего статуса объекта, вызывает метод объекта со значением 1(Online).
Если результат 0 и отличается от предыдущего статуса объекта, проверяется свойство PingTime (где указывается количество отрицательных пингов до присвоения статуса offline) и в случае неудачной попытки присваивается значение attempt равное количеству попыток. Как только количество неудачных попыток сравняется со значением PingTime - вызывается метод объекта со значением 0 (offline)
Все так сложно потому, что например, яблофон зачастую не пингуется 12 раз подряд через минуту, ардуино в пределах 9, камеры в пределах 3 раз. В таком случае значение online offline прыгает каждую минуту

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

$objects=SQLSelect("SELECT TITLE FROM objects");
 $total=count($objects);
 for($i=0;$i<$total;$i++) {
 
    if (gg($objects[$i]['TITLE'].'.IP')) {
     if ((gg($objects[$i]['TITLE'].'.IP'))>0){
         
    if (ping(gg($objects[$i]['TITLE'].'.IP'))) {
    callMethod($objects[$i]['TITLE'].'.statusChanged',array("value"=>1));
        
    } else {// если 0
        if (ping(gg($objects[$i]['TITLE'].'.IP'))) {
        callMethod($objects[$i]['TITLE'].'.statusChanged',array("value"=>1));
        }else{
            if (ping(gg($objects[$i]['TITLE'].'.IP'))) {
            callMethod($objects[$i]['TITLE'].'.statusChanged',array("value"=>1));
            }else{
            callMethod($objects[$i]['TITLE'].'.statusChanged',array("value"=>0));
            }
    
    
    
        }
    } 
   }
 
  } 
}
 
Последний раз редактировалось PAV Пт июл 18, 2014 2:04 pm, всего редактировалось 1 раз.
PAV
Сообщения: 949
Зарегистрирован: Пт дек 06, 2013 11:30 am
Откуда: Москва
Благодарил (а): 68 раз
Поблагодарили: 94 раза

Re: OnlineStatusCheck

Сообщение PAV » Чт июл 03, 2014 12:00 pm

Мозг уже закипел. Кто подскажет, как сделать. чтобы при получении Пинга=0 тут же еще раз пинговало, пока не превысит предел пинга? Но при этом хочется, чтобы пинговало не каждую минуту, а так:
Первый объект Пинг 0, записали
Второй объект Пинг 1
Третий объект Пинг 1
Больше нет объектов
Еще раз Первый объект Пинг 0, записали и т.д.

Я боюсь, что если закольцую пинг по каждому объекту до получения результата, то машину перегрузит или она не будет отвечать на запросы в это время.
PAV
Сообщения: 949
Зарегистрирован: Пт дек 06, 2013 11:30 am
Откуда: Москва
Благодарил (а): 68 раз
Поблагодарили: 94 раза

Re: OnlineStatusCheck

Сообщение PAV » Пт июл 18, 2014 2:03 pm

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

if ($params['value'] != $this->getProperty("status")){ // если новое значение
$this->setProperty("updated",time());
$this->setProperty("updatedTime",date("d/m/y H:i"));
$ot=$this->getProperty("Name");
$msg=$this->getProperty("minMsgLevel");

if ($params['value']==1) {
$this->setProperty("statusText","доступен"); 
$stat=$this->getProperty("statusText");
say($ot. " ". $stat, $msg);
$this->setProperty("attempt",0);
$this->setProperty("status",1); 

} else if ($params['value']==0){

$tries=$this->getProperty("attempt");
    $tries++;
    $this->setProperty("attempt",$tries); 
    $tri=$this->getProperty("PingTime");
       if ($tri>0) {
       } else {
       $tri=2;
       }
            if ($tries > $tri) { // три попытки
        $this->setProperty("statusText","недоступен"); 
        $stat=$this->getProperty("statusText");
        say($ot. " ". $stat, $msg);
        $this->setProperty("attempt",0);
        $this->setProperty("status",0); 
        $this->setProperty("AlertSay",1); 
        }

} else {
say("Неправильное значение состояния пользователя Users.StatusChanged", 0);
} 
} else ( //если старое значение

if $this->getProperty("attempt")>0){
$this->setProperty("attempt",0);
}
}
 
PAV
Сообщения: 949
Зарегистрирован: Пт дек 06, 2013 11:30 am
Откуда: Москва
Благодарил (а): 68 раз
Поблагодарили: 94 раза

Re: OnlineStatusCheck

Сообщение PAV » Ср окт 25, 2017 5:09 pm

Внес изменения в связи с тем, что процесс пинга занимал больше минуты. Теперь занимает 10 секунд.

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

$objects=SQLSelect("SELECT TITLE FROM objects");
 $total=count($objects);
//debmes($total);
 for($i=0;$i<$total;$i++) {
    if (gg($objects[$i]['TITLE'].'.IP')) {
       //debmes($objects[$i]['TITLE']." - ".gg($objects[$i]['TITLE'].'.IP'));
       
     if ((gg($objects[$i]['TITLE'].'.IP'))>0){
      
    //if (ping(gg($objects[$i]['TITLE'].'.IP'))) {

    $host=gg($objects[$i]['TITLE'].'.IP');
    exec("ping -c 2 -i 0.2 -w 1 " . $host, $output, $result);
    if ($result == 0){

    //echo "Ping successful!";
    callMethodSafe($objects[$i]['TITLE'].'.statusChanged',array("value"=>1));
        
    } else {// если 0
        //debmes($objects[$i]['TITLE']." Ping 0 ");
        //echo "Ping unsuccessful!";
        callMethodSafe($objects[$i]['TITLE'].'.statusChanged',array("value"=>0));
        //debmes(gg($objects[$i]['TITLE'].'.attempt'));
    } 
   }
 
  } 
}
 
*** Сообщение запрещено. Сообщение похоже на спам. ***
За это сообщение автора PAV поблагодарил:
box2 (Пн фев 19, 2018 12:04 am)
Рейтинг: 1.16%
sigment
Сообщения: 138
Зарегистрирован: Вт ноя 14, 2017 6:39 pm
Откуда: Москва
Благодарил (а): 44 раза
Поблагодарили: 5 раз
Контактная информация:

Re: OnlineStatusCheck

Сообщение sigment » Вс дек 03, 2017 10:48 pm

Расскажи куда этот код прописывать, чтоб все заработало?
Raspberry Pi3, Xiaomi, BroadLink, ESP8266
PAV
Сообщения: 949
Зарегистрирован: Пт дек 06, 2013 11:30 am
Откуда: Москва
Благодарил (а): 68 раз
Поблагодарили: 94 раза

Re: OnlineStatusCheck

Сообщение PAV » Пн дек 04, 2017 9:08 pm

Я загнал в скрипт и вызываю OnNewMinute
Ответить