Engineer & Coder
Engineer Engineer
Привет, я тут подумал, неплохо было бы организовать небольшую автономную систему мониторинга для нашей лаборатории. Там будет датчик температуры и микроконтроллер, которые будут отправлять уведомления, если температура выйдет за пределы заданных значений. Хочу, чтобы твой код мог на эти уведомления реагировать. У тебя есть опыт с чем-то подобным?
Coder Coder
Звучит как неплохая идея. Я уже делал что-то подобное несколько раз – обычно использую недорогой MCU, типа ESP32, DS18B20 или LM35 для температуры, и небольшой сервер, который слушает вебхук. Данные можно отправлять через MQTT или даже через HTTP POST на Python-скрипт, который будет отправлять письмо или сообщение в Slack, когда будет превышен порог. Скажи, какую платформу используешь, и я набросаю тебе код.
Engineer Engineer
Отлично, я запускаю систему мониторинга на Raspberry Pi с Raspbian. Буду использовать датчик DS18B20 по 1-Wire шине, подключу его к GPIO пина Pi и напишу небольшой скрипт на Python, который будет опрашивать датчик каждую минуту. Как только показания превысят заданный порог, скрипт должен будет отправлять HTTP POST запрос на мой центральный сервер на эндпоинт /alert. Сервер обработает данные и сгенерирует письмо. Посоветуй, пожалуйста, какую библиотеку или фреймворк лучше использовать для Pi, и я начну собирать код.
Coder Coder
Привет, Проще всего использовать встроенную поддержку ядра w1-therm и небольшой скрипт на Python. Включи интерфейс 1-Wire в raspi-config, а потом используй пакет w1thermsensor для чтения DS18B20. Для POST-запроса просто импортируй requests и отправь JSON-данные. Что-то вроде этого: ```python from w1thermsensor import W1ThermSensor import requests, time sensor = W1ThermSensor() threshold = 30.0 # градусы Цельсия url = 'https://your‑server/alert' while True: temp = sensor.get_temperature() if temp > threshold: payload = {'temp': temp, 'time': time.time()} try: requests.post(url, json=payload, timeout=5) except requests.RequestException: pass # можно было бы записать в лог ошибку time.sleep(60) ``` Всё, никаких тяжелых фреймворков не нужно, только эти два пакета. Если нужна большая надёжность, можно добавить небольшую переигровку (retry loop) или записывать в файл. Скажи, если понадобится серверная часть.
Engineer Engineer
Звучит неплохо. На стороне сервера я просто сделаю небольшой Flask-endpoint, который будет принимать JSON и отправлять письмо через SMTP. Сделаю его без сессий и добавлю быструю пересылку в случае проблем с сетью. Если нужен пример или помощь с почтой – дай знать.
Coder Coder
Конечно. Вот минимальный Flask-маршрут, который получает температуру, записывает ее в лог и отправляет письмо через smtplib. Если отправка не удалась, он несколько раз повторяет попытку. Отрегулируй хост/порт/пароль для твоего SMTP-сервера. ```python from flask import Flask, request, jsonify import smtplib from email.message import EmailMessage import time app = Flask(__name__) SMTP_HOST = 'smtp.example.com' SMTP_PORT = 587 SMTP_USER = 'user@example.com' SMTP_PASS = 'secret' ALERT_TO = 'alert-recipient@example.com' def send_mail(subject, body): msg = EmailMessage() msg['From'] = SMTP_USER msg['To'] = ALERT_TO msg['Subject'] = subject msg.set_content(body) for attempt in range(3): try: with smtplib.SMTP(SMTP_HOST, SMTP_PORT) as s: s.starttls() s.login(SMTP_USER, SMTP_PASS) s.send_message(msg) return True except Exception as e: if attempt < 2: time.sleep(5) # small back‑off else: print('Failed to send email:', e) return False @app.route('/alert', methods=['POST']) def alert(): data = request.get_json() temp = data.get('temp') ts = data.get('time') subject = f'Temperature alert: {temp:.1f}°C' body = f'Alert triggered at {time.ctime(ts)} with reading {temp:.1f}°C.' send_mail(subject, body) return jsonify({'status': 'sent'}), 200 if __name__ == '__main__': app.run(host='0.0.0.0', port=5000) ``` Попробуй, это должно заработать. Дай знать, если возникнут какие-то проблемы.