import rrdtool import time import requests from dotenv import load_dotenv import os load_dotenv() def send_telegram(): token = os.getenv("TELEGRAM_TOKEN") channel_id = os.getenv("TELEGRAM_CHANNEL_ID") if not token or not channel_id: raise ValueError("Telegram токен или ID канала не заданы в .env") url = f"https://api.telegram.org/bot{token}/sendPhoto" with open('temperature_graph.png', 'rb') as file: r = requests.post(url, data={ "chat_id": channel_id }, files={ "photo": file }) print(r.text) if r.status_code != 200: raise Exception(f"Ошибка отправки в Telegram: {r.text}") def create_graph(rrd_file: str, output_file: str): # Получаем текущее время now = int(time.time()) # Время начала (24 часа назад) start_time = now - 86400 # 86400 секунд = 1 день # Форматируем даты для заголовка start_date = time.strftime("%d-%m-%Y", time.localtime(start_time)) end_date = time.strftime("%d-%m-%Y", time.localtime(now)) try: rrdtool.graph( output_file, "--start", str(start_time), # Начало графика "--end", str(now), # Конец графика "--vertical-label", "Temperature (°C)", "--title", f"Temperature Readings from {start_date} to {end_date}", "DEF:low_temp={}:temp_low:AVERAGE".format(rrd_file), # Средние значения нижней температуры "DEF:high_temp={}:temp_high:AVERAGE".format(rrd_file), # Средние значения верхней температуры "LINE1:low_temp#0000FF:Low Temperature", # Линия для нижней температуры (синий) "LINE1:high_temp#FF0000:High Temperature", # Линия для верхней температуры (красный) r"GPRINT:low_temp:MIN:Min Low Temp\: %2.2lf°C", r"GPRINT:low_temp:MAX:Max Low Temp\: %2.2lf°C", r"GPRINT:low_temp:AVERAGE:Avg Low Temp\: %2.2lf°C\n", r"GPRINT:high_temp:MIN:Min High Temp\: %2.2lf°C", r"GPRINT:high_temp:MAX:Max High Temp\: %2.2lf°C", r"GPRINT:high_temp:AVERAGE:Avg High Temp\: %2.2lf°C\n", ) print(f"График успешно создан: {output_file}") send_telegram() except Exception as e: print(f"Ошибка создания графика: {e}") # Пример использования rrd_file = "temperature_data.rrd" output_file = "temperature_graph.png" create_graph(rrd_file, output_file)