Виджет состояние системы

Для быстрой оценки состояния сервера умного дома MajorDoMo в меню управления или на сцене просто необходим виджет состояния системы, в котором отображаются основные параметры, такие как загрузка процессора и памяти, температура процессора, свободное место на диске и т.д.

Для сбора параметров системы необходимо создать новый сценарий, для этого в разделе "Объекты/Сценарии" жмём кнопку "Добавить новый сценарий". В открывшемся окне заполняем необходимые поля. Я сценарий назвал "SysInfo". Выбираем категорию для скрипта.

Majordomo виджет состояние системы

В текстовое поле вставляем данный код.

SysInfo Показать

SysInfo Скрыть

$color = "grey";
$g_line[0] = "                             ";
$g_line[1] = "                            _";
$g_line[2] = "                          _ _";
$g_line[3] = "                        _ _ _";
$g_line[4] = "                      _ _ _ _";
$g_line[5] = "                    _ _ _ _ _";
$g_line[6] = "                  _ _ _ _ _ _";
$g_line[7] = "                _ _ _ _ _ _ _";
$g_line[8] = "              _ _ _ _ _ _ _ _";
$g_line[9] = "            _ _ _ _ _ _ _ _ _";
$g_line[10] = "          _ _ _ _ _ _ _ _ _ _";
$g_line[11] = "        _ _ _ _ _ _ _ _ _ _ _";
$g_line[12] = "      _ _ _ _ _ _ _ _ _ _ _ _";
$g_line[13] = "    _ _ _ _ _ _ _ _ _ _ _ _ _";
$g_line[14] = "  _ _ _ _ _ _ _ _ _ _ _ _ _ _";
$g_line[15] = "_ _ _ _ _ _ _ _ _ _ _ _ _ _ _";

// -------------------- Температура процессора --------------------------------------------------------
$cpu_temp=shell_exec('cat /sys/class/thermal/thermal_zone0/temp') / 1000;
$cpu_temp=round($cpu_temp,0);
sg("ThisComputer.CPUtemp",$cpu_temp);
$maxtemp = 75;
$mintemp = 25;
$kf = ($maxtemp - $mintemp)/15; // 15 это делений на индикаторе
sg('ThisComputer.CPUtemp', $cpu_temp);
$t15 = round (($cpu_temp - $mintemp) / $kf); // чтобы шкала начиналась с $mintemp 
if ($cpu_temp <= $mintemp) { 
   $t15 = 0; // и оганичим нижнее значение на 0
} elseif ($cpu_temp >= $maxtemp) {
   $t15 = 15; // ограничим максимум на 15 делений
}
$t15_line = $g_line[$t15];
sg('ThisComputer.CPUtemp_-1', $t15_line);

// и цвет для неё
if (($cpu_temp >= 0) && ($cpu_temp < 45)) {
   $color = 'lime';
} else if (($cpu_temp >= 45) && ($cpu_temp < 60)) {
   $color = 'greenyellow';
} else if (($cpu_temp >= 60) && ($cpu_temp < 70)) {
   $color = 'yellow';
} else if ($cpu_temp >= 70) {
   $color = 'red';
} else {
   $color = 'grey';
}

sg ('ThisComputer.CPUtemp_color', $color);
sg ('ThisComputer.CPUtemp_color_-1', $color);

// сдвинем значения с вылетом последнего
for ($i = 9; $i >= 0; $i--) {
   $j = $i - 1;
   sg ('ThisComputer.CPUtemp_'.$i, gg('ThisComputer.CPUtemp_'.$j));
   sg ('ThisComputer.CPUtemp_color_'.$i, gg('ThisComputer.CPUtemp_color_'.$j));
}

//---------------------- Загрузка процессора -----------------------------------------------------
$cpu_load=(exec("top -bn 1 | awk '{print $9}' | tail -n +8 | awk '{s+=$1} END {print s}'"))/4;
$cpu_load=round($cpu_load,0);
setGlobal("ThisComputer.CPUload",$cpu_load);

$l15 = round ($cpu_load / 6.66); // чтобы из 15 значений 100/15 = 6,(6)
$l15_line = $g_line[$l15];
sg('ThisComputer.CPUload_-1', $l15_line);

// и цвет для неё
if (($cpu_load >= 0) && ($cpu_load < 30)) {
   $color = 'lime';
} else if (($cpu_load >= 30) && ($cpu_load < 45)) {
   $color = 'greenyellow';
} else if (($cpu_load >= 45) && ($cpu_load < 60)) {
   $color = 'yellow';
} else if ($cpu_load >= 60) {
   $color = 'red';
} else {
   $color = 'grey';
}

sg ('ThisComputer.CPUload_color', $color);
sg ('ThisComputer.CPUload_color_-1', $color);

// сдвинем значения с вылетом последнего
for ($i = 9; $i >= 0; $i--) {
   $j = $i - 1;
   sg ('ThisComputer.CPUload_'.$i, gg('ThisComputer.CPUload_'.$j));
   sg ('ThisComputer.CPUload_color_'.$i, gg('ThisComputer.CPUload_color_'.$j));
}

