Повисло время в меню

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

Модератор: immortal

Аватара пользователя
sergejey
Site Admin
Сообщения: 4286
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 76 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: Повисло время в меню

Сообщение sergejey » Чт мар 10, 2016 5:26 pm

lysyy писал(а):Большое спасибо!
Я эту таблицу очищал транкейтом несколько недель назад...
т.е. надо обновиться?
03/10/2016 16:31 Main cycle history queue processing fix (by sergejey
А это не могло быть причиной торможения из-за pChart-графиков? мне пришлось просто убить папку pchart (((
хотя скорее всего графики из phistory строятся..скучно без них)
Вам прямо сейчас обновляться не обязательно, я внёс исправление в вашу копию сразу. pChart могли тормозить из-за огромного количества данных, если они попадают в историю.
За это сообщение автора sergejey поблагодарил:
lysyy (Чт мар 10, 2016 8:33 pm)
Рейтинг: 1.16%

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
lysyy
Сообщения: 113
Зарегистрирован: Вт июн 09, 2015 9:41 pm
Откуда: Moscow
Благодарил (а): 15 раз
Поблагодарили: 9 раз

Re: Повисло время в меню

Сообщение lysyy » Чт мар 10, 2016 8:25 pm

я заметил про монитору процесса, что очень часто обращается к файлу шрифта и дикая дисковая активность... может это как-то получится кэшировать?
и был же какой-то скрипт в системе, который прореживает данные... у меня была отправка данных с нескольких esp8266 раз в 30 сек настроена, проверял что-то, сейчас выставил раз в 10 минут, но отправляется все равно часто, видать перегрузить по питанию нужно, а они на даче
я пользуюсь вот таким, может это тоже развить, например автоматом распознавать данные текст\числа..
СпойлерПоказать

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

/*
 * @version 0.2 (auto-set)
 */
chdir('../');

include_once("./config.php");
include_once("./lib/loader.php");

// connecting to database
$db = new mysql(DB_HOST, '', DB_USER, DB_PASSWORD, DB_NAME);

include_once("./load_settings.php");

// OPTIMIZATION RULES updatedTimestamp
$rules = array(
   'temp'              => array('optimize' => 'avg'),
   'humSensors.humidity'           => array('optimize' => 'avg'),
   'lumSensors.value'              => array('optimize' => 'avg'),
   'humidity'      => array('optimize' => 'avg'),
   'uptime'                        => array('keep'     => 30, 'optimize' => 'max'),
 'updatedTimestamp'                        => array('keep'     => 30, 'optimize' => 'max'),
   'PowerMeters.power'             => array('optimize' => 'avg'),
   'PowerMeters.electric'          => array('optimize' => 'avg'),
   'status'                 => array('keep'     => 0),
 'updatedTimestamp'                 => array('keep'     => 0),
   'inhouseMovementSensors.status' => array('keep'     => 30),
   'WeatherStations.tempOutside'   => array('optimize' => 'avg'),
   'WeatherStations.updatedTime'   => array('keep'     => 0),
 'WeatherStations.updatedTimestamp '   => array('keep'     => 0),
   'WeatherStations.pressureRt'    => array('optimize' => 'avg'),
   'WeatherStations.pressure'      => array('optimize' => 'avg'),
 //и поехали наше по аналогии updatedTimestamp
 'esppower.pmpp'      => array('optimize' => 'avg'),
 'esppower.dhtt1'      => array('optimize' => 'avg'),
 'esppower.dhth1'      => array('optimize' => 'avg'),
 'esppower.dhth2'      => array('optimize' => 'avg'),
 'esppower.dhtt2'      => array('optimize' => 'avg'),
 //dsw1
 'esppower.dsw1'      => array('optimize' => 'avg'),
 'esppower.dsw2'      => array('optimize' => 'avg'),
 'esppower.dsw3'      => array('optimize' => 'avg'),
 'esppower.dsw4'      => array('optimize' => 'avg'),
 'esppower.dsw5'      => array('optimize' => 'avg'),
 'esppower.dsw6'      => array('optimize' => 'avg'),
 'esppower.dsw7'      => array('optimize' => 'avg'),
 
   'esppower.bmpt'      => array('optimize' => 'avg'),
  'bmpt'      => array('optimize' => 'avg'),
 'bmpp'      => array('optimize' => 'avg'),
 'Temperature'      => array('optimize' => 'avg'),
 'AtmPressure'      => array('optimize' => 'avg'),
 'rssi'      => array('optimize' => 'avg'),
 'rssiplus'      => array('optimize' => 'avg'),
 'tempout'      => array('optimize' => 'avg'),
 'tempin'      => array('optimize' => 'avg'),
 'rssiplus'      => array('optimize' => 'avg'),
 'vdd'      => array('optimize' => 'avg'),
 'CPUt'      => array('optimize' => 'avg'),
 'HDD0t'      => array('optimize' => 'avg'),
 'HDD1t'      => array('optimize' => 'avg'),
 'cpufanspeed'      => array('optimize' => 'avg'),
 'sysfanspeed'      => array('optimize' => 'avg'),
 'sysT'      => array('optimize' => 'avg'),
 'cpuload'      => array('optimize' => 'avg'),
 'vbat'      => array('optimize' => 'avg'),
 'cpuload'      => array('optimize' => 'avg'),
 'memorya'      => array('optimize' => 'avg'),
 'inv'      => array('optimize' => 'avg'),
 'outv'      => array('optimize' => 'avg'),
 'dhtt1'      => array('optimize' => 'avg'),
 'dhth1'      => array('optimize' => 'avg'),
 'dhtt2'      => array('optimize' => 'avg'),
 'dhth2'      => array('optimize' => 'avg'),
 'DevicesUnderControl'      => array('optimize' => 'avg'),
 
 
 
 'device1temp'      => array('optimize' => 'avg')
 
//'dacha2fl.bmpt'      => array('optimize' => 'avg'
);

set_time_limit(6000);

DebMes('Optimize history script started');

//STEP 1 -- calculate stats
echo "Calculating stats:<br />";

$sqlQuery = "SELECT pvalues.ID, properties.TITLE as PTITLE, classes.TITLE as CTITLE, objects.TITLE as OTITLE
               FROM pvalues 
               LEFT JOIN objects ON pvalues.OBJECT_ID = objects.ID
               LEFT JOIN classes ON objects.CLASS_ID  = classes.ID
               LEFT JOIN properties ON pvalues.PROPERTY_ID = properties.ID
             HAVING PTITLE != ''";

$pvalues = SQLSelect($sqlQuery);
$total = count($pvalues);

for ($i = 0; $i < $total; $i++)
{
   $sqlQuery = "SELECT COUNT(*) as TOTAL
                  FROM phistory
                 WHERE VALUE_ID = '" . $pvalues[$i]['ID'] . "'";

   $tmp = SQLSelectOne($sqlQuery);

   if ($tmp['TOTAL'])
   {
      echo $pvalues[$i]['CTITLE'] . "." . $pvalues[$i]['PTITLE'] . " (object: " . $pvalues[$i]['OTITLE'] . "): ";
      $grand_total += $tmp['TOTAL'];
   
      echo $tmp['TOTAL'] > 5000 ? "<b>" . $tmp['TOTAL'] . "</b>" : $tmp['TOTAL'];
      echo "<br />";
      echo str_repeat(' ', 1024);
      
      flush();
   }
}

echo "<h2>Grand-total: " . $grand_total . "</h2><br />";
echo str_repeat(' ', 1024);

flush();

// exit;
if (!$rules)
{
   echo "No rules defined.";
   exit;
}

//STEP 2 -- optimize values in time
$sqlQuery = "SELECT DISTINCT(VALUE_ID)
               FROM phistory";

$values = SQLSelect($sqlQuery);

$total = count($values);

for ($i = 0; $i < $total; $i++)
{
   $value_id = $values[$i]['VALUE_ID'];
   $sqlQuery = "SELECT pvalues.ID, properties.TITLE as PTITLE, objects.TITLE as OTITLE, classes.TITLE as CTITLE
                  FROM pvalues
                  LEFT JOIN objects ON pvalues.OBJECT_ID = objects.ID
                  LEFT JOIN properties ON pvalues.PROPERTY_ID = properties.ID
                  LEFT JOIN classes ON classes.ID = properties.CLASS_ID
                 WHERE pvalues.ID = '" . $value_id . "'";

   $pvalue = SQLSelectOne($sqlQuery);

   if ($pvalue['CTITLE'] != '')
   {
      $key = $pvalue['CTITLE'] . '.' . $pvalue['PTITLE'];
      $rule = '';
   
      if ($rules[$key])
         $rule = $rules[$key];
      elseif ($rules[$pvalue['OTITLE'] . '.' . $pvalue['PTITLE']])
         $rule = $rules[$pvalue['OTITLE'] . '.' . $pvalue['PTITLE']];
      elseif ($rules[$pvalue['PTITLE']])
         $rule = $rules[$pvalue['PTITLE']];

      if ($rule)
      {
         //processing
         echo "<h3>" . $pvalue['OTITLE'] . " (" . $key . ")</h3>";
         
         $sqlQuery = "SELECT COUNT(*) as TOTAL
                        FROM phistory
                       WHERE VALUE_ID = '" . $value_id . "'";

         $total_before = current(SQLSelectOne($sqlQuery));

         if (isset($rule['keep']))
         {
            echo " removing old (" . (int)$rule['keep'] . ")";
            $sqlQuery = "DELETE
                           FROM phistory
                          WHERE VALUE_ID = '" . $value_id . "'
                            AND TO_DAYS(NOW()) - TO_DAYS(ADDED) >= " . (int)$rule['keep'];
            SQLExec($sqlQuery);
         }

         if ($rule['optimize'])
         {
            echo str_repeat(' ', 1024);
            flush();

            $sqlQuery = "SELECT UNIX_TIMESTAMP(ADDED)
                           FROM phistory
                          WHERE VALUE_ID = '" . $value_id . "'
                          ORDER BY ADDED
                          LIMIT 1";

            echo "<br /><b>Before last MONTH</b><br />";
            $end = time() - 30 * 24 * 60 * 60; // month end older
            $start = current(SQLSelectOne($sqlQuery));
            $interval = 2 * 60 * 60; // two-hours interval
            optimizeHistoryData($value_id, $rule['optimize'], $interval, $start, $end);

            echo str_repeat(' ', 1024);
            flush();

            echo "<br /><b>Before last WEEK</b><br />";
            $start = $end + 1;
            $end = time() - 7 * 24 * 60 * 60; // week and older
            $interval = 1 * 60 * 60; // one-hour interval
            optimizeHistoryData($value_id, $rule['optimize'], $interval, $start, $end);

            echo str_repeat(' ', 1024);
            flush();

            echo "<br /><b>Before YESTERDAY</b><br />";
            $start = $end + 1;
            $end = time() - 1 * 24 * 60 * 60; // day and older
            $interval = 20 * 60; // 20 minutes interval
            optimizeHistoryData($value_id, $rule['optimize'], $interval, $start, $end);

            echo str_repeat(' ', 1024);
            flush();

            echo "<br /><b>Before last HOUR</b><br />";
            $start = $end + 1;
            $end = time() - 1 * 60 * 60; // 1 hour and older
            $interval = 3 * 60; // 3 minutes interval
            optimizeHistoryData($value_id, $rule['optimize'], $interval, $start, $end);
         }
         
         $sqlQuery = "SELECT COUNT(*) as TOTAL
                        FROM phistory
                       WHERE VALUE_ID = '" . $value_id . "'";
         $total_after = current(SQLSelectOne($sqlQuery));
         echo " <b>(changed " . $total_before . " -> " . $total_after . ")</b><br />";
      }
   }
}

SQLExec("OPTIMIZE TABLE phistory;");

echo "<h1>DONE!!!</h1>";

$db->Disconnect(); // closing database connection

DebMes("Optimize history script finished");

/**
 * Summary of optimizeHistoryData
 * @param mixed $valueID  Id value
 * @param mixed $type     Type
 * @param mixed $interval Interval
 * @param mixed $start    Begin date
 * @param mixed $end      End date
 * @return double|int
 */
function optimizeHistoryData($valueID, $type, $interval, $start, $end)
{
   $totalRemoved = 0;
   
   if (!$interval)
      return 0;

   $beginDate = date('Y-m-d H:i:s', $start);
   $endDate = date('Y-m-d H:i:s', $end);

   echo "Value ID: $valueID <br />";
   echo "Interval from " . $beginDate . " to " . $endDate . " (every " . $interval . " seconds)<br />";
   
   $sqlQuery = "SELECT COUNT(*)
                  FROM phistory
                 WHERE VALUE_ID =  '" . $valueID . "'
                   AND ADDED    >= '" . $beginDate . "'
                   AND ADDED    <= '" . $endDate . "'";

   $totalValues = (int)current(SQLSelectOne($sqlQuery));
   
   echo "Total values: " . $totalValues . "<br>";
   
   if ($totalValues < 2)
      return 0;

   $tmp = $end - $start;
   $tmp2 = round($tmp / $interval);
   
   if ($totalValues <= $tmp2)
   {
      echo "... number of values ($totalValues) is less than optimal (" . $tmp2 . ") (skipping)<br />";
      return 0;
   }

   echo "Optimizing (should be about " . $tmp2 . " records)...";

   echo str_repeat(' ', 1024);
   flush();

   $sqlQuery = "SELECT UNIX_TIMESTAMP(ADDED)
                  FROM phistory
                 WHERE VALUE_ID =  '" . $valueID . "'
                   AND ADDED    >= '" . $beginDate . "'
                 ORDER BY ADDED
                 LIMIT 1";

   $firstStart = current(SQLSelectOne($sqlQuery));

   $sqlQuery = "SELECT UNIX_TIMESTAMP(ADDED)
                  FROM phistory
                 WHERE VALUE_ID = '" . $valueID . "'
                   AND ADDED    <= '" . $endDate . "'
                 ORDER BY ADDED DESC
                 LIMIT 1";

   $lastStart = current(SQLSelectOne($sqlQuery));

   while ($start < $end)
   {
      if ($start < ($firstStart - $interval))
      {
         $start += $interval;
         continue;
      }

      if ($start > ($lastStart + $interval))
      {
         $start += $interval;
         continue;
      }

      echo ".";
      echo str_repeat(' ', 1024);
      flush();

      $sqlQuery = "SELECT * 
                     FROM phistory
                    WHERE VALUE_ID = '" . $valueID . "'
                      AND ADDED    >= '" . date('Y-m-d H:i:s', $start) . "'
                      AND ADDED    <  '" . date('Y-m-d H:i:s', $start + $interval) . "'";
      
      $data = SQLSelect($sqlQuery);
      $total = count($data);
    
      if ($total > 1)
      {
         $values = array();
      
         for ($i = 0; $i < $total; $i++)
            $values[] = $data[$i]['VALUE'];
     
         if ($type == 'max')
            $newValue = max($values);
         elseif ($type == 'sum')
            $newValue = array_sum($values);
         else
            $newValue = array_sum($values) / $total;

         $sqlQuery = "DELETE
                        FROM phistory
                       WHERE VALUE_ID = '" . $valueID . "'
                         AND ADDED    >= '" . date('Y-m-d H:i:s', $start) . "'
                         AND ADDED    < '" . date('Y-m-d H:i:s', $start + $interval) . "'";
         
         SQLExec($sqlQuery);

         $addedDate = ($type == 'avg') ? $start + (int)($interval / 2) : $start + $interval - 1;

         $rec = array();
         $rec['VALUE_ID'] = $valueID;
         $rec['VALUE'] = $newValue;
         $rec['ADDED'] = date('Y-m-d H:i:s', $addedDate);
         
         SQLInsert('phistory', $rec);
         
         $totalRemoved += $total;
      }
      
      $start += $interval;
   }

   echo "<b>Done</b> (removed: $totalRemoved)<br>";
   SQLExec("OPTIMIZE TABLE `phistory`");

   return $totalRemoved;
}
Аватара пользователя
ovcher
Сообщения: 183
Зарегистрирован: Сб сен 12, 2015 3:11 am
Откуда: Волгоград
Благодарил (а): 60 раз
Поблагодарили: 39 раз
Контактная информация:

Re: Повисло время в меню

Сообщение ovcher » Ср мар 16, 2016 11:09 am

У кого альтернативное меню, попробуйте сделать изменение в файле /var/www/templates_alt/menu.html а именно добавьте перед </head> строчку

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

 [#inc .././templates/websockets.html#] 
  
У кого меню от foxvlad (http://majordomo.smartliving.ru/forum/v ... &start=220) и/или начнут пропадать иконки на раскрывающихся меню, замените в файле /var/www/templates_alt/commands/commands_search_pda.html кусок кода между тегами <h2> ... </h2> на вот этот:

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

<h2>
[#if ICON!=""#]<img src="<#ROOTHTML#>cms/icons/[#ICON#]" alt="" class="ui-li-icon" style="margin-right:1px;top:0.4em;max-height:32px;max-width:32px;height:32px;width:32px;vertical-align:middle;">[#endif#] <span id="label_[#ID#]">[#TITLE#]</span>
</h2>
Я вылечил так, у меня Debian.
За это сообщение автора ovcher поблагодарил:
DiArt (Чт май 05, 2016 7:50 pm)
Рейтинг: 1.16%
Ответить