Вам прямо сейчас обновляться не обязательно, я внёс исправление в вашу копию сразу. pChart могли тормозить из-за огромного количества данных, если они попадают в историю.lysyy писал(а):Большое спасибо!
Я эту таблицу очищал транкейтом несколько недель назад...
т.е. надо обновиться?
03/10/2016 16:31 Main cycle history queue processing fix (by sergejey
А это не могло быть причиной торможения из-за pChart-графиков? мне пришлось просто убить папку pchart (((
хотя скорее всего графики из phistory строятся..скучно без них)
Повисло время в меню
Модератор: immortal
- sergejey
- Site Admin
- Сообщения: 4286
- Зарегистрирован: Пн сен 05, 2011 6:48 pm
- Откуда: Минск, Беларусь
- Благодарил (а): 76 раз
- Поблагодарили: 1559 раз
- Контактная информация:
Re: Повисло время в меню
- Рейтинг: 1.16%
Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
-
- Сообщения: 113
- Зарегистрирован: Вт июн 09, 2015 9:41 pm
- Откуда: Moscow
- Благодарил (а): 15 раз
- Поблагодарили: 9 раз
Re: Повисло время в меню
я заметил про монитору процесса, что очень часто обращается к файлу шрифта и дикая дисковая активность... может это как-то получится кэшировать?
и был же какой-то скрипт в системе, который прореживает данные... у меня была отправка данных с нескольких esp8266 раз в 30 сек настроена, проверял что-то, сейчас выставил раз в 10 минут, но отправляется все равно часто, видать перегрузить по питанию нужно, а они на даче
я пользуюсь вот таким, может это тоже развить, например автоматом распознавать данные текст\числа..
и был же какой-то скрипт в системе, который прореживает данные... у меня была отправка данных с нескольких 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: Повисло время в меню
У кого альтернативное меню, попробуйте сделать изменение в файле /var/www/templates_alt/menu.html а именно добавьте перед </head> строчку
У кого меню от foxvlad (http://majordomo.smartliving.ru/forum/v ... &start=220) и/или начнут пропадать иконки на раскрывающихся меню, замените в файле /var/www/templates_alt/commands/commands_search_pda.html кусок кода между тегами <h2> ... </h2> на вот этот:
Я вылечил так, у меня Debian.
Код: Выделить всё
[#inc .././templates/websockets.html#]
Код: Выделить всё
<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>
- Рейтинг: 1.16%