// -------------------- Использование ОЗУ -------------------------------------------------------------
$mem_total=exec("cat /proc/meminfo | grep MemTotal | awk '{print $2}'");
$mem_free=exec("cat /proc/meminfo | grep MemFree | awk '{print $2}'");
$mem_available=exec("cat /proc/meminfo | grep MemAvailable | awk '{print $2}'");
$mem_usage=$mem_total - $mem_available;
$sys_memory=round($mem_usage * 100 / $mem_total, 0);
$mem_free=round($mem_free/1024,0);
$mem_available=round($mem_available/1024,0);
$mem_total=round($mem_total/1024,0);
$mem_usage=round($mem_usage/1024,0);
sg("ThisComputer.memory_available",$mem_available);
sg("ThisComputer.memory_free",$mem_free);
sg("ThisComputer.memory_total",$mem_total);
sg("ThisComputer.memory_usage",$mem_usage);
sg("ThisComputer.System_memory",$sys_memory);

$color = ($sys_memory < 80) ? "lime" : "red";
sg ('ThisComputer.System_memory_color', $color);

// -------------------- Использование sda4 /home--------------------------------------------------------
$sda4 = array();
exec('df /dev/sda4',$sda4);
foreach($sda4 as $sda4line) {
 if (preg_match('/(\d+)(\s+)(\d+)(\s+)(\d+)(\s+)(\d+)[%]/',$sda4line,$m))
   $sda4size=round($m[1]/1048576,1);
   $sda4used=round($m[3]/1048576,1);
   $sda4free=round($m[5]/1048576,1);
   $sda4usedpc=$m[7];
   //echo "$sda4size $sda4used $sda4free $sda4usedpc<br/>";
}
setGlobal('ThisComputer.sda4size', $sda4size);
setGlobal('ThisComputer.sda4used', $sda4used);
setGlobal('ThisComputer.sda4usedPersent', $sda4usedpc);
$color = ($sda4usedpc < 80) ? "lime" : "red";
sg ('ThisComputer.sda4used_color', $color);
// -------------------- Использование / -------------------------------------------------------------
$root = array();
exec('df /',$root);
foreach($root as $rootline) {
 if (preg_match('/(\d+)(\s+)(\d+)(\s+)(\d+)(\s+)(\d+)[%]/',$rootline,$r))
  $rootsize = round($r[1]/1048576,1);
  $rootused = round($r[3]/1048576,1);
  $rootusedpc = $r[7];
// echo "$rootusedpc<br/>";
}
setGlobal('ThisComputer.RootUsed', $rootused);
setGlobal('ThisComputer.RootUsedPersent', $rootusedpc);
setGlobal('ThisComputer.RootSize', $rootsize);

$color = ($rootusedpc < 80) ? "lime" : "red";
sg ('ThisComputer.RootUsed_color', $color);

// -------------------- преобразование Uptime ----------------------------------------------------------
//System uptime
$seconds = shell_exec("awk '{print $1}' /proc/uptime");
    if ($seconds >= 86400) {
        $days = floor($seconds / 86400);
        $seconds = $seconds % 86400;
        $result = $days.' д., ';
    }
    if ($seconds >= 3600) {
        $hours = floor($seconds / 3600);
        $seconds = $seconds % 3600;
        $result .= $hours.' час., ';
    }
    if ($seconds >= 60) {
        $minutes = floor($seconds / 60);
        $seconds = $seconds % 60;
        $result .= $minutes.' мин., ';
    }
    $result .= $seconds.' сек.';
sg ('ThisComputer.System_uptime', $result);

Внизу страницы жмём кнопку сохранить. Этот скрипт может собрать информацию только Linux системы, в Windows он работать не будет!

Сценарий создан, но его необходимо периодически запускать. Проще всего запуск осуществлять в методе onNewMinute класса Timer. Для этого заходим в "Объекты/Объекты" там ищем класс "Timer", в этом классе находиться объект "ClockChime". Этот объект имеет два метода:

  • onNewHour
  • onNewMinute

Нас интересует метод "onNewMinute", заходим в этот метод и в конце кода дописываем несколько строчек

onNewMinute Показать

onNewMinute Скрыть

//Каждые 10 минут
if ($m%10 == 0) {
runScript('SysInfo');
} 

 Должно получиться так

Majordomo виджет состояние системы

Эти строчки кода запускают сценарий "SysInfo" каждые 10 минут.

Информация собирается, теперь её необходимо красиво отобразить. Добавим виджет с информацией в меню управления. Для этого заходим в "Объекты/Меню управления" и создаём там новый раздел. Придумываем название, тип выбираем HTML-блок.

 Majordomo виджет состояние системы

В окне "Данные" вставляем код:

В итоге в меню управления появиться такой виджет

Majordomo виджет состояние системы

В этот виджет легко добавить свои пункты или удалить не нужные.