Инструменты пользователя

Инструменты сайта


doc:2003:mgul.200300.001.1201

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
doc:2003:mgul.200300.001.1201 [2024/08/10 17:06]
daftwi
doc:2003:mgul.200300.001.1201 [2024/08/11 22:53] (текущий)
daftwi [Корневой каталог веб-приложения]
Строка 5: Строка 5:
  
 ===== Корневой каталог веб-приложения ===== ===== Корневой каталог веб-приложения =====
 +
 +<hidden index.html><​code>​
 +<​!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>​
 +</​code></​hidden>​
 +
 +
 +----
  
 <hidden conn.php><​code>​ <hidden conn.php><​code>​
Строка 124: Строка 149:
 pg_close($pgi);​ pg_close($pgi);​
 ?> ?>
 +</​code></​hidden>​
 +
 +
 +----
 +
 +<hidden conn_hour.php><​code>​
 +<?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);​
 +?>
 +</​code></​hidden>​
 +
 +
 +----
 +
 +<hidden conn_minutes.php><​code>​
 +<?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);​
 +?>
 +</​code></​hidden>​
 +
 +
 +----
 +
 +<hidden request.html><​code>​
 +<​!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>​
 +</​code></​hidden>​
 +
 +
 +----
 +
 +<hidden averequest.php><​code>​
 +<?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);​
 +}
 +?>
 +</​code></​hidden>​
 +
 +
 +----
 +
 +<hidden fileexport.html><​code>​
 +<​!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>​
 +</​code></​hidden>​
 +
 +
 +----
 +
 +<hidden export.php><​code>​
 +<?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';​
 +}
 +?>
 +</​code></​hidden>​
 +
 +
 +----
 +
 +<hidden style.css><​code>​
 +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);
 +}
 +</​code></​hidden>​
 +
 +
 +----
 +
 +<hidden stylereq.css><​code>​
 +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);
 +}
 +</​code></​hidden>​
 +
 +
 +----
 +
 +====== ПРОГРАММНЫЙ КОД АВТОМАТИЗАЦИИ ======
 +
 +===== Архив с кодом автоматизации и библиотеками =====
 +
 +{{ :​doc:​2003:​filesfordoku.zip | Server}}
 +
 +===== Текст кода библиотек =====
 +
 +<hidden lib2><​code>​
 +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()
 +</​code></​hidden>​
 +
 +
 +----
 +
 +<hidden lib3><​code>​
 +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()
 </​code></​hidden>​ </​code></​hidden>​
  
  
 ---- ----
doc/2003/mgul.200300.001.1201.1723298776.txt.gz · Последние изменения: 2024/08/10 17:06 — daftwi