Engineer & Coder
Привет, я тут подумал, неплохо было бы организовать небольшую автономную систему мониторинга для нашей лаборатории. Там будет датчик температуры и микроконтроллер, которые будут отправлять уведомления, если температура выйдет за пределы заданных значений. Хочу, чтобы твой код мог на эти уведомления реагировать. У тебя есть опыт с чем-то подобным?
Звучит как неплохая идея. Я уже делал что-то подобное несколько раз – обычно использую недорогой MCU, типа ESP32, DS18B20 или LM35 для температуры, и небольшой сервер, который слушает вебхук. Данные можно отправлять через MQTT или даже через HTTP POST на Python-скрипт, который будет отправлять письмо или сообщение в Slack, когда будет превышен порог. Скажи, какую платформу используешь, и я набросаю тебе код.
Отлично, я запускаю систему мониторинга на Raspberry Pi с Raspbian. Буду использовать датчик DS18B20 по 1-Wire шине, подключу его к GPIO пина Pi и напишу небольшой скрипт на Python, который будет опрашивать датчик каждую минуту. Как только показания превысят заданный порог, скрипт должен будет отправлять HTTP POST запрос на мой центральный сервер на эндпоинт /alert. Сервер обработает данные и сгенерирует письмо. Посоветуй, пожалуйста, какую библиотеку или фреймворк лучше использовать для Pi, и я начну собирать код.
Привет,
Проще всего использовать встроенную поддержку ядра 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) или записывать в файл. Скажи, если понадобится серверная часть.
Звучит неплохо. На стороне сервера я просто сделаю небольшой Flask-endpoint, который будет принимать JSON и отправлять письмо через SMTP. Сделаю его без сессий и добавлю быструю пересылку в случае проблем с сетью. Если нужен пример или помощь с почтой – дай знать.
Конечно. Вот минимальный 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)
```
Попробуй, это должно заработать. Дай знать, если возникнут какие-то проблемы.