Содержание

АННОТАЦИЯ

В данном документе приведён текст программы системы усреднения данных с приборов сети измерений кафедры К3 МФ МГТУ им. Н. Э. Баумана.

ПРОГРАММНЫЙ КОД ВЕБ-ПРИЛОЖЕНИЯ

Корневой каталог веб-приложения

index.html

index.html

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>Home page</title>

	<link rel="stylesheet" href="style.css">
</head>
<body>
	<nav class="nav nav-default">
		<h3>Навигация</h3>
		<a href="/request.html">Примеры запросов для выгрузки данных</a>
		<a href="/conn.php">Дебаг-монитор для дневных значений</a>
		<a href="/conn_hour.php">Дебаг-монитор для часовых значений</a>
		<a href="/conn_minutes.php">Дебаг-монитор для пятнадцатиминутных значений</a>
		<a href="/fileexport.html">Выгрузка файла</a>
	</nav>
</body>
</html>

conn.php

conn.php

<?php
function cmp($a, $b)
{
	return strcmp($a[0], $b[0]);
}
//ini_set('display_errors','1');
//ini_set('display_startup_errors','1');
//error_reporting(E_ALL);
$pgi = pg_connect("host=localhost port=5432 dbname=averobo user=averobo password=*****");
?>
<!DOCTYPE html>
<style>

	th {
		text-indent: 0px;
		border-collapse: collapse;
		background: #e8edfa;
		border-bottom: 1px solid #fff;
		color: #500;
		font-weight: 700;
		border-top: 0px solid transparent;
		padding: 2px;
		text-align:center;
	}
	td {
		text-indent: 0px;
		border-collapse: collapse;
		background: #e8edff;
		border-bottom: 1px solid #fff;
		color: #500;
		border-top: 0px solid transparent;
		padding: 2px;
		text-align:center;
	}
	tr:hover td {background: #eeddff;}
	tr{text-indent: 1px;}
</style>

<?php
if (!$pgi)
	{
		die ("Error!");
		pg_close($pgi);
//		echo 'yes';
	}
else
{
	$query = 'SELECT average, json_file, date, name
	FROM main_table
	WHERE name NOT LIKE \'Сервер%\' AND date >= now()::date - interval \'1 day\'
	ORDER BY date DESC';
$result = pg_query($pgi, "$query");
	if(!$result)
	{
		die("Wrong query!");
	}
	else
	{
		$t_mas = array();
		while($myrow = pg_fetch_assoc($result))
		{
			if(!in_array($myrow['average'], $t_mas))
			{
				array_push($t_mas, $myrow['average']);
			}
		}
		rsort($t_mas);
		array_unshift($t_mas, "name","date");
		pg_result_seek($result, 0);
		$i = 0;
		while($infrow = pg_fetch_assoc($result))
		{
			$i++;
			$flag = -100;
			for($j=1; $j<$i; $j++)
			{
				if ($infrow["name"] == $mass[$j][0])
				{
					$flag = $j;
				}
			}
			unset($j);
			if ($flag != -100)
			{
				$mass[$flag][array_search($infrow['average'], $t_mas)] = $infrow['json_file'];
				$i--;
			} else
			{
				$mass[$i][array_search($infrow['average'], $t_mas)] = $infrow['json_file'];
				$mass[$i][array_search("name", $t_mas)] = $infrow['name'];
				$mass[$i][array_search("date", $t_mas)] = $infrow['date'];
			}
		}
		usort($mass, "cmp");
		unset($i);
		$title = '<thead><tr>';
		for($i=0; $i<count($t_mas); $i++)
		{
			$title .= '<th>'.$t_mas[$i].'</th>';
		}
		unset($i);
		$max = '';
		for($i=1; $i<count($mass)+1; $i++)
		{
			$max .= '<tr>';
			for($j=0; $j<count($t_mas); $j++)
			{
				$max .= '<td>'.$mass[$i][$j].'</td>';
			}
			$max .= '</tr>';
		} 
		$list = $title.'</tr></thead><tbody>'.$max.'</tbody>';
		echo '<table width="100%" style="font-size: 11px">'.$list.'</table>';
	}
}
pg_close($pgi);
?>

conn_hour.php

conn_hour.php

<?php
function cmp($a, $b)
{
	return strcmp($a[0], $b[0]);
}
//ini_set('display_errors','1');
//ini_set('display_startup_errors','1');
//error_reporting(E_ALL);
$pgi = pg_connect("host=localhost port=5432 dbname=averobo user=averobo password=*****");
?>
<!DOCTYPE html>
<style>

	th {
		text-indent: 0px;
		border-collapse: collapse;
		background: #e8edfa;
		border-bottom: 1px solid #fff;
		color: #500;
		font-weight: 700;
		border-top: 0px solid transparent;
		padding: 2px;
		text-align:center;
	}
	td {
		text-indent: 0px;
		border-collapse: collapse;
		background: #e8edff;
		border-bottom: 1px solid #fff;
		color: #500;
		border-top: 0px solid transparent;
		padding: 2px;
		text-align:center;
	}
	tr:hover td {background: #eeddff;}
	tr{text-indent: 1px;}
</style>

<?php
if (!$pgi)
	{
		die ("Error!");
		pg_close($pgi);
	}
else
{
	$query = 'SELECT average, json_file, date, name
	FROM table_with_time
	WHERE name NOT LIKE \'Сервер%\' AND date >= now()::date - interval \'1 hour\' AND (average = \'maximum_in_hour\' OR average = \'minimum_in_hour\' OR average = \'aver_hour\')
	ORDER BY date DESC';
$result = pg_query($pgi, "$query");
	if(!$result)
	{
		die("Wrong query!");
	}
	else
	{
		$t_mas = array();
		while($myrow = pg_fetch_assoc($result))
		{
			if(!in_array($myrow['average'], $t_mas))
			{
				array_push($t_mas, $myrow['average']);
			}
		}
		rsort($t_mas);
		array_unshift($t_mas, "name","date");
		pg_result_seek($result, 0);
		$i = 0;
		while($infrow = pg_fetch_assoc($result))
		{
			$i++;
			$flag = -100;
			for($j=1; $j<$i; $j++)
			{
				if ($infrow["name"] == $mass[$j][0])
				{
					$flag = $j;
				}
			}
			unset($j);
			if ($flag != -100)
			{
				$mass[$flag][array_search($infrow['average'], $t_mas)] = $infrow['json_file'];
				$i--;
			} else
			{
				$mass[$i][array_search($infrow['average'], $t_mas)] = $infrow['json_file'];
				$mass[$i][array_search("name", $t_mas)] = $infrow['name'];
				$mass[$i][array_search("date", $t_mas)] = $infrow['date'];
			}
		}
		usort($mass, "cmp");
		unset($i);
		$title = '<thead><tr>';
		for($i=0; $i<count($t_mas); $i++)
		{
			$title .= '<th>'.$t_mas[$i].'</th>';
		}
		unset($i);
		$max = '';
		for($i=1; $i<count($mass)+1; $i++)
		{
			$max .= '<tr>';
			for($j=0; $j<count($t_mas); $j++)
			{
				$max .= '<td>'.$mass[$i][$j].'</td>';
			}
			$max .= '</tr>';
		} 
		$list = $title.'</tr></thead><tbody>'.$max.'</tbody>';
		echo '<table width="100%" style="font-size: 11px">'.$list.'</table>';
	}
}
pg_close($pgi);
?>

conn_minutes.php

conn_minutes.php

<?php
function cmp($a, $b)
{
	return strcmp($a[0], $b[0]);
}
//ini_set('display_errors','1');
//ini_set('display_startup_errors','1');
//error_reporting(E_ALL);
$pgi = pg_connect("host=localhost port=5432 dbname=averobo user=averobo password=*****");
?>
<!DOCTYPE html>
<style>

	th {
		text-indent: 0px;
		border-collapse: collapse;
		background: #e8edfa;
		border-bottom: 1px solid #fff;
		color: #500;
		font-weight: 700;
		border-top: 0px solid transparent;
		padding: 2px;
		text-align:center;
	}
	td {
		text-indent: 0px;
		border-collapse: collapse;
		background: #e8edff;
		border-bottom: 1px solid #fff;
		color: #500;
		border-top: 0px solid transparent;
		padding: 2px;
		text-align:center;
	}
	tr:hover td {background: #eeddff;}
	tr{text-indent: 1px;}
</style>

<?php
if (!$pgi)
	{
		die ("Error!");
		pg_close($pgi);
	}
else
{
	$query = 'SELECT average, json_file, date, name
	FROM table_with_time
	WHERE name NOT LIKE \'Сервер%\' AND date >= now()::date - interval \'15 minutes\' AND (average = \'minimum_in_15min\' OR average = \'maximum_in_15max\' OR average = \'aver_15min\')
	ORDER BY date DESC';
$result = pg_query($pgi, "$query");
	if(!$result)
	{
		die("Wrong query!");
	}
	else
	{
		$t_mas = array();
		while($myrow = pg_fetch_assoc($result))
		{
			if(!in_array($myrow['average'], $t_mas))
			{
				array_push($t_mas, $myrow['average']);
			}
		}
		rsort($t_mas);
		array_unshift($t_mas, "name","date");
		pg_result_seek($result, 0);
		$i = 0;
		while($infrow = pg_fetch_assoc($result))
		{
			$i++;
			$flag = -100;
			for($j=1; $j<$i; $j++)
			{
				if ($infrow["name"] == $mass[$j][0])
				{
					$flag = $j;
				}
			}
			unset($j);
			if ($flag != -100)
			{
				//echo "yes";
				$mass[$flag][array_search($infrow['average'], $t_mas)] = $infrow['json_file'];
				$i--;
			} else
			{
				$mass[$i][array_search($infrow['average'], $t_mas)] = $infrow['json_file'];
				$mass[$i][array_search("name", $t_mas)] = $infrow['name'];
				$mass[$i][array_search("date", $t_mas)] = $infrow['date'];
			}
		}
		usort($mass, "cmp");
		unset($i);
		$title = '<thead><tr>';
		for($i=0; $i<count($t_mas); $i++)
		{
			$title .= '<th>'.$t_mas[$i].'</th>';
		}
		unset($i);
		$max = '';
		for($i=1; $i<count($mass)+1; $i++)
		{
			$max .= '<tr>';
			for($j=0; $j<count($t_mas); $j++)
			{
				$max .= '<td>'.$mass[$i][$j].'</td>';
			}
			$max .= '</tr>';
		} 
		$list = $title.'</tr></thead><tbody>'.$max.'</tbody>';
		echo '<table width="100%" style="font-size: 11px">'.$list.'</table>';
	}
}
pg_close($pgi);
?>

request.html

request.html

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>Request guide</title>

	<link rel="stylesheet" href="stylereq.css">
</head>
<body>
	<nav class="nav nav-default">
		<h6>Перед работой с запросами не забудьте подставить нужные названия приборов и даты.</h6>
		<h6>Пример выгрузки данных, осредненных по дню:</h6>
		<a href="/averequest.php?avr_type=day&name=%27Hydra-L%2005%27,%27Hydra-L%2006%27&fdate=2023-10-04&sdate=2023-10-05">http://averobo.mgul.ac.ru/averequest.php?avr_type=day&name='Hydra-L 05','Hydra-L 06'&fdate=2023-10-04&sdate=2023-10-05</a>
		<h6>Пример выгрузки данных, осредненных по часу:</h6>
		<a href="/averequest.php?avr_type=hour&name=%27Hydra-L%2005%27,%27Hydra-L%2006%27&fdate=2023-10-04%2000:00:00&sdate=2023-10-05%2000:00:00">http://averobo.mgul.ac.ru/averequest.php?avr_type=hour&name='Hydra-L 05','Hydra-L 06'&fdate=2023-10-04 00:00:00&sdate=2023-10-05 00:00:00</a>
		<h6>Пример выгрузки данных, осредненных по 15 минутам:</h6>
		<a href="/averequest.php?avr_type=15min&name=%27Hydra-L%2005%27,%27Hydra-L%2006%27&fdate=2023-10-04%2000:00:00&sdate=2023-10-05%2000:00:00">http://averobo.mgul.ac.ru/averequest.php?avr_type=15min&name='Hydra-L 05','Hydra-L 06'&fdate=2023-10-04 00:00:00&sdate=2023-10-05 00:00:00</a>
		<h6>Пример выгрузки данных, сложенных за 15 минут:</h6>
		<a href="/averequest.php?avr_type=halfpath15&name=%27Hydra-L%2003%27,%27Hydra-L%2007%27&fdate=2023-10-14%2000:00:00&sdate=2023-10-14%2001:00:00">http://averobo.mgul.ac.ru/averequest.php?avr_type=halfpath15&name='Hydra-L 03','Hydra-L 07'&fdate=2023-10-14 00:00:00&sdate=2023-10-14 01:00:00</a>
		<h6>Пример выгрузки данных, сложенных за час:</h6>
		<a href="/averequest.php?avr_type=halfpathhour&name=%27Hydra-L%2003%27,%27Hydra-L%2007%27&fdate=2023-10-14%2000:00:00&sdate=2023-10-14%2001:00:00">http://averobo.mgul.ac.ru/averequest.php?avr_type=halfpathhour&name='Hydra-L 03','Hydra-L 07'&fdate=2023-10-14 00:00:00&sdate=2023-10-14 01:00:00</a>
	</nav>
</body>
</html>

averequest.php

averequest.php

<?php
header('Content-Type: application/json; charset=utf-8');
ini_set('display_errors','1');
ini_set('display_startup_errors','1');
error_reporting(32759);
$reqpar = $_SERVER['QUERY_STRING'];
parse_str($reqpar, $getpar);
$pgi = pg_connect("host=localhost port=5432 dbname=averobo user=averobo password=*****");
if(!$pgi)
{
	die("Error!");
	pg_close($pgi);
}
elseif ($getpar['help'] == 'manual')
{
	echo "example for day: http://averobo.mgul.ac.ru/averequest.php?avr_type=day&name=%27Hydra-L%2005%27,%27Hydra-L%2006%27&fdate=2023-10-04&sdate=2023-10-05\n";
	echo "example for sum and amount in 15 min:  http://averobo.mgul.ac.ru/averequest.php?avr_type=halfpath15&name=%27Hydra-L%2003%27,%27Hydra-L%2007%27&fdate=2023-10-14%2000:00:00&sdate=2023-10-14%2001:00:00";
}
else
{
	if ($getpar['avr_type'] == 'day')
	{
		$query = 'SELECT * FROM main_table WHERE name in ('.$getpar['name'].') AND date >= \''.$getpar['fdate'].'\' AND date <= \''.$getpar['sdate'].'\' ORDER BY date';
	}
	elseif ($getpar['avr_type'] == 'halfpath15')
	{
		$query = 'SELECT * FROM half_path WHERE average = \'half_path_15min\' AND name in ('.$getpar['name'].') AND date >= \''.$getpar['fdate'].'\' AND date <= \''.$getpar['sdate'].'\' ORDER BY date';
	}
	elseif ($getpar['avr_type'] == 'halfpathhour')
	{
		$query = 'SELECT * FROM half_path WHERE average = \'half_path_hour\' AND name in ('.$getpar['name'].') AND date >= \''.$getpar['fdate'].'\' AND date <= \''.$getpar['sdate'].'\' ORDER BY date';
	}
	elseif ($getpar['avr_type'] == '15min')
	{
		$query = 'SELECT * FROM table_with_time WHERE (average = \'minimum_in_15min\' OR average = \'maximum_in_15max\' OR average = \'aver_15min\') AND name in ('.$getpar['name'].') AND date >= \''.$getpar['fdate'].'\' AND date <= \''.$getpar['sdate'].'\' ORDER BY date';
	}
	elseif ($getpar['avr_type'] == 'hour')
	{
		$query = 'SELECT * FROM table_with_time WHERE (average = \'minimum_in_hour\' OR average = \'maximum_in_hour\' OR average = \'aver_hour\') AND name in ('.$getpar['name'].') AND date >= \''.$getpar['fdate'].'\' AND date <= \''.$getpar['sdate'].'\' ORDER BY date';
	}
	$result = pg_query($pgi, "$query");
	if(!$result)
	{
		die("Wrong query!");
	}
	else
	{
		$myarr = array();
		$i = 0;
		while($myrow = pg_fetch_assoc($result))
		{
			$myarr[(string)$i." "] = stripslashes(json_encode($myrow, JSON_UNESCAPED_UNICODE));
			$i++;
		}
		$str = stripslashes(str_replace(" \"","\"",json_encode($myarr, JSON_UNESCAPED_UNICODE)));
		$str3 = str_replace(":\"{",":{",$str) ;
		echo stripslashes(str_replace("}\"","}",$str3));
	}
	pg_close($pgi);
}
?>

fileexport.html

fileexport.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Export Data</title>

<link rel="stylesheet" href="style.css">
</head>
<body>
	<nav class="nav nav-default">
		<h3>Выгрузка данных</h3>
		<form action="export.php" method="post">
			<div class="form-group">
				<label style="color: rgb(220, 220, 220); font-size: 16px;" for="start_date">Время начала:</label>
				<input style="background-color: rgb(33, 33, 33); color: rgb(220, 220, 220); padding: 10px; font-size: 16px;" type="datetime-local" id="start_datetime" name="start_datetime" required>
			</div>
	
			<div class="form-group">			
				<label style="color: rgb(220, 220, 220); font-size: 16px;" for="end_date">Время конца:</label>
				<input style="background-color: rgb(33, 33, 33); color: rgb(220, 220, 220); padding: 10px; font-size: 16px;" type="datetime-local" id="end_datetime" name="end_datetime" required>
			</div>

			<div class="form-group">
				<label style="color: rgb(220, 220, 220); font-size: 16px;" for="file_type">Тип файла:</label>
				<select style="background-color: rgb(33, 33, 33); color: rgb(220, 220, 220); padding: 10px; font-size: 16px;" id="file_type" name="file_type" required>
					<option value="json">JSON</option>
					<option value="csv">CSV</option>
				</select>
			</div>

			<div class="form-group">
				<label style="color: rgb(220, 220, 220); font-size: 16px;" for="file_type">Промежуток осреднения:</label>
				<select style="background-color: rgb(33, 33, 33); color: rgb(220, 220, 220); padding: 10px; font-size: 16px;" id="avg_type" name="avg_type" required>
					<option value="day">День</option>
					<option value="hour">Час</option>
					<option value="15min">15 минут</option>
				</select>
			</div>

			<div class="form-group">
				<button style="background-color: rgb(33, 33, 33); color: rgb(220, 220, 220); padding: 10px; font-size: 16px; align-items: center;" type="submit">Выгрузка</button>
			</div>
		</form>
	</nav>
</body>
</html>

export.php

export.php

<?php
ini_set('display_errors', '1');
ini_set('display_startup_errors', '1');
error_reporting(32759);
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
	$start_date = $_POST['start_datetime'];
	$end_date = $_POST['end_datetime'];
	$file_type = $_POST['file_type'];
	$avg_type = $_POST['avg_type'];

		// Connect to the database
		$pgi = pg_connect("host=localhost port=5432 dbname=averobo user=averobo password=*****");
		
		if(!$pgi)
		{
			die("Error!");
			pg_close($pgi);
		}
		else
		{
			// Prepare and execute the query
			if ($avg_type == 'day')
			{	
				$query = 'SELECT * FROM main_table WHERE date >= \''.$start_date.'\' AND date <= \''.$end_date.'\' ORDER BY date';
			}
			elseif ($avg_type == 'hour')
			{
				$query = 'SELECT * FROM table_with_time WHERE (average = \'minimum_in_hour\' OR average = \'maximum_in_hour\' OR average = \'aver_hour\') AND date >= \''.$start_date.'\' AND date <= \''.$end_date.'\' ORDER BY date';
			}
			elseif ($avg_type == '15min')
			{				
				$query = 'SELECT * FROM table_with_time WHERE (average = \'minimum_in_15min\' OR average = \'maximum_in_15max\' OR average = \'aver_15min\') AND date >= \''.$start_date.'\' AND date <= \''.$end_date.'\' ORDER BY date';
			}

			$result = pg_query($pgi, "$query");
			if(!$result)
			{
				die("Wrong query!");
			}
			else
			{


				if ($file_type == 'json') {
					header('Content-Type: application/json');
					header('Content-Disposition: attachment; filename="data.json"');
					$myarr = array();
					$i = 0;
					while ($myrow = pg_fetch_assoc($result))
					{
						$myarr[(string)$i." "] = stripslashes(json_encode($myrow, JSON_UNESCAPED_UNICODE));
						$i++;
					}
					$str = stripslashes(str_replace(" \"", "\"", json_encode($myarr, JSON_UNESCAPED_UNICODE)));
					$str3 = str_replace(":\"{",":{",$str);
					echo stripslashes(str_replace("}\"","}",$str3));
				} else if ($file_type == 'csv') {
					header('Content-Type: text/csv; charset=utf-8');
					header('Content-Disposition: attachment; filename="data.csv"');
					$results = pg_fetch_all($result);
					$output = fopen('php://output', 'w');
					if (!empty($results)) {
						// Get the headers
						fputcsv($output, array_keys($results[0]));
						// Output the data
						foreach ($results as $row) {
							foreach ($row as &$value) {
								$value = mb_convert_encoding($value, 'UTF-8', 'auto');
							}
							fputcsv($output, $row);
						}
					}
					fclose($output);
				}
			}
			 
			pg_close($pgi);
		}
	
} else {
	echo 'Invalid request method';
}
?>

style.css

style.css

html, body
{
	padding: 0px;
	margin: 0px;
}
body
{
	width: 100vw;
	min-height: 100vh;
	overflow-x: hidden;

	display: flex;
	justify-content: center;
	align-items: center;

	flex-direction: column;

	background-color: rgb(33, 33, 33);
}
.nav
{
	display: flex;
	flex-direction: column;
	width: 392px;
	align-items: flex-start;
	padding: 30px;
	border-radius: 3px;
	background-color: rgba(255, 255, 255, 0.05);
	font-family: 'Lucida Sans', 'Lucida Sans Regular', 'Lucida Grande', 'Lucida Sans Unicode', Geneva, Verdana, sans-serif;
}
.nav > h1
{
	width: 100%;
	margin: 0px;
	padding: 0px;
	font-size: 18px;
	border-bottom: 1px solid rgba(255, 255, 255, 0.125);
	padding-bottom: 10px;
	margin-bottom: 12px;
	font-weight: lighter;
	color: rgb(240, 240, 240);
}
.nav > h3
{
	width: 100%;
	margin: 0px;
	padding: 0px;
	font-size: 18px;
	border-bottom: 1px solid rgba(255, 255, 255, 0.125);
	padding-bottom: 10px;
	margin-bottom: 12px;
	font-weight: lighter;
	color: rgb(240, 240, 240);
}
.nav > h6
{
	width: 500px;
	margin: 0px;
	padding: 0px;
	font-size: 16px;
	border-bottom: 1px solid rgba(255, 255, 255, 0.125);
	padding-bottom: 10px;
	margin-bottom: 12px;
	font-weight: lighter;
	color: rgb(240, 240, 240);
}
.form-group label,
.form-group input,
.form-group select
{
	display: block;
	font-size: 16px;
	color: rgb(220, 220, 220);
	margin-top: 8px;
	text-decoration: none;
	padding-bottom: 0px;
}
.nav > a
{
	font-size: 16px;
	color: rgb(220, 220, 220);
	margin-top: 8px;
	text-decoration: none;
	padding-bottom: 0px;
	border-bottom: 1px solid rgb(100, 100, 100);
	transition: .25s;
}
.nav > a:hover
{
	color: rgb(240, 240, 240);
	border-bottom: 1px solid rgb(160, 160, 160);
}

stylereq.css

stylereq.css

html, body
{
	padding: 0px;
	margin: 0px;
}
body
{
	width: 100vw;
	min-height: 100vh;
	overflow-x: hidden;

	display: flex;
	justify-content: center;
	align-items: center;

	flex-direction: column;

	background-color: rgb(33, 33, 33);
}
.nav
{
	display: flex;
	flex-direction: column;
	width: 500px;
	align-items: flex-start;
	padding: 30px;
	border-radius: 3px;
	background-color: rgba(255, 255, 255, 0.05);
	font-family: 'Lucida Sans', 'Lucida Sans Regular', 'Lucida Grande', 'Lucida Sans Unicode', Geneva, Verdana, sans-serif;
}
.nav > h3
{
	width: 100%;
	margin: 0px;
	padding: 0px;
	font-size: 18px;
	border-bottom: 1px solid rgba(255, 255, 255, 0.125);
	padding-bottom: 10px;
	margin-bottom: 12px;
	font-weight: lighter;
	color: rgb(240, 240, 240);
}
.nav > h6
{
	width: 500px;
	margin: 0px;
	padding: 0px;
	font-size: 18px;
	border-bottom: 1px solid rgba(255, 255, 255, 0.125);
	padding-bottom: 2px;
	margin-bottom: 12px;
	font-weight: lighter;
	color: rgb(240, 240, 240);
}
.nav > a
{
	font-size: 16px;
	color: rgb(220, 220, 220);
	margin-top: 8px;
	text-decoration: none;
	padding-bottom: 2px;
	margin-bottom: 10px;
	border-bottom: 1px solid rgb(100, 100, 100);
	transition: .25s;
}
.nav > a:hover
{
	color: rgb(240, 240, 240);
	border-bottom: 1px solid rgb(160, 160, 160);
}

ПРОГРАММНЫЙ КОД АВТОМАТИЗАЦИИ

Архив с кодом автоматизации и библиотеками

Server

Текст кода библиотек

lib2

lib2

import json
import datetime
import string
import psycopg2
import requests

def is_float(a_string):
	if a_string is None:
		return False
	try:
		float(a_string)
		return True
	except ValueError:
		return False


class Baz():
	"Stores name, serial and date"
	def __init__(self, name, serial, dt):
		self.name = name
		self.serial = serial
		self.dt = dt

def mindata(j: dict) -> dict:
	"""
	This function is finding min for new data 
	"""
	vec = []
	data = []
	fin = []
	t = 0
	dictData = j
	"""
	writing in file for debug
	with open("testfile2.json", "a") as f:
		f.write(json.dumps(dictData))
	"""
	for i in dictData:
		"relocating names and dates in vector, will be using as set"
		dictDatai = dictData[i]
		t = 0
		for s in vec:
			if (s.name == dictDatai["uName"] and s.serial == dictDatai["serial"] and dictDatai["Date"][0:10] == s.dt) or dictDatai["uName"].find("Сервер") != -1:
				t = 1
		if t == 0:
			vec.append(Baz(dictDatai["uName"],dictDatai["serial"],str(dictDatai["Date"][0:10])))
		"""
		debug
		with open("testfile3.json", "a") as f:
			f.write(json.dumps(dictDatai, ensure_ascii=False));
		"""
	for k in vec:
		"creating vector of data for each pribor at each date"
		data = []
		for i in dictData:
			dictDatai = dictData[i]
			if dictDatai["uName"] == k.name and dictDatai["serial"] == k.serial and dictDatai["Date"][0:10] == k.dt:
				data.append(dictDatai["data"])
		"working with date"
		if len(data) != 0:
			for i in data:
				fl = False
				while fl == False:
					fl = True
					for h in i:
						if "system" == h[0:6] or h[0:3] == "RTC" or h[0:3] == "NTP" or h.find("calibr_date") != -1:
							i.pop(h)
							fl = False
							break
		if len(data) != 0:
			"comparison"
			for h in data[0]:
				if not is_float(data[0][h]):
					data[0][h] = None
				elif h.find("temp") != -1 and h.find("color_tempCT") == -1 and (float(data[0][h]) < -100 or float(data[0][h]) > 100):
					data[0][h] = None
				elif h.find("pressure") != -1 and (float(data[0][h]) < 100 or float(data[0][h]) > 1000):
					data[0][h] = None
				elif h.find("humidity") != -1 and (float(data[0][h]) < 0 or float(data[0][h]) > 100):
					data[0][h] = None
				for i in range(1,len(data)):
					if h in data[i]:
						tr = 0
						if not is_float(data[i][h]):
							tr = 1
						elif h.find("temp") != -1 and h.find("color_tempCT") == -1 and (float(data[i][h]) < -100 or float(data[i][h]) > 100):
							tr = 1
						elif h.find("pressure") != -1 and (float(data[i][h]) < 100 or float(data[i][h]) > 1000):
							tr = 1
						elif h.find("humidity") != -1 and (float(data[i][h]) < 0 or float(data[i][h]) > 100):
							tr = 1
						if tr == 0:
							if data[0][h] is None:
								data[0][h] = round(float(data[i][h]), 4)
							else:
								data[0][h] = round(float(min(float(data[0][h]), float(data[i][h]))), 4)
		"forming result"
		final = dict(Date= k.dt, uName = k.name, serial = k.serial, data = data[0])
		fin.append(final)
	fe = {}
	for i in range(len(fin)):
		fe.update({str(i): fin[i]})
	return fe

def maxdata(j: dict) -> dict:
	"""
	This function is finding max new data
	same system as min
	"""
	vec = []
	data = []
	fin = []
	t = 0
	dictData = j
	"""
	debug
	with open("testfile2.json", "a") as f:
		f.write(json.dumps(dictData))
	"""
	for i in dictData:
		dictDatai = dictData[i]
		t = 0
		for s in vec:
			if (s.name == dictDatai["uName"] and s.serial == dictDatai["serial"] and s.dt == dictDatai["Date"][0:10]) or dictDatai["uName"][0:6] == "Сервер":
				t = 1
		if t == 0:
			vec.append(Baz(dictDatai["uName"],dictDatai["serial"],str(dictDatai["Date"][0:10])))
		"""
		debug
		with open("testfile3.json", "a") as f:
			f.write(json.dumps(dictDatai, ensure_ascii=False));
		"""
	for k in vec:
		data = []
		for i in dictData:
			dictDatai = dictData[i]
			if dictDatai["uName"] == k.name and dictDatai["serial"] == k.serial and dictDatai["Date"][0:10] == k.dt:
				data.append(dictDatai["data"])
		if len(data) != 0:
			for i in data:
				fl = False
				while fl == False:
					fl = True
					for h in i:
						if "system" == h[0:6] or h[0:3] == "RTC" or h[0:3] == "NTP" or h.find("calibr_date") != -1:
							i.pop(h)
							fl = False
							break
		if len(data) != 0:
			for h in data[0]:
				if not is_float(data[0][h]):
					data[0][h] = None
				elif h.find("temp") != -1 and h.find("color_tempCT") == -1 and (float(data[0][h]) < -100 or float(data[0][h]) > 100):
					data[0][h] = None
				elif h.find("pressure") != -1 and (float(data[0][h]) < 100 or float(data[0][h]) > 1000):
					data[0][h] = None
				elif h.find("humidity") != -1 and (float(data[0][h]) < 0 or float(data[0][h]) > 100):
					data[0][h] = None
				for i in range(1,len(data)):
					if h in data[i]:
						tr = 0
						if not is_float(data[i][h]):
							tr = 1
						elif h.find("temp") != -1 and h.find("color_tempCT") == -1 and (float(data[i][h]) < -100 or float(data[i][h]) > 100):
							tr = 1
						elif h.find("pressure") != -1 and (float(data[i][h]) < 100 or float(data[i][h]) > 1000):
							tr = 1
						elif h.find("humidity") != -1 and (float(data[i][h]) < 0 or float(data[i][h]) > 100):
							tr = 1
						if tr == 0:
							if data[0][h] is None:
								data[0][h] = round(float(data[i][h]), 4)
							else:
								data[0][h] = round(float(max(float(data[0][h]), float(data[i][h]))), 4)
		final = dict(Date= k.dt, uName = k.name, serial = k.serial, data = data[0])
		fin.append(final)
	fe = {}
	for i in range(len(fin)):
		fe.update({str(i): fin[i]})
	return fe

def halfpath15(j: dict) -> dict:
	"""
	This function is finding sum and amount in 15 minutes
	"""
	vec = []
	data = []
	fin = []
	t = 0
	dictData = j
	"""
	debug
	with open("testfile2.json", "a") as f:
		f.write(json.dumps(dictData))
	"""
	for i in dictData:
		"appending our set of names and dates"
		dictDatai = dictData[i]
		t = 0
		for s in vec:
			if (s.name == dictDatai["uName"] and s.serial == dictDatai["serial"] and s.dt == dictDatai["Date"][0:10]) or dictDatai["uName"][0:6] == "Сервер":
				t = 1
		if t == 0:
			vec.append(Baz(dictDatai["uName"],dictDatai["serial"],str(dictDatai["Date"][0:10])))
		"""
		debug
		with open("testfile3.json", "a") as f:
			f.write(json.dumps(dictDatai, ensure_ascii=False));
		"""
	for k in vec:
		"working with data and deleting system info"
		tempk = k.name
		if (k.name[0:6] != "Сервер"):
			data = []
			for i in dictData:
				dictDatai = dictData[i]
				if dictDatai["uName"] == k.name and dictDatai["serial"] == k.serial and dictDatai["Date"][0:10] == k.dt:
					data.append(dictDatai["data"])
			if len(data) != 0:
				for i in data:
					fl = False
					while fl == False:
						fl = True
						for h in i:
							if "system" == h[0:6] or h[0:3] == "RTC" or h[0:3] == "NTP" or h.find("calibr_date") != -1:
								i.pop(h)
								fl = False
								break
			templendata = len(data)
			tempdata = {}
			if templendata != 0:
				"averaging"
				for h in data[0]:
					lena = 1
					if not is_float(data[0][h]):
						data[0][h] = "0"
						lena -= 1
					elif h.find("temp") != -1 and h.find("color_tempCT") == -1 and (float(data[0][h]) < -100 or float(data[0][h]) > 100):
						data[0][h] = "0"
						lena -= 1
					elif h.find("pressure") != -1 and (float(data[0][h]) < 100 or float(data[0][h]) > 1000):
						data[0][h] = "0"
						lena -= 1
					elif h.find("humidity") != -1 and (float(data[0][h]) < 0 or float(data[0][h]) > 100):
						data[0][h] = "0"
						lena -= 1
					sum = float(data[0][h])
					for i in range(1,templendata):
						if h in data[i]:
							tr = 0
							if not is_float(data[i][h]):
								tr = 1
							elif h.find("temp") != -1 and h.find("color_tempCT") == -1 and (float(data[i][h]) < -100 or float(data[i][h]) > 100):
								tr = 1
							elif h.find("pressure") != -1 and (float(data[i][h]) < 100 or float(data[i][h]) > 1000):
								tr = 1
							elif h.find("humidity") != -1 and (float(data[i][h]) < 0 or float(data[i][h]) > 100):
								tr = 1
							if tr == 0:
								lena += 1
								sum += float(data[i][h])
					data[0][h] = round(sum, 4)
					tempdata.update({str(h): lena})
			# print(data[0], data[1])
			final = dict(Date= k.dt, uName = k.name, serial = k.serial, summa = data[0], length = tempdata)
			# print(final)
			fin.append(final)
	fe = {}
	for i in range(len(fin)):
		fe.update({str(i): fin[i]})
	return fe

def aver15(j: dict) -> dict:
	"""
	This function is finding average in 15 minutes
	"""
	fin = []
	dictData = j
	"""
	debug
	with open("testfile2.json", "a") as f:
		f.write(json.dumps(dictData))
	"""
	for i in dictData:
		"appending our set of names and dates"
		dictDatai = dictData[i]
		data = dict()
		for t in dictDatai["summa"]:
			# k = dictDatai["summa"][t]
			# print(dictDatai["uName"], t, dictDatai["length"][t])
			if int(dictDatai["length"][t]) == 0:
				data[t] = 0.0000
			else:
				data[t] = round(float(dictDatai["summa"][t])/int(dictDatai["length"][t]), 4)
		final = dict(Date= dictDatai["Date"], uName = dictDatai["uName"], serial = dictDatai["serial"], avr = data)
		fin.append(final)
	fe = {}
	for i in range(len(fin)):
		fe.update({str(i): fin[i]})
	return fe

def uploadolddata(y, m: string) -> json:
	"uploading old data from archive"
	with open('/home/alenanaz/db_all_' + y + '_'+ m +'.json') as f:
		templates = json.load(f)
	return templates

def insert15min(p: dict, dbn, usavr, passavr, hostavr, tabavr, tabhp, datetime: string):
	"""
	inserting avr in data base
	"""
	p1 = aver15(p);
	"connecting to the data base"
	conn = psycopg2.connect(dbname=dbn, user=usavr,password=passavr, host=hostavr)
	cursor = conn.cursor()
	"sql queries"
	for i in p:
		if (p[i]["uName"][0:6] != "Сервер"):
			cursor.execute(f'INSERT INTO {tabhp} VALUES(%s, %s, %s, %s, %s)', (datetime, (str(p[i]["uName"]) + ' ' + str(p[i]["serial"])), "half_path_15min", json.dumps(p[i]["summa"], ensure_ascii=False), json.dumps(p[i]["length"], ensure_ascii=False)))
	for i in p1:
		if (p[i]["uName"][0:6] != "Сервер"):
			cursor.execute(f'INSERT INTO {tabavr} VALUES(%s, %s, %s, %s)', (datetime, (str(p1[i]["uName"]) + ' ' + str(p1[i]["serial"])), "aver_15min", json.dumps(p1[i]["avr"], ensure_ascii=False)))
	conn.commit()

def insertmin15(p: dict, dbn, usavr, passavr, hostavr, tabavr, datetime: string):
	"""
	inserting min in data base
	"""
	"connecting to the data base"
	conn = psycopg2.connect(dbname=dbn, user=usavr,password=passavr, host=hostavr)
	cursor = conn.cursor()
	"sql queries"
	for i in p:
		if (p[i]["uName"][0:6] != "Сервер"):
			cursor.execute(f'INSERT INTO {tabavr} VALUES(%s, %s, %s, %s)', (datetime, (str(p[i]["uName"])+' '+str(p[i]["serial"])), "minimum_in_15min", json.dumps(p[i]["data"], ensure_ascii=False)))
	conn.commit()

def insertmax15(p: dict, dbn, usavr, passavr, hostavr, tabavr, datetime: string):
	"""
	insert max in db
	"""
	"connecting to db"
	conn = psycopg2.connect(dbname=dbn, user=usavr,password=passavr, host=hostavr)
	cursor = conn.cursor()
	"sql queries"
	for i in p:
		if (p[i]["uName"][0:6] != "Сервер"):
			cursor.execute(f'INSERT INTO {tabavr} VALUES(%s, %s, %s, %s)', (datetime, (str(p[i]["uName"])+' '+str(p[i]["serial"])), "maximum_in_15max", json.dumps(p[i]["data"], ensure_ascii=False)))
	conn.commit()

lib3

lib3

import json
import datetime
import string
import psycopg2

class Baz():
	"Stores name, serial and date"
	def __init__(self, name, serial, dt):
		self.name = name
		self.serial = serial
		self.dt = dt

def insertavghour(dbn, usavr, passavr, hostavr, tabavr, tabhp, dt: string):
	conn = psycopg2.connect(dbname=dbn, user=usavr,password=passavr, host=hostavr)
	cursor = conn.cursor()
	dt1 = datetime.datetime.strptime(dt, '%Y-%m-%d %H:%M:%S')
	cursor.execute(f'SELECT a.name, parametr, SUM( CAST(sum->>parametr AS NUMERIC)) AS summa, SUM(CAST(num->>parametr AS INTEGER)) AS numbers FROM {tabhp} INNER JOIN (SELECT name, JSON_OBJECT_KEYS(sum) AS parametr FROM {tabhp} GROUP BY name, parametr) AS a ON a.name = {tabhp}.name WHERE (\'{dt1}\' - date >= \'00:00:00\') AND (\'{dt1}\' - date < \'01:00:00\') AND average = \'half_path_15min\' GROUP BY a.name,parametr ORDER BY a.name')
	arr = tuple()
	arr = cursor.fetchall()
	dir_sum = {}
	dir_num = {}
	dir_avg = {}
	name = ""
	dt = str(dt1 - datetime.timedelta(minutes=8))
	i = 0
	for p in arr:
		if(p[1] != None and p[2] != None and p[3] != None):
			if (i == 0 or name == p[0]):
				dir_sum[p[1]] = float(p[2])
				dir_num[p[1]] = float(p[3])
				if(p[3] != 0):
					dir_avg[p[1]] = float(round(p[2]/p[3], 4))
			else:
				if(p[3] != 0):
					cursor.execute(f'INSERT INTO {tabhp} VALUES(%s, %s, %s, %s, %s)', (dt, (str(name)), "half_path_hour", json.dumps(dir_sum, ensure_ascii=False), json.dumps(dir_num, ensure_ascii=False)))
					cursor.execute(f'INSERT INTO {tabavr} VALUES(%s, %s, %s, %s)', (dt, (str(name)), "aver_hour", json.dumps(dir_avg, ensure_ascii=False)))
				dir_sum.clear()
				dir_num.clear()
				dir_avg.clear()
				dir_sum[p[1]] = float(p[2])
				dir_num[p[1]] = float(p[3])
				if(p[3] != 0):
					dir_avg[p[1]] = float(round(p[2]/p[3], 4))
			name = p[0]
			i += 1
			if(i == len(arr) and p[3] != 0):
				cursor.execute(f'INSERT INTO {tabhp} VALUES(%s, %s, %s, %s, %s)', (dt, (str(name)), "half_path_hour", json.dumps(dir_sum, ensure_ascii=False), json.dumps(dir_num, ensure_ascii=False)))
				cursor.execute(f'INSERT INTO {tabavr} VALUES(%s, %s, %s, %s)', (dt, (str(name)), "aver_hour", json.dumps(dir_avg, ensure_ascii=False)))	
	conn.commit()

def insertmaxhour(dbn, usavr, passavr, hostavr, tabavr, dt: string):
	conn = psycopg2.connect(dbname=dbn, user=usavr,password=passavr, host=hostavr)
	cursor = conn.cursor()
	dt1 = datetime.datetime.strptime(dt, '%Y-%m-%d %H:%M:%S')
	cursor.execute(f'select a.name, parametr, max( cast(json_file->>parametr as numeric)) as max from {tabavr} inner join (select name, json_object_keys(json_file) as parametr from {tabavr} group by name, parametr) as a on a.name = {tabavr}.name where (\'{dt1}\' - date >= \'00:00:00\') and (\'{dt1}\' - date < \'01:00:00\')  and average = \'maximum_in_15max\' group by a.name,parametr order by a.name')
	arr = tuple()
	arr = cursor.fetchall()
	dir_max = {}
	name = ""
	i = 0
	dt = str(dt1 - datetime.timedelta(minutes=8))
	for p in arr:
		if(p[1] != None and p[2] != None):
			if (i == 0 or name == p[0]):
				dir_max[p[1]] = float(p[2])
			else:
				cursor.execute(f'INSERT INTO {tabavr} VALUES(%s, %s, %s, %s)', (dt, (str(name)), 'maximum_in_hour', json.dumps(dir_max, ensure_ascii=False)))
				dir_max.clear()
				dir_max[p[1]] = float(p[2])

			name = p[0]
			i += 1
			if(i == len(arr)):
				cursor.execute(f'INSERT INTO {tabavr} VALUES(%s, %s, %s, %s)', (dt, (str(name)), 'maximum_in_hour', json.dumps(dir_max, ensure_ascii=False)))
	conn.commit()

def insertminhour(dbn, usavr, passavr, hostavr, tabavr, dt: string):
	conn = psycopg2.connect(dbname=dbn, user=usavr,password=passavr, host=hostavr)
	cursor = conn.cursor()
	dt1 = datetime.datetime.strptime(dt, '%Y-%m-%d %H:%M:%S')
	cursor.execute(f'select a.name, parametr, min( cast(json_file->>parametr as numeric)) as min from {tabavr} inner join (select name, json_object_keys(json_file) as parametr from {tabavr} group by name, parametr) as a on a.name = {tabavr}.name where (\'{dt1}\' - date >= \'00:00:00\') and (\'{dt1}\' - date < \'01:00:00\')  and average = \'minimum_in_15min\' group by a.name,parametr order by a.name')
	arr = tuple()
	arr = cursor.fetchall()
	dir_max = {}
	name = ""
	i = 0
	dt = str(dt1 - datetime.timedelta(minutes=8))
	for p in arr:
		if(p[1] != None and p[2] != None):
			if (i == 0 or name == p[0]):
				dir_max[p[1]] = float(p[2])
			else:
				cursor.execute(f'INSERT INTO {tabavr} VALUES(%s, %s, %s, %s)', (dt, (str(name)), 'minimum_in_hour', json.dumps(dir_max, ensure_ascii=False)))
				dir_max.clear()
				dir_max[p[1]] = float(p[2])

			name = p[0]
			i += 1
			if(i == len(arr)):
				cursor.execute(f'INSERT INTO {tabavr} VALUES(%s, %s, %s, %s)', (dt, (str(name)), 'minimum_in_hour', json.dumps(dir_max, ensure_ascii=False)))
	conn.commit()

#days

def insertavgday(dbn, usavr, passavr, hostavr, tabavr, tabhp, dt: string):
	conn = psycopg2.connect(dbname=dbn, user=usavr,password=passavr, host=hostavr)
	cursor = conn.cursor()
	dt1 = datetime.datetime.strptime(dt, '%Y-%m-%d %H:%M:%S')
	cursor.execute(f'SELECT a.name, parametr, SUM( CAST(sum->>parametr AS NUMERIC)) AS summa, SUM(CAST(num->>parametr AS NUMERIC)) AS numbers FROM {tabhp} INNER JOIN (SELECT name, JSON_OBJECT_KEYS(sum) AS parametr FROM {tabhp} GROUP BY name, parametr) AS a ON a.name = {tabhp}.name WHERE (\'{dt1}\' - date >= \'0:00:00\') AND (\'{dt1}\' - date < \'23:55:00\') AND average = \'half_path_hour\' GROUP BY a.name,parametr ORDER BY a.name')
	arr = tuple()
	arr = cursor.fetchall()
	dir_sum = {}
	dir_num = {}
	dir_avg = {}
	name = ""
	dt = str(dt1 - datetime.timedelta(days=1))[0:10]
	i = 0
	for p in arr:
		if(p[1] != None and p[2] != None and p[3] != None):
			if (i == 0 or name == p[0]):
				dir_sum[p[1]] = float(p[2])
				dir_num[p[1]] = float(p[3])
				if(p[3] != 0):
					dir_avg[p[1]] = float(round(p[2]/p[3], 4))
			else:
				if(p[3] != 0):
					cursor.execute(f'INSERT INTO {tabavr} VALUES(%s, %s, %s, %s)', (dt, (str(name)), "average_of_day", json.dumps(dir_avg, ensure_ascii=False)))
				dir_sum.clear()
				dir_num.clear()
				dir_avg.clear()
				dir_sum[p[1]] = float(p[2])
				dir_num[p[1]] = float(p[3])
				dir_avg[p[1]] = float(round(p[2]/p[3], 4))
			name = p[0]
			i += 1
			if(i == len(arr) and p[3] != 0):
				cursor.execute(f'INSERT INTO {tabavr} VALUES(%s, %s, %s, %s)', (dt, (str(name)), "average_of_day", json.dumps(dir_avg, ensure_ascii=False)))	
	conn.commit()

def insertmaxday(dbn, usavr, passavr, hostavr, tabavr, tabmn, dt: string):
	conn = psycopg2.connect(dbname=dbn, user=usavr,password=passavr, host=hostavr)
	cursor = conn.cursor()
	dt1 = datetime.datetime.strptime(dt, '%Y-%m-%d %H:%M:%S')
	cursor.execute(f'select a.name, parametr, max( cast(json_file->>parametr as numeric)) as max from {tabavr} inner join (select name, json_object_keys(json_file) as parametr from {tabavr} group by name, parametr) as a on a.name = {tabavr}.name where (\'{dt1}\' - date >= \'0:00:00\') and (\'{dt1}\' - date < \'23:55:00\')  and average = \'maximum_in_hour\' group by a.name,parametr order by a.name')
	arr = tuple()
	arr = cursor.fetchall()
	dir_max = {}
	name = ""
	i = 0
	dt = str(dt1 - datetime.timedelta(days=1))[0:10]
	for p in arr:
		if(p[1] != None and p[2] != None):
			if (i == 0 or name == p[0]):
				dir_max[p[1]] = float(p[2])
			else:
				cursor.execute(f'INSERT INTO {tabmn} VALUES(%s, %s, %s, %s)', (dt, (str(name)), 'maximum_in_day', json.dumps(dir_max, ensure_ascii=False)))
				dir_max.clear()
				dir_max[p[1]] = float(p[2])

			name = p[0]
			i += 1
			if(i == len(arr)):
				cursor.execute(f'INSERT INTO {tabmn} VALUES(%s, %s, %s, %s)', (dt, (str(name)), 'maximum_in_day', json.dumps(dir_max, ensure_ascii=False)))
	conn.commit()

def insertminday(dbn, usavr, passavr, hostavr, tabavr, tabmn, dt: string):
	conn = psycopg2.connect(dbname=dbn, user=usavr,password=passavr, host=hostavr)
	cursor = conn.cursor()
	dt1 = datetime.datetime.strptime(dt, '%Y-%m-%d %H:%M:%S')
	cursor.execute(f'select a.name, parametr, min( cast(json_file->>parametr as numeric)) as min from {tabavr} inner join (select name, json_object_keys(json_file) as parametr from {tabavr} group by name, parametr) as a on a.name = {tabavr}.name where (\'{dt1}\' - date >= \'0:00:00\') and (\'{dt1}\' - date < \'23:55:00\')  and average = \'minimum_in_hour\' group by a.name,parametr order by a.name')
	arr = tuple()
	arr = cursor.fetchall()
	dir_max = {}
	name = ""
	i = 0
	dt = str(dt1 - datetime.timedelta(days=1))[0:10]
	for p in arr:
		if(p[1] != None and p[2] != None):
			if (i == 0 or name == p[0]):
				dir_max[p[1]] = float(p[2])
			else:
				cursor.execute(f'INSERT INTO {tabmn} VALUES(%s, %s, %s, %s)', (dt, (str(name)), 'minimum_in_day', json.dumps(dir_max, ensure_ascii=False)))
				dir_max.clear()
				dir_max[p[1]] = float(p[2])

			name = p[0]
			i += 1
			if(i == len(arr)):
				cursor.execute(f'INSERT INTO {tabmn} VALUES(%s, %s, %s, %s)', (dt, (str(name)), 'minimum_in_day', json.dumps(dir_max, ensure_ascii=False)))
	conn.commit()