80 lines
3.7 KiB
Text
80 lines
3.7 KiB
Text
import os
|
||
import rrdtool
|
||
import pandas as pd
|
||
from datetime import datetime
|
||
import time
|
||
|
||
# Функция для инициализации базы данных RRD
|
||
def initialize_rrd_database(rrd_file: str):
|
||
if not os.path.exists(rrd_file):
|
||
rrdtool.create(
|
||
rrd_file,
|
||
"--step", "60", # Шаг в 60 секунд
|
||
"DS:temp1_low:GAUGE:120:-40:100", # Температура устройства 1 (нижняя)
|
||
"DS:temp1_top:GAUGE:120:-40:100", # Температура устройства 1 (верхняя)
|
||
"DS:temp2_low:GAUGE:120:-40:100", # Температура устройства 2 (нижняя)
|
||
"DS:temp2_top:GAUGE:120:-40:100", # Температура устройства 2 (верхняя)
|
||
"RRA:AVERAGE:0.5:1:1440", # Средние значения с шагом 1 минута за сутки
|
||
"RRA:AVERAGE:0.5:60:720" # Средние значения с шагом 1 час за месяц
|
||
)
|
||
print(f"Создана база данных: {rrd_file}")
|
||
else:
|
||
print(f"База данных уже существует: {rrd_file}")
|
||
|
||
# Функция для получения последней временной метки из RRD базы данных
|
||
def get_last_update(rrd_file: str):
|
||
if os.path.exists(rrd_file):
|
||
info = rrdtool.info(rrd_file)
|
||
return info["last_update"]
|
||
return 0
|
||
|
||
# Функция обновления базы данных RRD
|
||
def update_rrd_database(rrd_file: str, timestamp: int, t1_low: float, t1_top: float, t2_low: float, t2_top: float):
|
||
try:
|
||
rrdtool.update(rrd_file, f"{timestamp}:{t1_low}:{t1_top}:{t2_low}:{t2_top}")
|
||
human_readable_time = datetime.fromtimestamp(timestamp).strftime('%Y-%m-%d %H:%M:%S')
|
||
print(f"Обновлено: Время: {human_readable_time}, Устр.1: Низ {t1_low}, Верх {t1_top}, Устр.2: Низ {t2_low}, Верх {t2_top}")
|
||
except Exception as e:
|
||
print(f"Ошибка обновления базы данных RRD: {e}")
|
||
|
||
# Загрузка и очистка данных из CSV
|
||
def load_and_clean_csv(file_path):
|
||
data = pd.read_csv(file_path, sep=';', skiprows=3, names=["time", "down", "top"])
|
||
data = data.dropna() # Удаление пустых строк
|
||
data["down"] = pd.to_numeric(data["down"], errors='coerce')
|
||
data["top"] = pd.to_numeric(data["top"], errors='coerce')
|
||
data = data.dropna() # Удаление строк с некорректными значениями
|
||
data["timestamp"] = data["time"].apply(lambda x: int(time.mktime(datetime.strptime(x, "%d-%m-%Y %H:%M:%S").timetuple())))
|
||
return data
|
||
|
||
# Пути к CSV и RRD файлам
|
||
csv_file1 = "ПБКТ-2-Ш.6линия.csv"
|
||
csv_file2 = "ПБКТ-3-Ш.1линия.csv"
|
||
rrd_file = "temperature_data.rrd"
|
||
|
||
# Инициализация RRD базы данных
|
||
initialize_rrd_database(rrd_file)
|
||
|
||
# Загрузка данных
|
||
data1 = load_and_clean_csv(csv_file1)
|
||
data2 = load_and_clean_csv(csv_file2)
|
||
|
||
# Получение последней временной метки из RRD базы данных
|
||
last_update = get_last_update(rrd_file)
|
||
|
||
# Слияние данных и фильтрация
|
||
merged_data = pd.merge(data1, data2, on="timestamp", suffixes=("_device1", "_device2"))
|
||
merged_data = merged_data[merged_data["timestamp"] > last_update]
|
||
|
||
# Импорт данных в RRD базу
|
||
for _, row in merged_data.iterrows():
|
||
update_rrd_database(
|
||
rrd_file,
|
||
int(row["timestamp"]),
|
||
float(row["down_device1"]),
|
||
float(row["top_device1"]),
|
||
float(row["down_device2"]),
|
||
float(row["top_device2"]),
|
||
)
|
||
|
||
print("Импорт данных завершён.")
|