import requests import json import os import time import rrdtool from dotenv import load_dotenv # Конфигурация файла базы данных RRD rrd_file = "temperature_data.rrd" load_dotenv() # Функция для инициализации базы данных RRDTool def initialize_rrd_database(rrd_file: str): if not os.path.exists(rrd_file): rrdtool.create( rrd_file, "--step", "60", # Шаг в 60 секунд "DS:temp_low:GAUGE:120:-40:100", # Источник данных: нижняя температура "DS:temp_high:GAUGE:120:-40:100", # Источник данных: верхняя температура "RRA:AVERAGE:0.5:1:1440", # Средние значения с шагом 1 минута за сутки "RRA:AVERAGE:0.5:60:720" # Средние значения с шагом 1 час за месяц ) print(f"Создана база данных: {rrd_file}") else: print(f"База данных уже существует: {rrd_file}") # Функция обновления базы данных RRDTool def update_rrd_database(rrd_file: str, temp_low: float, temp_high: float): timestamp = int(time.time()) try: rrdtool.update(rrd_file, f"{timestamp}:{temp_low}:{temp_high}") print(f"Data update: Time: {timestamp}, down {temp_low}, Up {temp_high}") except Exception as e: print(f"Ошибка обновления базы данных RRD: {e}") # Получение токена OwenCloud def get_token(): login = os.getenv("LOGIN") password = os.getenv("PASSWORD") if not login or not password: raise ValueError("Логин или пароль не заданы в .env") data = {'login': login, 'password': password} headers = { "Content-Type": "application/json", "Accept": "application/json" } req = requests.post("https://api.owencloud.ru/v1/auth/open/", json=data, headers=headers) if req.status_code == 200: answer = req.json() token = "Bearer " + answer["token"] return token else: print(f"Ошибка авторизации: {req.status_code}, {req.text}") return None # Основная функция def main(): initialize_rrd_database(rrd_file) # Инициализируем RRD базу данных while True: # Бесконечный цикл для записи данных каждую минуту token = get_token() if not token: print("Не удалось получить токен. Пропускаем итерацию.") time.sleep(60) # Ждем минуту и пробуем снова continue device_id = "296613" headers = {'Authorization': token} data = json.dumps({'filter': ''}) req = requests.post(f"https://api.owencloud.ru/v1/device/{device_id}", data=data, headers=headers) if req.status_code != 200: print(f"Ошибка запроса устройства: {req.status_code}, {req.text}") time.sleep(60) continue nswer = req.json() if "parameters" not in nswer: print("Не удалось найти параметры в ответе.") time.sleep(60) continue parameters = nswer['parameters'] # Извлечение температуры try: temperature_1 = next(param for param in parameters if param['name'] == "Температура_1 (НИЗ)") temperature_2 = next(param for param in parameters if param['name'] == "Температура_2 (ВЕРХ)") except StopIteration: print("Не удалось найти необходимые параметры.") time.sleep(60) continue temp_low = float(temperature_1['value']) temp_high = float(temperature_2['value']) # Обновление базы данных RRDTool try: update_rrd_database(rrd_file, temp_low, temp_high) except Exception as e: print(f"Error with RRDTool: {e}") # Ждем минуту перед следующей итерацией time.sleep(60) if __name__ == "__main__": main()