Альтернативный Alive
Материал из MajorDoMo инфо
Версия от 08:22, 9 декабря 2020; Mixman (обсуждение | вклад) (Новая страница: «Category:Юзеркейсы Для определения "Живости" датчиков ZigBee я использую следующее решение....»)
Для определения "Живости" датчиков ZigBee я использую следующее решение. Код ниже можно вставить в сченарий, любой метод и придумать, как его периодически запускать. У меня же для этого создан объект DevicesStates в классе systemStates и прописал код ниже в методе checkState
//return;
// Запускаем раз в 5мин, иначе ретурн
$time = time();
$m = (int)date('i', $time);
if ($m%5 != 0) return;
$timeout = 90*60;
$devices = getObjectsByClass("Devices"); // Класс, в котором все проверяемые устройства. У вас скорее всего SDevices
$telegramtext = "";
$f=0;
foreach($devices as $device) {
$batteryLevel = gg($device['TITLE'].'.batteryLevel');
$heartbeatUpdated = gg($device['TITLE'].'.heartbeatUpdated');
$alive = gg($device['TITLE'].'.alive');
$aliveTimeOut = gg($device['TITLE'].'.aliveTimeOut')*3600;
if(!isset($aliveTimeOut)) $alive = $timeout;
$batteryLow = gg($device['TITLE'].'.batteryLow');
if(!isset($batteryLow)) sg($device['TITLE'].'.batteryLow', 0);
if ( $alive == 1 && time() - $heartbeatUpdated > $timeout ) {
sg($device['TITLE'].'.alive', 0);
$f=1;
$text = "HB ". $heartbeatUpdated . " AL " .$alive ." Отвалился " . $device['TITLE']." ". getObject($device['TITLE'])->description . "\n";
//Say('Отвалился датчик ' . $device['TITLE'].' '. getObject($device['TITLE'])->description, 1);
$this->setProperty('error', $text);
DebMes($text, 'DeviceCheck');
$telegramtext = $telegramtext . '\n' . $text;
$yellow_state=1;
}
elseif ( $alive != 1 && time() - $heartbeatUpdated < $timeout ) {
$f=1; sg($device['TITLE'].'.alive', 1);
$text = "HB ". $heartbeatUpdated . " AL " .$alive ." Появился " . $device['TITLE']." ". getObject($device['TITLE'])->description . "\n";
//Say($text, 1);
//DebMes($text, 'DeviceCheck');
//$this->setProperty('alive', 1);
$telegramtext = $telegramtext . $text;
}
// Мониторим батарейки
if ( $batteryLow < 1 && isset($batteryLevel) && $batteryLevel < 60 && $batteryLevel >30 ) {
sg($device['TITLE'].'.batteryLow', 1);
$text = " Желтый, уровень заряда батарейки " . $batteryLevel ."% у " . $device['TITLE']." ". getObject($device['TITLE'])->description . "\n";
$telegramtext = $telegramtext . $text;
$this->setProperty('error', $text);
$yellow_state=1;
}
if ( $batteryLow == 1 && isset($batteryLevel) && $batteryLevel < 30 && $batteryLevel >1 ) {
sg($device['TITLE'].'.batteryLow', 2);
$text = " Красный, уровень заряда батарейки " . $batteryLevel ."% у " . $device['TITLE']." ". getObject($device['TITLE'])->description . "\n";
$telegramtext = $telegramtext . $text;
$this->setProperty('error', $text);
$red_state=1;
}
}
if ($telegramtext != "" && $f==1 ) {
include_once(DIR_MODULES . 'telegram/telegram.class.php');
$telegram_module = new telegram();
$telegram_module->sendMessageToAdmin($telegramtext);
if ($red_state==1 ) {
$this->setProperty('stateColor',"red");
$this->setProperty('stateTitle',"красный");
$this->callMethod('stateChanged');
}
elseif ($yellow_state==1 ) {
$this->setProperty('stateColor',"yellow");
$this->setProperty('stateTitle',"желтый");
$this->callMethod('stateChanged');
}
}